lg课堂夺命问答5

本文探讨并发性的概念,包括并发的硬件环境、关键概念如原子操作、临界资源和死锁等。介绍操作系统如何处理并发问题,如保证一致性、互斥和同步。并详细讲解了硬件在实现互斥中的作用,如中断禁用和信号量机制。
摘要由CSDN通过智能技术生成

第五章 并发性:互斥和同步

第一部分

一、

并发的三种硬件环境/场景:单核、多核、分布式处理器
并发的概念:concurrency(并发)一个时间段内多个进程在执行、
parallel(并行)cpu中具有多个计算核心,在同一个时刻有多个进程在不同的核上运行(多核上)
程序 独立的部分抽取出来,让一件事情实现并发处理,提高效率


进入并发前要了解的7个概念:
原子操作:一段代码要么不执行要么同时执行
临界资源:同一个时刻只能允许一个资源访问
临界区:用来访问临界资源的代码
死锁:一组并发的进程,执行需要另外的资源,3..造成相互等待
活锁:等待很久后,主动释放自己的资源,让另一个并发的进程先执行,执行完毕后将资源都给它
互斥:排他性,访问临界资源时,一次只能一个访问,其他的必须等待
条件竞争:资源的状态由最后的进程决定
饥饿:有个进程,已经具备执行的条件,但由于某种情况,永远处于等待(eg:划分优先级,低优先级的进程,一直在等待高优先级的先完成)

并发的两种概念:1)concurrencey并发: 同一个时间段内多个程序同时执行 2)parallel并行:CPU中同时具有多个计算核心,同一时刻在不同核心同时运行

软件中使用并发目的/软件方面并发的三种场景:1)多应用程序 2)加速运行,结构化应用程序 3)操作系统结构(提高效率)

二、并发的原理

1.程序执行三个特点1)独占计算机系统全部资源 2)程序是封闭的,不会被其他程序打断,具有连续性 3)程序执行的一致性

2.引入并发/并发带来的问题:1)失去封闭性,资源为多个进程共享 2)表现出明显的中断性interleave 3)不一致性:相同的输入在多次执行中得到不同的输出 

1)全局共享 2)难进行资源最优分配 3)定位程序设计错误是很困难的

三、条件竞争

发生在多个进程或者线程读写数据时,其最终的结果依赖于多个进程的指令执行顺序。

四、操作系统关心的问题

1.需要考虑的问题:1)必须能跟踪不同的进程(进程控制块) 2)分配和释放资源(处理器的时间;内存管理;文件;IO设备)

3)保护数据和资源   4)保证一致性,即输出与执行速度无关

2.怎么保证一致性:1)取消资源共享:互斥 2)程序执行按期望顺序执行:同步 3)

3.进程和进程的关系:1)不知道对方存在,必然存在竞争资源  2)间接知道:通过共享方式存在一定合作关系 (处理互斥)3)直接知道:

操作系统对互斥的要求:1)空闲让进 2)忙则等待:进程正在使用临界资源,其他进程全部阻塞 3)有限等待:不会死锁和饥饿 4)让权等待:请求临界资源主动把CPU资源释放出来


第二部分 互斥:硬件的支持

互斥的原则(需求):空闲让进;(有多个进程访问临界资源,如果空闲,允许一个访问)

忙则等待;

有限等待;(等待临界资源的时间是有期限的,不能让其他的一直处于等待)

让权等待。(cpu使用权,有一个进程已经获得cpu,访问临界资源,。。主动把cpu资源让出来)

互斥的实现方式:软件、硬件、操作系统和编译器(信号量、管程、消息传递

硬件:

一、中断禁用

1.概念:中断屏蔽,访问临界资源时不被中断。保证了互斥

2.缺点:1)降低CPU利用率  2)不能完全实现对共享资源互斥的访问

二、机器指令

1.概念:禁止其他指令对共享资源进行访问

特点(有效保证实现互斥):1)能在一个指令周期内对指令资源实现读写 2)禁止其他指令访问机器指令正在使用的资源

优点:1)只需要定义一个指示变量,对并发进程速度没有限制  2)机器指令不会中断,值不会被修改 3)支持多个临界区

缺陷:1)忙时等待,浪费cpu资源 2)可能饥饿:其他进程不能访问临界区 3)可能死锁

三、信号量semphores

1.概念:本质上是数据结构。首先定义了一个整型的变量,不同取值空间产生不同信号量,semwait对整型变量进行减1操作,当小于0,将进程放进阻塞队列。对应的操作是semsignal,对整型变量加1操作,如果值小于等于0,会把阻塞队列队首进程放进就绪队列。blocked list,放着执行semwait而阻塞的进程

2.分类:

二元信号量binary semaphore:原始值只取0或1 

一般信号量normal:所有整数空间

互斥信号量:信号量中的semwait与semsignal放在同一个进程

强信号量:执行semsignal将一个进程从blocked list移除时,有策略的信号量

弱信号量:没有固定策略的信号量。

3.

Synchronization:

For example: process p1 must run before process p2
How can do it by using semaphore?

Semphore mutual=0;
Process p1:                                            Process P2:
While(1)                                                 while(1)
{                                                              {
	critical area;                                        semwait(mutula);
	semsignal(mutual);                             critical area;

}                                                                } 

步骤

1)判断进程的关系:直接or间接

2)具体分析关系:

3)定义信号量,并对信号量的值进行初始化

4)调用semwait,semsignal实现互斥、同步


例题讲解

The Simple Problem of Producer-Consumer

One producer  and one consumer:

1)if the buffer is empty ,the consumer must wait;

2)if the buffer is full, the producer must wait;

How can I implement this situationby using semaphore?

步骤

1.定性

1)同步关系  
2)initialization:

Semphore s1=0
Semphore s2=1

void main

{
    produce a product;
    semwait(s2);
    put product in repertory; 
    semsignal(s1);
}

void consumer()

{
    semwait(s1); //判断仓库是否有产品可供消费
    take product from repertory;
    semsignal(s2);
    consume;
}


2.

One or more producers are generating dataand placing these in a buffer
A single consumer is taking items out ofthe buffer one at time

Onlyone producer or consumer may access the buffer at any one time

Semphore mutex=1;     //刚刚开始任何进程都可以去抢临界区,临界资源只有一个所以设为1。仓库是一个临界区,需要互斥访问
Semphore s1=0;
Semphore s2=1;

void main()
{
    semwait(s2);
    semwait(mutex);
    put product into rep;
    semsignal(mutex);    //释放临界区     
    semsigal(s1);
}

void consumer()
{

    semwait(s1);        //是否有产品可消费
    semwait(mutex);     //抢临界区
    take product;
    semsignal(mutex);
    semsignal(s2);
}

3.仓库能放m个产品

semphore mutex=1; 
semphore s1=0; 
semphore s2=m;

void main()
{
    semwait(s2); //valid
    semwait(mutex);
    put product into rep;
    semsignal(mutex);
    semsigal(s1); //s1已经是一般信号量,取值范围为整数空间
}
void consumer()
{
    semwait(s1);           
    semwait(mutex);    
    take product;
    semsignal(mutex);
    semsignal(s2);
}


读者-写者问题(只有互斥关系,不存在同步,因为读写没有顺序,竞争使用文件)

有一个文件,有多个进程读文件,同时也有多个进程写文件:

1)允许多个读者同时执行读操作;

2)不允许读者、写者同时操作;

3)不允许多个写者同时操作。

int count=0;    //  R-R每一个读操作都要对count进行改变,所以存在顺序,存在竞争

semphore rmutex=1;
semphore mutex=1;

reader

{

    int temp;
    semwait(rmutex);
    count+=1;
    temp=count;    //避免全局变量的副作用
    semsignal(rmutex);
    if(temp==1) semwait(mutex);
    read;
    semwait(rmutex);
    count-=1;
    temp=count;  
    if(temp==0   semsignal(mutex);
    semsignal(rmutex);
}


write

{

    semwait(mutex);
    write file;
    semsignal(mutex);

}


改进:再加一个信号量,semaphore queue;

    







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值