目录
🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。
💡本文由Filotimo__✍️原创,首发于CSDN📚。
📣如需转载,请事先与我联系以获得授权⚠️。
🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!
🌟我的格言:森林草木都有自己认为对的角度🌟。
**一、**进程间的同步
仅存在同步关系的有:
(1)汽车装配流水线上的各道工序。
(2)一个进程在等待另一个进程向它发送消息。
(3)两个并发进程包含同一共享变量。
(4)在打印数据时,读数据进程、处理数据进程和打印结果进程。
(5)不同的用户在各自的电脑上打同一盘网络麻将。
(6)四人一起在线玩斗地主的游戏。
(7)当前系统中有3个进程,分别是读取数据进程、处理数据进程和打印结果进程。某一数据需要用这3个进程进行处理并打印输出,那么,这3个进程之间存在着同步关系。
(8)假设在足球比赛中,每个队员是一个进程,足球是资源。同队队员之间的关系是同步。
二、进程间的互斥
仅存在互斥关系有:
(1)在民航订票系统中,每个订票点在票务服务器上发起了请求订票进程。
(2)在民航网络订票系统中,相同航班订票人发起的订票进程。
(3)不同的用户使用订票软件同时访问同一个订票数据库。
(4)购买同一天同一车次车票的用户。
(5)多个进程同时调用键盘输入命令。
(6)生产者进程P1P2P3,向环形缓冲区放入数据。
(7)消费者进程Q1Q2....Qn,从环形缓冲区中提取数据。
(8)假设在足球比赛中,每个队员是一个进程,篮球是资源。双方队员之间的关系是互斥。
三、进程间的其它关系
既有同步关系又有互斥关系的有:
(1)不同的用户在同一台游戏机上玩踢足球的电子游戏
(2)多人一起在线玩魔兽电子游戏
既没有进程同步关系又没有进程互斥关系
(1)不同的用户在各自的电脑上同时编译程序
(2)某网络监控系统中,多个被授权的用户对监控数据进行查看
并发进程间存在的其它关系有:
(1)直接感知:相互间直接交互,如通信(潜在的控制问题是:两个进程通过通信方式协作,但可能造成死锁或饥饿);
(2)间接感知:双方都与第三方交互,如共享资源(潜在的控制问题是:两个进程共享协作,但可能造成互斥、死锁或饥饿);
(3)互相不感知:相互间完全不了解其他进程的存在(一个进程的结果对另一个进程的结果无影响)(潜在的控制问题是:两个进程相互竞争,可能造成互斥、死锁或饥饿)。
并发进程间由于存在着相互制约关系会产生若干问题,这些问题是:同步问题,互斥问题,死锁问题,饥饿问题。
在计算机系统中,有些进程存在与时间有关的相互制约问题,比如:民航飞机订票系统,网上银行存取款,汽车装配生产线,企业成品仓库的出入库系统等(与时间有关的相互制约问题是指:在并发程序中共享了公共变量,使得程序的计算结果与并发程序执行的速度(时间)有关)。
四、临界资源
临界资源是指计算机系统中的需要互斥使用的硬件或软件资源,如外设、共享代码段、共享数据结构等。
可把对临界资源的访问分成进入区、临界区、退出区和剩余区四部分:
(1)进入区:为了保证计算机中临界资源的正确使用,进程在对临界资源访问前,必须首先调用进入区的代码(作用是:测试是否能正确进入临界区)。
(2)临界区:在采用P、V操作对共享资源的使用进行保护时,对该共享资源读写的代码段称为临界区(作用是:访问临界资源)。
(3)退出区:为了保证临界资源的正确使用,进程在结束对临界资源的访问后必须通过退出区才能离开(作用是:将"正在访问临界区"的标志清除)。
(4)剩余区:代码中的其余部分
进程访问临界区时要遵循相关准则:空闲则入、忙则等待、有限等待、让权等待。
在民航网络订票系统中,作为临界资源的对象是:飞机票。
eg1(飞机订票):
cpp
int booking(id)//订票例程
{
int c;
while TS(&lock);//Test-and-Set指令
c=fetch(ticket);//从服务器取剩余票额
show(c); //显示
if (read(input)=1)//是否订票?
{
c=c-1;//票额减1
send(c);//送回新数据
}
lock=FALSE;//置标志为F
output(list);//打印机票
}
进入区是用来检查可否进入临界区,如果可以进入临界区,需要设置正在访问临界区的标志,如例子中的whie TS(&lock);
临界区就是程序访问临界资源的那段代码,如例子中的c=fetch(ticket);到if语句中的send(c);}那段代码;
退出区是将正在访问临界区的标志清除的代码,如例子中的lock=FALSE;
剩余区就是代码中除了上述三个区的代码剩余部分。
eg2(银行存款):
cpp
int deposit(id, int c)//存款例程,id是用户号,c为存入现金额
{
int n;
while TS(&lock);// Test-and-Set指令
n=fetch(balance);//从主服务器取存款余额
n=n+c;//存款余额加存入现金额
send(n);//送回新余额
lock=FALSE;//置标志为F
output(n);//打印余额凭条
}
程序中存款账户信息属于临界区资源,同一时刻只能有一个进程访问;
进入区:while Ts(&lock);
临界区:n=fetch(balance);n=n+c; send(n);
退出区:lock=FALSE;
剩余区:output(n);
eg3(独木桥):
cpp
int Crossbridge(intc) //过桥例程,c=0表示由南向北,c=1表示由北向南
{
int turn=0;//标志
while(turn!=c);//判断
Cross();//过桥
turn=1-c;//置标志为非
Leave(void);//离开
}
进入区:while(turn!=c);
临界区:Cross();
退出区:turn=1-c;
剩余区:Leave(void);