现代操作系统中最基本的构成是进程,操作系统中的PV操作,是进程中实现同步和互斥的两种方法,了解PV操作对多线程编程以及JUC框架的本质有非常大的帮助
1 进程模型
1.1 两状态进程模型
最简单的进程模型,一个进程要么正在执行,要么未执行,如图所示
1.2 三态模型
在整个生命周期内,进程总是在一些状态之间转化,对于操作系统的创建和终止一般关注的较少,这里我们需要关注更重要的三种状态,即就绪态、运行态和阻塞态
就绪态:当前未执行但已做好准备的进程,只要操作系统调度到它,就会执行 运行态:当前正在被处理器执行的进程,在多处理器的系统中会有多个进程处于这种状态 阻塞态:正在等待某一事件完成(如IO操作)的进程
1.3 五状态进程模型
运行态:进程正在执行 就绪态:进程做好了准备,只要有机会就开始执行 阻塞/等待态:进程在某些事件发生前不能执行,如I/O操作完成 新建态:刚刚创建的过程,操作系统还未把它加入可执行进程组,它通常是进程控制块已经创建但还未加载到内存中的新进程 退出态:操作系统从可执行进程组中释放出的进程,要么它自身已停止,要么它因某种原因被取消
2 进程同步与互斥
在多进程的系统下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步和互斥
2.1 进程同步
进程同步也是进程之间直接的制约关系,是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系
如上图所示,进程P1需要从缓冲区读取进程P2产生的信息,当缓冲区为空时,进程P2因为读取不到信息而被阻塞。而当进程P1产生信息放入缓冲区时,进程P2才会被唤醒
2.2 进程互斥
进程互斥是进程之间的间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待。只有当使用临界资源的进程退出临界区后,这个进程才会解除阻塞状态
如上图所示,进程P2需要访问打印机,但此时进程P1占有了打印机,进程P2会被阻塞,直到进程P1释放了打印机资源,进程P2才可以继续执行
3 信号量
信号量是一种用来解决进程同步与互斥问题的机制
3.1 定义
信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程,信号量的值表示相应资源的使用情况,是用来解决进程同步与互斥的机制
3.2 使用方式
信号量 S>=0 时,S 表示可用资源的数量,执行一次P操作意味着请求分配一个资源,因此 S 的值减 1
信号量 S<0 时,表示已经没有可用资源,S 的绝对值表示当前等待该资源的进程数,请求者必须等待其他进程释放该类资源才能继续运行,而执行一个V操作意味着释放一个资源,因此 S 的值加 1
若 S<0 ,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去
注意:信号量S的值只能通过操作系统PV操作改变
4 PV操作(占有和释放)
一种实现进程互斥与同步的有效方法,包含P操作与V操作
P操作:使 S=S-1 ,若 S>=0 ,则该进程继续执行,否则排入等待队列
P (S){S=S-1;}
//若S<0,将该进程状态置为等待状态,
//然后将该进程的控制块插入相应的S信号量等待队列末尾,
//直到有其他进程在S上执行V操作为止
V操作:使 S=S+1 ,若 S>0 ,唤醒等待队列中的一个进程
V (S){S = S + 1 ;}
//若S<=0,释放在S信号量队列中等待的一个进程,
//将其状态改变为就绪态,并将其插入就绪队列;
//然后,执行本操作的进程继续执行
5 临界资源与缓冲区
5.1 临界资源
在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等,而进程内访问临界资源的代码称为临界区,对临界区的访问过程分为以下四个部分:
①进入区:查看临界区是否可访问,如果可以访问,则转到步骤二,否则进程会被阻塞
②临界区:在临界区做操作
③退出区:清除临界区被占用的标志
④剩余区:进程与临界区不相关部分的代码
5.2 缓冲区
进程 P1 将信息输入到缓冲区 B 中,进程 P2 负责从缓冲区 B 中取出数据输出
① 对于进程 P1 来说,如果缓冲区满,则应暂停输入,等待 P2 进程取走数据后再输入新数据
②对于进程 P2 来说,如果缓冲区空,则应等待 P1 进程送来新数据
6 小结
(1)操作系统的进程模型,其中五态的通用进程模型,是通常被用的最多的,更符合人的思考习惯,包括之后会提到的java线程的6种状态也是参考操作系统的五态模型设计的
(2)P操作和V操作都是操作系统的原语,是用于解决进程同步和互斥的一种机制
(3)信号量是个被保护的量,只有P、V操作和信号量初始化操作才能访问和改变它的值,同一信号量的P、V操作总是成对出现,P(s)对应s+1;V(s)对应s-1
(4)对于临界资源的访问,必须是互斥进行。也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到其所申请的临界资源被释放
一起探索架构技术,拥抱AI,欢迎与我交流!