信息安全系统设计基础第十二周学习总结

第十二章 并发编程

并发指逻辑控制流在时间上是重叠的
进程程序员

  • 每一个控制流都是一个进程
  • 是由内核来调度维护
  • 有独立的虚拟地址空间
  • 在与其余流进行通讯时,控制流必须使用某种显式的进程间通讯机制
    I/O多用复路
  • 在并发编程中,应用程序在一个进程的上下文中显式的调度它们本身的逻辑流
  • 全部流都共享同一个地址空间
    线程
  • 是运行在单一进程上下文中的逻辑流
  • 由内核进行调度
  • 是进程和I/O多用复路的混合体

基于进程的并发编程

基于进程的并发服务器

因为服务器运行时间长,因此要包括一个SIGCHLD进程程序,用来回收僵死子进程的资源
编程

关于进程的优劣

对于父,子进程:共享文件表,但不共享用户地址空间数组

基于I/O多用复路的并发编程

基本思路:使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回应用的程序
例如:
安全

select函数处理类型为fd_set的集合
被容许对描述符集合作的三件事:服务器

  1. 分配他们
  2. 将一个此种类型的变量赋值给另外一个变量
  3. 用FD_ZERO,FD_SET,FD_CLR和FD_ISSET宏指令来修改和检查他们
    select的两个输入:
  4. 读集合的描述输入(fdset)
  5. 读集合的基数(n)
    反作用:select修改了参数fdset指向的fd_set,指明读集合中一个称为准备好集合的子集

利用select实现一个迭代echo服务器:
多线程


一旦select返回,就用FD_ISSET宏指令来判断哪一个能够进行读了并发

基于I/O多用复路的并发事件驱动服务器

一个状态机就是一组状态输入事件转移,其中转移就是将状态和输入事件映射到状态
自循环同一个输入和输出之间的转换
函数

  • select函数检测到输入事件
  • add_client函数建立一个新的逻辑流
  • check_clients函数经过回送输入行来执行状态转移

服务器使用I/O多用复,借助select函数检测输入事件的发生

clientfd数组表示已链接描述符的集合,其中整数-1表示一个可用的槽位

编码

I/O多用复路技术的优劣:

优势:操作系统

  1. 它比基于进程的设计给程序员更多的对程序行为的控制
  2. 一个基于I/O多用复路用事件驱动服务器是运行在一个单一进程上下文,并每一个逻辑流都能访问该进程的所有地址空间
    缺点:
  • 编码复杂

基于线程的并发编程

每一个线程都有它本身的线程上下文,包括一个惟一的整数线程ID,栈,栈指针,程序计数器,通用目的寄存器和条件码

线程执行模型

主线程:每一个进程开始生命周期都是单一线程
某时刻,主线程建立一个对等线程,今后时开始,两个线程并发运行

线程和进程的区别:

  • 一个线程的上下文比一个进程的上下文小不少
  • 线程上下文的切换要比进程上下文的切换快不少
  • 进程是按照严格的父子层次来组织的,线程则是对等的池

    Posix线程

  • 建立线程

  • 终止线程
  1. 当顶层的线程例程返回时,线程会隐式地终止
  2. 经过调用pthread_exit函数,线程会显式地终止
  3. 某个对等线程调用Unix的exit函数,该函数终止进程以及与该进程相关的全部线程
  4. 另外一个对等线程经过当前线程ID做为参数调用pthread_cancle函数来终止当前线程
  • 回收已终止线程的资源

    pthread_join函数会堵塞,直到线程tid终止,将线程例程返回的(void)指针赋值为pthread_return指向的位置,而后回收*已终止线程占用的全部储存器资源

  • 分离线程
    在任意一个时间点上,线程是可结合的或者是分离的

  • 初始化线程

多线程程序中的共享变量

一般,线程的寄存器是从不共享的,而虚拟储存器老是共享的

将变量映射到存储器

  • 全局变量:是定义在函数以外的变量,任何线程均可以引用
  • 本地自动变量:是定义在函数内部可是没有static属性的变量
  • 本地静态变量:是定义在函数内部并有static属性的变量

共享变量

若说变量v是共享的,当且仅当它的一个实例被一个以上的线程引用

用信号量同步线程

在共享变量的同时引入了同步错误的可能性
通常而言,没有办法预测操做系统是否能为你的线程选择一个正确的顺序

进度图

进度图将n个并发线程的执行模型化为一条n维笛卡尔空间中的轨迹线

图的原点对应于没有任何线程完成一条指令的初始状态


在进度图中,两个临界区的交集造成的状态空间区域称为不安全区

信号量

  • P(s):若是s是非零的,那么P将s减1,而且当即返回。若s为零,则挂起这个线程,直到s非零
  • V(s):V操做将s加1

使用信号量来实现互斥

基本思想:将每一个共享变量与一个信号量s联系起来,而后用P(s)和V(s)操做将相应的临界区包围起来

利用信号量来调度共享资源

生产者-消费者问题

基于预线程化的并发服务器

使用线程提升并行性

最简单的方法:将序列划分红t个不相交区域,而后给t个不一样的线程每一个分配一个区域

并行程序的加速比:


其余并发问题

线程安全

四个线程不安全函数类:

  • 不保护共享变量的函数
  • 保持跨越多个调用的状态的函数
  • 返回指向静态变量指针的函数
  • 调用线程不安全函数的函数

可重入性

在线程化的程序中使用已存在的函数库

竞争

当一个程序的正确性一个线程要在另外一个线程到达y点以前到达它的控制流中的x点时,就会发生竞争

死锁


避免死锁的规则:
互斥锁加锁顺序规则:若是对于程序中每对互斥锁(s,t),每一个同时占用s和t的线程都按照相同的顺序对它们加锁,那这个程序是无死锁的

相关文章
相关标签/搜索