线程的挂起是错误的概念实际是线程的阻塞

线程的主要状态有运行态,就绪态和阻塞态。挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念。特别地,如果一个进程被换出,由于它的所有线程都该进程的地址空间,因为它们必须都被换出。
进程的挂起是由于I/o跟不上处理器的速度,I/o已被占用,那么下一个请示I/o的进程阻塞,如此如此,当就绪队列中没有进程时(全部阻塞),则挂起某个阻塞进程的一部分或全部内容(这句话可能有问题,是摘抄的)

阻塞与挂起是两码事。挂起需要把进程的数据换出到磁盘中,你的问题个人认为是应该把线程变成阻塞状态等待。

https://bbs.csdn.net/topics/270030721?list=3341036

概念

挂起进程在操作系统中可以定义为暂时被淘汰出内存的进程,机器的资源是有限的,在资源不足的情况下,操作系统对在内存中的程序进行合理的安排,其中有的进程被暂时调离出内存,当条件允许的时候,会被操作系统再次调回内存,重新进入等待被执行的状态即就绪态,系统在超过一定的时间没有任何动作。 [1]

原因

(1)终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂停使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态成为“挂起状态”。
  (2)父进程的请求。有时父进程希望挂起自己的某个子进程,以便考察和修改子进程,或者协调各子进程间的活动。
  (3)负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
  (4)操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
  (5)对换的需要。为了缓和内存紧张的情况,将内存中处于阻塞状态的进程换至外存上。 [1]

参考资料

  • 1.  汤小丹等.《计算机操作系统》(第三版):西安电子科技大学出版社,2007
  • https://baike.baidu.com/item/%E6%8C%82%E8%B5%B7%E7%8A%B6%E6%80%81/9359976?fr=aladdin

进程的挂起、阻塞和睡眠

2017-04-05 16:14:22

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


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

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

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

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

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

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

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

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

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

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

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

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

https://www.cnblogs.com/ck1020/p/6669661.html

线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程相关推荐

  1. 别告诉我你连线程池都不会用~ 一文搞懂线程池

    线程池作用 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗. 提高响应速度:任务到达时,无需等待线程创建即可立即执行. 提高线程的可管理性:线程是稀缺资源,如果无限制创建 ...

  2. Linux——线程同步(条件变量、POSIX信号量)和线程池

    一.线程同步 (一).概念 线程同步是一种多线程关系,指的是线程之间按照特定顺序访问临界资源,进而能够避免线程饥饿问题. 所谓线程饥饿指的是某个线程长期"霸占"临界资源,导致其他线 ...

  3. 并发编程概念、程序线程进程、线程同步、互斥量、读写锁、协程并发

    多线程: 多线程就是同时执行多个应用程序,需要硬件的支持 同时执行:不是某个时间段同时,cpu切换的比较快,所有用户会感觉是在同时运行 并发与并行: 并行(parallel):指在同一时刻,有多条指令 ...

  4. [转载]今天安装sql2000,老是出挂起的错误。所以找了找看见了这个方法。

    今天安装sql2000,老是出挂起的错误.所以找了找看见了这个方法. 原帖地址:http://hi.baidu.com/xpyi/blog/item/fa1fd3af254d32f2fbed500d. ...

  5. SQL Server安装问题程序被挂起的错误解决办法

    SQL Server安装问题程序被挂起的错误解决办法 SQL Server安装问题程序被挂起的错误解决办法 安装SQL Server2000的时候,安装程序提示我安装程序被挂起,让我重新启动电脑,但我 ...

  6. 多线程(一) 线程概念及创建线程的方法

    多线程(一) 多线程基础 前言 我只是一个新上路的小菜鸟,通过分享自己的所学来巩固知识,文中如有错误希望能够指出改正. 一.线程的相关概念 程序 程序是为了完成特定任务,用某种语言编写的一组指令的集合 ...

  7. 【Java多线程】了解线程的锁池和等待池概念

    文章目录 一.内置锁 二.线程状态 线程的5种状态 线程状态图 线程释放锁的情况 线程阻塞和线程等待的区别 sleep.join.yield.wait区别 yield不释放锁案例 sleep不释放锁案 ...

  8. java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...

    基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...

  9. Linux系统编程----12(线程概念,Linux线程实现原理,栈中ebp指针和ebp指针,线程的优缺点和共享资源)

    线程概念 什么是线程 在一个程序里的一个执行路线就叫做线程(thread). 更准确的定义是:线程是"一个进程内部的控制序列" 一切进程至少都有一个执行线程 线程在进程内部运行,本 ...

最新文章

  1. 最长公共上升子序列 LCIS
  2. 使用具体的例子来讲解如何使用Esper
  3. 手把手带你使用JS-SDK自定义微信分享效果
  4. android view超出屏幕_Android APP界面保持屏幕常亮方法
  5. 老男孩博客园杨海潮MySQL--MySQL机构逻辑2
  6. 如何在Spring中将@RequestParam绑定到对象
  7. Python模块(1)-Argparse 简易使用教程
  8. 每天一个小异常——ssh整合空指针异常
  9. cortex a7 a53_最美轿跑之一的奥迪A7,究竟有何魅力令人一眼定心
  10. 小米Miui线刷步骤记录
  11. Java 基本数据类型的转换 Java 基础(二)
  12. 六安牌照上海浦东验车
  13. 2021年全球陶瓷基板收入大约409.7百万美元,预计2028年达到657.3百万美元
  14. 软件能力成熟度模型CMM
  15. 解决大疆无人机飞了一段距离就停下来的问题(大疆限飞50米)
  16. XAMPP下载速度太慢了
  17. uniapp自定义导航栏,高度,自定义组件
  18. 身份证号码验证C语言函数
  19. 舰c2018换html5,[ 转] HTML/HTML5 download属性及其兼容性的探讨
  20. css技术点二:字体图标(阿里巴巴字体图标使用)

热门文章

  1. k8s多master建议用几个_Kubernetes 教程之跟着官方文档从零搭建 K8S
  2. 在你做回归测试的时候,突然有个着急的测试需求,你会怎么做?
  3. 自动化测试框架:几行代码轻松解决Appium环境问题
  4. hp打印机无法与计算机,电脑中安装HP打印机后重启无法打印的解决方法
  5. c语言二重循环的盒图怎么画,全国计算机二级C语言程序设计讲义 循环嵌套.ppt...
  6. 系统延时任务和定时任务
  7. 为什么在notebook里面还是显示torch_torch.utils.cpp_extension对c++/cuda进行拓展
  8. python有多态特性吗_Python:多态、协议和鸭子类型
  9. python编写通讯录管理系统_一个简单的python程序实例(通讯录)
  10. Math.round(11.5)等于多少? Math.round(-11.5)等于多少?