目录
一、进程通信
进程通信指进程之间的消息交换
- 低级通信:进程间仅交换一些状态和少量数据。如:进程之间的互斥和同步使用信号量机制通信。信号量机制作为通信工具的缺点:①效率低;②通信对用户不透明(透明:用户看不见)
- 高级通信:进程间可交换大量数据。用户可直接利用操作系统提供的一组通信命令,高效地传送大量数据的一种通信方式。OS隐藏了进程通信的细节,对用户透明,减少了通信程序编制上的复杂性
1.进程通信的类型
高级通信机制可归结为三大类:共享存储器系统、消息传递系统、管道通信系统
(1)共享存储器系统
相互通信的进程间共享某些数据结构或共享存储区,通过这些空间进行通信
①基于共享数据结构的通信方式
进程公用某些数据结构,借以实现诸进程间的信息交换。如:可以被多个函数访问调用的全局变量;生产者—消费者问题中的buffer
实现:公用数据结构的设置及对进程间同步的处理,都是程序员的职责。操作系统提供共享存储器
特点:低效。只适合传递相对少量的数据
②基于共享存储区的通信方式
在存储器中划出一块共享存储区,诸进程在通信前申请获得共享存储区中的一个分区,并将这个分区附加到自己的地址空间中,便可以通过对共享存储区中数据的读或写来实现通信,通信完成后归还。【如:黑板上划出一块留言板。进程干这些事,不需要OS】
(2)消息传递系统
消息传递系统将消息从源端发送到目的端,发送方以格式化的形式发送信息(把要通信的数据封装在信息当中),程序员直接利用系统提供的一组通信命令(原语),来实现进程和进程之间的数据交换进行通信【如:计算机网络,网络报文】
(3)管道通信
管道:指用于连接一个读进程和一个写进程以实现他们之间通信的一个打开的共享文件,又名pipe文件
为了协调双方的通信,管道机制必须提供以下三方面的协调能力:① 互斥,即当一个进程正在对 pipe 执行读 / 写操作时,其它 ( 另一 ) 进程必须等待。② 同步,指当写进程把一定数量的数据写入 pipe ,便去睡眠等待,直到读进程取走数据后再把它唤醒。当读进程读一空 pipe 时,也应睡眠等待,直至写进程将数据写入管道后才将之唤醒。③ 确定对方是否存在,只有确定了对方已存在时才能进行通信。
2.消息传递通信的实现方法
进程间通信时,源进程可以直接或间接地将消息传送给目标进程,由此可将进程通信分为直接通信和间接通信
(1)直接通信方式
发送进程利用OS提供的发送命令,直接把消息发送给目标进程。发送进程和接收进程都以显式方式提供对方的标识符
通信原语:
利用直接通信原语解决生产者—消费者问题——
当生产者生产出一个产品(消息)后,便用Send原语将消息发送给消费者进程;而消费者进程则利用Receive原语来得到一个消息。若消息尚未产生出来,消费者必须等待,直至生产者进程将消息发送过来
(2)间接通信方式——通过信箱通信
信箱用来暂存发送进程发送给目标进程的消息,接收进程则从信箱中取出发送给自己的消息
消息在信箱中可安全保存,只允许核准的目标用户随时读取。利用信箱通信方式,既可实时通信,又可非实时通信(A、B给我发邮件,我立马看了是实时,我过了段时间才看是非实时)
信箱可由操作系统创建,也可由用户进程创建,创建者是信箱的拥有者。根据创建者不同信箱分成了3类
- 私用信箱(用户进程创建,单向通信链路方式通信)
- 公用信箱(操作系统创建,并分配访问权限给进程,这些进程可以访问邮箱发送接收消息,如:老师创建了一个公用信箱,把作业发到邮箱里,告诉家长邮箱的名称和密码,家长每天登录邮箱看作业,双向通信链路方式通信)
- 共享信箱(某一进程创建,创建时指明该信箱是共享的,以及能共享该信息的进程)
3.消息传递系统实现中的若干问题
(1)通信链路
通信链路是为了让发送进程与接收进程之间能够通信,在它们两者之间建立一条通信链路
①根据通信链路建立方式分类
- 显示连接:先用“建立连接”命令(原语)建立一条通信链路;通信;用显示方式拆除链路。——用于计算机网络
- 隐式连接:发送进程无须明确提出建立链路的要求,直接利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。——用于单机系统
②根据通信链路的连接方法分类
- 点—点连接通信链路【一个发送方一个接收方】
- 多点连接通信链路【一个发送方多个接收方】
③根据通信方式分类
- 单向通信链路【要么只能发,要么只能接收】
- 双向链路【既能发送又能接收】
④根据通信链路容量分类
- 无容量通信链路【通信时没有缓冲区,不需要暂存,直接把数据发送到接收端】
- 有容量通信链路
(2)消息的格式
- 单机系统环境(发送进程和接收进程在同一计算机当中):环境相同,消息格式简单
- 计算机网络环境(不在同一计算机当中):环境不同,消息的传输距离很远,消息格式比较复杂
(3)进程同步方式
在进程之间进行通信时,辅以进程同步机制,使诸进程间能协调通信【发送完了,才能接收;接收完了,才能发送】
发送进程或接收进程在完成消息的发送或接收后,都存在两种可能性:进程要么继续发送(接收)要么阻塞
- 发送进程阻塞、接收进程阻塞【紧密的同步方式,发送进程和接收进程之间没有缓冲区,发送进程直接发送给接收进程,接收进程直接接收,发送进程不发了阻塞起来,接收进程不接收阻塞起来】
- 发送进程不阻塞、接收进程阻塞【常用,一对多方式,一个发送方多个接收方,比如windows操作系统,有很多服务,如打印机服务,暂时用不着就会阻塞起来】
- 发送进程和接收进程均不阻塞【中间有一个缓冲区,如果发送方和接收方配合得好,可以一直发一直接收,不会阻塞,如果发送方发太快了,接收方读不完,发送方阻塞,否则接收方阻塞】
4.消息缓冲队列通信机制
消息缓冲队列通信机制应用于本地进程间通信,在这种通信机制中,发送进程利用 Send 原语将消
息直接发送给接收进程;接收进程则利用 Receive 原语接收消息。
(1)通信机制中的数据结构
消息缓冲队列通信方式中,主要利用的数据结构是消息缓冲区
①消息缓冲区
②PCB中有关通信的数据项
在进程的PCB中增加消息队列队首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量mutex和信号量sm
(2)发送原语
发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一发送区 a ,把待发送的消息正文、发送进程标识符、消息长度等信息填入其中,然后调用发送原语,把消息发送给目标 ( 接收 ) 进程。发送原语首先根据发送区 a 中所设置的消息长度 a.size 来申请一缓冲区 i,接着,把发送区 a 中的信息复制到缓冲区 i 中。为了能将 i挂在接收进程的消息队列 mq 上,应先获得接收进程的内部标识符 j ,然后将 i 挂在 j.mq 上。由于该队列属于临界资源,故在执行 insert 操作的前后都要执行 wait 和 signal 操作。
(3)接收原语
接收进程调用接收原语 receive(b) ,从自己的消息缓冲队列 mq 中摘下第一个消息缓冲区 i ,并将其中的数据复制到以 b 为首址的指定消息接收区内。
总之发送进程a想要发消息给b,就要先申请一个缓冲区,然后把消息放进这个缓冲区里,再把这个缓冲区挂到消息队列中,接收进程就可将消息从消息队列中移出来复制到自己的接收区当中
二、线程
1.引入
进程的两个基本属性
- 进程是一个可以拥有资源的独立单位
- 进程是一个可以独立调度和分派的基本单位
正是这两个基本属性,使进程成为一个能独立运行的基本单位,构成了进程并发执行的基础
进程并发执行所付出的时空开销——进程拥有资源使进程的创建、撤销和调度付出较大的时空开销,这就限制了系统中所设置进程的数目,而且进程切换也不宜过于频繁。因此,引入线程以减少程序在并发执行时所付出的时空开销,使 OS 具有更好的并发性
将进程的两个属性分开处理,第2个属性由线程实现
线程作为调度和分配的基本单位——
- 轻型实体
- 独立调度和分配的基本单位
- 可并发执行
- 共享进程资源
2.线程与进程比较
线程具有许多传统进程所具有的特征,所以称之为轻型进程。可以通过以下几个方面对进程和线程进行比较:
(1)调度的基本单位
进程:在传统的OS中,进程作为独立调度和分配的基本单位,
线程:而在引入进程的操作系统中。线程变成了资源调度和分派的基本单位,可以把线程理解成 “轻量级进程”。
(2)并发性
进程与进程:进程和进程可以实现并发。
进程内的各线程:也可以实现并发,从而进一步提升了并发性
(3)拥有资源
进程: 进程可以拥有资源,并作为系统中拥有资源的一个基本单位。
线程: 线程只拥有少量的,能保证独立运行的资源,还允许多个线程共享资源。
(4)独立性
同一进程内的不同线程: 独立性低, 因为同一进程内的不同线程是为了提高并发性和相互之间的合作而创建的,他们共享进程内的地址空间和资源。
不同进程内的不同线程: 独立性高,为了防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其他资源,除了共享全局变量以外,不允许其他进程访问。
(5)系统开销
进程:开销大。在创造或撤销进程时,系统都要为之分配和回收PCB,分配或回收其他资源(如I/O设备)
线程:开销小。不需要涉及PCB的分配,系统开销明显小于进程。并且切换线程的代价也远低于进程的切换。
(6)支持多处理机系统
单线程进程: 在多处理机系统中,进程只能运行在1个处理机上。
多线程进程: 在多处理机系统中,进程可以在多个处理机上并发运行,无疑加速了进程了完成。
3.线程的状态和线程控制块(略)
(1)线程运行的三个状态
线程在运行时也具有下述三种基本状态:(1)执行状态;(2)就绪状态;(3)阻塞状态
(2)线程控制块TCB
线程控制块TCB,用于记录所有用于控制和管理线程的信息
(3)多线程OS中的进程属性
- 多线程OS中的进程有以下属性:
- 进程是一个可拥有资源的基本单位
- 多个线程可并发执行
- 进程已不是可执行的实体