第1页:第二章 进程管理封面
第二章 进程管理:本页为《计算机操作系统》课件封面,标注课程名称与英文名称 Operating Systems,并列出 WINDOWS、UNIX、LINUX 等常见操作系统类型。
第2页:2.5进程通信
2.5进程通信
- 进程通信:进程之间的信息交换,其所交换的信息量
- 一个状态或数值
- 成千上万个字节
- 低级通信
- 进程之间的互斥和同步
- 交换量的比较少
- 高级通信
- 用户可直接利用OS所提供的一组通信命令高效地传送大量数据的一种通信方式
第3页:进程通信的类型
进程通信的类型
- 进程通信的类型1共享存储器系统
- 基于共享数据结构的通信方式
- 基于共享存储区的通信方式2消息传递系统3管道通信系统
第4页:共享存储器系统:共享数据结构
共享存储器系统:共享数据结构
- 1共享存储器系统
- 基于共享数据结构的通信方式
- 诸进程公用某些数据结构
- 如:在生产者—消费者问题
- 增加了程序员的负担
- OS只须提供共享存储器
- 低效的,只适于传递相对少量的数据
第5页:共享存储器系统:共享存储区
共享存储器系统:共享存储区
- 共享存储器系统
- 基于共享存储区的通信方式
- 诸进程通过对共享存储区中数据的读或写来实现通信
- 通信方式属于高级通信
- 先向系统申请获得共享存储区中的一个分区
- 像读、写普通存储器一样地读、写该公用存储分区。进程1进程2物理主存共享主存
第6页:消息传递系统
消息传递系统
- 2消息传递系统
- 属于高级通信方式
- 程序员直接利用操作系统提供的一组通信命令(原语)
- 进程间的数据交换
- 以格式化的消息(message)为单位的
- 因实现方式的不同而进一步分成
- 直接通信方式
- 间接通信方式
第7页:管道通信
管道通信
- 3管道通信
- 管道
- 是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。写进程共享文件读进程
第8页:管道机制的协调能力
管道机制的协调能力
- 管道机制必须的协调能力1.互斥2.同步
- 当写进程把一定数量的数据写入pipe,便去睡眠等待
- 读进程取走数据后,再把它唤醒
- 当读进程读一空pipe时,也应睡眠等待
- 写进程将数据写入管道后,才将之唤醒。3.确定对方是否存在
- 只有确定了对方已存在时,才能进行通信
第9页:2.5.2消息传递通信的实现方法
2.5.2消息传递通信的实现方法
第10页:直接通信方式
直接通信方式
- 1.直接通信方式
- 发送进程利用OS所提供的发送命令,直接把消息发送给目标进程
- 系统提供下述两条通信命令(原语)
- 要求发送进程和接收进程都以显式方式提供对方的标识符
第11页:用消息传递解决生产者-消费者
用消息传递解决生产者-消费者
解决生产者—消费者问题repeatproduce an item in nextp;send(consumer,nextp);until false;repeatreceive(producer,nextc);consume the item in nextc;until false
第12页:间接通信方式
间接通信方式
- 2.间接通信方式
- 进程之间的通信需要通过作为共享数据结构的实体
- 该实体用来暂存发送进程发送给目标进程的消息
- 接收进程从该实体中取出对方发送给自己的消息
- 这种中间实体称为信箱
- 消息在信箱中可以安全地保存
- 只允许核准的目标用户随时读取
第13页:信箱通信原语
信箱通信原语
- 信箱通信原语1.信箱的创建和撤消
- 创建者进程应给出信箱名字、信箱属性
- 对于共享信箱,还应给出共享者的名字
- 当进程不再需要读信箱时,可用信箱撤消原语将之撤消2.消息的发送和接收
第14页:信箱的分类
信箱的分类
第15页:私用信箱
私用信箱
- 用户进程可为自己建立一个新信箱,并作为该进程的一部分
- 当拥有该信箱的进程结束时,信箱也随之消失
- 可采用单向通信链路的信箱来实现
- 信箱的拥有者有权从信箱中读取消息
- 其他用户只能将自己构成的消息发送到该信箱中
第16页:公用信箱
公用信箱
- 它由操作系统创建,提供给系统中的所有核准进程使用
- 公用信箱在系统运行期间始终存在
- 公用信箱应采用双向通信链路的信箱来实现
- 核准进程既可把消息发送到该信箱中
- 也可从信箱中读取发送给自己的消息
第17页:共享信箱
共享信箱
- 由某进程创建,创建时提供共享进程(用户)的名字
- 拥有者和共享者均可读取自己消息
第18页:消息传递系统实现中的问题
消息传递系统实现中的问题
- 2.5.3消息传递系统实现中的若干问题1.通信链路
- 建立通信链路的方式
- (1)由发送进程在通信之前用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路
- 主要用于计算机网络中
- (2)发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动地为之建立一条链路
- 主要用于单机系统中
第19页:通信链路
通信链路
- 根据通信链路的连接方法,可把通信链路分为两类
- (1)点—点连接通信链路
- (2)多点连接链路,指用一条链路连接多个(n>2)结点(进程)
- 根据通信方式的不同,可把链路分成两种
- (1)单向通信链路
- (2)双向通信链路
- 根据通信链路容量,把链路分成两类
- (1)无容量通信链路
- (2)有容量通信链路
第20页:消息的格式
消息的格式
- 2.消息的格式
- 单机系统环境
- 其消息格式比较简单
- 计算机网络环境
- 可把一个消息分成消息头和消息正文两部分
- 消息头包括消息在传输时所需的控制信息
- 如源进程名、目标进程名、消息长度、消息类型、消息编号及发送的日期和时间
- 定长消息格式和变长消息格式
第21页:同步方式
同步方式
- 3同步方式
- 阻塞:等待接收进程回答消息后,才继续进行
- 非阻塞:发送方可继续运行,直到某个时刻需要接收进程返回的回答消息后,才查询和处理
- 阻塞:如果没有消息,接收进程会被阻塞,直到有消息;如果有消息,则会立即获得一个消息并返回
- 非阻塞:查询后,立即返还控制给调用进程;如果有消息,就返回消息;否则表明无消息可用。这种方法允许接收进程轮询信箱
第22页:通信进程的同步
通信进程的同步
- 发送进程阻塞,接收进程阻塞
- 主要用于进程之间紧密同步
- 发送进程和接收进程之间无缓冲时
- 发送进程不阻塞,接收进程阻塞
- 应用最广的进程同步方式
- 常用于服务进程
- 发送进程和接收进程均不阻塞
第23页:消息缓冲队列的数据结构
消息缓冲队列的数据结构
- 2.5.4消息缓冲队列通信机制
- 数据结构1).消息缓冲区:typemessage_buffer=recordsender;发送进程标识符size;消息长度text;消息正文next;指向下一缓冲区指针end
第24页:PCB中的通信数据项
PCB中的通信数据项:2.5.4消息缓冲队列通信机制2).PCB中有关通信的数据项:typeprocesscontrolblock=record…mq;消息队列队首指针mutex;消息队列互斥信号量sm;消息队列资源信号量…end。
第25页:发送原语send
发送原语send:发送原语proceduresend(receiver,a)begingetbuf(a.size,i);根据a.size申请缓冲区;i.sender∶=a.sender;i.size∶=a.size;i.text∶=a.text;i.next∶=0;getid(PCBset,receiver.j);获得接收进程内部标识符;wait(j.mutex);insert(j.mq,i);将消息缓冲区插入消息队列;signal(j.mutex);signal(j.sm);end。
第26页:消息缓冲通信
消息缓冲通信:消息缓冲通信。
第27页:接收原语receive
接收原语receive
接收原语procedure receive(b)Beginj:= internal name;j为接收进程内部的标识符;wait(j.sm);wait(j.mutex);remove(j.mq,i);将消息队列中第一个消息移出;signal(j.mutex);b.sender:=i.sender;将消息缓冲区i中的信息复制到接收区b;b.size:=i.size;b.text:=i.text;end
第28页:2.6线程与线程的引入
2.6线程与线程的引入
- 2.6线程1线程的引入
- 在创建、撤消和切换中,系统必须为之付出较大的时空开销
- 进程数目不宜过多,进程切换的频率也不宜过高
- 将拥有资源的单位和可独立调度/分派的基本单位分离
第29页:线程与进程的比较:调度
线程与进程的比较:调度
- 2.线程与进程的比较1)调度
- 把线程作为调度和分派的基本单位
- 进程作为资源拥有的基本单位2)并发性
第30页:线程与进程的比较:资源与开销
线程与进程的比较:资源与开销:2.线程与进程的比较3)拥有资源4)系统开销进程进程PCB资源线程控制块用户栈核心栈线程控制块用户栈核心栈线程控制块用户栈核心栈存储空间全局数据程序代码线程1线程2线程控制块…线程i线程n。
第31页:线程的属性
线程的属性
- 3.线程的属性
- 轻型实体
- 线程中的实体基本上不拥有系统资源
- 只是有一点必不可少的、能保证其独立运行的资源
- 独立调度和分派的基本单位
- 线程的切换非常迅速且开销小
- 可并发执行
- 共享进程资源
第32页:线程的状态
线程的状态
- 3线程的状态
- 线程的运行状态
- ①执行状态
- ②就绪状态
- ③阻塞状态
- 线程的状态转换也类似于进程
第33页:多线程OS中的进程
多线程OS中的进程
- 6.多线程OS中的进程
- 在多线程OS中的进程具有的属性
- (1)作为系统资源分配的单位
- (2)可包括多个线程:至少也要有一个线程
- (3)进程不是一个可执行的实体
- 进程仍具有与执行相关的状态
- 对进程所施加的与进程状态有关的操作,也对其线程起作用
- 进程挂起和激活
第34页:2.6.3线程的实现方式
2.6.3线程的实现方式
- 从实现角度看,线程分成
- 用户级线程ULT
- 如Java线程库
- 内核支持线程KST
- 混合式线程
第35页:内核支持线程
内核支持线程
- 1内核支持线程
- 进程中的线程的创建、撤消和切换等都是利用系统调用进入内核,再由内核中相应的处理程序完成的
第36页:内核支持线程的优点
内核支持线程的优点
- 内核支持线程主要优点
- 多处理器上,内核能同时调度同一进程中多个线程并行执行
- 进程中的一个线程被阻塞了,内核能调度同一进程的其它线程占有处理器运行
- 内核支持线程数据结构和堆栈很小,线程切换较快
- 内核自身也可用多线程技术实现,能提高系统的执行速度和效率
第37页:内核支持线程的缺点
内核支持线程的缺点
- 内核支持线程的主要缺点
- 对于用户的线程切换而言,其模式切换的开销较大
第38页:用户级线程
用户级线程
- 2用户级线程
- 用户级线程仅存在于用户空间中
- 线程管理工作无须利用系统调用来实现,由用户空间中的线程库来完成
- 内核不知道线程的存在
第39页:线程调度单位的比较
线程调度单位的比较
第40页:用户级线程的优点
用户级线程的优点
- 用户级线程(ULT)优点
- 线程切换不需要转换到内核空间
- 调度算法可以是进程专用的
- 用户级线程的实现与操作系统平台无关
第41页:用户级线程的缺点
用户级线程的缺点
- 用户级线程(ULT)的缺点
- 系统调用的阻塞问题
- 多线程应用不能利用多处理机进行多重处理的优点
- 内核在一段时间里,分配一个进程仅占用一个CPU
- 进程中仅有一个线程能执行。CPU
第42页:3.组合方式
3.组合方式
- 线程的实现两个层次
- 用户层和核心层
- 内核支持多KST的建立、调度和管理
- 允许应用程序建立、调度和管理ULT
第43页:ULT与KLT的对应关系
ULT与KLT的对应关系
- 组合方式
- 应用程序的多个ULT能分配和对应于一个或多个KLT
- 一个应用中的多个线程能同时在多处理器上并行运行
- 阻塞一个线程时并不需要封锁整个进程。用户空间线程库P内核空间P
第44页:作业
作业:作业。
第45页:UNIX系统的开放性
UNIX系统的开放性
- UNIX系统最本质的特征是开放性
- 所谓开放性,是指系统遵循国际标准规范;凡遵循国际标准所开发的硬件和软件,均能彼此兼容,并可方便地实现互连
- 人们普遍认为
- UNIX是目前开放性最好的OS,是目前惟一能稳定运行在从微型机到大、中型等各种机器上的OS
- 还能方便地将已配置了UNIX OS的机器互连成计算机网络
- UNIX系统是一个多用户、多任务OS
第46页:UNIX核心的框图
UNIX核心的框图:UNIX核心的框图。
第47页:10.2.3进程控制
10.2.3进程控制
- 创建进程(fork)
- 终止进程(exit)
- 等待子进程结束(wait)
- 用于将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止
- 父进程可以利用wait使自身的执行与子进程的终止同步
- 获得进程ID
第48页:进程的创建:fork
进程的创建:fork
- 创建进程
- fork( )-----父子进程是独立的进程
- 创建一个新进程,即调用fork( )父进程的副本,称为子进程
- 子进程继承了父进程的许多特性
- 父进程与子进程并发执行
第49页:fork系统调用与返回值
fork系统调用与返回值
- 进程的创建
- 系统调用格式:intpid=fork( );fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。对子进程返回0>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值。向父进程返回子进程的进程号-1:创建失败
第50页:fork创建子进程实例
fork创建子进程实例
- 进程的创建
- 实例:编写一段程序,使用系统调用fork( )创建一个子进程
- 当此程序运行时,在系统中有一个父进程和一个子进程活动
- 让每一个进程在屏幕上显示不同的字符串
第51页:fork程序示例代码
fork程序示例代码:main(){pid_t pid;printf(“PID…);pid=fork();if(pid!=0)printf(“这是父进程…”);elseprintf(“这是子进程…);}main( ){pid_t pid;printf(“PID…);pid=fork();if(pid!=0)printf(“这是父进程…”);elseprintf(“这是子进程…);}main( ){pid_t pid;printf(“PID…);pid=fork();if( pid !=0)printf(“这是父进程…”);elseprintf(“这是子进程…);}父进程父进程子进程分裂执行继续执行继续执行。
第52页:10.3.2信号机制
10.3.2信号机制
- 信号机制
- 主要是作为在同一用户的诸进程之间通信的简单工具
- 信号本身是一个1~19中的某个整数
- 用来代表某一种事先约定好的简单消息
- 发送信号
- 可利用系统调用kill向另一进程或一组进程发送一个信号
- 表示某进程已发生了某种异常事件
第53页:信号的检查与处理
信号的检查与处理
- 信号机制
- 每个进程在执行时,都要通过信号机制来检查是否有信号到达
- 若有信号到达,则
- 立即中断正在执行的进程
- 转向由该信号(某整数)所指示的处理程序,去完成对所发生的事件(事先约定)的处理
- 处理完毕,再返回到此前的断点处继续执行
第54页:预置处理方式
预置处理方式
- 参数sig为信号名
- func用于预置处理方式,可分成三种情况
- (1)func=1时,进程对sig类信号不予理睬
- (2)func=0,为缺省值,进程在收到sig信号后应自我终止
- (3)func为非0、非1类整数时,就把func的值作为指向某信号处理程序的指针
第55页:信号发送与处理示例代码
信号发送与处理示例代码:Process Abeginkill(B,16);…endProcess BBeginsignal(16,stop);……Endvoid stop(){ mark=0;}。
第56页:10.3.3管道机制
10.3.3管道机制
- 管道的类型
- 这是一个临时文件,利用系统调用pipe( )建立
- 只有调用pipe的进程及其子孙进程才能利用该文件(管道)进行通信
- 利用mknod系统调用建立的
- 可以在文件系统中长期存在的、具有路径名的文件
- 其它进程可以感知它的存在,并能利用该路径名来访问该文件
第57页:管道通信示例代码
管道通信示例代码:父进程:int fd[2];char OutPipe[100],InPipe[100];//定义两个字符数组pipe(fd);//创建无名管道……read(fd[0],InPipe,50);子进程……write(fd[1],OutPipe,50);//向管道写入数据……。
第58页:10.3.4消息机制
10.3.4消息机制
- 消息是一个格式化的、可变长度的信息单元
- 消息机制允许进程发送一个消息给任何其它进程
- 消息队列
- 当一个进程收到由其它多个进程发来的消息时,可将这些消息排成一个消息队列
- 每个消息队列有一个称为关键字key的名称,它是由用户指定的
第59页:消息队列的系统调用
消息队列的系统调用
- 消息队列的系统调用1.系统调用msgget()
- 建立一个指名的消息队列2.msgctl( )系统调用
- 对指定的消息队列进行操纵。3.消息发送系统调用msgsnd( )
- 核心唤醒在等待消息到来的睡眠进程。4.消息的接收系统调用msgrcv( )
- 从指定消息队列中读一个消息
第60页:消息机制客户端示例代码
消息机制客户端示例代码:void CLIENT( ){ ……msgqid=msgget(MSGKEY,0777|IPC_CREAT);msgsnd(msgqid,&msg,1030,0);……}void SERVER( ){ msgqid=msgget(MSGKEY,0777|IPC_CREAT);msgrcv(msgqid,&msg,1030,0,0);……msgctl(msgqid, IPC_RMID,0);}。
第61页:10.3.5共享存储区机制
10.3.5共享存储区机制:共享存储区机制是UNIX系统中通信速度最高的一种通信机制。
第62页:共享存储区的系统调用
共享存储区的系统调用
- 共享存储区的系统调用1.系统调用shmget( )
- 建立一块共享存储区2.shmctl( )系统调用
- 共享存储区的操纵3.系统调用shmat( )
- 将该共享存储区附接到用户给定的某个进程的虚地址shmaddr上,4.系统调用shmdt( )
- 利用该调用把该区与进程断开
第63页:共享存储区示例代码
共享存储区示例代码:Process ABeginshmid=shmget(SHMKEY,1024,0777|IPC_CREAT);addr=shmat(shmid,0,0);*addr=-1;……shmctl(shmid,IPC_RMID,0);end。