【Linux系统】进程状态

1.直接谈论Linux的进程状态

Linux进程状态本质上是task_struct这个结构体内的一个变量用来存储进程状态。

task_struct

{

    //内部的一个属性

    int status;

}

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。

D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

t(tracing stop)

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

R:进程运行的状态

S:休眠状态

进程在等待“资源”就绪

这个状态下是可以用kill命令杀掉

所以又可以被称为可中断睡眠

T/t:让进程暂停,等待被进一步唤醒

kill -l:列出所有可用的信号名称

kill -9 pid:杀掉一个进程

kill -19 pid:暂停一个进程

kill -18 pid:解除进程的暂停

t是我们在调试程序时会出现的一种暂停状态,当我们的程序在断点处停下,此时即是t状态。

D:磁盘休眠状态(深度睡眠或不可中断睡眠)不可被kill杀掉

Linux系统比较特有的一种进程状态!

假设有个进程要将1GB的数据交给磁盘来存储,磁盘收到进程的请求找到一块空间进行存储,这时进程就要等待磁盘输出结束,进程进入S态,当内存严重不足时,Linux操作系统有权利杀掉进程来释放空间,当Linux操作系统刚好把我们正在等待磁盘资源响应的进程杀掉时,就会出现问题,磁盘如果申请空间失败会回来告诉进程,但此时进程已经被杀掉,那怎么办?这就会发生这1GB数据丢失的问题!!!

所以就有了D状态的出现,D状态下的进程是不可被杀的,就不会出现这个问题了!

2.僵尸进程和孤儿进程

僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)

没有读取到子进程退出的返回代码时就会产生僵死(尸)进程,僵死进程会以终止状态保持在进程表中

并且会一直在等待父进程读取退出状态代码。

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

  1 #include<stdio.h>2 #include<sys/types.h>3 #include<unistd.h>4 5 int main()6 {7   pid_t id = fork();8   if(id == 0)9   {10     //child11     int cnt = 5;12     while(cnt--)13     {14       printf("I am a child process, pid:%d, ppid:%d\n", getpid(), getppid());15     }16   }17   else18   {19     //parent 20     int cnt = 5;21     while(cnt)22     {23       printf("I am a parent process, pid:%d, ppid:%d\n", getpid(), getppid());24     }25   }                                                                                     26   return 0;27 }

 

 

已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct中会记录自己的退出信息,未来让父进程进行读取,但该这个子进程已经结束,父进程没有读取到子进程状态。

如果没有父进程读取,这个僵尸进程将会一直存在

因为进程 = task_struct内核数据结构 + 进程的代码和数据,子进程结束即代码和数据读取的结束,但task_struct仍然存在,如果父进程不去回收就会造成内存泄漏问题!!!

僵尸进程会等待着OS释放,这个状态就是X状态,无法查看的状态。

总结:

我们已经启动的所有进程,我们怎么从来没有关注过僵尸呢?内存泄漏??

直接在命令行中启动的进程,他的父进程是bash,bash会自动回收新进程的Z

孤儿进程

孤儿进程:父进程如果先退出,子进程就会变成孤儿进程。

孤儿进程一般都是会被1号进程(OS本身)领养

孤儿进程为什么要被OS领养?依旧要保证子进程正常被回收!!!

3.进程的阻塞和挂起,运行(纯理论)

操作系统学科里的阻塞挂起等状态

 

 运行(并发和并行)

 进程在运行队列中, 该进程的状态就是R状态

 我已经准备好了,可以随时被调度!

 一个进程一旦持有CPU会一直运行到这个进程结束吗?不会

这些进程是基于时间片进行轮转调度的!!!

并发:让多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码,就叫做并发。

如果我们有多个CPU,每个CPU独立的在调度各自的进程,这时就有了并行的概念。

并行:任何时刻都有多个进程在真的同时运行,我们叫做并行

阻塞态

 我们平常写c语言代码都可能会用到scanf,我们知道scanf函数需要我们输入一些信息,该进程才能继续运行下去!!!

其实这个状态就可以叫做阻塞态

等待,等待键盘资源是否就绪,键盘上面有没有被用户按下的按键,按键数据交给进程。

我们知道操作系统是就是软硬件资源的管理者!!!

操作系统如何对硬件进行管理?先描述,在组织

入队列的不是进程的代码和数据,而是进程的task_struct

不是只有CPU才有自己的运行队列,各种其他的设备,键盘,显示器等也是有着自己的wait_queue等待队列,当键盘没有按下对应的数据时,这时的进程其实是在键盘的等待队列中的,等待键盘输入再链接入CPU的运行队列中去!!!

像这种进程没有处在CPU的运行队列中的状态一般即是阻塞态。

我们常说的S态和D态就是阻塞。

挂起态

 挂起态是一种用空间换取时间的方法。

当OS 内存特别吃紧的时候,为了更合理的使用内存空间。

OS会把那些处于阻塞态的或其他的一些进程换入到swap分区存储该进程对应的代码和数据,需要使用时我们再唤出,这种就叫做阻塞挂起!!!用户层是感受不到这种操作的!

但是如果swap分区过于大的话会发生频繁的唤入唤出,这会导致效率问题,所以swap分区设置一般不易过大。

4.进程切换的话题

 

 我们知道进程都是在并发运行着,一个进程时间片结束又会运行下一个进程,那我们的数据是如何稳定的保存呢?这样频繁的进程切换会不会导致数据的丢失?不会

进程在切换,最重要的一件事情是,上下文数据的保护和恢复

CPU的寄存器:

寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!!

CPU内部的数据,可以有多套,有几个进程,就有几套与该进程所对应的上下文数据

寄存器 != 寄存器的内容

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

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

相关文章

【深度学习】深度学习md笔记总结第4篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

hbase基础shell用法

HBase中用create命令创建表&#xff0c;具体如下&#xff1a; create student,Sname,Ssex,Sage,Sdept,course 此时&#xff0c;即创建了一个“student”表&#xff0c;属性有&#xff1a;Sname,Ssex,Sage,Sdept,course。因为HBase的表中会有一个系统默认的属性作为行键&#x…

李彦宏放话:百度AI大模型绝不抢开发者饭碗

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 昨晚&#xff0c;李彦宏内部讲话称&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 但你一定要说话算话哦&#xff0c;可千万别说&#xff1a;“我永远不做手机&#xff0c;谁再敢提做手机就给…

科技云报道:从“奇点”到“大爆炸”,生成式AI开启“十年周期”

科技云报道原创。 世界是复杂的&#xff0c;没有人知道未来会怎样&#xff0c;但如果单纯从技术的角度&#xff0c;我们总是能够沿着技术发展的路径&#xff0c;找到一些主导未来趋势的脉络。 从Sora到Suno&#xff0c;从OpenAI到Copilot、Blackwell&#xff0c;这些热词在大…

[温故] 红黑树算法

前言 最近在突然想起一些基础的东西, 向着温故知新, 有了些新的感悟和大家分享一下. 排序算法是数据结构的一个重要组成部分, 当时学习的时候没有少折腾, 这里来看看大佬们怎么运用这些数据结构来构建庞大的计算机体系的. 二叉树是排序算法的一个衍生, 基于二叉树的构建不同…

C语言--2048小游戏

需要用到EasyX图形库 #include <stdio.h> #include <stdlib.h> #include <time.h> #include<assert.h> #include <conio.h> #include <windows.h> #include<graphics.h> #include<string.h> #define ROW 4 /* 行数 */ #defin…

Rust面试宝典第2题:逆序输出整数

题目 写一个方法&#xff0c;将一个整数逆序打印输出到控制台。注意&#xff1a;当输入的数字含有结尾的0时&#xff0c;输出不应带有前导的0。比如&#xff1a;123的逆序输出为321&#xff0c;8600的逆序输出为68&#xff0c;-609的逆序输出为-906。 解析 这道题本身并没有什么…

PostgreSQL入门到实战-第二十一弹

PostgreSQL入门到实战 PostgreSQL中表连接操作(五)官网地址PostgreSQL概述PostgreSQL中RIGHT JOIN命令理论PostgreSQL中RIGHT JOIN命令实战更新计划 PostgreSQL中表连接操作(五) 使用PostgreSQL RIGHT JOIN连接两个表&#xff0c;并从右表返回行 官网地址 声明: 由于操作系统…

打印机共享设置助手

工作中经常设置共享打印机&#xff0c;为简化操作编写了此打印机设置助手运行环境&#xff1a; 支持Windows 7以上系统直接运行Windows 7 使用PrinterTool_NET20版本Windows 10以上 使用PrinterTool_NET452版本 软件功能&#xff1a; 设置默认打印机设置共享打印机快捷连接共…

微软Office吊打WPS ?不一定,WPS未来被它“拿捏”了

微软Office Plus吊打WPS Office&#xff1f; 微软的Office套件在全球范围内内享有盛誉&#xff0c;其强大的功能和广泛的应用场景使其在办公、娱乐乃至生活的各个角落都显得不可或缺。 而与之相对&#xff0c;WPS Office作为国内办公软件的佼佼者&#xff0c;与微软的较量已历…

探新路建“枢纽” 湖南深耕中非经贸合作“试验田”

湖南作为中国与非洲经贸合作的重要窗口&#xff0c;积极推动中非经贸关系的发展和深化。通过构建覆盖全产业链的高效运作模式&#xff0c;湖南企业能够在一周内将肯尼亚干制鳀鱼加工成为麻辣鲜香的劲仔深海小鱼并投入中国市场。此外&#xff0c;湖南还致力于推动非洲优质农产品…

gitee和idea集成

1 集成插件 2 配置账号密码 3 直接将项目传到仓库 4直接从gitee下载项目

题目:斤斤计较得小Z(蓝桥OJ 2047)

问题描述&#xff1a; 题解&#xff1a; 做法一&#xff08;kmp模板&#xff09;&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e6 9; char s[N], p[N]; int nex[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);// p: 子…

Stable Diffusion——SDXL Turbo让 AI 出图速度提高10倍

摘要 在本研究中&#xff0c;我们提出了一种名为对抗扩散蒸馏&#xff08;ADD&#xff09;的创新训练技术&#xff0c;它能够在1至4步的采样过程中&#xff0c;高效地对大规模基础图像扩散模型进行处理&#xff0c;同时保持图像的高质量。该方法巧妙地结合了分数蒸馏技术&…

记录linux从0部署java项目(宝塔)

目录 一、安装宝塔可视化界面 二、部署前端 三、部署后端 1、配置并连接Mysql数据库 2、配置并连接redis 3、安装jdk 这里先记录一个安装后遇到的问题 安装openJDK 四、检查 一、安装宝塔可视化界面 宝塔面板下载&#xff0c;免费全能的服务器运维软件 运行安装脚本 安…

【爬虫开发】爬虫从0到1全知识md笔记第5篇:Selenium课程概要,selenium的其它使用方法【附代码文档】

爬虫开发从0到1全知识教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;爬虫课程概要&#xff0c;爬虫基础爬虫概述,,http协议复习。requests模块&#xff0c;requests模块1. requests模块介绍,2. response响应对象,3. requests模块发送请求,4. request…

【JAVA基础篇教学】第一篇:Java基础数据类型

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第一篇&#xff1a; Java基础数据类型。 在Java中&#xff0c;数据类型是用来指定变量存储数据的类型。Java的数据类型可以分为两大类&#xff1a;原始数据类型&#xff08;Primitive Data Types&#xff09;和引用数据类型…

黄金基金和黄金有什么区别?

黄金基金本质上是一种投资工具&#xff0c;它通过间接投资黄金或与其紧密相关的金融衍生品来反映黄金市场的表现。不同于直接持有实物黄金&#xff0c;投资者购买黄金基金并不涉及实体黄金的保管问题&#xff0c;而是将资金交由专业的基金管理人管理&#xff0c;由他们代表投资…

流程图的新语法-mermaid的快速使用--推荐

chatgpt或者现在的大数据采用的流程图给出的代码如下&#xff1a; graph TD;A[接收客户请求] --> B[问题分类];B --> C[技术支持];B --> D[维修服务];C --> E[远程解决];C --> F[现场支持];D --> G[维修完成];G --> H[服务反馈];style A fill:#f9f,strok…

IO流(字节流、字符流)

一、IO概述 1&#xff0e;什么是IO流? 存储和读取数据的解决方案l: inputo: output流∶像水流一样传输数据 2.IO流的作用? 用于读写数据&#xff08;本地文件&#xff0c;网络) 3.IO流按照流向可以分类哪两种流? 输出流:程序 - > 文件 输入流:文件 - > 程…