《深入理解计算机系统》 第十三章 并发编程

并发程序(concurrent program)
构造并发程序的方法:进程、I/O多路复用、线程
进程:每个逻辑控制流都是一个进程,由内核来调度和维护。进程有独立的虚拟地址空间,想要和其他流通信,控制流必须使用某种显式的进程间通信机制。
I/O多路复用:应用程序在一个进程的上下文中显式地调用他们自己的逻辑流。
线程:运行在一个单一进程上下文中的逻辑流,由内核进行调度。是其他两种方式的混合体,像进程流一样由内核进行调度,而像I/O多路复用流一样共享同一个虚拟地址空间。

13.1基于进程的并发编程
在父进程中接受客户端连接请求,然后创建一个新的子进程来为每个新客户端提供服务。

13.2 基于I/O多路复用的并发编程
使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
13.2.1 基于I/O多路复用的并发事件驱动服务器
I/O多路技术可以用作并发事件驱动程序的基础,在事件驱动中,流是作为某种事件的结果前进的,一般概念是将逻辑流模型化为状态机,不严格的说一个状态机就是一组状态、输入事件和转移。
13.2.2 I/O多路复用技术的优劣
优点:基于进程,每个逻辑流都能访问该进程的全部地址空间,使得共享数据容易。
缺点:编码复杂,

13.3 基于线程的并发编程
一个线程就是运行在一个进程上下文中的一个逻辑流。每个线程都有自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的的寄存器和条件码。所有的运行在一个进程里的线程共享该进程的整个虚拟地址空间。
13.3.1 线程执行模型
在这里插入图片描述
线程的上下文要比进程的上下文小的多,所以切换较快。线程不是像进程一样按照严格的父子层次来组织的。和一个进程相关的线程组成一个对等线程池,独立于其他线程创建的线程。每个对等线程都能读写相同的共享数据。
13.3.2 Posix线程
C程序中一个处理线程的标准接口,pthreads定义了大约60个函数,允许程序创建、杀死和回收线程,与对等线程安全地共享数据,还可以通知对等线程系统状态的变化。

在这里插入图片描述
在这里插入图片描述
13.3.3 创建线程
在这里插入图片描述
13.3.4 终止线程
顶层的线程例程返回时,线程会隐式地终止。
通过调用pthread_exit函数,线程会显示地终止,该函数会返回一个指向返回值thread_return的指针。
在这里插入图片描述

对某个对等线程调用Unix的exit函数,该函数终止进程以及所有与该进程相关的线程。
调用当前线程ID来pthread_cancle函数终止当前线程。
在这里插入图片描述

13.3.5 回收已终止线程的资源

调用pthread_join函数等待其他线程终止,该函数会阻塞,直到指定的线程终止,然后回收已终止线程占用的所有存储器资源。
在这里插入图片描述

13.3.6 分离线程
在任何一个时间点,线程是可结合的(joinable)或者是分离的(detached)。可结合的线程能够被其他线程收回其资源和杀死,在被其他线程回收之前,它的存储器资源是不释放的。相反,一个分离的线程不能被其他线程回收或杀死的,其存储器资源在终止时由系统自动释放。
在这里插入图片描述
13.3.7 初始化线程

在这里插入图片描述
13.3.8 一个基于线程的并发服务器

13.4 多线程程序中的内存变量
13.4.1 线程存储器模型
每个线程都有自己独立的线程上下文,包括线程ID、栈、栈指针、程序计数器、条件代码和通用目的寄存器值。每个线程和其他线程一起共享进程上下文的剩余部分。这包括整个用户虚拟地址空间,它是由只读文本(代码)、读/写数据、堆以及所有的共享库代码和数据区域组成的,线程也共享同样的打开文件的集合。

13.4.2 将变量映射到存储器
在这里插入图片描述

13.4.3 共享变量
13.5 用信号同步线程
共享变量方便但却会引起同步错误

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值