【liunx】进程的状态

news2024/11/13 15:07:01

进程的状态

  • 1.进程的状态
  • 2.僵尸进程
  • 3.孤儿进程

1.进程的状态

我们或多或少了解到进程的状态分为:
运行,新建,就绪,挂起,阻塞,等待,停止,挂机,死亡…

首先解释一点,进程这么多状态,本质上都是用来满足不同运行场景的。

接下来我们从两个方面来理解进程的状态

1.普遍的操作系统层面理解进程的概念

在这里插入图片描述

总结:
1.一个cpu一个运行队列
2.让进程进队列,本质上是将进程的task_struct结构体对象放在运行队列中
3.进程pcb在运行队列,就是R,不是这个进程正在运行,才是运行状态

状态其实是进程内部的属性,放在task_struct,本质是就是int类型的数字来表示不同的状态(假如1:run 2:stop …)。

我们知道磁盘速度都是很慢的,进程或多或少会访问磁盘,但是磁盘也只有一个,那该怎么办呢?
只能是等待

4.不要只以为,你的进程只会等待(占用)cpu资源,你的进程也可能随时随地要外设资源。

在这里插入图片描述

当cpu发现某个进程需要访问磁盘,就会把该进程从运行队列中剥离,如果这个磁盘现在正由其他进程使用,操作系统就会把该进程放在磁盘的等待队列里(将task_struct对象放在不同队列中),该进程会由运行状态变成阻塞状态。,当磁盘处理完进程,但是等待队列中的进程还是阻塞状态,操作系统会把该进程拿到系统中,把状态改成R(运行状态)再给cpu的运行队列中。

5.所谓的进程不同的状态,本质是进程在不同的队列中,等待某种资源。

进程处于阻塞状态,可能不会被立即调度,万一阻塞的进程有很多,内存空间不够了怎么办?
在这里插入图片描述

操作系统会把该进程对应的代码和数据暂时保存到磁盘上,pcb还在内存。这样就节省了一部分空间,然后把这一部分空间给别人使用。
在这里插入图片描述
此时的进程就处于挂起状态

将进程的代码和数据,加载或者保存到磁盘叫做内存数据的唤入换出

阻塞并不一定挂起,挂起一定阻塞。

进程的状态我们这里就说这么多,主要要知道,1.什么叫做运行;2.什么叫做阻塞;3.什么叫做挂起。

接下来我们从另一方面来了解进程

2.Linux是怎么做的(具体的linux操作系统的状态)

STAT 状态

#include<stdio.h>
   
   int main()
   {
   
       while(1)
       {}
                                                                                                                                                                    
      return 0;
  }

在这里插入图片描述

R+ 运行

#include<stdio.h>
#include<unistd.h>

int main()
{                                                                                                                                                                   
	int a=0;
	while(1)
	{
		printf("%d\n",a++);
		sleep(1);
	}
  
	return 0;
}

在这里插入图片描述

S+ 休眠

printf会把内容打印到显示器上去,显示器是一个外设,外设特点就是慢,等待显示器就绪,cpu需要花较长的时间。99%都是在等IO就绪,1%再执行打印代码。

所有进程访问外设行为基本都是S(阻塞状态的一种)

kill -l  //查看kill命令

在这里插入图片描述

kill -19 编号  //暂停进程

在这里插入图片描述

T 暂停(阻塞的一种)

kill -18 编号 //继续进程

在这里插入图片描述
这里注意一点,在睡眠的状态是S+,当我暂停进程,又继续进程之后。这个进程状态就变成S了;

状态后面带+,属于前台进程,在xshell输入任何指令没用,除了用ctrl+c,结束进程。
状态后面不带+,属于后台进程,在xshell输入指令都有效,使用ctrl+c不能结束进程,只能使用kill -9 杀死进程。

在这里插入图片描述
ctrl+c不能杀死后台程序

在这里插入图片描述
输入指令还有效

在这里插入图片描述
对于后台程序只能通过kill -9 杀死进程。

D 深度睡眠

讲个小故事帮助我们理解D状态。

今天我想让进程帮我向磁盘写个超大份的数据,磁盘答应给我写,那么磁盘就开始写了。写了一会操作系统发现我们电脑变得很卡,操作系统是很聪明的,它去查看,发现这个进程导致电脑变卡,如果不删去这个进程而去删别的进程就会导致其他进程有意见,所以操作系统决定给它删了,过了一会磁盘写数据遇见错误,呼叫进程,但是进程被删了,所以最终导致写入数据失败。当我发现写入数据失败,我问它们三个到底是谁的责任?

请问是操作系统的责任吗?请问是进程的责任吗?请问是磁盘的责任吗?

操作系统回答说,不是我的责任,这是我们赋予它的权力,为了保证系统正常运行。
进程回答说,不是我的责任,我是被操作系统给删掉了。
磁盘回答说,也不是我的责任,我只负责任写。

那么为了想把数据写到磁盘里,我只能给这个进程发一个免死金牌,让操作系统不能删掉它。

像在高级IO的情况,该进程就处于D(深度睡眠),在该状态的进程,无法被操作系统杀掉!只能通过断电,或者进程自己醒来才能解决

S+ 休眠,属于浅度睡眠可以被终止

t 也是暂停状态,表示该进程正在被追踪,等待指令,当调试的时候。出现该状态

在这里插入图片描述

在这里插入图片描述

X(dead)死亡状态

Z(zombie)僵尸状态

2.僵尸进程

为什么会有僵尸状态?(感性的认识)
进程被创建出来,是为了完成任务。
1.要知道它完成的如何。2.不关系结果。

Linux是一个你可以不要,但我要给。
所以进程退出的时候,不能立即释放该进程对应的资源(代码和数据释放掉,PCB保留),保存一段时间,让父进程或者操作系统来进行读取,因什么原因而退出。这段时间内进程处于僵尸状态。

所谓僵尸状态就是:当进程退出的时候,如果没有对该进程回收,此时进程处于僵尸。

我们在linux下见见僵尸状态
具体做法,子进程退出,但是父进程和操作系统没有对其回收------> 创建一个子进程,让父进程不要退出,而且什么都不做,让子进程正常退出即可。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    pid_t id=fork();
    if(id == 0)
    {
         //子进程
         int cnt=10;
         while(cnt--)
         {
             printf("子进程, pid : %d , ppid : %d  ,ret : %d ,cnt=%d\n",getpid(),getppid(),id,cnt);
             sleep(1);
         }                                                                                                                                                        
         exit(-1);
     }
     else if(id > 0)
     {
 
        //父进程
        while(1)
        {
             printf("父进程, pid : %d , ppid : %d  ,ret : %d\n",getpid(),getppid(),id);
             sleep(3);
        }
     }
     return 0;
 }

在这里插入图片描述
在这里插入图片描述

3.孤儿进程

所谓孤儿进程就是,当父进程先退出,这个子进程会被操作系统(1号进程)领养,这个子进程叫做孤儿进程。

这里要说明的是:
1.父进程先退出这种情况一定是存在的。
2.子进程会被操作系统(1号进程)领养。
3.那为什么要领养呢?
如果不领养,那么子进程退出的时候,对应的僵尸便没有人能回收了。造成了资源浪费。
4.被领养的进程----孤儿进程
5.如果是前台进程创建的子进程,变成了孤儿,会自动变成后台程序,只能被杀死。

int main()
{
    pid_t id=fork();
    if(id > 0)
    {
         //父进程
         int cnt=10;
         while(cnt--)
         {
             printf("父进程, pid : %d , ppid : %d  ,ret : %d ,cnt=%d\n",getpid(),getppid(),id,cnt);
             sleep(1);
         }                                                                                                                                                        
         exit(-1);
     }
     else if(id > 0)
     {
 
        //子进程
        while(1)
        {
             printf("子进程, pid : %d , ppid : %d  ,ret : %d\n",getpid(),getppid(),id);
             sleep(3);
        }
     }
     return 0;
 }

在这里插入图片描述
在这里插入图片描述
发现当父进程退出,子进程会被操作系统(1号进程领养)。并且子进程由前台程序变成了后台程序,只能被杀死。

在这里插入图片描述

关于进程的状态我们就说这么多,喜欢的点赞,评论,收藏+关注。下篇继续了解更多关于进程的知识。

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

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

相关文章

windows系统edge浏览器退出账户后还能免密登录的解决方式

edge浏览器明明退出登录了&#xff0c;还能不用输密码一键点击就能登录&#xff1b; 这是因为微软的煞笔产品经理用脚后跟想出来的方案。 解决方案&#xff1a; 去设置里的账号管理&#xff0c;注销自己的微软账号登录&#xff1b;如果你发现自己并没有登录&#xff0c;那么看…

Spring框架中bean的生命周期(理解)

1.解释Spring框架中bean的生命周期 在传统的Java应用中&#xff0c;bean的生命周期很简单。使用Java关键字new进行bean实例化&#xff0c;然后该bean就可以使用了。一旦该bean不再被使用&#xff0c;则由Java自动进行垃圾回收。 相比之下&#xff0c;Spring容器中的bean的生命…

2023什么好用的工具可以传大文件?

在当今的信息时代&#xff0c;数据已经成为了企业和个人的重要资产。无论是视频、音乐、图片、文档等各种格式的文件&#xff0c;都需要在不同的场景和需求下进行传输或分享。然而&#xff0c;随着数据量的不断增长&#xff0c;传输或分享大文件就成了一个难题。 常见的传输方式…

SpringBoot通过自定义注解实现日志打印

目录 前言&#xff1a; 正文 一.Spring AOP 1.JDK动态代理 2.Cglib动态代理 使用AOP主要的应用场景&#xff1a; SpringBoot通过自定义注解实现日志打印 一.Maven依赖 二.ControllerMethodLog.class自定义注解 三.Spring AOP切面方法的执行顺序 四.ControllerMethodL…

WireShark抓包工具的安装

1.下载安装包 在官网或者电脑应用商城都可以下载 2.安装 打开安装包&#xff0c;点击next 点击next 选择UI界面&#xff0c;两种都装上 根据习惯选择 选择安装位置点击安装 开始安装安装成功

测试用例基础

测试用例概要 测试用例要素 测试环境,操作步骤,测试数据,预期结果 测试用例好处 提高测试效率,节省测试时间 测试用例是自动化测试用例的前提 测试用例设计方法 1.基于需求的设计方法 需求文档 --> 梳理需求(掌握需求) --> 针对文档设计测试用例(基于需求设计测…

无脑013—— win11配置mmdetection实现训练自己的vol格式(xml)数据集

昨天使用cascade——rcnn 实现了MSAR 1.0的训练&#xff0c;今天来回顾一下 参考资料&#xff1a; http://t.csdn.cn/8A5WE http://t.csdn.cn/ccOZg 电脑 笔记本电脑&#xff0c;拯救者Y7000P 2018款&#xff0c;GTX1060显卡6G显存 &#xff0c;cmd输入代码nvcc-version显示的C…

[docker]笔记-portainer的安装

1、portainer是一款可视化的容器管理软件&#xff0c;利用portainer可以轻松方便的管理和创建容器。portainer本身是一个容器&#xff0c;完全免费并且具有汉化版。本文介绍portainer的安装和使用。 2、安装好容器并配置好容器环境&#xff0c;可参照https://blog.csdn.net/bl…

redis实战篇之导入黑马点评项目

1. 搭建黑马点评项目 链接&#xff1a;https://pan.baidu.com/s/1Q0AAlb4jM-5Fc0H_RYUX-A?pwd6666 提取码&#xff1a;6666 1.1 首先&#xff0c;导入SQL文件 其中的表有&#xff1a; tb_user&#xff1a;用户表 tb_user_info&#xff1a;用户详情表 tb_shop&#xff1a;商户…

使用Vagrant创建和管理本地Kubernetes(K8s)集群的步骤是什么

文章目录 步骤1&#xff1a;准备环境步骤2&#xff1a;创建Vagrantfile步骤3&#xff1a;启动虚拟机步骤4&#xff1a;安装Kubernetes步骤5&#xff1a;配置Kubernetes网络插件步骤6&#xff1a;将Worker节点加入集群步骤7&#xff1a;验证集群步骤8&#xff1a;部署应用步骤9&…

部署笔记:文件句柄调整和磁盘分区 02

系统默认是1024&#xff0c;基本不够&#xff0c;会报“too many open files”的错误。因此需要调整。 系统文件句柄数调整 # 编辑打开文件&#xff0c;在文末追加两行配置 vim /etc/security/limits.conf # 需要添加的配置&#xff0c;注意别漏了前面的*号 # * 指所有用户、…

gitlab 合并分支

打开我们的gitlab&#xff0c;找到我们的项目&#xff0c;在左侧菜单中找到Merge requests&#xff0c;点击Merge requests&#xff0c;进入下一个页面 点击New merge requests&#xff0c;创建一个新的merge&#xff0c;进入下一个页面 选择自己分支和目标分支&#xff0c;自己…

如何在Windows中使用C#填写和提取PDF表单

如何在Windows中使用C#填写和提取PDF表单 PDF表单不仅允许用户填写和提交数据&#xff0c;也允许用户创建各种表单域收集用户的数据&#xff0c;并通过提取表单字段值&#xff0c;将收集和合并提交的数据进一步分析或处理。PDF通过电子方式填写、保存和共享的形式&#xff0c;…

WebDAV之π-Disk派盘 + 百灵创作

百灵创作是一款简约而不简单、功能强大且安全的高颜值码字工具,为网络写手和小说作者提供跨平台的写作环境,并提供强大的数据备份和云同步技术,以保障作者的数据安全,并提供流畅的多端无缝切换体验。 百灵创作的特点和功能包括: 简约而不简单:提供简洁直观的界面和操作,…

成都瀚网科技有限公司:抖音怎么绑定抖音小店才好?

抖音是一款非常流行的短视频应用&#xff0c;为用户提供了一个展示才华、分享生活的平台。在抖音上&#xff0c;用户可以通过绑定抖音商店来销售自己的产品或服务&#xff0c;从而实现商业变现。那么&#xff0c;抖音如何绑定抖音商店呢&#xff1f; 1、抖音如何绑定抖音商店&a…

注解方式配置SpringMVC

注解配置SpringMVC 1. 初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建SpringMVCConfig配置类&#xff0c;代替SpringMVC.xml配置文件4. 项目结构 1. 初始化类&#xff0c;代替web.xml Spring3.2引入了一个便利的WebApplic…

解放程序员生产力的AI代码助手重磅来袭

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

生信教程:多序列比对

摘要 所有系统发育推断方法都需要同源数据集作为输入。因此&#xff0c;当核苷酸序列用于系统发育分析时&#xff0c;第一步通常是推断不同类群序列中的哪些核苷酸彼此同源&#xff0c;以便这些核苷酸之间的差异仅源于序列进化中发生的变化。不同序列的核苷酸之间的同源性推断最…

Windows11 上使用 QEMU 创建 Ubuntu aarch64(ARM64)虚拟机

文章目录 背景步骤要点一、下载QEMU二、下载 QEMU UEFI 固件文件三、Ubuntu 光盘镜像文件四、安装设置 QEMU五、创建虚拟网卡1、安装 tap-windows2、重命名新网卡3、共享物理网卡的网络 六、创建硬盘镜像七、从iso镜像安装虚拟机八、启动镜像九、连接 ssh过程中 powershell 执行…

【已更新建模代码】2023数学建模国赛B题matlab代码--多波束测线问题

一、 问题重述 1.1问题背景 海洋测深是测定水体深度与海底地形的重要任务&#xff0c;有两种主要技术&#xff1a;单波束测 深与多波束测深。单波束适用于简单任务&#xff0c;但多波束可提供更精确的地形数据。多 波束系统的关键在于覆盖宽度与重叠率的设计&#xff0c;以确保…