文档介绍:第13章程序的并发性和进程交互原语
基本概念
程序与进程
一个程序的一次执行叫做一个进程(process)
就绪ready 可执行代码装入内存立即可运行
运行running 执行进程
阻塞blocked 停止本进程执行, 随时可恢复执行
终止terminated 停止, 且不可恢复执行
激活:创建一个进程并使之进入就绪或立即运行状态
触发:使就绪或阻塞状态转入运行态
中断:使运行的进程转入阻塞或终止态
原语:程序语言中定义的例程名
线程:创建子进程不另分配资源
子进程:一个进程执行中再次创建的进程
线程与进程计算模式及分类
线程是共享资源的轻量级进程(lightweight process),它也有线程执行状态,也有其静态存储和局部变量。
MS-DOS
Java
UNIX
Windows NT
Solaris
Mach
OS/2
原子动作
原子动作是一次“立即”执行完的“顺序”动作。至于是否真正不再分就不一定了。原子动作一般定义在语句级的事件(event)上
事件是本程序表示的状态有了变化
例: PL/1的多任务
PL/1的并发进程是任务TASK, 它可以定义语句级的事件。
P是一个进程, 它并行执行Q进程, 则P进程的正文可以写:
DECLARE X EVENT
:
CALL Q(APT) TASK (X) //激活Q
进程交互
(1) 独立进程两进程并行但不相关
设进程为事件序列, 若有C,K两并行进程, 可表达为C‖:
C={C1, }
K={K1,K2,…Km}
独立进程是两进程内任何事件Ci, Kj的执行都不依赖对方
(2) 竞争进程两进程竞争同一资源
临界段(Critical section):据有并加工资源的代码段
竞争进程一般形式是:
C : loop K : loop
入口协议入口协议
临界段临界段
出口协议出口协议
非临界段非临界段
end loop end loop
入口协议一般是按所设共享变量判断能否进入,出口协议则改置
,利用共享变量“通信”协调
(3) 通信进程两进程有协议的信息交换
设C,K定义如前, Ci必须先于Kj(Kj要用到Ci的结果)的执行, 即其它事件先后无所谓, 一定要保证Ci, Kj的执行顺序.
同步(synchronous)通信指两进程进度各不相同, ,另一方等待,,发送方一直等待接受方执行的结果,拿回结果后再各自执行自己的进程为双向同步通信。
异步(asynchronous),发送方有了信息投入邮箱,, 当然也可做成双向的。
定向/,任何共享该信道的成员均可接受, 所以是异步通信、单向的.
并发程序带来的问题
(1) 速度依赖
并发程序执行结果,(real time)要求的程序,执行结果还取决于绝对速度.
(进入悬置态):
await<表达式> do <语句|进程>
(2) 输入值依赖
同一并发程序两组数据输入可能会有很大差别
(3) 不确定性
顺序程序两次同样值的测试,
(4) 死锁(deadlock)是一种状态,:
受到排斥进程永远访问不到所需资源
循环等待进程资源分配链形成一封闭回路
无占先(no preemption) 进程无法放弃所占的、,只要所据资源的进程未处于使用状态,另一优先级高的进程有了要求,则此资源被后者占去
把持(wait and hold) 相互以占有对方资源为放弃已占资源的先决条件
解决死锁的方法:
利用工具作静态死锁检测,可以避免或减少死锁出现的可能
或事前,让进程同时提出所有需要的资源, 消除把持条件, 或强行给资源排序, 按此顺序满足要求, 消除循环等待条件
或事前,为调度程序声明最大的资源需求
一旦出现, 最笨的办法是重新启动, 试换数据, 找出原因改正之。事后重试解决
一旦出现, 找出死锁地点, 夭折某些事件或进程或设置检测点
(5) 死等(starvati