进程状态和优先级

文章目录

  • 进程状态
  • Linux中具体的进程状态
    • 僵尸进程
    • 孤儿进程
  • 进程优先级

正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

进程状态

进程在操作系统中是有不同的状态的,那么一个进程可以有多少种不同的状态的?

在这里插入图片描述

  1. 运行状态

什么是运行状态呢?
每个CPU都会在系统层面上维护一个叫运行队列的东西,当我们的进程都准备好了,可以随时被调度,就会被放到运行队列中等待执行,所以只要在运行队列的进程都是运行状态。

  1. 阻塞状态

什么是阻塞状态呢?

我们写代码是时候,一定会用到scanf等从键盘中读入的函数或者从硬盘中访问某些资源,但是如果我们一直不输入,或者要访问的该磁盘的资源的进程很多,我们的进程就不能就绪,既然我们需要的资源不能就绪,那么代码就不能接着往后执行,那么我们这种等待资源就绪的进程的状态,就是阻塞状态。并且OS一定是最先知道它所管理的设备的状态的变化的!!

当一个进程阻塞了,从我们小白的视角看就是程序卡住了,换个角度说,就是我们的进程没有在运行队列,CPU不调度我的进程了。

  1. 挂起状态

什么是挂起?

如果说一个进程被阻塞了,那么注定这个进程它所等待的资源是没有就绪的,该进程是无法被调度的,如果此时,OS的内存资源已经验证不足了,怎么办?OS会觉得反正你现在等待的资源没有就绪,也运行不了,所以它会把你加载到内存的代码数据,放到磁盘中,磁盘中有个swap分区,是专门存放被OS替换下去的数据的。所以当你的代码被OS放到磁盘的那一刻起,你的状态就是挂起状态,由于你是阻塞的,所以你就是阻塞挂起状态。但是如果你的进程出现了挂起状态,也就意味着你的OS离挂掉不远了。

将内存数据置换到外存中是针对所有阻塞进程的,不用担心慢的问题,这个是必然的,当出现挂起状态,就不是慢不慢的问题,是OS挂不挂的问题了。当进程再一次被调度是,该挂起的进程的数据就会被置换回来了,这些操作都是操作系统内部完成的。
在这里插入图片描述
PCB中的成员有很多,进程状态就在里面 status。进程状态说白了,就是PCB中的一个字段!而进程状态变化的本质,就是修改 status的值,然后把PCB链如不同的队列中去。

Linux中具体的进程状态

我们看一下kernel内核怎么说

在这里插入图片描述

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping):意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT信号让进程继续运行。
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。
t 停止状态 是debug程序在遇到断点时,进程暂停。

其中S D T t 都是阻塞状态,Linux在内存严重不足的时候,是会自己杀死进程来保证自身接着运行的,一般来说之计OS快要挂掉的时候才有可能能够看到D状态,并且它是不可被杀掉的,它是专门对磁盘设计的一种状态。

我们可以通过 ps axj 来查看进程状态。
在这里插入图片描述
我们的进程还分为前台进程和后台进程。
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。

后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互;Linux的大多数服务器就是使用守护进程实现的。

我们平时执行的可执行程序都是前台的,在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行。

在这里插入图片描述

僵尸进程

我们创建一个进程一定是为了完成某种任务,但是这个任务完成的怎么样,所以在进程退出的时候是要有一些退出的信息,表示自己的任务完成的怎么样,我们平时写的main函数都有return ,这个就是返回信息,当一个进程在退出时退出信息会由OS写入到PCB中,可以允许代码和数据的空间立即被释放,但是PCB不能立即被释放,需要等待父进程来读取返回信息,然后才可以是释放,这样的进程就是僵尸进程。

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

僵尸进程的危害?
进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!
那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
在这里插入图片描述

孤儿进程

子进程退出了,父进程没有退出,该子进程就是僵尸状态,但是要是子进程没有退出,父进程退出来,子进程怎么办?

此时子进程就变成了孤儿进程,它会被1号进程领养,来回收它的PCB。

总结:

  1. 父进程先退出,子进程就称之为“孤儿进程”
  2. 孤儿进程被1号init进程领养,当然要有init进程回收喽。

进程优先级

优先级是什么?
是得到某种资源的先后顺序,优先级存在的本质就是系统资源不足!优先级其实就是进程PCB中的一个字段,数字越小,优先级越高。

Linux中的优先级范围是 60 ~ 99,Linux中程序默认的优先级都是80。
在这里插入图片描述
Linux的优先级是支持动态调整的,Linux中有一个nice值,我们可以通过调整nice值来调整优先级:
优先级(新) = pri(每次都从80开始) + nice。
nice的调整大小是 -20 ~ 19 超过19 的按照19 计算,不高于 -20 的按照 -20计算。

那么为什么OS要把优先级控制在一定的范围内呢?

这是因为OS要保证每个进程在调度的时候,每个进程都要较为均衡的得到调度,如果不控制在一定的范围,容易到值一些优先级较低的进程长时间得不到CPU的调度,导致进程饥饿问题。

优先级VS权限

优先级是保证可以申请到某种资源,只不过需要等一等。
权限是能否得到某种资源。

每一个进程不是占有CPU就一直运行,而是每隔一段时间就会被从CPU上玻璃下来,这段时间就是时间片。Linux内核是支持进程之间进行CPU抢占的,基于时间片的轮转式抢占式内核。并发问题,就一定要考虑进程间的切换。

为什么我们函数内定义的临时变量,会被return返回给外部呢?
这是因为有eax寄存器,它充当了代码的临时空间。

为什么我们的进程知道我们的代码运行到哪里?又是如何做到函数之间的跳转呢?

这是因为CPU内有eip寄存器,它是程序计数器,会记录程序运行的位置。我们进程在运行的时候,是会使用这些寄存器的,我们的进程,会产生各种数据,在寄存器中临时保存。

如果我们有多个进程,各个进程产生的数据都是不一样的,但是寄存器只有一套,那怎么保证数据的独立性呢?

这是因为CPU寄存器的内容会保存到各个进程各自对应的PCB中,在调度的时候把内容放到CPU的寄存器中,在调度完后,再把自己对应的寄存器中的数据带走,这样就可以保证每个进程拥有自己独立的数据,内容保存在PCB中,本质是保存在内存中,所以说寄存器!=寄存器的内容。

那么今天的分享就到这里了,有什么不懂得可以私信博主,或者添加博主的微信,欢迎交流。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图解算法数据结构-LeetBook-数组03_除本身之外乘积

为了深入了解这些生物群体的生态特征,你们进行了大量的实地观察和数据采集。数组 arrayA 记录了各个生物群体数量数据,其中 arrayA[i] 表示第 i 个生物群体的数量。请返回一个数组 arrayB,该数组为基于数组 arrayA 中的数据计算得出的结果&am…

AI驱动的软件测试,何时可以信赖?

综合编译|TesterHome社区 作者|Yuliya Vasilko,数据工程师 以下为作者观点: 越来越多的组织转向人工智能(AI)驱动的测试解决方案,以简化质量保证流程并提高软件可靠性。 随着对人工智能的依赖程…

动态规划题解

文章目录 杨辉三角杨辉三角2爬楼梯最小花费爬楼梯斐波那契数列比特位计数不同路径 杨辉三角 var generate function(numRows) {//先定义一个空数组var ret[];//遍历行数for(let i 0;i<numRows;i){var cownew Array(i1).fill(1)//定义行内数组数&#xff0c;有多少numrows&a…

[N-133]基于springboot,vue小说网站

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plus 本项…

幼教早教内容付费预约小程序的效果如何

很多家庭对孩子的重视程度很高&#xff0c;尤其加之如今激烈竞争的市场&#xff0c;孩子从小便需要各种提前教育&#xff0c;而相关教培企业也比较多&#xff0c;基于服务高需求度&#xff0c;线下教育与线上课程教育同样重要。 在实际经营中&#xff0c;幼教早教培训机构也面…

关于我用半个月过了软件设计师这件事

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 有关考取软件设计师证书的好处我就不在…

JAIN SIP API详解与GB28181服务器实现

目录 JAIN SIP API 摘要 关于JAIN SIP API API概述 maven坐标 类/接口 Message接口 Request接口 Response接口 即时通讯程序 TextClient代码概述 Message Processor SIP协议栈 发送SIP请求 发送会话消息 接收SIP响应 接收SIP请求 处理错误 总结 GB28181SIP…

HDRP图形入门:HDRP渲染管线depth翻转

新项目开坑HDRP渲染管线&#xff0c;花了些时间把项目开发框架和图形工作流更新到最新版本&#xff0c;其间发现HDRP中深度信息和buildin渲染管线翻转了。 以前的buildin渲染管线&#xff0c;距离摄像机越近depth->0&#xff0c;越远depth->1&#xff0c;这也很好理…

2.3 CE修改器:浮点数扫描

本关需要使用 Cheat Engine 工具对浮点数进行扫描&#xff0c;完成修改任务。浮点数是一种带有小数点的数值&#xff0c;通过“浮点数”扫描方式进行修改。本关中&#xff0c;健康值为单精度浮点数&#xff0c;弹药值为双精度浮点数&#xff0c;需要将这两项数值都修改为 5000 …

【Linux】八、进程通信

进程通信的介绍 目的 数据传输&#xff1a;一个进程将它的数据发送给另一个进程&#xff1b; 资源共享&#xff1a;多个进程间共享资源&#xff1b; 通知事件&#xff1a;一个进程向另一个或一组进程发送消息&#xff0c;同时事件如&#xff0c;进程终止时要通知父进程&#xf…

web前端开发第一次Dreamweave课堂练习/html练习代码《社会主义核心价值观》

目标图片&#xff1a; 文字素材&#xff1a; 社会主义核心价值观 Socialist Core Values 富强、民主、文明、和谐是国家层面的价值目标。 自由、平等、公正、法治是社会层面的价值取向。 爱国、敬业、诚信、友善是公民个人层面的价值准则。 Core socialist values are the…

联系作者方式的教程

首先你应该目前是在付费资源运行效果的展示文章页面&#xff0c;如下所示 然后一直往下滑&#xff0c;滑到这个文章的最下面&#xff0c;就可以看到我的推广名片&#xff0c;最后点击这个名片就可以获取到我的联系方式了~

[云原生案例2.4 ] Kubernetes的部署安装 【通过Kubeadm部署Kubernetes高可用集群】

文章目录 1. 基本架构及前置准备1.1 基本架构1.2 前置准备 2. 系统初始化操作 ---- 所有节点2.1 关闭防火墙、selinux和swap分区2.1.1 关闭防火墙和selinux2.1.2 关闭交换分区 2.2 修改主机名&#xff0c;添加域名映射2.2.1 修改主机名2.2.2 修改本地hosts文件 2.3 内核升级2.4…

MGA-WPA

作者未提供代码

YOLO目标检测——水果检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;水果分类检测数据集的应用场景主要包括农贸市场监管、水果品质检测、超市零售管理等数据集说明&#xff1a;水果分类检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;含有苹果香蕉橙子图片标签说明&#xff1a;使…

【Servlet】 三

本文主要介绍了基于serlvet的表白墙项目的编写. (附完整代码) 一.JS基础 作为后端开发,对于前端的要求是能前端代码能看懂七七八八 . JS是一个动态弱类型的编程语言 1. let/war定义变量 (推荐使用let) 2.querySelector是浏览器提供api , 能够获取到页面的元素的 (js的目的就…

CV计算机视觉每日开源代码Paper with code速览-2023.11.9

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【3D目标检测】3DiffTection: 3D Object Detection with …

JAVA毕业设计110—基于Java+Springboot+Vue的房屋租赁系统小程序(源码+数据库)

基于JavaSpringbootVue的房屋租赁系统小程序(源码数据库)110 一、系统介绍 本系统前后端分离 本系统分为用户、房东、超级管理员三种角色 1、用户&#xff1a; 登录、注册、房屋搜索、房屋收藏、看房预约、租房申请、租房记录、看房记录、收藏记录、我的消息、个人信息修改…

企业培训服务预约小程序的作用是什么

企业在经营过程中往往会遇到人才培养进展缓慢、客户难以寻找维系、经营缺乏管理等痛点&#xff0c;基于此&#xff0c;相关企业培训机构或个人有着较高需求&#xff0c;但也同样面临着一些难题。 缺少转化方式&#xff0c;无法促进用户购买或预约咨询服务&#xff0c;向外扩展…

Golang 中的 Context 包

简介 今天&#xff0c;我们将讨论 Go 编程中非常重要的一个主题&#xff1a;context 包。如果你现在觉得它很令人困惑&#xff0c;不用担心 — 在本文结束时&#xff0c;你将像专家一样处理 context&#xff01; 想象一下&#xff0c;你在一个主题公园&#xff0c;兴奋地准备…