进程的挂起、阻塞和睡眠

2017-04-05 16:14:22

今天脑子中突然想起进程的挂起和阻塞有什么区别,自己头脑风暴了下,还真不好解释,结合进程的睡眠,于是就有了今天这篇文章,以下内容均是个人参考资料后得到的自己的理解,如有错误,还请指正!



要说挂起、阻塞、睡眠难免让人想到进程生命周期中的阻塞态或者等待状态,而挂起和睡眠却没有出现在进程生命周期中,说明这三个其实在本质上区别并不那么大,但是既然称呼不同,应该就有不同的道理。

先说阻塞,既然它能出现在进程生命周期,必然是每个进程都会经历的一个阶段,众所周知,进程在运行过程中必然要获取资源,暂且不说CPU,进程运行肯定要和磁盘进行交互,继而发生IO操作,IO操作势必要引起等待,在资源未读取完成,进程必然要等待,那么在等待IO完成这个部分就是阻塞状态。所以从这里来看,阻塞是一种被动的方式,由于获取资源获取不到而引起的等待。

再说睡眠,睡眠就是一种主动的方式,其实个人认为睡眠和阻塞在一个层次上,为何这么说呢?当一个进程获取资源比如获取最普通的锁而失败后,可以有两种处理方式,1、自己睡眠,触发调度;2、忙等待,使用完自己的时间。所以从这里看,睡眠的确是一种主动的方式,且仅仅作为一种处理手段。当然睡眠不仅仅用于阻塞,更多的,我们可以在适当的时候设置让进程睡眠一定的时间,那么在这里,就可以发现,睡眠之前,我们已经预先规定了,你只能睡多长时间,这段时间过后,比必须返回来工作。

最后说挂起,挂起也是一种主动的行为,具体而言,挂起是系统层面对进程作出的合理操作。本来想说调度,但是进程调度作为专业术语指CPU资源的分配,那么这里就说操作。挂起的标志就是换出到外存,在外存的进程肯定是不能执行的,所以挂起的目的就很明显,在内存资源不足时,需要把一些进程换出到外存,给着急运行的进程腾地方。挂起倾向于换出阻塞态的进程,也可以是就绪态的进程。只是这个转换几乎不会采用,因为任意时刻,肯定可以找到在内存中的阻塞态进程,但也不能缺少这种直接把就绪转换到挂起的能力。

其实相比之下,睡眠和其他两个结合的不太紧密,有资料说挂起释放内存,而阻塞不释放内存也有一定的道理。下面结合一个图看挂起和阻塞的状态转换:

  • 就绪态:进程在内存中并可以执行。
  • 阻塞态:进程在内存中并等待一个事件。
  • 阻塞/挂起态:进程在外存中并等待一个事件。
  • 就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行。

阻塞和挂起之间的相互转换如下:

阻塞→阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间。如果操作系统确定当前正在运行的进程,或就绪进程为了维护基本的性能要求而需要更多的内存空间,那么,即使有可用的就绪态进程也可能出现这种转换。

阻塞/挂起→就绪/挂起:如果等待的事件发生了,则处于阻塞/挂起状态的进程可以转换到就绪/挂起状态。注意,这要求操作系统必须能够得到挂起进程的状态信息。

就绪/挂起→就绪:如果内存中没有就绪态进程,操作系统需要调入一个进程继续执行。此外,当处于就绪/挂起态的进程比处于就绪态的任何进程的优先级都要高时,也可以进行这种转换。这种情况的产生是由于操作系统设计者规定调入高优先级的进程比减少交换量更重要。

就绪→就绪/挂起:通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能执行。但如果释放内存以得到足够空间的唯一方法是挂起一个就绪态进程,那么这种转换也是必需的。并且,如果操作系统确信高优先级的阻塞态进程很快将会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。

参考:《操作系统:精髓与设计原理(原书第6版)》

时间: 2024-10-31 21:00:26

进程的挂起、阻塞和睡眠的相关文章

linux进程的挂起和恢复

进程的挂起及恢复 #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前台执行:用bg命令将挂起的作业放到后台执行 格式:fg 工作号:bg 工作号 进程:正在执行的一个程序 程序:是一种写好的代码或脚本 &:后台执行,不占用终端 如:xeyes & ps命令进程查看命令 ps命令:process status -e 显示所有进程 -f 全格式 -h 不显示标题 -l 长格式 -w 宽输出 a 显示终

进程&线程 同步异步&阻塞非阻塞

2015-08-19 15:23:38 周三 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 线程安全问题都是由全局变量及静态变量引起的 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用 线程不安全就是不提供数

进程基础知识

进程是可并发执行的程序在一个数据集合上的运行过程. 进程是指进程实体的运行过程. 进程和程序比较 进程更能真实地描述并发,而程序不能: 进程是由程序和数据.进程控制块PCB三部分组成的: 进程具有创建其他进程的功能,而程序没有: 同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程.也就是说同一程序可以对应多个进程: 进程特征 结构性:由程序段.数据段.进程控制块三部分组成: 动态性:进程是程序的执行过程: 并发性:多个进程可同存于内存中,能在一段时间内同时运行: 独立性:独立运行的基本

操作系统核心原理-3.进程管理(上):进程概要

进程管理.内存管理和文件管理是操作系统的三大核心功能,那么什么是进程呢?顾名思义,进程就是进展中的程序,或者说进程是执行中的程序.当一个程序被加载到内存之后就变为了进程.因此,我们可以得到:进程=程序+执行.本篇将会对进程.进程模型.进程状态以及进程的缺陷等进行学习,为后续学习进程调度与进程通信打下坚实基础. 一.进程是什么鬼? 1.1 从工作到进程 进程在Multics操作系统出现之前被叫做工作(Job),工作是IBM用于多道批处理程序设计中的概念.由于历史原因,Multics操作系统的研发人

[操作系统] 进程与线程

一.进程 进程的引入多个程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征. 这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征.为了深刻描述程序动态执行过程的性质,人们引入"进程(Process)"概念.

线程和进程的区别(详细)

1.线程的基本概念 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行. 好处 :(1)易于调度. (2)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程来执行同一程序的不同部分. (3)开销少.创建线程比创建进程要快,所需开销很少.. (4)利于充分发挥多处

Python线程与进程的区别

进程的基本概念 概念进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要使用的资源:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志. 线程的基本概念 概念线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资

Linux内核调试方法总结之死锁问题分析

死锁问题分析 死锁就是多个进程(线程)因为等待别的进程已占有的自己所需要的资源而陷入阻塞的一种状态,死锁状态一旦形成,进程本身是解决不了的,需要外在的推动,才能解决,最重要的是死锁不仅仅影响进程业务,而且还会占用系统资源,影响其他进程.所以内核中设计了内核死锁检测机制,一旦发现死锁进程,就重启OS,快刀斩乱麻解决问题.之所以使用重启招数,还是在于分布式系统中可以容忍单点崩溃,不能容忍单点进程计算异常,否则进行死锁检测重启OS就得不偿失了. 内核提供自旋锁.信号量等锁形式的工具,具体不再赘述. L

多线程的实现方法

第一题:线程的基本概念.线程的基本状态及状态之间的关系? 概念:线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源.一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行. 好处 : (1)易于调度. (2)提高并发性.通过线程可方便有效地实现并发性.进程可创建多个线程来执行同一程序的不同部分. (3)开销少.创建线程比创建进程要快,