三态模型
进程通常分为就绪、运行和阻塞三种工作状态。
三种状态在某些条件下可以转换,具体转换关系如下:
进程三个状态之间的转换是通过PV操作和信号量来控制的,其中信号量起到了很重要的作用。
信号量
信号量是最早出现的用来解决进程同步与互斥问题的机制。
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程,信号量的值表示相应资源的使用情况。
信号量
S>=0
时,S
表示可用资源的数量,执行一次P操作意味着请求分配一个资源,因此S
的值减1
;信号量
S<0
时,表示已经没有可用资源,S
的绝对值表示当前等待该资源的进程数,请求者必须等待其他进程释放该类资源才能继续运行,而执行一个V操作意味着释放一个资源,因此S
的值加1
;若
S<0
,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。注意,信号量的值只能通过PV操作来改变。
两类问题
在说明这两类问题之前首先解释一些相关的概念:
PV操作:一种实现进程互斥与同步的有效方法,包含P操作与V操作。
P操作:使 S=S-1
,若 S>=0
,则该进程继续执行,否则排入等待队列。
V操作:使 S=S+1
,若 S>0
,唤醒等待队列中的一个进程。
临界资源:同一时刻只允许一个进程访问的资源,与上面所说的 S
有关联。
缓冲区问题
进程 P1
将信息输入到缓冲区 B
中,进程 P2
负责从缓冲区 B
中取出数据输出,缓冲区容量为 n
。
对于进程 P1
来说,如果缓冲区满,则应暂停输入,等待 P2
进程取走数据后再输入新数据;
而对于进程 P2
来说,如果缓冲区空,则应等待 P1
进程送来新数据。
我们首先分析一下,假设缓冲区未满且有数据存在时, P2
进程可以顺利的取出一个数据,同样 P1
进程此时也可以顺利的添加一个数据。
也就是说,对于这两个进程的每一次操作,只要初始条件满足,那么它一定可以顺利的执行下去,不会受到其他条件的制约。
于是便有:
P1()
{
P(empty);
输入新数据;
V(full);
}
P2()
{
P(full);
取出数据;
V(empty);
}
其中 empty
初始值为缓冲区容量 n
, full
初始值为 0
。
假如缓冲区为空时, P2
进程阻塞, P1
可以顺利执行,随后唤醒 P2
进程运行。
假如缓冲区为满时, P1
进程阻塞, P2
可以顺利执行,随后唤醒 P1
进程运行。
其中的制约关系如下
公交车司机售票员问题
设公交车上司机的活动是启动车辆,正常行车,到站停车;售票员的活动是关车门,售票,开车门,用信号量和PV操作来实现它们的同步。
首先设信号量 S1
、 S2
,其中:
S1
表示是否允许司机启动汽车,初始值为 0
。
S2
表示是否允许售票员开门,初始值为 0
。
于是便有:
司机进程()
{
P(S1);
启动车辆;
正常行驶;
到站停车;
V(S2);
}
售票员进程()
{
关车门;
V(S1);
售票;
P(S2);
开车门;
上下客;
}
我们来分析一下这个过程, S1
与 S2
的初始值都为 0
。
如果售票员没有关车门的话司机进程会阻塞在P操作之前,直到售票员关闭车门后执行V操作唤醒司机进程启动车辆…
之后的一段时间司机进程与售票员进程可以同时运行。
当司机到站停车前售完票的售票员会阻塞在P操作之前,直到司机到站停车后执行V操作唤醒售票员开车门,然后上下客。
(那么问题来了,如果到站停车后售票员还没有售完票会怎么样呢?答案是售票员会继续售票,直到结束以后才会开车门上下客,然后耽误了好多乘客的时间于是被解雇了,hahah没有那么夸张啦~😝)
这便是公交车司机与售票员之间的制约关系了,如下:
总结
使用PV操作实现进程同步时应该注意的问题有:
- 同一信号量的P、V操作要成对出现
- 信号量的初始值与相应资源的数量有关,也与P、V操作在程序中出现的位置有关
- 我们要首先分析出进程间的制约关系,在保证进程间有正确同步关系的情况下,确定哪一个进程先执行,哪一个进程后执行,彼此间应该用什么信号量来协调
哈哈哈
Pingback: 操作系统 — PV操作
QQ表情也能搞到啊,哈哈
不过如果没有缓存的话第一次访问会下载那么多的表情并且可能用不到感觉有点耗费资源
是说呢,搞来搞去还是颜文字最实在了。。。
(吐槽一下,我刚评论过的,关闭重进又要输入昵称邮箱网址了么 TAT)
还没有加记住用户信息这部分,然后都是靠浏览器自动补全的,我去网上找找看有没有相关的教程咯
你把这个信息放在浏览器的cookie中,加载页面的时候看看有没有这些cookie,有的话用javascript直接添加上去,这应该是比较简单的做法啦~
(最后,我又重新填写了一次!好想打你一顿 (#‵′)凸)
chrome 在输入框上面点一下就会出现以前输入的记录啦!(我都是这么做的)如果测试不成功的话,欢迎来打
Obviously, It can not work!!!
然后我也用 chrome 操作了一下~~
然后十几行代码搞定啦!欢迎测试
666666,可以了
哈哈,谢谢学长提供的建议~٩(ˊᗜˋ*)و
走开,我刚毕业呢,学长不好听,叫亮哥倒是可以的 。◕ᴗ◕。
哈哈,谢谢亮哥提供的建议~٩(ˊᗜˋ*)و
哈哈,嘴巴好甜
太棒啦,今天刚刚复习到进程管理。( ,,´・ω・)ノ'(´っω・`。)
咦,学长也是这学期考操作系统嘛?我们在周四考试
对对对
嗯呢嗯呢,考试加油咯,必过ヾ(≧∇≦*)ゝ
😭 估计悬了 空了大题…
听同学说了你们题目的难度😣,老师在批卷的时候一定会控制好不及格率的
我们也考了操作系统,早考完了,,不过我更喜欢用纸做期末复习笔记
想把这些写在博客里,或许会帮到很多人也说不定呀~至于复习笔记(反正挂不了🤣,因为老师有画【重点】)
(⊙v⊙)嗯!想问文章中的作图是用什么软件做的呀?
我用的微软的Visio,在线也有类似绘图的网站,比如ProcessOn