1、并发进程 :
并发的实质是一个处理器在几个进程之间的多路复用,并发是对有限的物理资源强制行使多用户共享,消除计算机部件之间的互等现象,以提高系统资源利用率。
(1)并发进程——互斥性:
进程互斥是指若干个进程因相互争夺独占型资源时所产生的竞争制约关系。
(2)并发进程——同步性:
进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于协作进程的消息或信号,当一个进程没有得到来自于协作进程的消息或信号时需等待,直到消息或信号到达才被唤醒。
(3)两者关系:
进程互斥关系是一种特殊的进程同步关系,即逐次使用互斥共享资源,是对进程使用资源次序上的一种协调。
2、临界区管理:
(1)并发进程中与共享变量有关的程序段叫“临界区”,指进程中用于访问共享资源的那段代码。
(2)共享变量代表的资源叫“临界资源”。
(3)为了保证临界资源的正确使用,可以把临界资源的访问过程分成以下几部分:
- 进入区—增加在临界区前面的一段代码,用于检查欲访问的临界资源此刻是否被访问。
- 退出区—增加在临界区后面的一段代码,用于将临界资源的访问标志恢复为未被访问标志。
3、临界区(互斥)问题的几类方法:
(1)软 件 方 法
(2)硬 件 方 法
(3)P、V 操 作
- 设s为一个记录型数据结构,一个分量为整形量value,另一个为信号量队列list为等待此类资源的指针。
- P(s);将信号量s减去l,若结果小于0,则调用P(s)的进程被置成等待信号量s的状态。
- V(s):将信号量s加1,若结果不大于0,则释放一个等待信号量s的进程。
4、习题演练:
1、在一个盒子里,混装了数量相等的黑白围棋子。现在用自动分拣系统把黑子、白子分开,设分拣系统有二个进程P1 和P2,其中P1 拣白子;P2 拣黑子。规定每个进程每次拣一子;当一个进程在拣时,不允许另一个进程去拣;当一个进程拣了一子时,必须让另一个进程去拣。试写出两进程P1 和P2 能并发正确执行的程序。
main(){Semaphore mutex,S1,S2;mutex=1;S1=1;S2=0;conbegin;Process P1(){While(1){P(S1);P(mutex);{捡白子}V(mutex);V(S2);}}While(1){Process P2(){P(S2);P(mutex);{捡黑子}V(mutex);V(S1);}}conend; }
2、系统中有二个进程WriteData和ReadData,有一个缓冲区BUF。假设BUF中最多可放5个信息,初始值有2个信息。WriteData进程负责输入信息并送入BUF中,ReadData进程负责取出BUF中的信息并输出。编写实现WriteData和ReadData的同步与互斥的算法程序。
main(){Semaphore mutex,empty,message;mutex=1;empty=3;message=2;conbegin;Process Write(){While(1){P(empty);P(mutex);{输入信息}V(mutex);P(message);}}While(1){Process Read(){P(message);p(mutex);{输出信息}V(mutex);V(empty);}}conend;}
3、设公共汽车上有一个司机和一个售票员,它们的活动如下:
司机:启动车辆,正常行车,到站停车。
售票员:开车门、关车门,售票,
车辆初始状态:停放在总站、车门关闭、乘客还未上车
要求:当发车时间到,售票员开车门、乘客上(或下)车、关门后,司机才能启动车辆,售票员开始售票;当到站后,司机停车后,售票员才能打开车门,乘客下车、关门。Semaphore: S_stop,S_run; //定义同步信号量S_stop=1;S_run=0; // 据车辆初始状态设初值cobegin{driver ( );busman ( );}coendprocess driver ( ){while(true){P(S_run)启动车辆;正常行车;到站停车;V(Sstop);} }process busman (){while(true){P(Sstop);开车门;上下乘客;关车门;V(S_run);售票;}}
4、一个网上购物平台,假设有三类职员:
(1)接单员,负责做接收顾客采购商品清单的工作:
(2)打包员,负责顾客购置商品的打包;
(3)快递发货员,负责把包裹发送给顾客。
每类职员看做一个进程,用同步机制编写出能让这三类职员正确并发的工作程序。(接单员进程OrderTaker();打包员进程Packer();快递发货员进程Courier())
main(){Semaphore text,goods,car;text=1,goods=0,car=0;conbegin;Process OrderTaker(){While(){P(text);接收清单;V(goods);}}Process Packer(){While(1){P(goods);打包商品;V(car);}}Process Courier(){While(1){P(car);发货;V(text);}}conend; }