5.1 进程同步

一、进程同步的概念

在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约的关系。为了协调进程之间的相互制约的关系,引入进程同步的概念。

1.临界资源

虽然多个进程可以共享系统中的各种资源,但其中许多资源依次只能为一个进程所使用,这类资源称为临界资源。许多物理设备都属于临界资源,例如打印机、磁带机。此外,全局变量,静态变量、数据等都可以被若干进程共享,也属于临界资源。

对临界资源的访问,必须互斥地进行。在每个进程中,访问临界资源的那段代码称为临界区。为了保证临界资源的正确使用,可以把临界资源的访问分成四个部分。

do{
    entry section;//进入区
    critical section;//临界区
    exit section;//退出区
    remainder section;//剩余区
} while (true);
  • 进入区
    为了进入临界区使用临界资源,在进入区要检查可否进入临界区,如果可以进入,则应该设置在访问临界区的标志,以阻止其他进程同时进入临界区。
  • 临界区
    进程中访问临界资源的代码段,又称为临界段
  • 退出区
    将正在访问临界区的标志清除
  • 剩余区
    进程代码中其余部分

2.同步

同步亦称为直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系源于它们之间相互的合作

例如,输入进程A通过单缓冲向进程B提供数据。当该缓冲区空时,进程B不能获得所需数据而阻塞,一旦进程A将数据送入缓冲区,进程B被唤醒。反之,当缓冲区满时,进程A被阻塞,仅当进程B取走缓冲数据时,才唤醒进程A。

可以用下图简单表示:

3.互斥

互斥亦称为间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一个进程才允许区访问此临界资源。

例如,在仅有一台打印机的系统中,有两个进程A和进程B,如果进程A需要打印时, 系统已将打印机分配给进程B,则进程A必须阻塞。一旦进程B将打印机释放,系统便将进程A唤醒,并将其由阻塞状态变为就绪状态。


为禁止两个进程同时进入临界区,同步机制应遵序以下准则:

  • 空闲则让
    临界区空闲时,可以允许一个请求进入空闲区的进程立即进入临界区
  • 忙则等待
    当已有进程进入临界区时,其他试图进入临界区的进程必须等待
  • 有限等待
    对请求访问的进程,应保证能在优先时间内进入临界区
  • 让权等待
    当进程能进入临界区,应立即释放处理器,防着进程忙等待

二、临界区的实现

1.软件实现方法

在进入区设置和检查一些标志来标明是否有进程在临界区中,如果已有进程在临界区,则在进入区通过循环检查进行等待,进程离开临界区后则在退出区修改标志。

接下来介绍两种软件解决方案:Peterson算法与Dekker算法。

  • Dekker算法
bool flag[2];
int turn;//访问权限
void P0(){
    while (true){
        flag[0] = true;//P0想使用关键区。
        while (flag[1]){//检查P1是不是也想用?
            if (turn == 1){//如果P1想用,则查看P1是否具有访问权限?
                flag[0] = false;//如果有,则P0放弃
                while (turn == 1);//检查turn是否属于P1。
                flag[0] = true;//P0想使用。
            }
        }
        do_something();//访问critical section
        turn = 1; //访问完成,将权限给P1。
        flag[0] = false;//P0结束使用。
    }
}
void P1(){
    while (true){
        flag[1] = true; //P1想使用关键区
        while (flag[0]){ //检查P0是不是也想用?
            if (turn == 0){ //如果P0想用,则查看P0是否具有访问权限?
                flag[1] = false; //如果有,则P1放弃
                while (turn == 0); //检查turn是否属于P1
                flag[1] = true; // P1想使用。
            }
        }
        do_something();//访问critical section
        turn = 0; //访问完成,将权限给P0
        flag[1] = false; //P1结束使用
    }
}
  • Peterson算法
bool flag[2];//访问请求
int turn;//访问权
void* procedure0(void *){
    while (true){
        flag[0] = true;
        turn = 1;
        while (flag[1] && turn == 1){
            //P1需要访问且拥有访问权时,P0等待
            //当P1不想访问或者不具备权限时推出
            Sleep(1);
            printf("procedure0 is waiting!\n");
        }
        do_something();//访问critical section
        flag[0] = false;
    }
}
void* procedure1(void *){
    while (true){
        flag[1] = true;
        turn = 0;
        while (flag[0] && turn == 0){
            //P0需要访问且拥有访问权时,P1等待
            //当P0不想访问或者不具备权限时推出
            Sleep(1);
            printf("procedure1 is waiting!\n");
        }
        do_something();//访问critical section
        flag[1] = false;
    }
}

2.硬件实现方法

计算机提供了特殊的硬件指令,允许对一个字中的内容进行检测和修正,或者是对两个字的内容进行交换等。通过硬件支持临界区访问的方法或称为元方法。

硬件实现方法主要有两种:中断屏蔽方法和硬件指令方法。

  • 中断屏蔽方法
    当某进程正在执行其临界区代码时,为防止其他进程再进入其临界区访问的最简单方法是禁止一切中断发生,称之为屏蔽中断或关中断。由于CPU只在发生中断时引起进程切换,中断的屏蔽便可保证当前进程顺利执行完临界区代码,进而保证互斥。其典型模式为:

    关中断;
    临界区;
    开中断;

    中断屏蔽的实现方式代价很高。如果临界区比较大的话会限制并发能力,不适用与多处理器,适用于操作系统本身,不适用与用户进程

  • 硬件指令方法
    1)TSL(TestAndSetLock)指令
    这条指令是原子操作,即执行该代码时不允许被中断。其功能是读出指定标志后把该标志设置为真。指令的功能描述如下:

enter_region:
    TSL REGISTER, LOCK
    CMP REGISTER, #0
    JINE enter_region
    RET
leave_region
    MOVE LOCK, #0
    RET

2)XCHG(EXCHANGE)指令
该指令的功能是交换两个字节的内容。其功能描述如下:

enter_region:
    MOVE REGISTER, #1
    XCHG REGISTER, LOCK
    CMP REGISTER, #0
    JINE enter_region
    RET
leave_region
    MOVE LOCK, #0
    RET
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容

  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,132评论 0 23
  • ** 本文摘自汤小丹主编《计算机操作系统》(第三版)2.3 进程同步 ** 在 OS 中引入进程后,虽然提高了资源...
    刘帅_阅读 3,098评论 0 0
  • word直接复制来了,格式就不改了。至于这门课怎么复习,只要平时实验都认真完成、报告认真写,平时分都很高;考试的话...
    Jozhn阅读 4,560评论 0 8
  • “从一件小事开始做起,然后坚持下去,日复一日的重复,就会明白什么叫做量变引起质变,若一开始便对这件“小事”抱有某种...
    王安迪阅读 327评论 1 2
  • 朋友们可知这两句诗,已经火了好几天了,上网搜索一下便知,是2月22日网友杜子健在微博上发出这句诗来征集下文,引发了...
    如柏的日记阅读 1,027评论 2 1