操作系统知识盘点(二)(互斥、同步与信号量)

本文详细介绍了操作系统中互斥的实现方法,包括软件方法(如算法1至4)和硬件方法,以及它们的优缺点。同时,讨论了信号量的概念、类型及其在进程同步与互斥中的应用,如生产者-消费者问题、读者-写者问题和哲学家就餐问题。
摘要由CSDN通过智能技术生成

11、互斥实现方法

互斥的实现既可以用软件方法,也可以用硬件方法

(1)软件方法

算法1:设置一个公用的整型变量turn,用来允许进入临界区的进程标识。若turn为0,则允许进程P0进入临界区;否则循环检查该变量,知道turn变为本进程标识;在退出区,修改允许进程的标识turn为1.进程p1的散发于此类似。两个进程的程序结构如下:
 

int turn = 0;
P0:{
    Do{
        while(turn!=0);            //当turn不为0时循环检查,直到为0(进入区)
        进程P0的临界区代码CS0        //临界区
        turn = 1;                   //退出区
        进程P0的其他代码;
}
    while(true)                      //循环执行这段代码
}

P1:{
    Do{
        while(turn!=1);            //进入区
        进程P1的临界区代码CS1        //临界区
        turn = 0;                   //退出区
        进程P1的其他代码;
}
    while(true)                      //循环执行这段代码
}

此方法可以保证互斥访问临界资源,但存在的问题是强制两个进程以交替次序进入临界区,很容易造成资源利用不充分。例如,当进程P0退出临界区后将turn置为1,一边允许进程P1进入临界区,但如果进程P1暂时并未要求访问该临界资源,而P0又想再次访问临界资源,则他将无法进入临界区。可见,此算法不能保证实现“空闲让进”准则。

算法2:

设置标志数组flag[]标识进程是否在临界区中执行,初始值为佳。在每个进程访问临界资源前,先检查另一个进程是否在临界区中,若不在,则修改本进程的临界区标志位真并进入临界区,在退出区修改本进程临界区标志为佳。两进程的程序结构如下:

enum boolean(false,true);            //设置数组元素类型
boolean flag[2]={false,false};        //设置标志数组
P0:{
    Do{
        while flag[1];                //flag[0]为真表示P1在访问临界区,P0等待(进入区)
        flag[0] = true;                //进入区
        进程P0的临界区代码CS0            //临界区
        flag[0]=false;                   //退出区
        进程P0的其他代码;
}
       while(true)
}

P1:{
    Do{
        while flag[0];                //flag[0]为真表示P1在访问临界区,P0等待(进入区)
        flag[1] = true;                //进入区
        进程P0的临界区代码CS0          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值