学习记录2
来源:互联网 发布:n9软件下载 编辑:程序博客网 时间:2024/06/05 11:13
pv操作同步过程
对信号灯状态进行改变,P调用一次-1,V调用一次+1。
P操作:
p(s)是一个原语操作,p操作执行 s– ,若s为负数,调用p(s)的进程被阻塞,放到等待队列q中。
p(s)
{
s- -;
if (s < 0)
{
保留调用进程的CPU现场;
将进程的pcb插入到s的等待队列;
把进程变为“等待状态”;
转到进程调度;
}
}
V操作
v(s)刚好与p(s)操作相反,v操作执行 s++ ,若s为大于0,继续执行;s <=0,从信号灯等待队列移出一个进程,解除等待状态,返回本程序继续执行。
v(s)
{
s++;
if (s <= 0)
{
移出s等待队列首元素;
将该进程的pcb插入就绪队列;
设置该进程为“就绪状态”;
}
进程互斥的实现
上锁原语顺利通过可进入临界区CSa或者CSb。
1、使用上锁原语与开锁原语解决并发进程互斥问题:
main()
{
int w = 0; //互斥锁
cobegin
ppa();
ppb();
coend
}
使用信号灯实现进程互斥:
用与互斥信号灯初值mutex = 1 ;表示该资源未被占用。任何想要进入临界区的进程,必须先进行p操作(mutex为1时才能通过),访问临界资源完成后再v操作。。。
mutex =1 : 表示没有进程进入临界区
mutex =0 : 表示有一个进程进入临界区,前方没有其他进程。
mutex =-1 :表示一个进程已经进入,另一个进程的等待进入。
main()
{
int mutex = 0; //互斥信号灯
cobegin
Pa();
Pb();
coend
进程同步实现:
生产中消费者问题:
这里写图片描述
消费者:消耗系统资源。
生产者:释放系统资源。
缓冲区未空:消费者就可以一直取资源。
缓冲区未满:生产者就可以一直生产资源。
因此,同步关系保证了上面两点的实现。
方法:用两个信号灯,分别说明缓冲区数目(full和empty)
main()
{
int w = 0; //满缓冲区的数目
int empty = n; //空缓冲区的数目
int mutex = 1; //对有界缓冲区进行操作的互斥信号灯
cobegin
P1();P2()……Pm();
C1();C2()……Cn();
coend
}
producer() consumer()
{ {
while(生产未完成) while(还要继续消费)
{ {
. p(full);
. p(mutex);
. 从有界缓冲区取产品;
生产一个产品; v(mutex);
p(empty); v(empty);
p(mutex); .
送一个产品到有界缓冲区; .
v(mutex); .
v(full); 消费一个产品;
}
} }
}
- [学习记录]Kepware学习记录(2)
- 脚本学习记录2
- GUI学习记录2
- Python学习记录2
- WCF 学习记录(2)
- thinkPHP学习记录2
- fortran 学习记录2
- Android学习记录2
- Java 学习记录2
- OpenGL学习记录2
- hibernate学习记录2
- java学习记录2
- Java学习记录(2)
- PHP学习记录2
- Hadoop学习记录-2
- thinkphp3.2学习记录
- Hibernate 学习记录 2
- Hibernate学习记录2
- Java正则表达式
- Warning:The `android.dexOptions.incremental` property is deprecated and it has no effect on the buil
- 安装和配置git
- 自定义控件实现banner轮播
- 最大流的Ford-Fulkerson 标号法
- 学习记录2
- 按各个输出格式输出数据
- JAVA使用Gson排除特定字段
- Programming Ability Test 乙级真题及训练集1002
- HDU-2255(记录km算法的板子,km求最大权,最小权匹配)
- 使用BEGAN生成美女图片
- 第四章 多态
- 五、读第十一、十二章
- 求二次方程的根。求平方根的函数是sqrt,头文件