并发指逻辑控制流在时间上是重叠的
进程:程序员
因为服务器运行时间长,因此要包括一个SIGCHLD进程程序,用来回收僵死子进程的资源
编程
对于父,子进程:共享文件表,但不共享用户地址空间数组
基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回应用的程序
例如:
安全
select函数处理类型为fd_set的集合
被容许对描述符集合作的三件事:服务器
利用select实现一个迭代echo服务器:
多线程
一旦select返回,就用FD_ISSET宏指令来判断哪一个能够进行读了并发
一个状态机就是一组状态,输入事件和转移,其中转移就是将状态和输入事件映射到状态
自循环同一个输入和输出之间的转换
函数
服务器使用I/O多用复,借助select函数检测输入事件的发生
clientfd数组表示已链接描述符的集合,其中整数-1表示一个可用的槽位
编码
优势:操作系统
每一个线程都有它本身的线程上下文,包括一个惟一的整数线程ID,栈,栈指针,程序计数器,通用目的寄存器和条件码
主线程:每一个进程开始生命周期都是单一线程
某时刻,主线程建立一个对等线程,今后时开始,两个线程并发运行
线程和进程的区别:
进程是按照严格的父子层次来组织的,线程则是对等的池
建立线程
回收已终止线程的资源
pthread_join函数会堵塞,直到线程tid终止,将线程例程返回的(void)指针赋值为pthread_return指向的位置,而后回收*已终止线程占用的全部储存器资源
分离线程
在任意一个时间点上,线程是可结合的或者是分离的
初始化线程
一般,线程的寄存器是从不共享的,而虚拟储存器老是共享的
若说变量v是共享的,当且仅当它的一个实例被一个以上的线程引用
在共享变量的同时引入了同步错误的可能性
通常而言,没有办法预测操做系统是否能为你的线程选择一个正确的顺序
进度图将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线
图的原点对应于没有任何线程完成一条指令的初始状态
在进度图中,两个临界区的交集造成的状态空间区域称为不安全区
基本思想:将每一个共享变量与一个信号量s联系起来,而后用P(s)和V(s)操做将相应的临界区包围起来
生产者-消费者问题
最简单的方法:将序列划分红t个不相交区域,而后给t个不一样的线程每一个分配一个区域
并行程序的加速比:
四个线程不安全函数类:
当一个程序的正确性一个线程要在另外一个线程到达y点以前到达它的控制流中的x点时,就会发生竞争
避免死锁的规则:
互斥锁加锁顺序规则:若是对于程序中每对互斥锁(s,t),每一个同时占用s和t的线程都按照相同的顺序对它们加锁,那这个程序是无死锁的