文章目录
顺序程序和并发
顺序程序
开始-计算-输出
- 顺序性
- 封闭性
- 可再现性
并发程序
一个程序段执行未结束另外一个已经开始.
并行记号
cobegin
...
coend
性质:无封闭性和可再现性
公共变量(临界资源会对执行产生影响
一个程序可以有多个计算段和IO段
进程
所谓进程,就是一个具有独立功能的程序关于某个数据集 合的一次运行活动.
- 程序是静态的概念,进程是动态的概念;
- 进程是一个独立运行的活动单位;
- 进程是竞争系统资源的基本单位;
- 一个程序可以对应多个进程,一个进程包含一个程序。
进程的基本状态
- Running
- Wait
- Ready
进程的转换
进程描述(*)
- 进程控制块:描述进程和其他资源的关系
- 程序和数据
进程控制块PCB
- 进程标识符PID
- 进程状态(Run,Ready,Wait)
- 队列指针(队列是相同状态的进程)
- 优先级
- CPU保护信息
- 进程间通讯信息
- 资源占用清单
进程管理
进程状态的变化
- 创建->撤销
- 运行->等待
- 等待->就绪
进程控制原语
进程创建原语
创建一个具有指定标识符的进程,建立进程的PCB结构
进程撤销原语
当进程完成任务后希望终止自己时使用进程撤消原语
撤消当前运行的进程。将该进程的PCB结构归还到PCB资源池,所占用的资源归还给父进程,从总链队列中消除它,然后转进程调度程序
kill()
& exit()
进程等待原语
当进程需要等待某一事件完成时,它可以调用等待原语挂起自己
susp()
进程唤醒原语
当处于等待状态的进程所期待的事件来到时,由发现者进程使用唤醒原语叫唤醒
进程互斥
临界资源
多个进程共享的资源
- 硬件:IO设备
- 软件:公共变量等
互斥
当一个进程访问临界区域时不允许其他的进程访问.
同步
进程间在一些节点时需要进行通信
进程同步管理
See: https://blog.csdn.net/qicheng777/article/details/77432129
进程锁
用变量w代表某种资源的状态,w称为“锁” 。
上锁操作和开锁操作
进程及进程管理——进程同步机构
检测w的值 (是0还是1);
如果w的值为1,继续检测;
如果w的值为0,将锁位置1 (表示占用资源),进入临界区执行。 (此为上锁操作)
临界资源使用完毕,将锁位置0。 (此为开锁操作)
- 上锁原语:
lock(w)
- 开锁原语:
unlock(w)
信号灯(*)
信号灯是一个确定的二元组 (s,q),s是一个具有非负初值 的整型变量,q是一个初始状态为空的队列。操作系统利用信号灯的状态对并发进程和共享资源进行控制和管理。
变量值 ≥ 0 时,表示绿灯,进程执行;
变量值 < 0 时,表示红灯,进程停止执行
注意:创建信号灯时,应准确说明信号灯 s 的意义和初值
P:-1
如果**=<0**,置等待状态
V:+1
如果**>0**,进入就绪状态
See: https://blog.csdn.net/XiaoBuHome/article/details/50223879
互斥的实现范式:
main( )
{
int mutex=1; ∕* 互斥信号灯 *∕ //初始设置为1
cobegin
pa( );
pb( );
coend
}
pa( )
{
p(mutex);
//...
v(mutex);
}
pb()
{
p(mutex);
//...
v(mutex);
}
合作进程的执行实现(*)
类似这样的合作进程,实现分析如下:
-
先执行pa
-
执行完毕后打开b,c信号
-
执行bc
-
一开始只有a可以执行
-
a执行完之后才能执行bc
碎碎念:code
段中是不是三个p是同一级别,只看信号灯调动??
范式:
main()
{
sig2=0;
sig3=0;
code begin
p1();
p2();
p3();
code end
}
p1()
{
//...
v(sig2);
v(sig3);
}
p2()
{
p(sig2);
//...
}
p3()
{
p(sig3);
//...
}
范式:
main()
{
sig3=-1;
code begin
p1();
p2();
p3();
code end
}
p1()
{
//...
v(sig3);
}
p2()
{
//...
v(sig3)
}
p3()
{
p(sig3);
//...
}
共享缓冲区的同步
计算进程 cp和打印进程 iop公用一个单缓冲,为了完成正确的计算与打印,试用信号灯的p、v操作实现这两个进程的同步。
也就是计算部分将数据存放进缓冲区buf中,由打印进程取出并输出.
- 当cp进程把计算结果送入buf时,iop进程才能从buf中取出结 果去打印,否则必须等待。
- 当iop进程把buf中的数据取出打印后,cp进程才能把下一个 计算结果数据送入buf中,否则必须等待。
信号灯设置
-
sa:表示缓冲区中是否有可供打印的计算结果,其初值为0。
-
sb:表示缓冲区有无空位置存放新的信息,其初值为1。
进程描述
cp:
- 产生数据
- p(sb)//标识无空位(sb-1)
- 放入数据
- v(sa)//标识有数据(sa+1)
iop:
- p(sa)//标识无数据
- 取出数据
- v(sb)//标识有空位
- 打印
范式
main( )
{
int sa=0; ∕* buf isdata*∕
int sb=1; ∕* buf isempty*∕
cobegin
cp( );iop( );
coend
}
cp()
{
while(not finished)
{
get_result;
p(sb);
push;
v(sa);
}
}
iop()
{
while(not_finished)
{
p(sa);
get_from_buffer;
v(sb);
output;
}
}
出数据
3. v(sb)//标识有空位
4. 打印
范式
main( )
{
int sa=0; ∕* buf isdata*∕
int sb=1; ∕* buf isempty*∕
cobegin
cp( );iop( );
coend
}
cp()
{
while(not finished)
{
get_result;
p(sb);
push;
v(sa);
}
}
iop()
{
while(not_finished)
{
p(sa);
get_from_buffer;
v(sb);
output;
}
}