进程互斥

xiaoxiao2021-02-28  125

互斥是由程序共享资源所引起的,某一个资源不允许同时多个程序访问,那么解决方法是要么访问其他空闲的同种资源,要么等待这一资源。等待这一资源就要在操作系统实现互斥:当一个进程正在使用资源的时候,其他希望使用该资源的程序必须等待,当该进程使用完并释放资源后,才允许其他进程去访问此资源,我们称这种进程之间的互相制约关系叫做互斥。

互斥的实现方法

软件方法

算法一: 保证互斥访问临界资源,问题在于强制两个进程交替进入临界区,造成资源利用率低,p0退出后,P1未进入,P0不能进入 int turn = 0; P0: { do { while(turn == 0) P0的临界区代码CS0; turn = 1; 进程的其他代码codesegment1; } while(ture); } P1: { do { while(turn == 1) P1的临界区代码CS1; turn = 0; 进程的其他代码codesegment2; } while(true); } 12345678910111213141516171819 算法二: 解决了空闲让进的问题,但是当两个进程都未进入临界区,而又同时想进入临界区,双方都认为对方不在临界区,同时进入临界区,违背了忙则等待 //枚举类型 enum boolean {true, false}; boolean flag[2] = {false, false}; P0 { do { while flag[1]; flag[0] = true; CS0; flag[0] = false; codesegment1; } while(true); } P1: { do { while flag[0]; flag[1] = true; CS1; flag[1] = false; codesegment2; } while(true); } 1234567891011121314151617181920212223 算法三: 算法防止了两个进程同时进入临界区,但存在两个都进不了临界区的问题,违背了有限等待 enum boolean{false, true}; boolean flag[2] = {false, false}; P0 { do { flag[0] = true; while flag[1]; CS0; flag[0] = false; codesegment1; } while(true); } P1: { do { flag[1] = true; while flag[0]; CS1; flag[1] = false; codesegment2; } while(true); } 12345678910111213141516171819202122 算法四: flag解决临界区访问,turn解决饥饿现象 enum boolean{falsetrue}; boolean flag[2] = {falsefalse}; int turn;     P0 {         do {             flag[0] = true;             turn = 1;             while flag[1] && turn == 1;             CS0;             flag[0] = false;             codesegment1;            }         while(true);        }     P1: {          do {              flag[1] = true;              turn = 0;              while flag[0] && turn == 0;               CS1;              flag[1] = false;              codesegment2;             }          while(true);         }
转载请注明原文地址: https://www.6miu.com/read-47810.html

最新回复(0)