12 状态优先级

概念

cpu需要执行很多进程,有很多进程排在队列中,每个进程加载后运行一定的时间段,然后切换下一个进程。cpu如何判断进程需不需要加载,什么时候加载,依靠进程的状态和优先级属性来判断,进程调度,就变成了在task_struct的队列中选择一个进程的过程

内核源码

为了弄明白正在运行的进程是什么意思,需要知道进程的不同状态,一个进程有几个状态,有时候也叫任务

/*
* 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 */
};

新建:新建进程,还没有运行的时候

运行

阻塞:当一个进程被cpu执行时,需要磁盘、网卡、显卡等设备资源就绪才可以,就会进入其他队列等待,等待磁盘等资源就绪的队列就是阻塞队列。**等待非cpu资源就绪就叫做阻塞态。**比如一个scanf函数一直不输入,等待键盘资源,就是阻塞。程序卡死有时候也是等待网卡资源,也有可能是cpu被占用,得不到调度,或操作系统卡死

在这里插入图片描述

挂起:当内存不足的时候,OS通过适当的置换进程的代码和数据到磁盘,进程的状态就叫做挂起
cpu内存不足的时候,会将长时间不执行,还需要等待很长时间资源的进程代码和数据换出到磁盘。也就是电脑的swap分区,是操作系统预先留好的,保证cpu正常的运行,这时候cpu会比较慢。再回来运行时需要把数据拿回来才能正常运行。压力过大电脑会宕机

写一份循环代码,用上节的循环命令不断查看进程状态
在这里插入图片描述

R+的状态就是运行中,接着往循环内加一个printf或者scanf函数,cpu的执行速度是非常快的,大部分时间都是往屏幕打印等待键盘输入等阻塞状态

在这里插入图片描述
S的状态就是阻塞

+的意思是前台程序
**前台进程:**当这个程序运行的时候,输入其他命令就没作用
运行程序后面加一个&符号,表示在后台运行,这个时候就没有+号了

在这里插入图片描述后台进程停止需要发送kill信号,crtl+c没用
在这里插入图片描述

退出状态:

有了上面的状态描述,下面逐个解析源码对应的状态:

R运行状态(running):对应上面的运行态
S睡眠状态(sleeping):阻塞状态,可中断睡眠
什么是可中断睡眠,运行一个阻塞状态的程序,-l查看所有信号
在这里插入图片描述
发送19号停止信号
在这里插入图片描述
进程被强制停止了,也就是睡眠状态还会接受命令,可以被中断

D睡眠状态:深度睡眠,磁盘睡眠,不可被中断,不可以自动唤醒
这个和上面的S状态相反
当服务器压力过大的时候,操作系统会将一些长时间不就绪的进程杀掉,多数为等待硬盘资源就绪的进程,当正准备往硬盘写入数据被杀掉后,就会造成数据丢失。为了防止这种情况,就设置了一种D状态,操作系统遇到这种状态就不会误杀。常用于从硬盘读取数据的场景,只有当硬盘数据就绪完成后,才会改变状态。kill信号也不行,dd命令的进程就是这种状态

T暂停状态: 上面发送了19号信号的进程就是暂停状态
在这里插入图片描述
t调试状态: 暂停状态的一种,正在调试的进程显示的状态(需要程序是debug版才可以调试),打一个断点,运行到断点处

在这里插入图片描述

X终止状态: 瞬时性非常强, 因为有很多进程在运行,需要标注可以回收的进程,很难捕捉到,任务列表李看不到

Z僵尸状态: 一个进程已经退出,不允许被OS释放,处于一个被检测的状态。一般是为了父进程或OS来回收,需要检测运行的结果

#include <stdio.h>
  2 #include <unistd.h>
  3 #include <sys/types.h>
  4 
  5 int main()
  6 {
  7     pid_t pid = fork();
  8     if (pid == 0)
  9     {
 10             sleep(3);  
 11     }
 12     else if(pid > 0)                                 
 13     {
 14         while(1)
 15         {
 16             sleep(3);
 17         }  
 18     }      
 19 }         

上面的代码子进程三秒后会结束,父进程一直在运行,可以循环查看状态
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上图是理论状态,字母是具体状态。创建就是进程没运行,fork的子进程如果还没运行就是创建
运行状态,退出或终止就是Z和X状态,阻塞就是S,挂起也是S,看数据在不在内存,不在的话,内存中是挂起,进程状态还是S。状态可以是在上面的很多之间不停转换

僵尸状态

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

僵尸进程危害

进程的推出态必须被维持下去,要告诉关心它的父进程任务完成情况,如果一直不读取,就处于Z状态。进程不退出,PCB一直要维护,一直不回收,就会造成内存资源浪费,后面会详细说明

孤儿状态

父进程提前退出,子进程还在运行,就叫孤儿进程
孤儿进程会被1号进程领养,就是系统的 init进程,系统本身,也会回收

int main()
  6 {
  7     pid_t pid = fork();
  8     if (pid == 0)
  9     {
 10         while(1)       
 11         {        
 12      
 13             sleep(3);
 14         }                                            
 15     }
 16     else if(pid > 0) 
 17     {
 18             sleep(3);
 19             exit(0);
 20            
 21     }                
 22 } 

当3秒父进程结束后,子进程的父进程立马变成了1号进程,这时变为后台进程,可以kill杀掉
在这里插入图片描述

为什么要被领养,未来子进程退出的时候父进程不在,需要领养来回收资源

进程优先级

基本概念

cpu资源分配的先后顺序,进程的优先权
优先权高的进程有优先执行的权利,配置进程优先权对多任务环境的linux很有用,可以改善系统性能
还可以吧进程运行到 指定的cpu上,可以大大改善系统整体性能

优先级= 老优先级+nice值

运行一个进程,ps -la查看优先级
在这里插入图片描述

UID: 代表执行者的身份
PID: 进程的标识符
PPID: 哪个进程衍生来的,父进程
PRI: 进程的优先级,越小越早执行
NI: 代表nice值

NI是进程可执行优先级的修正数值,意思是可以通过根据这个值来调整优先级
加入nice值后,PRI会变为:PRI(new)=PRI(old)+nice
调整优先级,就是调整nice值
nice取值范围是-20至19,一共40个级别

进程的nice值不是优先级,但是会影响优先级,是修正数据

设置优先级

进入top,按r输入进程pid,回车后输入nice值
在这里插入图片描述
sudo模式设置nice为-100后,变为了60
在这里插入图片描述

这是因为每次设置nice值,老的优先级都是从80开始算,最小优先级是-20,80-20就是60
优先级的调整不会太大,nice值范围固定。是为了尽量不打破系统的调度安排,避免恶意占用资源,也为了系统更稳定

其他概念

竞争性:系统进程数目众多,cpu资源少量,所以进程有竞争性,为了高效合理分配资源,有了优先级
独立性:多进程运行,独享各种资源,一个进程崩溃不会影响其他进程。互相不干扰
并行:多个进程在多个cpu下同时运行
并发:进程切换的方式,一段时间内,多个进程都得以推进

每个进程在cpu中运行的时间叫时间片,而这个运行时间并不是固定的,如果运行完毕就会出去。同时,有时高优先级的进程会抢占cpu,低优先级的出让。每个进程都会较为均衡的占用cpu

在这里插入图片描述

一个进程在cpu运行的时候,寄存器内一定保存了进程的临时数据信息,寄存器有可显寄存器,还有电脑内的不可显。这些临时数据就是进程a的上下文数据,进程a被切下来时,需要带走保存自己的上下文数据。为了下次回来的时候,能恢复上去,就能按照之后的逻辑继续执行,就如同没有中断过一样。上下文数据可以有多份,分别对应不同的进程

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

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

相关文章

Gitlab: PHP项目CI/CD实践

目录 1 说明 2 CI/CD 2.1 部署方式一&#xff1a;增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二&#xff1a;镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…

深入探讨 AutoGPT:彻底改变游戏的自主 AI

原文地址&#xff1a;Deep Dive into AutoGPT: The Autonomous AI Revolutionizing the Game 2023 年 4 月 24 日 AutoGPT 是一个功能强大的工具&#xff0c;它通过 API 使用 GPT-4 和 GPT-3.5&#xff0c;通过将项目分解为子任务并在自动循环中使用互联网和其他工具来创建完…

力扣hot8---滑动窗口

这里先跳过力扣hot7啦&#xff0c;这几天就回更~ 题目&#xff1a; 滑动窗口思路&#xff1a; 首先左窗口&#xff08;left&#xff09;指向的是第0个元素&#xff0c;依次遍历循环每一个元素&#xff0c;维护一个unordered_set&#xff0c;如果当前被遍历的元素存在于unorder…

Python实现ADTM工具判断信号:股票技术分析的工具系列(6)

Python实现ADTM工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;6&#xff09; 介绍算法解释 代码rolling函数介绍完整代码data代码ADTM.py 介绍 ADTM&#xff08;动态买卖气指标&#xff09;是一种用于衡量市场买卖力量对比的指标。它通过计算动态买盘指标&#…

【源码】imx6ull实现触摸屏单点实验-移植tslib和qt

一、本实验实验的器材&#xff1a; 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件&#xff1a; 仓库代码&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 arm-qt.tar.bz2&#xff1a;移植好的…

tsc : 无法加载文件 C:\Users\Administrat\AppData\Roaming\npm\tsc.ps 1,因为在此系统上禁止运行脚本

报错&#xff1a;tsc : 无法加载文件 C:\Users\Administrat\AppData\Roaming\npm\tsc.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 解决 使用命令行时出现ab…

idea中引入新JDK环境

在不同的项目中往往会需要不同的运行环境&#xff0c;那么如何下载一个新的环境并运用到idea中呢&#xff1f; 下面给出的就是oracle官网&#xff0c;以JDK17为例教大家如何下载 Java Archive Downloads - GraalVM for JDK 17https://www.oracle.com/java/technologies/javase…

世界的本质是旋转(5)-在复平面上驱动软件无线电SDR发射BPSK波形

在上一篇文章中&#xff0c;我们介绍了复平面、拍照采样的一些思维实验。从本节开始&#xff0c;转入现实应用&#xff0c;通过控制复平面向量的位置&#xff0c;实现一个完整的BPSK全双工通信通道。 发射方&#xff1a;通过控制复平面向量在各个时刻的位置来携带信息的技术&a…

108. 将有序数组转换为二叉搜索树【简单】

108. 将有序数组转换为二叉搜索树【简单】 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉…

电脑不小心格式化了,怎么恢复?

在这个数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;有时我们可能会不小心格式化电脑硬盘&#xff0c;导致重要数据的丢失。那么&#xff0c;电脑不小心格式化了&#xff0c;怎么恢复&#xff1f; 别着急&#xff0c;在本篇攻略中&…

vue3页面内容切换(类似登录、注册内容切换)

一、内容描述 页面有俩块内容&#xff0c;分别是验证码登录页面内容&#xff0c;账号密码登录页面内容。有俩种处理方式&#xff0c;一个是写俩个页面跳转使用&#xff0c;还有一种是一个页面俩个内容&#xff0c;切换的只是不同的内容&#xff0c;相同的内容保留。一般都是选择…

音视频开发之旅——音频基础概念、交叉编译原理和实践(LAME的交叉编译)(Android)

本文主要讲解的是音频基础概念、交叉编译原理和实践&#xff08;LAME的交叉编译&#xff09;&#xff0c;是基于Android平台&#xff0c;示例代码如下所示&#xff1a; AndroidAudioDemo 音频基础概念 在进行音频开发的之前&#xff0c;了解声学的基础还是很有必要的。 声音…

Windows安装SSH教程

Windows安装SSH教程 一、SSH1.SSH简介2.SSH功能3.SSH验证3.1 第一种级别&#xff08;基于口令的安全验证&#xff09;3.2 第二种级别&#xff08;基于密匙的安全验证&#xff09; 4.SSH层次4.1 传输层协议 [SSH-TRANS]4.2 用户认证协议 [SSH-USERAUTH]4.3 连接协议 [SSH-CONNEC…

改造muduo,不依赖boost,用C++11重构

组件的实现 1. 序 1.1. 总述 muduo库是基于多Reactor-多线程模型实现的TCP网络编程库&#xff0c;性能良好。如libev作者&#xff1a;“One loop per thread is usually a good model”&#xff0c;muduo库的作者陈硕在其《Linux多线程服务端编程》中也力荐这种“One loop pe…

linux中对信号的认识

信号的概念与相关知识认识 信号是向目标进程发送消息通知的的一种机制。 信号可以以异步的方式发送给进程&#xff0c;也就是说&#xff0c;进程无需主动等待&#xff0c;而是在任何时间都可以接收到信号。 信号的种类 用kill-l命令查看系统定义的信号列表&#xff1a; 前台…

初识Hive

官网地址为&#xff1a; Design - Apache Hive - Apache Software Foundation 一、架构 先来看下官网给的图&#xff1a; 图上显示了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有&#xff1a; UI&#xff1a; 用户向系统提交查询和其他操作的用户界面。截至2011年&…

Linux - 安装 maven(详细教程)

目录 一、下载二、安装三、配置环境变量四、镜像资源配置 一、下载 官网&#xff1a;https://maven.apache.org/download.cgi 打开 maven 的官网下载页面&#xff0c;点击 bin.tar.gz 文件链接 即可下载最新版本的 maven 如果想要下载旧版本的 meven&#xff0c;则点击 Maven…

【短时交通流量预测】基于GRNN神经网络

课题名称&#xff1a;基于GRNN神经网络的短时交通流量预测 版本时间&#xff1a;2023-04-27 代码获取方式&#xff1a;QQ&#xff1a;491052175 或者 私聊博主获取 模型简介&#xff1a; 城市交通路网中交通路段上某时刻的交通流量与本路段前几个时段的交通流量有关&#x…

Python类 __init__() 是一个特殊的方法

设计者&#xff1a;ISDF工软未来 版本&#xff1a;v1.0 日期&#xff1a;2024/3/5__init__() 是一个特殊的方法 类似c# C的构造函数 两头都包含两个下划线&#xff0c;这是约定&#xff0c;用于与普通的函数保持区分class User:用户类def __init__(self,first_name,last_name):…

软件应用,财务收支系统试用版操作教程,佳易王记录账单的软件系统

软件应用&#xff0c;财务收支系统试用版操作教程&#xff0c;佳易王记录账单的软件系统 一、前言 以下软件操作教程以 佳易王账单记账统计管理系统V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;统计报表包含 收支汇…