进程互斥


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

互斥的实现方法

软件方法

算法一:
保证互斥访问临界资源,问题在于强制两个进程交替进入临界区,造成资源利用率低,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);
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值