- 一、基础概念
- 二、信号量和P、V操作
- 三、pv原语
- 四、关于死锁的概念
1、进程:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2、进程PCB:系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标志。进程与PCB是一一对应的)。
3、临界区:每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。
4、锁:在多线程编程中,操作系统引入了锁机制。通过锁机制,能够保证在多核多线程环境中,在某一个时间点上,只能有一个线程进入临界区代码,从而保证临界区中操作数据的一致性。
5、死锁:一个进程需要独占访问不止一种资源。而操作系统允许多个进程并发致性共享系统资源时,此时可能会出现进程永远被阻塞的现象。这种现象称为死锁。
二、信号量和P、V操作1、信号量:1965年荷兰的计算机科学家E.W.Dijkstra提出的新的同步工具。他将交通管制中多种颜色的信号灯管理交通的方法引入操作系统,让两个或多个进程通过信号量展开交互。信号量常常用一个记录型数据结构表示,它有两个分项:信号量的值,信号量队列的队列指针。例:信号量是一个二元数组(s,q)。可以这么理解s信号量的状态(一个整数),s的初值不为负数(和交通灯类似)。q是它的等待队列,建立信号量时q为空。
- s >=0 : 绿灯
- s < 0 :红灯
2、原语:信号量仅能由同步原语对其进行操作,而原语是执行时不可中断的过程,即原子操作。Dijkstra发明了两个同步原语:P操作和V操作,此外还用的符号有:wait和signal,up和down,sleep和wakeup。利用信号量和P、V操作既可以解决并发进程的的竞争问题,又可以解决进程的协作问题。例:对信号量状态进行改变,P调用一次-1,V调用一次+1。
3、上锁原语:
lock:(w锁位为1,表示已上锁)
{
while(w == 1)
{
保护现场进程CPU现场;
将现行进程的pcb插入w的等待队列;
置该进程为“等待”状态;
转进程调度;
}
w = 1; //上锁
}
4、开锁原语:
lock:(w锁位为1,表示已上锁)
{
while(w等待队列不为空)
{
移除等待队列首元素;
将现行进程的pcb插入w的就绪队列;
置该进程为“就绪”状态;
}
w = 0; //开锁
}
5、P操作: p(s)是一个原语操作,p操作执行 s– ,若s为负数,调用p(s)的进程被阻塞,放到等待队列q中。
p(s)
{
s- -;
if (s < 0)
{
保留调用进程的CPU现场;
将进程的pcb插入到s的等待队列;
把进程变为“等待状态”;
转到进程调度;
}
}
6、V操作 : v(s)刚好与p(s)操作相反,v操作执行 s++ ,若s为大于0,继续执行;s
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?