【操作系统原理】第四章——并发与同步(上)

目录

一、进程间的同步

二、进程间的互斥

三、进程间的其它关系

四、临界资源


🌈嗨!我是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);

相关推荐
海绵波波10738 分钟前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
努力变厉害的小超超2 小时前
ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染
笔记·鸿蒙
秃头佛爷2 小时前
Python学习大纲总结及注意事项
开发语言·python·学习
dayouziei4 小时前
java的类加载机制的学习
java·学习
热爱跑步的恒川4 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
云飞云共享云桌面4 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
aloha_7896 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
hikktn7 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
音徽编程7 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习