1第一章处理机管理第二章存储管理第三章设备管理目录第四章文件管理第五章操作系统接口2主要内容1.1进程基本概念1.2进程通信1.4处理机调度与死锁1.5UNIX中的处理机管理1.6线程1.3经典的进程通信问题3并发执行的进程之间相互影响相互制约如何确保进程按合理的速度向前推进?进程同步4正常行车到站停车车辆启动售票开车门关车门func1(y)X=func1(y)*func2(z)func2(z)实例一个进程达到了一个确定的点(同步点)后,除非另一个进程已经完成了某些操作,否则就不得不停下来以等待这些操作执行结束。进程同步协同工作的几个进程需要在某些确定的点上协调他们的工作。并发执行的进程之间相互影响相互制约如何确保进程按合理的速度向前推进?进程同步如何确保进程之间不会相互影响?进程互斥5进程互斥竞争条件:多个进程同时读写共享的数据,而最终的结果取决于进程执行的时序。包含竞争条件的程序是错误的(与时间相关的错误)。ProcessIN:…count++;…ProcessOUT:…count--;…movax,count;incax;movcountax;movax,count;decax;movcountax;临界资源:同时只允许一个进程使用的软件和硬件资源。临界区:访问临界资源的程序段。相关临界区:访问同一临界资源的临界区。实例count6同时使用同一临界资源的进程应当互斥:保证在任何时刻,最多只有一个进程运行在临界区。T1T2T3T4B被阻塞进程A进程BA进入临界区B试图进入临界区A离开临界区B进入临界区B离开临界区entrysection;//检测临界资源是否空闲?//如果空闲,则设置忙标志,//进入临界区;否则,忙等或稍后再试;criticalsection;exitsection;//清除临界资源的忙标志。进程互斥空闲让进忙则等待有限等待让权等待原则8利用“忙等”实现进程互斥1.开关中断:在单处理机系统中,借用中央处理机中的硬件中断开关位作为临界区的锁。关中断;//中断关闭,不会发生进程切换//当前进程不被打断执行临界区程序criticalsection;开中断;//离开临界区后开中断优点:简单,可靠。不足:1)单处理器2)临界区中不能包含可能进入阻塞状态的因素3)临界区比较长时,……适合操作系统内核的进程互斥while(lock==1);//试图进入临界区前先检测锁的状态:若//锁为关闭状态,则等待。lock=1;//若锁为打开状态,则关锁后进入临界区临界区;lock=0;//退出临界区后,开锁9如果这里发生了进程调度?有可能有多个进程同时进入临界区解决问题的关键:锁变量的检查和置1应同时完成利用“忙等”实现进程互斥2.锁变量:为每个临界资源设置一个锁变量lock,lock=0表示锁开着;lock=1表示锁关闭(初始为0)。10关中断lock=0?lock=1开中断开中断临界区NY利用开关中断来保证关锁操作的完整性,并不是实施关锁操作本身。以上三种方式的弊端:忙等浪费了宝贵的CPU时间3.用开关中断保证关锁操作的完整性利用“忙等”实现进程互斥structsemaphore{intvalue;structsem_queue*head;};初值:初始条件下,可使用的资源数或可同时使用资源的进程数=0:当前可使用的资源数或可同时使用资源的进程数=0:因为该资源阻塞的进程数信号量是一个数据结构value:信号量的值sem_queue:所有等待使用该信号量的进程value的物理意义s.value=3利用“信号量”实现进程互斥12voidP(s){s.value=s.value-1;//用先减去一个的方式来申请资源if(s.value0)//如果该类资源已分配完毕,则申请资源失败sleep();//本进程进入该信号量的等待队列中,放弃CPU//此时s.value的绝对值表示阻塞进程的数目}voidV(s){s.value=s.value+1;//执行进程释放一个资源if(s.value=0)//如果仍有进程在等待使用本信号量wakeup();//从本信号量的等待队列中唤醒一个进程}信号量的P,V操作进程申请使用资源时进程释放资源时操作系统保证P,V操作的原子性利用“信号量”实现进程互斥必须成对出现13s.value=3p(s)s.value=2p(s)s.value=1p(s)s.value=0资源分配完毕p(s)s.value=-1|s.value|=1利用“信号量”实现进程互斥14s.value=3v(s)s.value=0v(s)s.value=1利用“信号量”实现进程互斥ProcessIN:…count++;…ProcessOUT:…count--;…互斥信号量:semaphoremutex;mutex.value=1;利用“信号量”实现进程互斥互斥:任意时刻只能有一个进程使用该资源ProcessIN:…count++;…ProcessOUT:…count--;…movax,count;incax;movcountax;movax,count;decax;movcountax;15P(mutex);V(mutex);P(mutex);V(mutex);2.进入临界区:P操作离开临界区:V操作3.PV操作在每个相关临界区前后对同一信号量成对使用Processpa:…L1:…Processpb:…L2:…利用“信号量”实现进程同步同步信号量:semaphoreproceed;proceed.value=0;同步:在同步点上等待“可以继续执行”的消息需要一个“可以继续执行的消息”发送一个“可以继续执行的消息”P(proceed);V(proceed);2.P操作:发送消息V操作:接收消息3.PV操作由不同的进程实施,成对使用同步:直接的相互制约关系互斥:间接的相互制约关系互斥实质上是同步的一种特殊情况?并发执行的进程之间相互影响相互制约如何确保进程按合理的速度向前推进?进程同步如何确保进程之间不会相互影响?进程互斥如何在进程间传递大量数据?进程高级通信进程高级通讯18共享存储器系统消息传递系统管道通信系统共享数据结构共享存储区直接通信方式Send(Receiver,message);Receive(Sender,message);间接通信方式信箱:Send(mailbox,message);Receive(mailbox,message);消息缓冲队列发送进程(写进程)与接收进程(读进程)以管道文件连接由程序员管理由操作系统管理利用“消息传递”实现高级通讯19sender:Asize:5text:Hellosend(B,a)ProcessAa发送区sender:size:text:receive(b)ProcessBb接收区由操作系统管理的消息缓冲队列消息队列指针、信号量发送原语ProcessB:PCBsm……mqmutex……sender:Xsize:Xtext:Xnext:0利用“消息传递”实现高级通讯20sender:Asize:5text:Hellosend(B,a)ProcessAa发送区ProcessB:PCBsm……mqmutex……sender:Xsize:Xtext:Xnext:0sender:size:text:receive(b)ProcessBb接收区由操作系统管理的消息缓冲队列消息队列指针、信号量发送原语proceduresend(receiver,a)beginend按发送区大小申请一个消息缓冲区;sender:size:text:next:0sender:Asize:5text:Hellonext:0将发送区中信息复制到消息缓冲区;找到接收进程的PCB;P(mutex);将消息缓冲区插入接收进程消息队列末尾;V(mutex);利用“消息传递”实现高级通讯21sender:Asize:5text:Hellosend(B,a)ProcessAa发送区ProcessB:PCBsm……mqmutex……sender:Xsize:Xtext:Xnext:0sender:size:text:receive(b)ProcessBb接收区由操作系统管理的消息缓冲队列消息队列指针、信号量发送原语sender:Asize:5text:Hellonext:0接收原语procedurereceive(b)beginendP(mutex);从消息队列中取出第一个缓冲区;V(mutex);将消息缓冲区中信息复制到接收区;释放该消息缓冲区;利用“消息缓冲”实现高级通讯22sender:Asize:5text:Hellosend(B,a)ProcessAa发送区ProcessB:PCBsm……mqmutex……sender:Xsize:Xtext:Xnext:0sender:size:text:receive(b)ProcessBb接收区由操作系统管理的消息缓冲队列消息队列指针、信号量发送原语proceduresend(receiver,a)beginend按发送区大小申请一个消息缓冲区;sender:size:text:next:0sender:Asize:5text:Hellonext:0将发送区中信息复制到消息缓冲区;找到接收进程的PCB;P(mutex);将消息缓冲区插入接收进程消息队列末尾;V(mutex);V(sm);发送原语procedurereceive(b)beginendP(mutex);从消息队列中取出第一个缓冲区;V(mutex);P(sm);释放该消息缓冲区;将消息缓冲区中信息复制到接收区;23本节小结:1进程同步与互斥及其实现方法:信号量2高级进程通讯的实现方法:共享存储、消息传递、管道EL03_E:进程通讯相关习题