08-进程通信与线程模型
进程通信
进程通信的基本概念
进程通信可以通过共享存储、消息传递、管道通信这三个方式实现
进程通信:进程之间的信息交换
进程是分配系统资源的单位,因此各进程拥有的内存地址空间相互独立
为了保证安全,一个进程不能直接访问另一个进程的地址空间,但是进程之间的信息交换又是必须实现的,为了保证进程间的安全通信,操作系统提供了一些方法。
共享存储
- 共享存储
两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)比如(P、V操作)
基于数据库的共享
- 基于数据结构的共享
- 比如共享空间只能放长度为10的数组,这种共享方式速度慢、限制多
- 是一种低级的共享方式
基于存储区的共享
- 基于存储区的共享
- 在内存中画出一块共享存储区,数据的形式、存放的位置由进程控制
- 是一种高级的共享方式
- 相比之下,这种共享方式速度更快,是一种高级通信方式
消息传递
1.消息传递
进程间的数据以格式化的消息为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换
直接通信方式
直接通信方式:消息直接挂到接收进程的消息缓冲队列上
间接通信方式
间接通信方式:消息要发送到中间实体中,因此也成为“信箱通信方式"
管道通信
- 管道是指在内存中开辟一个大小固定的缓冲区
- 管道只能采用半双工通信,某一个时间段内只能实现单向传输
- 如果要实现双向同时通信,需要设置两个管道
- 各进程要互斥的访问管道
- 数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
- 如果没写满,就不允许读。如果没读空,则不允许写
- 数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况
线程概念和多线程模型
线程的基本概念
有的进程可能需要“同时”做很多事,而传统的进程只能串行的执行一系列程序。为此引入了“线程”,增加并发度
线程可以理解为轻量级进程
线程是一个基本的CPU执行单元,也是系统执行流的最小单位
进程是作为除CPU外系统资源的分配单元
引入线程的结果
- 进程间可以并发
- 各个线程之间也可以并发
- 提高了并发度,使得进程之间可以并发处理各个任务
带来的变化
资源分配、调度
- 资源分配、调度
- 传统进程机制中,进程是资源分配、调度的基本单位
- 引入线程后,进程是资源分配的基本单位,线程是调度的基本单位
并发性
- 并发性
- 传统进程机制中,只能进程间并发
- 引入线程后,各线程间也能并发,提高了并发度
系统开销
- 系统开销
- 传统进程间并发,需要切换进程的运行环境,系统开销很大
- 线程间并发,如果是统一进程内的线程切换,则不需要切换进程环境、系统开销小
- 引入线程后,并发带来的系统开销小
线程的重要属性
- 线程是处理机调度的单位
- 多CPU计算机中,各个线程可占用不同的CPU
- 每个线程都有过一个线程ID,线程控制块TCB
- 线程也有就绪、阻塞、运行三种基本状态
- 线程几乎不拥有系统资源
- 同一进程的不同线程间共享进程的资源
- 由于共享内存地址,同一进程中的线程间通信甚至不许系统干扰
- 同一进程中的线程切换,不会引起进程切换
- 不同进程中的线程切换,会引起进程切换
- 切换同进程中的线程,开销会很小
- 切换进程,系统开销较大
线程的实现方式
用户级线程
- 用户级线程
- 应用程序通过线程库实现
- 所有的线程管理工作由应用程序负责
- 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预
- 从用户看来,是有多个线程;但在操作系统看来,并不意识到线程的存在
内核级线程
- 内核级线程
- 内核级线程的管理工作由操作系统完成
- 内核级线程的切换需要在核心态完成
- 内核级线程是指从操作系统内核视角能看到的线程
- 内核级线程才是处理机分配的单位
- 例如:假如一个进程由两个内核级线程、三个用户级线程,在用户看来,该进程中有三个线程,但即使该进程运行在一个四处理机的计算机上运行,也最多只能被分配到两个核,最多只有两个用户线程并发执行
多线程模式
在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了多线程模型的问题
多对一模型
- 多对一模型
- 多个用户级线程映射到一个内核级线程。每个用户线程只能对应一个内核级线程
- 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高
- 缺点:如果一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高.多个线程不可在多核处理机上处理
一对一模型
- 一对一模型
- 一个用户级线程映射到一个内核级进程。每个用户进程有与用户级线程同数量的内核级进程
- 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强.多线程可以在多核处理机上并发执行
多对多模型
- 多对多模型
- n用户级线程映射到m个内核级线程.每个用户线程对应m个内核级线程
- 克服了多对一模型中并发度不高的缺点,又客服了一对一模型中一个用户进程占用太多用户级线程,开销太大的缺点