自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王木木

移步阿水书屋专栏,有惊喜哦

  • 博客(318)
  • 资源 (1)
  • 收藏
  • 关注

原创 《系统架构设计师教程》 第二章:计算机与网络基础知识

1. 操作系统基础知识1.1 操作系统基础知识操作系统的作用:通过资源管理,提高计算机系统的效率改善人机界面,向用户提供友好的工作环境操作系统的特征:并发性、共享性、虚拟性和不确定性

2022-09-14 23:14:27 979

原创 《系统架构设计师教程》 第一章:绪论

现代信息系统的架构三要素:构件、模式以及规划。软件系统架构是关于软件系统的结构、行为和属性的高级抽象。20世纪80年代,IBM首先引入“信息系统架构框架”概念,提出从信息、流程、网络、人员、时间和基本原理6个视角来分析企业,并提供; 与之相对应的6个模型,包括语义、概念、逻辑、物理、组件和功能模型。软件架构的研究主要包括软件架构描述语言、软件架构的描述与表示、软件架构的分析与验证、基于框架的软件维护与演化、软件架构的可靠性等方面。系统架构设计师是软考中级资格“软件设计师、软件评测师“之后的高级资格。

2022-09-14 21:18:11 812

原创 《精通正则表达式》

精通正则表达式

2022-09-10 10:03:52 6325

原创 《Python高级编程》

《Python高级编程》

2022-09-10 09:39:06 6418

原创 《C大学教程》

《C大学教程》

2022-09-10 09:38:13 6313

原创 《MySQL核心技术手册》

《MySQL核心技术手册》

2022-09-10 09:31:34 6569

原创 《SQL基础教程》

《SQL基础教程》

2022-09-10 09:25:43 6634

原创 《程序员实用算法》

《程序员实用算法》

2022-09-10 09:22:36 6216

原创 《数字逻辑与计算机设计基础》

《数字逻辑与计算机设计基础》

2022-09-10 09:21:09 6434

原创 《算法设计技巧与分析》

结构简明,内容丰富,适合于作为计算机学科及相关学科算法课程的教材和参考书,尤其适宜于学过数据结构和离散数学课程之后的算法课程教材。同时也可作为从事算法研究的一本好的入门书

2022-09-10 09:14:06 9838

原创 《Effective Modern C++》学习笔记之条款四十二:考虑置入而非插入

如果你有个容器,持有一些,比如说,std::string型别的对象,那么似乎合乎逻辑的做法是用某个插入函数insertion function来向其中添加新元素,比如insert,push_front和push_back,又或者对于std::forward_list而言的insert_after,而传递给函数的元素型别将是std::string。毕竟,那正是容器持有物的型别。1. 分析为什么push_back效率不高说合乎逻辑倒也确实合乎逻辑,但却不一定合乎事实。考虑这段代码:std::vect

2022-03-20 13:26:02 6667

原创 《Effective Modern C++》学习笔记之条款四十一:针对可复制的形参,在移动成本低并且一定会被复制的前提下,考虑将其按值传递

C++中的每一项通用技术或特性,都会在某些情况下使用,而在另一些情况下则不适用。一般而言,描述通用技术或者特性的适用情况才顺理成章,但本章却反其道而行之,描述了两种例外情况。通用技术指的是按值传递,而通用特性则是置入(emplacement)。想做出是否采用它们的决定,须面对诸多影响因素,而我能够提供的最佳建议则是需要考虑他们其实是有适用场景的。话虽如此,这两者可都是高效现代C++程序设计的重要角色,下面的条款为在评价它们是否适用你的软件这方面提供了参考信息。方法一:重载有些函数的形参本来就是打

2022-03-20 13:14:35 215

原创 《Effective Modern C++》学习笔记之条款四十:对并发使用std::atomic,对特种内存使用volatile

可怜的volatile。被误解到如此地步。它甚至不应该出现在本章中,因为它与并发程序设计毫无关系。但是在其他程序设计语言中(例如 Java 和 C# ),它还是会对并发程序设计有些用处。甚至在C++中,一些编译器也已经把volatile投入了染缸,使得它的语义显得可以用于并发软件中(但是仅可能用于使用这些编译器进行编译之时)。因此,除了消除环绕在它周围的混淆视听外,没有什么其他的理由值得在关于并发的一章中讨论volatile。程序员有时会把volatile与绝对属于本章讨论范围的另一C++特性混淆,

2022-03-20 13:04:34 1828

原创 《Effective Modern C++》学习笔记之条款三十九:考虑针对一次性事件通信使用以void为模板型别实参的期值

有时候,提供让一个任务通知另一个以异步方式运行的任务发生了特定的事件的能力,会很有用,原因可能是第二个任务在事件发生之前无法推进。这事件也许是某个数据结构完成了初始化,也许是某个计算阶段结束了,又也许是某个重要传感器取值被检测到了等等。在此情况下,用什么方式完成线程间通信会是最佳的呢?1. 使用条件变量一种明显的途径是使用条件变量,若我们把检测条件的任务成为检测任务,把对条件做出反应的任务成为反应任务,则策略表述起来很简答:反应任务等待这条件变量,而检测任务则在事件发生时,通知条件变量。给定:.

2022-03-20 12:52:35 327

原创 《Effective Modern C++》学习笔记之条款三十八:对变化多端的线程句柄析构函数行为保持关注

Item 37 解释过,可联结的线程对应着一个底层系统执行线程,未推迟任务(参见Item 36)的期值和系统线程也有类似关系。这么一来,std::thread型别对象和期值对象都可以视作系统线程的句柄。从这个视角看,std::thread对象和期值独享的析构函数表现出如此不同的行为值得深思。重温std::thread的析构表现Item 37 中剃刀的,针对可联结的std::thread型别对象实施析构会导致程序终止,因为另外两个显而易见的选择(隐式join或者detach)都被认为是更糟糕的选择

2022-03-19 19:15:11 195

原创 《Effective Modern C++》学习笔记之条款三十七:使std::thread型别对象在所有路径皆不可联结

每个std::thread型别对象皆处于两种状态之一:可联结或不可联结。哪些属于可联结可联结的std::thread对应底层以异步方式已运行或者可运行的线程。std::thread型别对象对应的底层线程若处于阻塞或等待调度,则它可联结。std::thread型别对象对应的底层线程如已运行结束,则也认为其可联结。哪些属于不可联结不可联结的std::thread的意思如你所想:std::thread不处于以上可联结的状态。不可联结的std::thread型别对象包括:默认构造的std::th

2022-03-19 19:11:55 312

原创 《Effective Modern C++》学习笔记之条款三十六:如果异步是必要的,则指定std::launch::async

当你调用std::async来执行一个函数(或一个可执行对象)时,你通常希望函数是异步执行的。但你没有要求std::async必须这样做,函数是根据std::async的发射策略(launch policy)来执行的。有两个标准策略,每个都是通过std::launch局部枚举来表示。假设一个函数f要传递给std::launch执行,std::launch::async:意味着函数f必须异步执行,即在另一线程执行。 std::launch::deferred:意味着函数f只会在std::async所返回

2022-03-19 18:58:47 1143

原创 《Effective Modern C++》学习笔记之条款三十四:优先选用lambda表达式,而非std::bind

1. 先来点历史资料std::bind是C++98中std::bind1st和std::bind2nd的后继特性,但是作为一种非标准特性而言,std::bind在2005年就已经是标准库的组成部分了。正是在那时,标准委员会接受了名称TR1的文档,里面就包含了std::bind的规格(在TR1中,bind位于不同的名字空间,所以是std::tr1::bind而非std::bind,还有一些借口细节与现在有所不同)。2. 再来谈抛弃这样的历史意味着,有些开发者已经有了十多年的std::bind开发经

2022-03-19 16:55:03 250

原创 《Effective Modern C++》学习笔记之条款三十三:对auto&&型别的形参使用decltype,以std::forward之

1. 你有完美转发lambda入参的需求么?泛型lambda式(generic lambda)是C++14最振奋人心的特征之一————lambda可以在形参规格中使用auto。这个特性的实现十分直接了当:闭包类中的operator()采用模板实现。例如,给定下述lambda式:auto f = [](auto x) { return func(normalize(x));};则闭包类的函数调用运算符如下所示:class SomeComilerGeneratedClassName {.

2022-03-19 16:37:38 380

原创 《Effective Modern C++》学习笔记之条款三十二:使用初始化捕获将对象移入闭包

如果你有一个对象,其复制操作开销昂贵,而移动操作成本低廉,而你又需要把该对象放入闭包,那么你肯定更愿意移动该对象,而非复制它。C++14为我们提供了一个全新的捕获方式---初始化捕获,也叫做广义lambda捕获,使用初始化捕获,则你会得到机会指定: 由lambda生成的闭包类中的成员变量名字。 一个表达式,用以初始化该成员变量。 例如使用初始化捕获将std::unqiue_ptr移动到闭包内:class Widget { //一些有用的型别p

2022-03-15 14:02:45 684

原创 数据结构与算法之美【19】-字符串匹配

字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如 Java 中的 indexOf(),Python 中的 find() 函数等,它们底层就是依赖接下来要讲的字符串匹配算法。1、BF 算法BF 算法中的 BF 是 Brute Force 的缩写,中文叫作暴力匹配算法,也叫朴素匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就会比较简单、好懂,但相应的性能也不高。在开始讲解这个算法之前,我先定义两个概念:

2022-03-14 18:25:28 955

原创 数据结构与算法之美【18】-深度和广度优先搜索

我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。我们上一节讲过,图有两种主要存储方法,邻接表和邻接矩阵。需要说明一下,深度优先搜索算法和广度优先搜索算法,既可以用在无向图,也可以用在有向图上。1、广度优先搜索(BFS)广度优先搜索(Breadth-First-Search),我们平常都简称 BFS。直观地讲,它其实就是一种“地毯式”层层推进的搜索策略,即先查找

2022-03-14 17:33:51 512

原创 《Effective Modern C++》学习笔记之条款三十五:优先选用基于任务而非基于线程的程序设计

如果你想以异步方式运行函数doAsyncWork(),有两种方法。你可以创建一个std::thread,并在其上运行doAsyncWork,这种方式属于基于线程的程序设计(thread_based) int doAsyncWork();std::thread t(doAsyncWork); 也可以把doAsyncWork传递给std::async,这种策略叫做基于任务(task_based) auto fut = std::async(doAsyncWork); //fut是...

2022-03-14 16:50:04 893

原创 《Effective Modern C++》学习笔记之条款三十一:避免默认捕获模式

C++11中有两种默认捕获方式:按值或者按引用。按值的默认捕获方式可能会忽悠你,按引用的默认捕获方式可能导致空悬引用。按引用捕获会导致闭包包含涉及到局部变量的引用,或者涉及到定义lambda式子的作用域内形参的引用,考虑如下代码:using FilterContainer = std::vector<std::function<bool(int)>>;FilterContainer filters;void addDivisorFilter() { auto cal

2022-03-14 16:09:50 861

原创 《Effective Modern C++》学习笔记之条款三十:熟悉完美转发的失败情形

完美转发的确切含义:“转发”的含义不过是一个函数把自己的形参传递(转发)给另一个函数而已。其目的是为了让第二个函数(转发目的函数)接受第一个函数(转发发起函数)所接受的同一对象。这就排除了按值传递形参,因为它们只是原始调用者所传递之物的副本,我们想要转发目的函数能够处理原始传入对象。指针形参也只能出局,因为我们不想强迫调用者传递指针。论及一般意义上的转发时,都是在处理形参为引用类型的情形。完美转发的含义是我们不仅转发对象,还转发显著特征:类型,是左值还有右值,以及是否带有const或volatile..

2022-03-14 15:23:23 207

原创 《Effective Modern C++》学习笔记之条款二十九:假定移动操作不存在/成本高/未使用

我们知道,C++98标准库已经为C++11彻底翻修过,目的是为那些移动比复制更快的型别添加移动操作,但是如果你现有的代码没有为C++11做过专门修改,那性能也不会有很大提升。前面我们知道,C++11只会为那些未声明复制操作、移动操作以及析构函数的类生成移动操作。而且有些类的移动可能并不会比复制快多少,例如std::array这个新容器类别,它实质上就是带有STL接口的内建数组,这一点和其他容器有很大区别,其他容器都是将其内容存放在堆上,然后维护一个堆指针,当需要移动时,只需要将指针重新赋值即可,..

2022-03-14 14:39:23 787

原创 Linux开发(十二):四中内存分配方式

1、malloc/free 函数malloc()函数和free()函数是在堆中申请或释放内存空间的,其函数声明如下:#include <stdlib.h>void* malloc(size_t _size);void free(void* _ptr);函数参数_size:堆中申请分配一个长度为_size字节的连续空间返回值:若分配成功,则返回一个指向该区域的首地址的指针,若申请失败则返回NULL2、realloc函数realloc函数是用来在堆中更改已经

2022-03-12 14:49:23 394

原创 Linux开发(十四):Linux拓展应用

目录一、POSIX 实现2G文件复制二、重定向编程1、dup实现2、dup2实现三、线程池实现四、ping功能实现五、原始套接字实现DOS攻击一、POSIX 实现2G文件复制想要实现2G大文件复制操作,必须需要系统的支持,因此,在头文件声明前,需要先定义宏 _LARGEFILE_SOURCE、LARGEFILE64_SOURCE、FILE_OFFSET_BITS或者在编译时,加入以下编译项: -D_LARGEFILE64_SOURCE -D_FILE_OFFSE.

2022-03-12 14:38:02 1478

原创 Linux开发(十三):守护进程

目录一、概述二、守护进程的创建1、顺序创建2、库函数daemon()三、守护进程出错处理一、概述Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程一般在系统启动时开始运行,除非强行终止

2022-03-12 13:40:33 1394

原创 Linux开发(十):多进程通信与同步---信号

信号是进程间通信机制中唯一的异步通信机制,在实现上是一种软中断,信号可以导致一个正在运行的进程被中断,进而处理一个突发事件。目录一、信号表二、信号术语三、信号使用1、信号安装(1)signal()(2)sigaction()2、信号发送(1)kill函数(2)raise函数(3)alarm函数(4)abort函数(5)pause函数(6)sigqueue函数3、信号集操作函数4、信号阻塞函数四、注意事项一、信号表Lin...

2022-03-11 18:17:42 1842

原创 Linux开发(十一):多进程通信与同步---管道通信

管道是Linux环境中历史最悠久的进程间通信方式,本质上,管道就是一个操作方式为文件的内存缓冲区。Linux上的管道分两种类型,分别为匿名管道(无名管道)和有名管道(命名管道)。目录一、匿名管道1、创建匿名管道2、注意事项3、代码示例二、有名管道1、管道创建(1) 命令行创建(2) 函数创建2、删除命名管道3、代码示例一、匿名管道匿名管道是一种特殊类型的文件,完全由操作系统管理和维护,因为其存储位置只有亲缘关系的进程知道,所以只能用于亲缘关系的进程..

2022-03-11 16:46:53 2096

原创 Linux开发(八):多进程通信与同步---信号量

信号量其实也是一种锁,线程获取不到信号量的时候进入睡眠,直至有信号量释放出来时,才会被唤醒,进入临界区继续执行。信号量有二值信号量和计数信号量两种,其中二值信号量比较常用。二值信号量表示信号量只有两个值,即0和1。信号量为1时,表示临界区可用,信号量为0时,表示临界区不可访问。和消息队列和共享内存一样,信号量也有两个版本,分别为System V信号量和POSIX信号量。那么两者有什么区别:POSIX信号量常用于线程,而System V信号量常用于进程的同步 从使用的角度,System V 信号量

2022-03-11 15:47:42 968

原创 Linux开发(九):多进程通信与同步---共享内存

共享内存是进程间通信的一种最基本、最快速的机制。共享内存是两个或多个进程共享同一块内存区域,并通过该内存区域实现数据交换的进程间通信机制。通常是由一个进程开辟一块共享内存区域,然后允许多个进程对此区域进行访问。由于不需要使用中间介质,而是数据由内存直接映射到进程空间,因此共享内存是最快速的进程间通信机制。共享内存的最大不足之处在于,由于多个进程对同一块内存区具有访问的权限,各个进程之间的同步问题显得尤为突出。必须控制同一时刻只有一个进程对共享内存区域写入数据,否则将造成数据的混乱。但是同步控制的问题,可

2022-03-10 17:27:44 2660

原创 Linux开发(八):多进程通信与同步---消息队列

进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。一、消息队列消息队列实质上就是一个链表,该链表是由系统内核维护,读取消息时,不一定遵循先进先出原则, 也可以按消息的类型字段进行读取。1、获取key值Linux系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。key_t ftok( char * fname, int i

2022-03-09 18:19:58 1529

原创 Linux开发(七):多线程通信与同步

线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。 不过要注意的是线程间需要做好同步。一、互斥锁互斥锁也叫做互斥量,是一个二元变量,主要以排他的方式防止数据被并发访问。在访问共享资源前对互斥锁进行加锁,访问后释放互斥锁。若互斥锁已经被某线程加锁,其他试图再次对互斥锁加锁的线程都将会被阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有一个以上的线程等待加锁,那么这些线程都将会变成可运行状态,但只有一个变线程可以对互斥量加锁,其他线程抢占失败,只能再次

2022-03-09 11:54:24 1046 1

原创 Linux开发(五):I/O多路复用

一、什么是I/O多路复用多路是指网络连接,复用指的是同一个线程。IO 多路复用是一种同步IO模型,实现一个线程可以监视多个文件句柄; 一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作; 没有文件句柄就绪就会阻塞应用程序,交出CPU。二、IO多路复用的三种实现1、select()函数select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述符就绪(有数据可读、可写、或者有异常),或者超时(ti

2022-03-08 17:26:16 975

原创 Linux开发(二):缓冲区

一、缓冲区类型标准I/O为我们提供了3种类型的缓冲区:全缓冲区、行缓冲区、无缓冲区。(1)全缓冲区:这种缓冲区默认大小为BUFSIZ,具体大小与系统定义有关。在缓冲区满或主动调用fflush()函数后,才进行真正的I/O操作,普通磁盘文件的写操作通常使用全缓冲区访问。// from /usr/include/stdio.h#ifndef BUFSIZ#define BUFSIZ _IO_BUFSIZ // BUFSIZ全局宏定...

2022-03-08 15:21:12 1042

原创 Linux开发(四):网络编程API

本文主要介绍Linux网络编程时,用到的各个API,不涉及协议相关知识!一、网络编程API我们知道正常的CS架构,包含以下内容:下面依次介绍以上用到的各个API。1、socket()函数创建网络套接字。#include<sys/types>#include<sys/socket.h>int socket(int domain, int type, int protocol);函数参数:domain:该socket要使用的地址协议簇,常用选项

2022-03-07 17:30:12 3498

原创 Linux开发(三):文件I/O

一、系统调用系统调用函数是操作系统为内核代码提供给用户或上层使用的一些函数接口,调用在用户态,执行在内核态。1、open()函数打开或创建一个文件.#include <fcntl.h>int open(const char *pathname,int flag, mode_t mode);函数参数:pathname: 要打开或创建文件的路径+名字flag: 打开的方式,有以下几种方式:O_RDONLY:只读 O_WRONLY:只写 O_RDWR:可读可写

2022-03-07 11:54:52 890

原创 Linux开发(六):多线程编程API

一、什么是多线程线程是应用程序并发执行多个任务的机制,一个进程可以包含多个线程,且共享同一个全局内存区域,包括(未)初始化数据段、堆内存。多核处理器机器是可以支持多个线程真正意义上的多个线程并发执行。二、线程操作1、线程创建用户创建的线程数量不能超过RLIMIT_NPROC软资源限制,所有用户创建的总线程数也不能超过/proc/sys/kernel/threads_max内核参数定义的值。//from /usr/include/bits/pthread.hint pthread_..

2022-03-04 17:02:42 975

Visual Studio2017版本

购买即可获取其他相关编程软件,因资源大小限制,只列出了一个VS2017,如有需要,留言想要的资料,免费提供,包括数据库、Python、Qt、keil、LabVIEW、安卓、JAVA、虚拟机等

2018-09-18

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除