操作系统课件os02进程通信和线程.ppt_第1页
操作系统课件os02进程通信和线程.ppt_第2页
操作系统课件os02进程通信和线程.ppt_第3页
操作系统课件os02进程通信和线程.ppt_第4页
操作系统课件os02进程通信和线程.ppt_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统 Operating Systems,2.5 进 程 通 信,进程通信:进程之间的信息交换,其所交换的信息量: 一个状态或数值 成千上万个字节 低级通信: 进程之间的互斥和同步 交换量的比较少 高级通信: 用户可直接利用OS所提供的一组通信命令高效地传送大量数据的一种通信方式。,进程通信的类型,1 共享存储器系统 基于共享数据结构的通信方式 基于共享存储区的通信方式 2 消息传递系统 3 管道通信系统,1 共享存储器系统,基于共享数据结构的通信方式 诸进程公用某些数据结构 如:在生产者消费者问题 增加了程序员的负担 OS只须提供共享存储器 低效的,只适于传递相对少量的数据。,共享存储器系统,基于共享存储区的通信方式 诸进程通过对共享存储区中数据的读或写来实现通信。 通信方式属于高级通信 先向系统申请获得共享存储区中的一个分区 像读、写普通存储器一样地读、写该公用存储分区。,进程1,进程2,物理主存,共享主存,2 消息传递系统,属于高级通信方式 程序员直接利用操作系统提供的一组通信命令(原语) 进程间的数据交换 以格式化的消息(message)为单位的 因实现方式的不同而进一步分成: 直接通信方式 间接通信方式,3 管道通信,管道 是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。,管道机制必须的协调能力,互斥 同步 当写进程把一定数量的数据写入pipe,便去睡眠等待, 读进程取走数据后,再把它唤醒。 当读进程读一空pipe时,也应睡眠等待 写进程将数据写入管道后,才将之唤醒。 确定对方是否存在 只有确定了对方已存在时,才能进行通信。,2.5.2 消息传递通信的实现方法,直接通信方式 间接通信方式,1. 直接通信方式,发送进程利用OS所提供的发送命令,直接把消息发送给目标进程。 系统提供下述两条通信命令(原语): Send(Receiver,message);发送一个消息给接收进程 Receive(Sender,message);接收Sender发来的消息 要求发送进程和接收进程都以显式方式提供对方的标识符 原语Send(P2,m1) 原语Receive(P1,m1),解决生产者消费者问题,repeat produce an item in nextp; send(consumer,nextp); until false;,repeat receive(producer,nextc); consume the item in nextc; until false,2. 间接通信方式,进程之间的通信需要通过作为共享数据结构的实体。 该实体用来暂存发送进程发送给目标进程的消息; 接收进程从该实体中取出对方发送给自己的消息。 这种中间实体称为信箱 消息在信箱中可以安全地保存, 只允许核准的目标用户随时读取。,信箱通信原语,信箱的创建和撤消。 创建者进程应给出信箱名字、信箱属性; 对于共享信箱,还应给出共享者的名字。 当进程不再需要读信箱时,可用信箱撤消原语将之撤消 消息的发送和接收。 Send(mailbox,message); Receive(mailbox,message);,信箱分类,私用信箱 公用信箱 共享信箱,私用信箱,用户进程可为自己建立一个新信箱,并作为该进程的一部分。 当拥有该信箱的进程结束时,信箱也随之消失。 可采用单向通信链路的信箱来实现 信箱的拥有者有权从信箱中读取消息, 其他用户只能将自己构成的消息发送到该信箱中。,公用信箱,它由操作系统创建,提供给系统中的所有核准进程使用。 公用信箱在系统运行期间始终存在。 公用信箱应采用双向通信链路的信箱来实现。 核准进程既可把消息发送到该信箱中, 也可从信箱中读取发送给自己的消息。,共享信箱,由某进程创建,创建时提供共享进程(用户)的名字 拥有者和共享者均可读取自己消息。,2.5.3 消息传递系统实现中的若干问题,1通信链路 建立通信链路的方式 (1)由发送进程在通信之前用显式的“建立连接”命令(原语)请求系统为之建立一条通信链路; 主要用于计算机网络中。 (2)发送进程无须明确提出建立链路的请求,只须利用系统提供的发送命令(原语),系统会自动地为之建立一条链路。 主要用于单机系统中。,通信链路,根据通信链路的连接方法,可把通信链路分为两类: (1) 点点连接通信链路; (2) 多点连接链路,指用一条链路连接多个(n2)结点(进程) 根据通信方式的不同,可把链路分成两种: 单向通信链路; 双向通信链路; 根据通信链路容量,把链路分成两类: (1)无容量通信链路; (2)有容量通信链路,2消息的格式,单机系统环境 其消息格式比较简单; 计算机网络环境 可把一个消息分成消息头和消息正文两部分。 消息头包括消息在传输时所需的控制信息 如源进程名、目标进程名、消息长度、消息类型、消息编号及发送的日期和时间; 定长消息格式和变长消息格式,3 同步方式,send( )时 阻塞:等待接收进程回答消息后,才继续进行 非阻塞:发送方可继续运行,直到某个时刻需要接收进程返回的回答消息后,才查询和处理。 Receive()时 阻塞:如果没有消息,接收进程会被阻塞,直到有消息;如果有消息,则会立即获得一个消息并返回 非阻塞:查询后,立即返还控制给调用进程;如果有消息,就返回消息;否则表明无消息可用。这种方法允许接收进程轮询信箱,通信进程的同步,发送进程阻塞,接收进程阻塞 主要用于进程之间紧密同步 发送进程和接收进程之间无缓冲时。 发送进程不阻塞,接收进程阻塞。 应用最广的进程同步方式 常用于服务进程 发送进程和接收进程均不阻塞。,2.5.4 消息缓冲队列通信机制,数据结构 1).消息缓冲区: type message_buffer=record sender;发送进程标识符 size; 消息长度 text; 消息正文 next; 指向下一缓冲区指针 end,2.5.4 消息缓冲队列通信机制,2).PCB中有关通信的数据项: type processcontrol block=record mq; 消息队列队首指针 mutex; 消息队列互斥信号量 sm; 消息队列资源信号量 end,发送原语,procedure send(receiver, a) begin getbuf(a.size,i); 根据a.size申请缓冲区; i.sender=a.sender; i.size=a.size; i.text=a.text; i.next=0; getid(PCB set, receiver.j); 获得接收进程内部标识符; wait(j.mutex); insert(j.mq, i); 将消息缓冲区插入消息队列; signal(j.mutex); signal(j.sm); end,消息缓冲通信,接收原语,procedure receive(b) Begin j:= 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,2.6 线 程,1 线程的引入 在创建、撤消和切换中,系统必须为之付出较大的时空开销 进程数目不宜过多,进程切换的频率也不宜过高。 将拥有资源的单位和可独立调度/分派的基本单位分离,2线程与进程的比较,1) 调度 把线程作为调度和分派的基本单位 进程作为资源拥有的基本单位 2) 并发性,2线程与进程的比较,3) 拥有资源 4) 系统开销,进程,进程PCB,资源,线程 控制块 用户栈 核心栈,线程 控制块 用户栈 核心栈,线程 控制块 用户栈 核心栈,存储空间,全局数据,程序代码,线程1,线程2,线程 控制块 ,线程i,线程n,3线程的属性,轻型实体。 线程中的实体基本上不拥有系统资源 只是有一点必不可少的、 能保证其独立运行的资源 独立调度和分派的基本单位。 线程的切换非常迅速且开销小。 可并发执行。 共享进程资源。,3 线程的状态,线程的运行状态 执行状态 就绪状态 阻塞状态 线程的状态转换也类似于进程。,6多线程OS中的进程,在多线程OS中的进程具有的属性: 作为系统资源分配的单位。 可包括多个线程:至少也要有一个线程 进程不是一个可执行的实体。 进程仍具有与执行相关的状态 对进程所施加的与进程状态有关的操作,也对其线程起作用 进程挂起和激活,2.6.3 线程的实现方式,从实现角度看,线程分成: 用户级线程ULT 如 Java线程库 内核支持线程KST 如Window2003、OS/2。 混合式线程 如Solaris,1 内核支持线程,进程中的线程的创建、撤消和切换等都是利用系统调用进入内核,再由内核中相应的处理程序完成的。,内核支持线程主要优点,多处理器上,内核能同时调度同一进程中多个线程并行执行 进程中的一个线程被阻塞了,内核能调度同一进程的其它线程占有处理器运行。 内核支持线程数据结构和堆栈很小,线程切换较快 内核自身也可用多线程技术实现,能提高系统的执行速度和效率。,内核支持线程的主要缺点,对于用户的线程切换而言,其模式切换的开销较大,2 用户级线程,用户级线程仅存在于用户空间中 线程管理工作无须利用系统调用来实现,由用户空间中的线程库来完成。 内核不知道线程的存在,用户级线程,调度单位,内核支持线程,用户级线程,用户级线程(ULT)优点,线程切换不需要转换到内核空间 调度算法可以是进程专用的。 用户级线程的实现与操作系统平台无关,用户级线程(ULT)的缺点,系统调用的阻塞问题。 多线程应用不能利用多处理机进行多重处理的优点: 内核在一段时间里,分配一个进程仅占用一个CPU 进程中仅有一个线程能执行。,CPU,3组合方式,线程的实现两个层次: 用户层和核心层 内核支持多KST的建立、调度和管理; 允许应用程序建立、调度和管理ULT。,组合方式,应用程序的多个ULT能分配和对应于一个或多个KLT. 一个应用中的多个线程能同时在多处理器上并行运行 阻塞一个线程时并不需要封锁整个进程。,用户空间,线程库,P,内核空间,P,作业,P83 34 36 37,UNIX系统,UNIX系统最本质的特征是开放性。 所谓开放性,是指系统遵循国际标准规范;凡遵循国际标准所开发的硬件和软件,均能彼此兼容,并可方便地实现互连。 人们普遍认为: UNIX是目前开放性最好的OS,是目前惟一能稳定运行在从微型机到大、中型等各种机器上的OS 还能方便地将已配置了UNIX OS的机器互连成计算机网络。 UNIX系统是一个多用户、多任务OS,UNIX核心的框图,10.2.3 进程控制,创建进程(fork)。 终止进程(exit)。 等待子进程结束(wait)。 用于将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。 父进程可以利用wait使自身的执行与子进程的终止同步。 获得进程ID,创建进程,fork( )-父子进程是独立的进程 创建一个新进程,即调用fork( )父进程的副本,称为子进程。 子进程继承了父进程的许多特性。 父进程与子进程并发执行,进程的创建,系统调用格式: int pid=fork( ) ; fork( )返回值意义如下: 0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。对子进程返回0 0:在父进程中,pid变量保存的fork( )返回值为子进程的id值。向父进程返回子进程的进程号 -1:创建失败。,进程的创建,实例:编写一段程序,使用系统调用fork( )创建一个子进程。 当此程序运行时,在系统中有一个父进程和一个子进程活动。 让每一个进程在屏幕上显示不同的字符串: 子进程显示这是子进程 父进程显示 这是父进程 ,main() pid_t pid; printf(“PID); pid=fork(); if(pid!=0) printf(“这是父进程”); else printf(“这是子进程); ,main( ) pid_t pid; printf(“PID); pid=fork(); if(pid!=0) printf(“这是父进程”); else printf(“这是子进程); ,main( ) pid_t pid; printf(“PID); pid=fork(); if( pid !=0) printf(“这是父进程”); else printf(“这是子进程); ,父进程,父进程,子进程,分裂,执 行,10.3.2 信号机制,信号机制 主要是作为在同一用户的诸进程之间通信的简单工具 信号本身是一个119中的某个整数 用来代表某一种事先约定好的简单消息 发送信号 可利用系统调用kill向另一进程或一组进程发送一个信号。 表示某进程已发生了某种异常事件,信号机制,每个进程在执行时,都要通过信号机制来检查是否有信号到达。 若有信号到达,则: 立即中断正在执行的进程 转向由该信号(某整数)所指示的处理程序,去完成对所发生的事件(事先约定)的处理。 处理完毕,再返回到此前的断点处继续执行。,预置处理方式,系统调用signal(sig,func) 参数sig为信号名 func用于预置处理方式,可分成三种情况: (1)func=1时,进程对sig类信号不予理睬。 (2)func=0,为缺省值,进程在收到sig信号后应自我终止 (3)func为非0、非1类整数时,就把func的值作为指向某信号处理程序的指针。 如: signal(16,stop); /接收到软中断信号16,转stop,Process A,begin /*向B发软中断信号16*/ kill(B,16); end,Process B,Begin signal(16,stop); End void stop() mark=0; ,10.3.3 管道机制,管道的类型 无名管道(Unnamed Pipes) 这是一个临时文件,利用系统调用pipe( )建立。 只有调用pipe的进程及其子孙进程才能利用该文件(管道)进行通信 有名管道(Named Pipes) 利用mknod系统调用建立的 可以在文件系统中长期存在的、具有路径名的文件 其它进程可以感知它的存在,并能利用该路径名来访问该文件。,父进程: int fd2; char OutPipe100,InPipe100;/ 定义两个字符数组 pipe(fd);/ 创建无名管道 read(fd0,InPipe,50);,子进程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论