管程是一种特殊的软件模块;
- 局部于管程的共享数据结构的说明;
- 对该数据结构进行操作的一组过程(相当于函数);
- 对局部于管程的共享数据设置初始值的语句;
- 管程有一个名字;
- 局部于管程的数据只能被局部于管程的过程所访问;
- 一个进程只有通过调用管程内的过程才能进入管程访问共享数据;
- 每次仅允许一个进程在管程内执行某个内部过程;
- 需要在管程中定义共享数据;
- 需要在管程中定义用于访问这些共享数据的 " 入口 " ---- 其实就是一些函数;
- 只有通过这些特定的 " 入口 " 才能访问共享数据;
- 管程中有很多 " 入口 " ,但是每次只能开放其中一个 " 入口 " ,并且只能让一个进程或线程进入;
- 可在管程中设置条件变量及等待 / 唤醒操作以解决同步问题;
各进程互相等待对方手里的资源,导致各进程都堵塞,无法向前推进的现象;
死锁:
- 一定是 " 循环等待其他进程手里的资源 " 导致的;
- 如果有死锁现象,那至少有两个进程同时发生死锁;
- 死锁一定处于阻塞态;
饥饿:
- 由于长期得不到资源,某进程无法向前推进;
- 可能只有一个进程发生饥饿;
- 发生饥饿的进程可能是阻塞态也可能是就绪态,即得不到需要的 I / O 设备或长期得不到处理机;
死循环:
- 某个进程执行过程中一直跳不出某一个循环的现象;
- 可能只有一个程序发生死循环;
- 可能是程序 bug 导致,可能是程序员故意设计;
- 互斥条件:
只有对必须互斥使用的资源的争抢才会导致死锁;
- 不剥夺条件:
进程所获得的资源在未使用完之前不能由其他进程取走,只能主动释放;
- 请求和保持条件:
进程至少保持了至少一个资源,并又提出了新的资源请求,而所需的资源又被其他进程所占有,这个时候请求进程被堵塞,但是又对已有资源保持不放;
- 循环等待条件:
存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求;
注:发生死锁时一定有循环等待,但是循环等待时不一定是死锁;
- 对系统资源的竞争:各进程对不可剥夺的资源的竞争可能引起死锁;
- 进程推进顺序非法:请求和释放资源的顺序不当也同样会导致死锁;
- 信号量使用不当也会造成死锁;
总结:
对不可剥夺的资源的不合理分配,可能导致死锁;