Linux进程状态和优先级

news2025/2/28 11:21:02

我的另一篇有关进程概念的博客:Linux 进程概念

目录

一、操作系统进程状态

1.1 运行状态(R)

1.2 阻塞状态(S)

1.3 挂起状态(S)

二、Linux操作系统内核中的进程状态

2.1 进程状态种类

2.2 查看R和S进程状态

2.3 T和t状态

2.3.1 T状态

 2.3.2 t状态(说明此进程正被追踪)

 2.4 僵尸状态(Z)

2.4.1 模拟实现僵尸进程

2.4.2 僵尸进程的危害

2.5 孤儿进程

三、进程优先级(了解)

​编辑 3.1 进程优先级标志(PRI) 和 修正符(NI)

3.2 top工具手动修改nice(了解)

四、进程其他概念

4.1 并发/并行

4.2 进程切换


一、操作系统进程状态

进程状态是进程的一种属性,task_struct中有数据描述进程的状态!

下面我们谈谈普遍操作系统下的进程状态!

1.1 运行状态(R)

每个进程都有一个PCB,描述进程的所有属性!同一时间,有很多进程需要CPU处理!CPU中有一个运行队列(run_queue),运行队列中放着一个个进程PCB,它们通过链表链接!CPU通过队列顺序去读取相应的进程代码!CPU很快,所以队列中这些进程的命令很快就能被处理!所以这些在运行队列中的进程,进程状态称为运行

1.2 阻塞状态(S)

根据冯诺依曼体系,CPU很快,相比之下硬件设备很慢!

OS通过描述硬件的结构体管理硬件

比如键盘:struct dev_keyboard

显示器:struct dev_display

可能有很多进程都要访问同一个硬件!CPU能很快读取进程代码并向OS发出进程申请使用硬件的信息!操作系统通过驱动调用底层硬件。外设启动和数据加载到内存中需要时间!比如我们需要读取磁盘文件信息!但文件加载很慢!CPU很快,CPU不会等外设!OS此时会将这个进程状态改为阻塞,然后将它放到对应的硬件结构体的等待队列(wait_queue)中!

我们称这些在外设等待队列中等待的进程为阻塞状态!

当一个阻塞进程完成外设任务以后,会不会立即被CPU运行呢?

答案是不会,完成以后OS会先将它的进程状态改为R,然后将它放置运行队列中。


1.3 挂起状态(S)

如果队列中有很多进程,短时间内不会执行该进程,但是它的进程数据和代码依然在内存中白白占据空间万一内存空间不够了怎么办!这样会影响进程的有效运行!那些短期不被执行的进程代码和数据浪费了内存空间。OS的任务是有效管理进程!此时它会出手,它会在磁盘开辟一块空间,将这些进程的数据和代码置入到这个临时空间中!这样减少内存空间的占据!此时这个进程状态称为挂起!我们称这个过程叫做内存数据的唤出,同样OS将它拿回到内存中,称为内存数据的唤入


二、Linux操作系统内核中的进程状态

2.1 进程状态种类

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):这个状态只是一个返回状态,你不会在任务列表里看到这个状态

2.2 查看R和S进程状态

#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
int main()
{
    pid_t id=fork();
    //子进程执行代码
    if(id==0)
    {
        while(1)
        {
            //子进程访问外设
            printf("我是子进程,我的pid=%d\n",getpid());
            sleep(1);
        }
    }
    //创建子进程失败
    else if(id<0)
    {
        printf("Creat process error\n");
    }
    //父进程执行代码
    else 
    {
        //父进程不访问外设
        while(1)
        {}
    }
    return 0;
}


2.3 T和t状态

2.3.1 T状态

同样是上面代码,我们可以用kill -19 + 进程pid 将运行的进程状态修改为T状态!此时该进程会被暂停!kill -18 又可以让这个进程继续跑起来!


暂停子进程结果: 

暂停父进程结果:

 对比两者,不同之处在于一个+号,这里有加号说明进程在前台,没有则是在后台!后台进程不能通过ctrl + C 结束进程,必须用kill -9 指令来结束进程!

 2.3.2 t状态(说明此进程正被追踪)


 2.4 僵尸状态(Z)

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

2.4.1 模拟实现僵尸进程

下面我们来测试一下:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<stdlib.h>//exit
int main()
{
    pid_t id=fork();
    //子进程提前5秒结束
    if(id>0)
    {
        printf("id=%d parent process is sleeping\n",getpid());
        sleep(10);
    }
    else
    {
        sleep(5);
        printf("id=%d child process has entered Z...\n",getpid());
        exit(0);//子进程退出
    }
    return 0;
}



2.4.2 僵尸进程的危害

1.进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态

2.维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说, Z状态一直不退出, PCB一直都要维护!
3.那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!
4.内存泄漏?是的!


2.5 孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
父进程先退出,子进程就称之为“孤儿进程”!孤儿进程被1号init进程领养,结束后被init进程回收喽。

下面我们来测试一下:



 下面我们再看一下这个pid为1的进程:它负责回收子进程的进程信息!


三、进程优先级(了解)

 
3.1 进程优先级标志(PRI) 和 修正符(NI)

PRI :代表这个进程可被执行的优先级,其值越小越早被执行
NI :代表这个进程的nice值

①.PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高
②.那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
③.PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
(老的优先级默认为80,nice默认为0)。这样,当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行所以,调整进程优先级,在Linux下,就是调整进程nice值!nice其取值范围是-20至19,一共40个级别

3.2 top工具手动修改nice(了解)

进入top后按“r”–>输入进程PID–>输入nice值!


四、进程其他概念

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

4.1 并发/并行

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

4.2 进程切换

我们绝大多数的笔记本或者电脑只有一个CPU!但是我们可以“同时”使用很多软件(进程),一个CPU如何“同时”处理多个进程? 答案是进程切换!

CPU很快,但CPU不是处理完一个进程才去处理另一个进程!它会来回切换进程,并处理!每个进程有固定时间片周期去占用CPU资源!

CPU内有一套寄存器!它负责存储当前进程的数据!CPU读取内存中进程PCB信息,将信息存储到寄存器中!其中一个寄存器内存放着下一段代码的地址便于CPU读取下一段代码!

进程占有CPU不是一直到进程结束!它有一个时间片,这个时间片期间,如果进程没跑完就会进程切换!那个存放下一段代码地址的寄存器内的数据会被写入进程PCB!下一次进程再来的时候,CPU读取PCB,也就能找到上次中断的位置并开始一个时间片周期!需要强调的是,寄存器是被所有进程所共享的,寄存器内的数据是被进程所私有的!

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

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

相关文章

python正则表达式与回溯绕过waf

1.正则表达式的背景 正则表达式的历史&#xff1a;美国的两个人类神经元研究者&#xff0c;使用特殊的符号描述。之后有一位科学家将这门技术引入了数学&#xff0c;将这门技术命名为正则表示式。 肯汤普森在编写UNIX系统时&#xff0c;将正则引入到了一个编辑器 绝大多数编…

GNN实战——KarateClub数据集

GNN&#xff1a;graph neural network 图神经网络&#xff0c;是⼀种连接模型&#xff0c;通过⽹络中节点之间的信息传递(message passing)的⽅式来获取图中的依存关系(dependence of graph)&#xff0c;GNN通过从节点任意深度的邻居来更新该节点状态&#xff0c;这个状态能够表…

Linux网络编程 第四天

目录 学习目标 多路IO-poll 多路IO-epoll 进阶epoll 用实验验证LT和ET模式 epoll反应堆 学习目标 1 了解poll函数 2 熟练使用epoll多路IO模型 3 了解epoll ET/LT触发模式并实现 4 理解epoll边缘非阻塞模式并实现 5 了解epoll反应堆模型设计思想 6 能看懂epoll反应堆模型的…

《C++程序设计原理与实践》笔记 第10章 输入/输出流

在本章和下一章中&#xff0c;我们将介绍C标准库中用于处理来自各种源的输入和输出的功能&#xff1a;I/O流。本章关注基本模型&#xff1a;如何读写单个值&#xff0c;以及如何打开和读写整个文件。下一章将介绍具体细节。 10.1 输入和输出 如果没有数据&#xff0c;计算就毫…

【正点原子FPGA连载】第十三章Linux内核移植 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十三章Linux内…

2023版软件测试学习路线图(超详细自学路线)

送福利了&#xff01;超详细的软件测试学习路线图来啦&#xff0c;2023版是首发哟&#xff01;软件测试学习路线图分为9个阶段&#xff0c;包含&#xff1a;软件测试环境配置和管理-->软件测试数据管理与数据库测试-->web前端测试技术-->通用软件测试技术-->Python…

回顾2022! 链上NFT精彩项目大盘点

过去一年&#xff0c;WEB3和元宇宙无疑吸引了一大波关注度和热度。不少知名品牌如耐克、GUCCI、百事可乐、星巴克、麦当劳等都纷纷加入这波浪潮&#xff0c;通过推出NFT、数字商品等&#xff0c;来尝试WEB3机制&#xff0c;进而塑造更好的用户消费体验和参与度。NFT兼具身份、功…

springboot,vue二手交易平台

开发工具&#xff1a;IDEA服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8项目构建&#xff1a;maven数据库&#xff1a;mysql5.7系统用户前台和管理后台两部分&#xff0c;项目采用前后端分离前端技术&#xff1a;vue elementUI服务端技术&#xff1a;springbootmybatis项目功…

0基础快速掌握正则表达式

背景 在日常开发中&#xff0c;我们经常会遇到使用正则表达式的场景&#xff0c;比如一些常见的表单校验&#xff0c;会让你匹配用户输入的手机号或者身份信息是否规范&#xff0c;这就可以用正则表达式去匹配。相信大多数人在碰到这种场景的时候都是直接去网上找&#xff0c;…

在 2023 ETH Denver 与 Cartesi 一起建设

我们非常高兴的加入了 2023年ETHDenver&#xff0c;参加了BUIDLathon 赛道和现场研讨会等活动。作为规模最大、持续时间最长的ETH 活动之一&#xff0c;我们将向热衷于为全球区块链生态系统做出贡献的新开发者社区分享 Cartesi 技术。你想在2023年#BUIDL 做一些有趣有意义的事情…

基于springboot的景区旅游信息管理系统(源代码+数据库)

基于springboot的景区旅游信息管理系统(源代码数据库) 一、系统介绍 本项目分为管理员与普通用户两种角色 用户登录 前台功能&#xff1a;旅游路线、旅游景点、旅游酒店、旅游车票、旅游保险、旅游策略管理员登录 后台功能&#xff1a;用户管理、旅游路线管理、旅游景点管理…

Codeforces Round #843 (Div. 2)(A~C,E)

A1/A2. Gardener and the Capybaras (easy version)三个字符串&#xff0c;按照顺序连在一起&#xff0c;三个字符串满足第二个字符串大于等于第一个和第三个&#xff0c;或者第二个字符串小于等于第一个和第三个&#xff0c;输出满足情况的三个字符串。思路&#xff1a;对于长…

ubuntu18.04系统下挂载新的机械硬盘

ubuntu18.04系统下挂载新的机械硬盘1.显示硬盘以及所属分区情况sudo fdisk -lDisk /dev/sda doesnt contain a valid partition table硬盘分区 对机械硬盘进行操作 sudo fdisk /dev/sda下图表示的是具体流程截图&#xff1a; The partition table has been altered!硬盘格式…

AWS RDS开启审计日志

问题 需要对AWS的RDS开启相关日志。先检查RDS是否开启日志&#xff0c;如下图&#xff1a; 选中一个数据库实例&#xff0c;查看到只开启了数据库的错误日志。但是&#xff0c;我们需要开启其他类型的审计日志。下面开始怎么样开启其他类型日志&#xff0c;来启用高级审计模…

corrosion 靶机(ffuf模糊测试,命令执行)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;c2j6 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2022.03 信息收集 1.探测目标靶机开放端口和服务情况 2.用gobuster扫描目录&#xff0c;并访问 gobuster dir -…

手把手编译FFmpeg

支持centos8.6、ubuntu20.04 export 建议开始之前&#xff0c;弄一台干净的机子&#xff0c;或者系统恢复到出厂设置&#xff0c;否则容易出问题 然后设置动态库默认加载目录&#xff08;注意/usr/local/lib不是系统默认的路径&#xff0c;/lib和/usr/lib才是&#xff09; …

jsp库存管理管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 库存管理管理系统 是一套完善的系统源码&#xff0c;对理解JSP java serlvet MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S 模式开发。 通过本系统建设&#xff0c…

ArcGIS基础实验操作100例--实验97计算河道方向坡度

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验97 计算河道方向坡度 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

内存管理-模板初阶理解-string类的模拟实现

文章目录1. 内存管理operator new和operator delete面试题&#xff1a;malloc、free和new、delete的区别2. 内存泄漏1. 内存泄漏&#xff1a;2. 内存泄漏危害&#xff1a;3.堆内存泄漏4.系统资源泄漏3. 模板初阶函数模板类模板&#xff1a;模板运行时不检查数据类型&#xff0c…

黑马编程资源最新最全全清单:速来收藏~

今年是黑马坚持免费分享视频教程的第16年&#xff0c;每年到了这个时候&#xff0c;「成绩单」也不会缺席&#xff0c;不仅是对过往的回顾&#xff0c;更是对那些选择跟着黑马持续学习的小伙伴们的一种激励。 黑马视频教程2022年速报 截至年底&#xff0c;黑马程序员 B 站累计…