李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 第 6 讲 进程管理(4) 李元金 计算机与信息工程学院 E-mail: liyuanjin10@126.com 1/
进程管理 教学目标 教学内容 掌握P、V操作的实现。 了解进程通信的类型; 理解消息传递系统中的发送和接收原语; 理解线程的概念、线程间的同步、通信以及线程的实现 教学内容 P、V操作的实现 进程通信 线程 2/
复习 生产者---消费问题中wait(empty)与wait(mutex)能互换吗? 生产者---消费问题中wait(full)与wait(mutex)能互换吗? 生产者---消费问题中signal(mutex)与signal(full)能互换吗? 生产者---消费问题中signal(mutex)与signal(empty)能互换吗? 3/
思考题 某银行的人民币存取业务由 n 个柜台工作人员负责。每个顾客进入银行后先从抽号机中取一个号,并且等着叫号。当一个柜台工作人员空闲下来,就叫下一个号。 试用P,V 操作编写柜台工作人员进程和顾客进程的程序。 4/
分析 可把“顾客号数”看成是一个单缓冲区,顾客和柜员必须互斥访问; CUSTOMER_NUM --单缓冲区 semaphore counter; //柜台人员数;初值为n semaphore customer; //当前等待的顾客数;初值为0; semaphore mutex; //互斥对顾客号数的访问;初值为1 5/
顾客进程: { int num; //取号码 P(mutex); num = CUSTOMER_NUM++; V(mutex); //等待叫号 V(customer); //请求服务 P(counter); //等待号接受服务; 离开; COSTOMER_NUM--; } semaphore counter; //柜台人员数,初 值为n semaphore customer ; //当前等待的顾客 数;初值为0; semaphore mutex; //互斥对顾客号数 的访问。初值为1
P(customer); //等待顾客请求服务叫号为顾客服务; V(counter); //服务完成 UNTIL false; } 柜台人员进程: { int num; REPEAT //叫号 P(customer); //等待顾客请求服务叫号为顾客服务; V(counter); //服务完成 UNTIL false; } 7/
思考题 理发店理有一位理发师、一把理发椅和n把供等候理发的顾客坐的椅子 如果没有顾客,理发师便在理发椅上睡觉。 一个顾客到来时,它必须叫醒理发师 如果理发师正在理发时又有顾客来到,则如果有空椅子可坐,就坐下来等待,否则就离开。 8/
P、V操作实现 顾客进程 Customer() 理发师进程 Barber() 特定义两个信号量customers和barbers实现进程的同步, 并定义信号量S实现进程的互斥。代码如下: 9/
P、V操作实现 Begin int CHAIRS:=n; //为等候的顾客准备的椅子数 semaphore: customers=barbers=0; semaphore: cut=0; semaphore: finish=0; semaphore: mutex=1; // 用于互斥的信号量 int waiting= 0; 10/
P、V操作实现 Cobegin Process Procedure Customer() { P(mutex); if (waiting>=CHAIRS) then V(mutex) //没有空椅子离开 else waiting=waiting+1; V(mutex); V(customers); SIT_ON_CHAIR(); //坐在椅子上等候 P(barbers); //等待理发召唤 Stand_up(); // 从椅子上起身 11/
P、V操作实现 P(mutex); } waiting=waiting-1; V(mutex); SIT_ON_CUT_CHAIR(); //坐在理发椅上 V(cut); //告诉理发师可以开始理发 P(finish); //等待理发完成 } 12/
P、V操作实现 Process Procedure Barber() { while(1) P(customers); // 等待顾客到来 Clear_cut_chair(); //整理一下理发椅 V(barbers); //召唤下一个顾客,理发师空闲 P(cut); //等待顾客就座,可以理发否 CUT_CHAIR(); // 理发 V(finish); // 告诉顾客已结束 } Coend End 13/
进程通信 概念:进程间的信息交换。 实例: 缺点:效率低;通信对用户不透明 信号量机制(一种低级通信) 高级通信 效率高,通信实现细节对用户透明 14/
进程通信的类型 共享存储器系统 在共享存储系统中,互相通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。故其可分成以下两种类型。 基于共享数据结构的通信方式(低级通信) 要求诸进程公用某些数据结构,借以实现诸进程的信息交换。在生产者-消费者问题中,就是用有界缓冲区这种数据结构来实现通信的。 producer-consumer中的缓冲区,低效,不透明。 系统只提供了一个共享存储器,适于少量通信。 15/
进程通信的类型 基于共享存储区的通信方式(高级通信) 为了传输大量数据,在存储器中划出了一块共享存储区,进程可通过对共享存储区中数据的读或写来实现通信。 系统提供:共享存储区 通信过程: 向系统申请一个或多个分区 获得分区后即可读/写 特点:高效,速度快。 16/
进程通信的类型 消息传递系统(用于单机,多机,网络) 管道通信 数据交换以格式化的消息(报文)为单位 实现:一组通信命令(原语)。 是目前的主要通信方式,分为直接通信方式、间接通信方式 管道通信 管道:用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件。又名pipe文件。写进程以字符流的形式向管道送入大量数据;读进程则从管道中接收数据,故又称为管道通信。其能有效传输大量数据. 管道机制提供以下协调能力 互斥、同步、对方是否存在 17/
消息传递通信的实现方式 直接通信方式 例:解决生产—消费问题。 send(Receiver, message); 发送一个消息给接收进程 receive(Sender, message);接收sennder发来的消息 例:解决生产—消费问题。 repeat … produce an item in nextp; send(consumer, nextp); until false; receive( producer, nextc); consumer the item in nextc; 18/
消息传递通信的实现方式 间接通信方式(可以实现非实时通信) 指进程之间的通信,需要通过作为共享数据结构的实体,这种实体称为信箱。 接收进程 发送进程 接收进程 信箱 消息在信箱中可以安全地保存,只允许核准的目标用户随时读取。这样既可实现实时通信,又可实现非实时通信。 19/
消息传递通信的实现方式 原语 消息的发送和接收 send (mailbox, message) 信箱的创建与撤消: 信箱名 属性(公用、私用、共享)(共享者名字),不需要时可撤销之 消息的发送和接收 send (mailbox, message) receive (mailbox, message) 20/
消息传递通信的实现方式 信箱类型 发送—接收进程之间的关系: 私用:拥有者有读/写数,其它只有写权,(单向通信链路实现)存在期=进程存在期。 公用:系统创建,核准进程可以发送,也可读取发送给自己的消息。双向通信链路实现,存在期=系统存在期。 共享信箱:一般进程创建,并指明其共享者。拥有者和共享者都可取走发送给自己的消息。 发送—接收进程之间的关系: 一对一关系; 多对一关系; 一对多关系; 多对多关系:公用信箱。 21/
消息传递系统实现中的若干问题 通信链路 建立通信链路 通信链路的分类 发送进程建立 系统自动建立 根据连接方法分为 点-点连接通信链路 多点连接链路 22/
消息传递系统实现中的若干问题 根据通信方式分为 单向链路 双向链路 根据通向链路的容量分为 无容量通信链路 有容量通信链路 23/
消息传递系统实现中的若干问题 消息格式 进程同步方式 定长格式 变长格式 发送进程阻塞,接收进程阻塞(汇合)。 发送进程不阻塞,接收进程阻塞。(应用最广) 发送进程和接收进程均不阻塞。 24/
消息缓冲队列通信机制 数据结构 消息缓冲区 PCB中有关通信的数据项: type message buffer =record sender: size: text: next:指向下一指针 end PCB中有关通信的数据项: type pcb=record mq 消息队列首指针 mutex 消息队列互斥信息量 sm 消息队列资源信息量(表资源消息数) … 25/
消息缓冲队列通信机制 发送原语 procedure send(receiver, a) begin getbuf(a.size, i); 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 26/
消息缓冲队列通信机制 接收原语 procedure receive(b) begin j:=internal name; wait(j.sm); wait(j.mutex); remove(j.mq, i); signal(j.mutex); b.sender:=i.sender; b.size:=i.size; b.text:=i.text; end 27/
mq mutex sender :A sm size :5 text:hello next:0 PCB(B) 进程B 进程A send(B,a) receive(b) sender :A size :5 text:hello next:0 a b sender:A 发送区a sender:A size:5 size:5 接收区B text:Hello text:Hello 28/
线程 线程的基本概念 线程的引入 减少并发执行时的时空开销,进程的创建、撤消、切换较费时空,因它既是调度单位,又是资源拥有者。 创建进程 系统在创建一个进程时,必须为它分配其所必需的、除处理机以外的所有资源,如内存空间、I/O 设备,以及建立相应的PCB。 撤销进程 系统在撤销进程时,必须先对其所占有的资源执行回收操作,然后再撤销PCB。 进程切换 对进程切换时,由于要保留当前进程的CPU 环境和设置新选中进程的CPU环境,因而花费不少的处理机时间。 29/
线程 如何能使多个程序更好地并发执行同时又尽量减少系统的开销,已成为近年来操作系统设计时的重要目标。若能将进程的两个属性分开,即对作为调度和分派的基本单位,不同时作为拥有资源的单位,以做到轻装上阵;而对于拥有资源的基本单位,又不对之进行频繁的切换。 30/
线程 线程与进程的比较 调度性 并发性 拥有资源 系统开销 31/
线程 线程是系统独立调度和分派的基本单位,其基本上不拥有系统资源,只有少量资源(寄存器,栈等),但共享其所属进程所拥有的全部资源。 32/
线程 线程的属性 线程的状态 轻型实体(只包含TCB,PC,寄存器,堆栈) 独立调度和分派的基本单位 可并发实体 共享进程资源 状态参数 寄存器状态、堆栈、运行状态、优先级、线程专有存储器、 信号屏蔽 线程的运行状态:执行,就绪,阻塞 33/
线程 线程的创建和终止 多线程OS中的进程 创建线程时,需要利用一个线程创建函数(或系统调用),并提供相应的参数 终止线程方式 作为系统资源分配的的单位。在多线程操作系统中,仍是将进程作为系统资源分配的基本单位。 可包含多个线程。通常一个进程都包含有多个相对独立的线程(至少包含一个),由进程为这些线程提供资源及运行环境,使这些线程可并发执行. 进程不是一个可执行的实体。在多线程OS系统中,线程是独立运行的基本单位。 34/
线程的同步和通信 互斥锁 阻塞方式 lock(mutex) 访问 unlock(mutex) 非阻塞方式 if(trylock) then else 35/
线程的同步和通信 条件变量 lock(mutex1) 访问临界区C unlock(mutex1) lock(mutex2) 访问临界区R //线程i访问临界区C,又要访问临界资源R // unlock(mutex1) lock(mutex2) 访问临界区R //线程j正在访问临界资源R// unlock(mutex2) 线程i在对mutex2执行关锁操作后必将被阻塞,这样mutex1一直保持关锁状态。若线程j要进入临界区C,由于mutex1一直保持关闭而无法进入,便形成了死锁。 36/
线程的同步和通信 在创建互斥一个锁时便联系着一个条件变量。单纯的互斥锁用于短期锁定,主要是用来保证对临界区的互斥访问。而条件变量则用于线程的长期等待,直至所等待的资源成为可用的。 线程首先对mutex执行关锁操作,若成功进入临界区,然后查找用于描述资源状态的数据结构,以了解资源的情况只要发现所需资源R正处于忙状态,并对mutex 执行开锁操作后,等待该资源被释放;若资源处于空闲状态,表明线程可以使用该资源,于是将该资源设置为忙碌状态,再对mutex 执行开锁操作。 37/
线程的同步和通信 Lock mutex lock mutex check data structures; mark resource as free While (resource busy); unlock mutex wait (condition variable) ; wakeup (condition Mark resource as busy; Unlock mutex 38/
线程的同步和通信 信号量机制 私用信号量---是为了同一进程的不同线程间的同步. 私用信号量属于特定的进程所有,其存放于应用程序的地址空间中,而操作系统并不知道该私用信号量的存在. 公用信号量(系统信号量)---是为了实现不同进程间或不同进程的线程之间的同步. 其有一个公开的名字供所有的进程使用.其数据结构是存放在受保护的系统存储区中,由OS为其分配空间并进行管理, 39/
线程的实现方式 内核支持线程(KST) 用户级线程 (ULT) 组合方式 40/
小结 进程通信 线程 41/
作业 P84 17-22 实验二: 进程创建 42/