菜鸟Linux(2):进程优先级与进程状态

news2024/11/24 5:16:47

 "才一年,看着世界变迁,有种沧海桑田"


一、进程调度 与 进程优先级

(1)何为优先级

双击.exe(可执行程序)文件 会发生什么?

但是,当我们使用电脑的时候,不仅仅只会 启动一个程序! 系统中一定会有多个 进程同时存在! 

然而,需求是无限的! 资源却是有限的! 既是存在再多CPU也有 无限的进程 里的代码需要被执行!

在我们实际使用中的计算机,恐怕不会遇见 只能开一个或者几个进程,而其他进程起 不来的情况吧? 

显然聪明的大佬们不会让这种事情发生!当然,我们也过于低估了CPU执行、跑代码的速度!

总有进程能够有机会 或许在(到来的时间上,或是"nice"值上.....) 

能够更优先一步地 " 抢占 "CPU资源!

这也就是 所谓的优先级的概念!

权限  -----> 能否

优先级 ---->(能的基础上) 先后!

①nice值

//进程nice值设置
top + r  + 进程id + 设置的值[-20,19]

为什么这样的nice值 会有限制?[-19,20) 

限制的根本在于: 促进 各个进程 都能被cpu调度,cpu能更公平地被 使用!

可以想想,如果 一个特别高优先级的进程存在! 那么 一定会首先抢占cpu资源, 而它的执行时间又长又臭 并且大多数都在等待某种资源就绪!这样所谓的 "占着茅坑,不拉屎" 的行为 反而让其他进程 因为优先级低 无法 抢占cpu而无法被调度得到cpu资源。 

(2)何为调度? 

任何时刻,进程都有可能会因调度 从cpu上拿下来,换上另外一个 优先级更高 或者 因超时而被换下..... 那么,如果这个被 “切换下” 的进程如果再次被调度呢? 它原先执行到的历史数据是否该被丢弃了?  

答案是肯定不行!

但又如何 解决 正在被执行的进程突然被切走呢? 保存 寄存器里的 临时数据! 也就是保存 寄存器里的上下文数据。(当然,这种数据最后被保存到哪里呢? 此时我们并不用太过关心) 

由此,如果被切走的进程 再一次被cpu调度,也就会先读取 加载历史数据,而不会再重新 去执行该进程的代码。 

"保护 数据是为了 恢复数据"


二、进程状态

在前半部分,我们有了一个概念。 cpu是有限的! 但是 进程 却是无限的! 如果此时 一个进程正在被cpu调度,那么 "正在运行"的程序呢? 他们所处的状态是什么?

(1)Linux下的进程状态;

为什么需要这么多进程状态? 实质上是因为 不同的场景有不同的需求! 任何操作系统都有不同的进程状态以满足 进程、用户、OS......的需求。

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */     运行状态
"S (sleeping)", /* 1 */    睡眠
"D (disk sleep)", /* 2 */  深度睡眠
"T (stopped)", /* 4 */     停止
"t (tracing stop)", /* 8 */  追溯停止
"X (dead)", /* 16 */    死亡
"Z (zombie)", /* 32 */  僵尸
};
R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

 

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

先来给大家搭一个宏观的 os系统调度概念; 

①睡眠(S) 和 运行(R)

难道上面的图是 口说无凭吗?肯定不是!

 从上面的描述来看可以有以下几个结论:
1.一个cpu 那么就一定会被OS维护一个运行队列! 方便调度。

2.进程启动 让进程进入运行队列的本质是 把PCB连入到 运行队列中。

3.不是某个进程正在执行的状态为R , 而是连入运行队列中。

4.进程不仅仅只会等待 cpu的调度, 同样也会等待外设资源的就绪。

那么OS怎么知道 一个进程 该处于什么状态呢? 该怎样去读取 一个启动进程的状态呢?

答案当然是也在进程的 PCB当中 有标识。 更改进程状态的本质 就是更改 PCB里的标识符

所谓的不同状态,就是进程 在不同的队列中! 等待某种资源就绪!


②停止(T) 和追溯停止(t)

上面说了 进程的 运行 (R) 与 阻塞(S)状态。那么如何模拟停止 与 追溯停止的状态呢? 

这两种停止有何区别??

此时给进发送 信号SIGCONT 进程状态切换到T 

如果我们此时让进程 又运行起来 只需要给进程发送SIGCONT

此时进程又开始跑了。此时心细的会发现 查看进状态的 字母S 没有了 “+” 这说明什么?

"+" 说明这是一个前台进程 。

因此当 对被停止的进程 唤醒后, 会自动让它从前台进程 切换到后台!

我们是否有一个疑问:当我们对程序进行调试的时候,该程序是什么状态?

我们打开gdb调试 并随便打一个断点;

t-tarcing stop 此时就出现了小t状态。


③挂起

什么是挂起? 

任何进程状态的存在 都是有自己需求的场景!

1.用户层面:

        用户在进程运行期间,发现有可疑问题时,希望进程暂时停止下来。但并不终止进程的。若进程处于运行状态,则暂停运行;若进程处于就绪状态,则不接受调度。

2.父进程需求:

        父进程要查看、修改子进程或者协调各个子进程之间的活动,需要暂时挂起自己的子进程。

3.操作系统需求:

        操作系统有时候需要挂起某些程序,然后检查系统中的资源使用情况,从而改善系统运行的性能。

4.对换需求:

        为了缓和主存与系统其他资源的紧张情况,并且提高系统的性能。将处于等待状态的进程从主存换到外存。当等待事件的完成,换到外存的进程不具备运行的条件,不会进入调度队列。

我们模拟一下下面的场景;

现如今一个进程需要与外设磁盘交互

这种状态就被 称谓"挂起"状态。 当然内核代码肯定不会 让用户知道有这门子个操作。因为没必要。

其实本质上 , 挂起 是一种特殊的 阻塞状态。 这也就不难理解 有些说法是挂起阻塞状态。

 


④深度睡眠(D)

已经 有一个浅度睡眠s 为什么又来一个深度睡眠D状态呢?

与浅度睡眠想比较;

深度睡眠TASK_UNINTERRUPTIBLE:不可被信号唤醒;

不可被kill -9杀死 除非自己唤醒

浅度睡眠TASK_INTERRUPTIBLE:唤醒方式,等到需要的资源,响应信号;

可被kill -9杀死 和 信号唤醒

从另外一个层面来说,一旦进入深度睡眠 就算是操作系统 也不能对 处于深度睡眠的进程 做任何操作! 

例如:

执行程序的过程中,假如在读取磁盘的过程中 ,又有代码需要从磁盘里读取,就会造成"嵌套休眠"(S)。那么此时不得不让这两个动作互不干扰!读磁盘的动作不可被打断。即只等待IO资源可用,不响应任何信号。

对于设置了深度睡眠的进程别无他法,因为系统层面上已经无法控制它了。

1.等待该进程执行完。

2.拔电源(或重启)


⑤僵尸进程(Z)

什么是僵尸进程? 

僵尸进程 是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程

我们来看看代码模拟;

//监视脚本
while :; do ps ajx | head -1 && ps ajx | grep test | grep -v 'grep'; echo '#################' ; sleep 1; done

那么有什么东西能够避免这些情况呢?  当然有的。但不是本篇内容所设计的。


⑥孤儿进程

什么是孤儿进程?

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。

我们先来模拟一下场景;

而pid==1 的这个进程 就是操作系统 

孤儿进程 vs 僵尸进程

 理解了僵尸进程 也就理所应当地知道 为什么产生孤儿进程后 会自动被操作系统"领养"

 并且 本来是前台的子进程 也会自动被 切换成后台运行。 


 

总结:

①优先级确定先后,权限决定能否。

②调度并不是 只管清空数据 还应保存 寄存器里的数据 也就是上下文数据 以便恢复。

③什么是运行? 什么是挂起? 什么是休眠?

④孤儿进程 vs 僵尸进程 

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

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

相关文章

什么是云手机?云手机的原理是什么?

什么是云手机? 云手机(Cloud Phone)是在云上运行APP的仿真手机。云手机服务根据不同场景提供多种规格的云手机,稳定24小时不间断,全面兼容Android原生APP,流畅运行大型手游,是移动办公好助手。云手机服务为您提供高性能、安全、…

微服务Spring Boot 整合 Redis 实现好友关注 – Feed流实现推送到粉丝收件箱

文章目录⛄引言一、Redis 实现好友关注 -- Feed流实现推送到粉丝收件箱⛅Feed 流实现方案⚡推送到粉丝收件箱三、Redis 实现好友关注 -- 实现分页滚动查询 实时获取信息⛵小结⛄引言 本博文参考 黑马 程序员B站 Redis课程系列 在点评项目中,有这样的需求&#xff…

【正点原子I.MX6U-MINI】删除开机内核Logo和进度条界面Logo

一、编译内核 内核源码1、例程源码-》3、正点原子 Uboot 和 Linux 出厂源码-》linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2。 在 Ubuntu 中新建名为“alientek_linux”的文件夹,然后将 linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2 这个压缩包拷贝到前面新建的 aliente…

Revit中用楼板编辑创建坡道的两种方法

在绘制坡道的时候,有一种两侧带坡度的坡道,一般我们采用楼板编辑的方式来创建。 方法有两种: 第一种是听过添加子图元的点来创建,方法如下, 首先绘制设计所需的楼板尺寸,完成之后点击楼板,形状编…

【Flutter 组件】004-基础组件:图片及 ICON

【Flutter 组件】004-基础组件:图片及 ICON 文章目录【Flutter 组件】004-基础组件:图片及 ICON一、图片1、Image概述Image 的几个构造方法常用属性ImageProvider2、从 asset 中加载图片第一步:准备图片第二步:使用图片第三步&…

9.高性能计算 期末复习

文章目录1.提纲2.第二章 并行硬件&程序设计2.1 SIMD&MIMD2.2 可扩展性2.7 串行程序并行化(poster四步:划分、通信、聚合、分配)3.mpi2.1 点对点gemm2.2集合通信gemmsend/recv实现reducesend/recv 实现ring AllReduce2.3 加速比2.4 奇…

数据预处理的方法有哪些?

数据处理的工作时间占据了整个数据分析项目的70%以上。因此,数据的质量直接决定了分析模型的准确性。那么,数据预处理的方法有哪些呢?比如数据清洗、数据集成、数据规约、数据变换等,其中最常用到的是数据清洗与数据集成&#xff…

医学影像篇

影像组学研究的基本流程知识点 01 准备工作 研究前我们先要做好准备工作:(这个准备工作呢就好像小白做菜) 最开始,我们往往主动提出或者被提出了一个临床问题(临床问题可能是老板直接安排的,也可能是在临…

【网管日记】Nginx基本介绍、安装与使用

Nginx基本使用 基本介绍 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是 占用内存少,并发能力强 ,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用ngin…

AntV-G6:图表自动居中显示/画布自适应/fitView

需求描述 图表节点较多时,可能分布到屏幕可视范围之外,期望图表自动居中显示 调研分析 阅读官网文档:G6.Graph配置项,一下就看到了这个配置项: 看起来只要在初始化图表的配置里加上“fitView: true”就能万事大吉了…

解决PyCharm中opencv不自动补全的问题

解决PyCharm中opencv不自动补全的问题前言解决办法前言 今天下载opencv后,发现用pycharm打开并没有出现代码补全的情况,对于我这种新手极其不友好,故我去网上寻找方法。 opencv版本:4.6.0 寻找半天 有的说,要移动cv…

数据结构——二叉树的顺序存储(堆)

二叉树的顺序存储 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面的章节会专门讲解。二叉树顺序存储在物理上是一个数组&…

玩转MySQL:如何在高并发大流量情况下正确分库分表海量数据

引言 本篇数据库专栏内容,主要会讲解不同高并发场景下的MySQL架构设计方案,也包括对于各类大流量/大数据该如何优雅的处理,也包括架构调整后带来的后患又该如何解决?其中内容会涵盖库内分表、主从复制、读写分离、双主热备、垂直分…

极简而高效的沟通管理法(有点长,但都是干货)

我想说的意思不是说为了体现工作的价值,要故意提高工作的沟通成本,相反,我们的确需要通过归纳总结梳理标准话的流程、甚至是工具化的手段来降低一个领域的沟通,但我们同时工作在找更复杂、更需要去沟通的场景中,去创造…

【PTA-训练day16】L2-028 秀恩爱分得快 + L1-064 估值一亿的AI核心代码

!L2-028 秀恩爱分得快 - 分块大模拟 PTA | 程序设计类实验辅助教学平台 这个题还是挺考验 函数合理运用 和 数据模拟处理能力 的 思路: 因为可能出现-0这种输入 所以不能是int型 stoi() 将字符串转化为整数先把每张照片的人 按照片编号储存因为题目只要…

手慢无!阿里云神作被《Spring Boot进阶原理实战》成功扒下,限时

小编又来给大家分享好书了:郑天民老师的 《Spring Boot进阶:原理、实战与面试题分析》,别问网上有没有开源版本!问就是我也不知道,哈哈!小编会在文末附电子版下载方式。 郑天民是谁? 资深架构师和技术专家…

非程序员,到底该不该学Python

前言 最近被各种Python的小广告轰炸。也有很多非程序员的朋友咨询Python相关的事儿。(前两年是前端) 所以今天不讲技术,纯BB。 进入正题吧: Python是啥: 编程语言。和大多数编程语言一样。它只能帮助人类完成一些…

3000字带你读懂:BI能解决报表解决不了的什么问题?

一、BI不等于报表 工作原因,老李经常跟不同行业的人打交道。不聊不知道,在大肆谈论“数字化转型”、“信创”、“业务对象数字化”、“BI”这类大而广的词语之下,隐藏着的却是国人的无知。搞业务的朋友不太懂这类工具和概念,我也…

mac怎么删除硬盘里面的东西?为什么苹果电脑无法删除移动硬盘文件?

mac怎么删除硬盘里面的东西?由于移动硬盘的文件系统是NTFS格式的,而这种格式与Mac电脑是不兼容的,Mac电脑没有权限对移动硬盘上的数据进行操作,Mac上不能把移动硬盘的数据删除了,那么,有没有什么操作方法&a…

状态模式(State)

参考: [状态设计模式 (refactoringguru.cn)](https://refactoringguru.cn/design-patterns/mediator) 4. 状态模式 — Graphic Design Patterns (design-patterns.readthedocs.io) design-patterns-cpp/State.cpp at master JakubVojvoda/design-patterns-cpp …