操作系统僵尸进程、CFS、上下文切换

进程

Linux的进程调度

CFS 完全公平调度算法

权重和nice值
  • 权重:权重越大,分配的时间比例越大,就相当于进程的优先级越高。 进程的时间 = C P U 总时间 ∗ 进程的权重 / 就绪队列所有进程权重之和 进程的时间 = CPU总时间 * 进程的权重/就绪队列所有进程权重之和 进程的时间=CPU总时间进程的权重/就绪队列所有进程权重之和
  • nice值:进程对外的编程接口中使用的是一个nice值,大小范围是(-20~19),数值越小优先级越大,意味着权重值越大,nice值和权重之间可以转换的。一个进程每降低一个nice值,就能多获得10% 的CPU时间。1024权重对应nice值为0,被称为NICE_0_LOAD。默认情况下,大多数进程的权重都是NICE_0_LOAD
虚拟时间

虚拟时间vruntime和实际时间(wtime)转换公式如下:

v r u n t i m e = w t i m e ∗ ( N I C E _ 0 _ L O A D / w e i g h t ) vruntime = wtime * (NICE\_0\_LOAD / weight) vruntime=wtime(NICE_0_LOAD/weight)

CFS调度主要保证每个进程运行的虚拟时间一致即可。在选择下一个即将运行的进程时,只需要找到虚拟时间最小的进程就行了

在运行队列中用红黑树结构组织进程的调度实体,这里进程虚拟时间正是红黑树的key,这样进程就以进程的虚拟时间被红黑树组织起来了。红黑树的最左子节点,就是虚拟时间最小的进程,随着时间的推移进程会从红黑树的左边跑到右,然后从右边跑到左边,

CFS调度进程

让虚拟时间最小的进程最先运行, 一旦进程运行虚拟时间就会增加,最后尽量保证所有进程的虚拟时间相等,谁小了就要多运行,谁大了就要暂停运行。

僵尸进程及守护进程?

守护进程

守护进程就是在后台运⾏,不与任何终端关联的进程,⼀个守护进程的⽗进程是init进程通常情况下守护进程在系统启动时就在运⾏,它们以root⽤⼾运⾏,并能处理⼀些系统级的任务

孤⼉进程

如果⽗进程先退出,⼦进程还没退出,那么⼦进程的⽗进程将变为init进程。(注:任何⼀个进程都必须有⽗进程)。孤⼉进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集⼯作。因此孤⼉进程并不会有什么危害

僵⼫进程

⼦进程⽐⽗进程先结束,而⽗进程⼜没有回收⼦进程,释放⼦进程占⽤的资源,此时⼦进程将成为⼀个僵⼫进程。

⼀个进程在调⽤exit命令结束⾃⼰的⽣命的时候,其实它并没有真正的被销毁, 而是留下⼀个称为僵⼫进程(Zombie)的数据结构

在Linux进程的状态中,僵⼫进程是⾮常特殊的⼀种,它已经放弃了⼏乎所有内存空间,没有任何可执⾏代码,也不能被调度,仅仅在进程列表中保留⼀个位置,记载该进程的退出状态等信息供其他进程收集。

系统所能使⽤的进程号是有限的,如果⼤量的产⽣僵⼫进程,将因为没有可⽤的进程号而导致系统不能产⽣新的进程。 此即为僵⼫进程的危害,应当避免。

⭐️如何避免僵⼫进程?
  • ⽗进程通过waitwaitpid等函数等待⼦进程结束,但是这会导致⽗进程挂起。

  • 忽略SIGCHLD信号,这常⽤于并发服务器的性能的⼀个技巧

    因为并发服务器常常fork很多⼦进程,⼦进程终结之后需要服务器进程去wait清理资源。如果将此信号的处理⽅式设为忽略,可让内核把僵⼫⼦进程转交给init进程去处理,省去了⼤量僵⼫进程占⽤系统资源。

  • 如果⽗进程很忙可以⽤signal函数为SIGCHLD注册handler信号处理函数,在信号处理函数调⽤wait/waitpid等待⼦进程退出。

  • 通过两次调⽤fork。⽗进程⾸先调⽤fork创建⼀个⼦进程然后waitpid等待⼦进程退出,⼦进程再fork⼀个孙进程后退出。这样⼦进程退出后会被⽗进程等待回收,而对于孙⼦进程其⽗进程已经退出所以孙进程成为⼀个孤⼉进程,孤⼉进程由init进程接管,孙进程结束后,init会等待回收。

⼦进程结束后为什么要进⼊僵⼫状态**?**

设置僵⼫进程的⽬的是维护⼦进程的信息,⽗进程可能要取得⼦进程的退出状态等信息。这些信息⾄少包括进程ID,进程的终⽌状态,以及该进程使⽤的CPU时间,当⽗进程调⽤waitwaitpid时就可以得到这些信息。

僵⼫状态是每个⼦进程必经的状态吗?

是的。 任何⼀个⼦进程(init除外)在exit()之后,并⾮⻢上就消失掉,而是留下⼀个称为僵⼫进程(Zombie)的数据结构,等待⽗进程处理。这是每个⼦进程在结束时都要经过的阶段。如果⼦进程在exit()之后,⽗进程没有来得及处理,这时⽤ps -aux命令就能看到⼦进程的状态是“Z”。如果⽗进程能及时 处理,可能⽤ps -aux命令就来不及看到⼦进程的僵⼫状态,但这并不等于⼦进程不经过僵⼫状态。

僵尸进程不能将它看成是一个正常的进程,这个进程已经死亡了,用户区资源已经被释放了,只是还占用着一些内核资源(PCB)。 僵尸进程就相当于是一副已经腐烂只剩下骨头的尸体。

僵尸进程的出现是由于这个已死亡的进程的父进程不作为造成的。

消灭僵尸进程的方法是,杀死这个僵尸进程的父进程,这样僵尸进程的资源就被系统回收了。通过kill -9 僵尸进程PID的方式是不能消灭僵尸进程的,这个命令只对活着的进程有效,僵尸进程已经死了,鞭尸是不能解决问题的。

上下文切换?

CPU上下文切换

根据任务的不同,CPU 的上下文切换就可以分为几个不同的场景,也就是进程上下文切换线程上下文切换以及中断上下文切换

系统调用

系统调用过程中,不会涉及到虚拟内存等进程用户态的资源,也不会切换进程。

  • 进程上下文切换,是指从一个进程切换到另一个进程运行。
  • 而系统调用过程中一直是同一个进程在运行。

所以,系统调用过程通常称为特权模式切换,而不是上下文切换

进程上下文切换

进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。

因此,进程的上下文切换就比系统调用时多了一步:在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。(与系统调用的区别?

线程上下文切换
  • 前后两个线程属于不同进程。此时,因为资源不共享,所以切换过程就跟进程上下文切换是一样。
  • 前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。
中断上下文切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。而在打断其他进程时,就需要将进程当前的状态保存下来,这样在中断结束后,进程仍然可以从原来的状态恢复运行。

  • 中断上下文切换并不涉及到进程的用户态。

  • 所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。

  • 中断上下文,其实只包括内核态中断服务程序执行所必需的状态,包括CPU 寄存器、内核堆栈、硬件中断参数等。

  • 对同一个 CPU 来说,中断处理比进程拥有更高的优先级

  • 进程上下文切换一样,中断上下文切换也需要消耗CPU

参考:
极客时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑鼠标一直转圈圈怎么处理?对症下药,分享6种方法

在使用电脑的过程中,鼠标一直转圈圈是一个常见且令人困扰的问题。这种情况通常意味着系统正在处理某些任务,但如果持续时间过长,可能表明系统存在性能问题或错误。本文将详细探讨鼠标一直转圈圈的常见原因及其解决方法。 摘要 电脑鼠标一直转…

概述:监督学习(分类,回归)与无监督学习(聚类)

目录: 一、监督学习:1.什么是监督学习:2.监督学习类型: 二、无监督学习1.什么是无监督学习:2.无监督学习类型: 一、监督学习: 1.什么是监督学习: 当前创造市场价值的机器学习中99%都是监督学习。监督学习…

Django实现部门管理功能

在这篇文章中,我们将介绍如何使用Django框架实现一个简单的部门管理功能。这个功能包括部门列表展示、添加新部门、编辑和删除部门等操作。 1. 项目设置 首先,确保你已经安装了Django并创建了一个新的Django项目。在项目中,我们需要创建一个名为​​app01​​的应用。 2.…

【前端项目笔记】8 订单管理

订单管理 效果展示: 在开发功能之前先创建分支order cls 清屏 git branch 查看所有分支(*代表当前分支) git checkout -b order 新建分支order git push -u origin order 将本地的当前分支提交到云端仓库origin中命名为order 通过路由方式…

JAVA 和Python对比

JAVA 和Python对比 1 . 数据类型 python Int,float,complex numbers 都没有定义到底占用多少个字节空间。都是没有取值范围,也没有无符号的情况。 JAVA JAVA 有基础数据类型,都有确定占多少个字节 2. 全局变量 python 类似…

基于精益转型打造医疗电子运营新模式

为了保持竞争优势并满足日益增长的客户需求,许多企业开始探索精益转型之路,以打造医疗电子运营的新模式。本文,深圳天行健精益管理咨询公司将从精益转型的概念、实施策略以及面临的挑战等方面,深入探讨如何通过精益转型实现医疗电…

面试问题C++

当你将一个无符号整型(unsigned integer)转换为一个有符号整型(signed integer)时,具体的值取决于原始无符号整型的值以及目标有符号整型的大小。 转换规则: 如果无符号整型的值在有符号整型的可表示范围内(即它小于等于INT_MAX),则转换后的值将保持不变。如果无符号…

【数据结构】(C语言):堆(二叉树的应用)

堆: 此处堆为二叉树的应用,不是计算机中用于管理动态内存的堆。形状是完全二叉树。堆分两种:最大堆,最小堆。最大堆:每个节点比子树所有节点的数值都大,根节点为最大值。最小堆:每个节点比子树…

python-opencv多态模板匹配简单代码实现

在我实验过程中发现,这种模板匹配如果不做任何处理只对原有图像进行匹配的话,好像效果很瓜 貌似是模板是1 那就只能检测出正常形态下的1,变大或者是 l 都不一定检测到, 也就是说,只能检测和模板图片大小尺寸颜色类别…

docker 安装 禅道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口号访问 使用禅道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…

电脑录制视频的软件,电脑录制,4款免费软件推荐

在数字化时代,电脑录制视频的软件已成为我们日常生活和工作中的得力助手,这些软件可以帮助我们轻松捕获到屏幕上的精彩瞬间。但同时市面上的录制视频软件也层出不穷,让人不知该如何选择。到底怎样才能选择到一款适合自己的录屏软件呢&#xf…

【SpringBoot3学习 | 第2篇】SpringBoot3整合+SpringBoot3项目打包运行

文章目录 一. SpringBoot3 整合 SpringMVC1.1 配置静态资源位置1.2 自定义拦截器(SpringMVC配置) 二. SpringBoot3 整合 Druid 数据源三. SpringBoot3 整合 Mybatis3.1 Mybatis整合3.2 声明式事务整合配置3.3 AOP整合配置 四. SpringBoot3 项目打包和运行…

k8s-第二节-常用操作

k8s命令行常用操作 k8s命令行 操作对象时都要前面声明操作对象类型 kubectl get kubectl describe kubectl delete kubectl edit kubectl logs kubectl exec kubectl port-forward 端口转发将pod 端口映射出来 kubectl cp 本地文件路径:容器文件路径 kubectl apply …

【JS场景题】判断一个元素是否在可视区域内有哪些方法?

方法一、通过元素的位置信息和滚动条滚动的高度来判断 前置知识 clientWidth: 元素的内容区域宽度加上左右内边距宽度。offsetTop: 元素的上外边框至包含元素的上内边框之间的像素距离。document.documentElement.clientHeight: 获取视口高度(不包含滚动…

《Attention Is All You Need》解读

一、简介 “Attention Is All You Need” 是一篇由Ashish Vaswani等人在2017年发表的论文,它在自然语言处理领域引入了一种新的架构——Transformer。这个架构现在被广泛应用于各种任务,如机器翻译、文本摘要、问答系统等。Transformer模型的核心是“自…

小学vr虚拟课堂教学课件开发打造信息化教学典范

在信息技术的浪潮中,VR技术正以其独特的魅力与课堂教学深度融合,引领着教育方式的创新与教学方法的变革。这一变革不仅推动了“以教促学”的传统模式向“自主探索”的新型学习方式转变,更为学生带来了全新的学习体验。 运用信息技术融合VR教学…

深度学习1

1.支持向量机Support Vector Machine(SVM)是一种对数据二分类的线性分类器,目的是寻找一个超平面对样本进行分割,广泛应用人像识别,手写数字识别,生物信息识别。 二维空间分割界是一条直线,在三…

table = collections.defaultdict(list)申请的字典的类型是什么?

当你使用 collections.defaultdict(list) 来申请一个字典时,这个字典的类型是 defaultdict,但是其行为和表现方式在某些方面与普通的字典(dict)相似,主要区别在于它如何处理缺失的键。 defaultdict 是 Python 标准库 …

【基础篇】第4章 Elasticsearch 查询与过滤

在Elasticsearch的世界里,高效地从海量数据中检索出所需信息是其核心价值所在。本章将深入解析查询与过滤的机制,从基础查询到复合查询,再到全文搜索与分析器的定制,为你揭开数据检索的神秘面纱。 4.1 基本查询 4.1.1 Match查询…

Java操作Excel最佳实践

Java操作Excel最佳实践 1、背景描述2、Apache POI简介3、Java读取Excel 1、背景描述 2、Apache POI简介 官网&#xff1a;http://poi.apache.org/index.html 官方文档&#xff1a;https://poi.apache.org/apidocs/index.html 3、Java读取Excel 3.1、导入依赖 <dependency…