Linux基础4-进程2(Linux中的进程状态,R,S,D,T,t,Z,X,僵尸进程,孤儿进程)

news2024/9/23 23:16:28

上篇文章:Linux基础4-进程1(操作系统,进程介绍,Linux进程相关命令,getpid,fork)-CSDN博客

本章重点:

进程状态相关知识

目录

1. 进程常见的状态

2.普遍的操作系统理解进程状态

3. Linux操作系统是如何区分这些状态的

3.Linux中查看进程状态

3.1 R(运行状态)与 S(睡眠状态)

3.2 T(停止状态)状态, t(短暂暂停)状态,D(深度睡眠)状态

3.2.1 前后台进程

3.2.2 t状态

3.2.3 D状态

4. Z状态与僵尸进程

5. 孤儿进程

6. 下章重点

6.1 进程优先级

6.2 进程的竞争性,独立性,并发,并行


1. 进程常见的状态

运行,新建,就绪,挂起,阻塞,等待,停止,挂机,死亡等

2.普遍的操作系统理解进程状态

        在os中,os会管理一个运行队列

1 一个cpu会拥有一个运行队列        

2 让进程进入运行状态的本质,将进程对象的task_struct(进程控制块PCB)放入运行队列

3 进程对象的PCB在进程队列中,该进程的状态才是运行状态,并不是进程在运行就是运行状态

4 进程会等待占用CPU资源,进程也会去占用外设的资源

5 操作系统通过将进程对象的PCB放到不同的执行队列来改变其状态

6 所谓的进程不同的状态,本质是在不同的执行队列中,等待某种资源

关于阻塞和挂起:

阻塞状态是当进程需要资源而处于等待时的状态。

阻塞状态的进程可能不会立即被调度,它会占用内存来等待资源。

但是,被阻塞的进程状态过多,内存资源会不够,这个时候操作系统就会把这些进程的数据和代码保存在磁盘上。

这样就能够节省一定的内存资源,将进程的这种状态称为挂起状态。

当被挂起的状态等待的资源到达时,操作系统再将磁盘的数据和代码加载到内存中继续运行。

两种状态之间的转化如下:

3. Linux操作系统是如何区分这些状态的

上图是Linux 代码中对进程状态的描述

有R(运行状态) S(睡眠状态) D(深度睡眠) T(停止状态) t(短暂停止) Z(僵尸状态) X(死亡状态) 七种状态

3.Linux中查看进程状态

3.1 R(运行状态)与 S(睡眠状态)

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

int main()
{
  while(1)
  {
    int a = 1;
    a+=1;
  }
  return 0;
}

该代码是一个死循环,方便我们观察状态

适当修改代码,死循环的同时打印a值

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

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

这个由R状态变为S状态的原因:

printf输出到外设(显示器),进程需要等待显示器就绪,需要等待较长的时间(相对于cpu)

所以:99%显示的是S状态,1%显示的是R状态

3.2 T(停止状态)状态, t(短暂暂停)状态,D(深度睡眠)状态

kill -19 进程pid    //可以停止这个进程
kill -18 进程pid    //可以重启暂停的进程

暂停状态是阻塞状态还是挂起状态?

对于用户来说:暂停状态就是阻塞了,是否挂起我们不知道

对于OS来说:是否要挂起阻塞状态由OS自行决定(用户不需要知道阻塞状态是否需要被挂起)

继续运行暂停的进程

使用 kill -18 之后,被暂停的process重新变成了S状态。

但是却不是变回S+,这是为什么??

我们使用 ctrl c 都无法强制退出process,这是因为process变为了后台进程

3.2.1 前后台进程

状态前面带+号的是前台进程,不带+号的是后台进程

后台进程无法使用ctrl c 终止,只能使用 kill 杀死

当一个前台进程被kill -19 暂停后,使用 kill -18恢复运行就会由前台进程变为后台进程

3.2.2 t状态

t状态是暂短暂停状态,如使用gdb调试一个进程的时候,该进程会处于t

3.2.3 D状态

在D状态下的进程无法被杀死,只有通过断电,或者进程自己醒来,自己解决

4. Z状态与僵尸进程

处于Z状态的进程称为僵尸进程。

当子进程退出之后,父进程没有读取到子进程的返回状态,子进程就会变为僵尸进程。且僵尸进程会一直等待父进程读取退出状态

子进程被创建出来 --> 为了完成任务 --> 父进程需要知道子进程完成的怎么样(通过子进程的退出信息)

当子进程退出了,父亲却没有回收子进程,这是一个问题!

只要我们创建一个父子进程,让父进程不退出,也不回收子进程。再让子进程退出,就能观察到处于僵尸状态的子进程

下面代码父亲处于死循环且不会回收子进程,子进程5秒后退出。

子进程退出之后就会变为僵尸进程

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  pid_t id=fork();
  if(id==0)//正常为子进程
  {
    //childi
    printf("我是子进程,我的pid为%d,我的ppid为%d\n",getpid(),getppid());
     sleep(5);
     exit(1);
   }
   else 
   {
     //parent
     while(1)
     {
       printf("我是父进程,我的pid为%d,我的ppid为%d\n",getpid(),getppid());
       sleep(1);
     }
   }
   return 0;
 }

僵尸进程会占用内存,又不会被回收,这样会导致内存泄漏

5. 孤儿进程

如果子进程退出,父进程不回收子进程退出信息,子进程会变为僵尸进程

如果父进程先退出,而子进程不退出会怎么样呢??

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
  pid_t id=fork();
  if(id > 0)//正常为子进程
  {
    //childi
     printf("我是父进程,我的pid为%d,我的ppid为%d\n",getpid(),getppid());
     sleep(5);
     exit(1);
   }
   else 
   {
     //parent
     while(1)
     {
       printf("我是子进程,我的pid为%d,我的ppid为%d\n",getpid(),getppid());
       sleep(1);
     }
   }
   return 0;
 }

父进程比子进程先退出,子进程就会变为孤儿进程,同时被1进程收养

如果不被领养的话,子进程会变为僵尸进程,被1收养之后可以被1进程回收。这样就不会造成内存泄漏

父进程先退出

1.这种现象一定会存在 2.子进程一定会被操作系统(1进程)领养 3.如果不领养,那么子进程退出的时候,对应的僵尸进程就没人回收了

4.所以被领养的进程就是孤儿进程 5.如果是前台进程创建了子进程,如果孤儿了,那么它会自动变为后台进程

6. 下章重点

6.1 进程优先级

6.2 进程的竞争性,独立性,并发,并行

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

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

相关文章

c++263抽象类在继承中的应用

#include<iostream> using namespace std; //计算程序员工资 //1.要求能计算出junior_programmmer mid-programer adv-programmer的工资 //2.要求利用抽象类统一界面 方便程序的扩展 ex&#xff1a;新增计算架构师architect的工资class programmer { public:virtual void…

CTFHub技能树-SQL注入-Cookie注入

使用bp发现cookie的注入点 id1&#xff0c;发现为数字型 首先使用联合查询 id 1 order by 2 id 1 order by 3发现2的时候有回显&#xff0c;而3的时候无回显 Cookie: id-1 union select database(),user() 后面开始库->表->列->数据 Cookie: id-1 union select 1…

WebLogic文件任意上传漏洞CVE-2018-2894

1.环境搭建 cd vulhub-master/weblogic/CVE-2018-2894 docker-compose up -d 2.获取环境后台密码 docker-compose logs | grep password 3.开启web服务测试 设置web服务测试开启:域结构->base-domain->高级 ->启动Web服务测试页 4.修改访问目录 先进入/ws_utc/co…

Java基础知识扫盲

目录 Arrays.sort的底层实现 BigDecimal(double)和BigDecimal(String)有什么区别 Char可以存储一个汉字吗 Java中的Timer定时调度任务是咋实现的 Java中的序列化机制是咋实现的 Java中的注解是干嘛的 Arrays.sort的底层实现 Arrays.sort是Java中提供的对数组进行排序的…

每日一练:对称二叉树

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,n…

对象【JavaScript】

在JavaScript中&#xff0c;对象是一种复合数据类型&#xff0c;它使用花括号 {} 包裹一组键值对。每个键&#xff08;属性名&#xff09;后面跟着一个冒号 : 和对应的值。键通常是字符串&#xff08;或符号&#xff09;&#xff0c;而值可以是任意数据类型。 1. 对象字面…

数据脱敏-快速使用

1.数据脱敏定义 数据脱敏百度百科中是这样定义的&#xff1a; 数据脱敏&#xff0c;指对某些敏感信息通过脱敏规则进行数据的变形&#xff0c;实现敏感隐私数据的可靠保护。 因为在真正的生产环境中,很多数据是不能直接返回,但是我们工作的时候可能经常性的需要返回一些用户信…

公司将被千万美金收购,工程师却误删数据库 —— 没 有 备 份!!!

前些天&#xff0c;Retention 和 RB2B 的 CEO&#xff0c;Adam Robinson&#xff0c;在领英&#xff08;LinkedIn&#xff09;发帖讲了一个恐怖故事。 2021 年 3 月&#xff0c;在他第一个创业公司即将以一千万美金被收购的两周前&#xff0c;他们的一位工程师不小心删除了整个…

M9410A VXT PXI 矢量收发信机,300/600/1200MHz带宽

M9410A PXI 矢量收发信机 -300/600/1200MHz带宽- M9410A VXT PXI 矢量收发信机&#xff0c;300/600/1200MHz带宽支持 5G 的 PXI 矢量收发信机&#xff08;VXT&#xff09;是一个 2 插槽模块&#xff0c;具有 1.2 GHz 的瞬时带宽 主要特点 Keysight M9410A VXT PXIe 矢量收发…

SpringBoot+Vue技术框架开发的ADR智能监测系统源码,Java语言的药品不良反应智能监测系统源代码

系统概述&#xff1a; 药品不良反应是指合格药品在正常用法用量下出现的与用药目的无关的有害反应。药品不良反应智能监测系统是一种用于监测和收集药品在使用过程中发生的不良反应的系统。它基于医院临床数据中心&#xff0c;运用信息技术实现药品不良反应的智能监测、报告管…

46.哀家要长脑子了!

1.435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;动态规划 实际上本质就是找最长的无重叠子序列&#xff0c;那么我们可以遍历这个区间的集合&#xff0c;只要前一个区间的右端点是小于等于后一个区间的左端点&#xff0c;那么这两个区间就不是重…

C:内存函数

目录 前言&#xff1a; 一、memcpy 函数的使用及实现 1、memcpy函数的介绍 1.1 memcpy函数参数解读 2、memcpy函数的使用 3、memcpy函数的模拟实现 二、memmove函数的使用及模拟 1、memmove函数的使用 2、memmove函数的模拟实现 三、memset 函数的使用 1、memset函数的…

mybatis 配置文件完成增删改查(五) :单条件 动态sql查询,相当于switch

文章目录 单条件 动态sql查询写测试方法 疑问总结 单条件 动态sql查询 <select id"selectByConditionBySingle" resultMap"brandResultMap">.select *from tb_brandwhere<choose>/*相当于switch*/<when test"status ! null">…

基于Vision-Board的智能应急环境监测控制小车

目录 1 项目概述 1.1 项目背景 1.2 系统功能介绍 1.2.1 下位机智能小车控制系统 1.2.2 微信小程序App 1.2.3 PC上位机App 1.3 框图介绍 1.3.1 主控板卡 1.3.2 小车控制模块 1.3.3 通信模块 1.4 系统使用的技术要点 2 系统硬件设计 2.1 Version board主控板块系统结…

matlab恢复默认窗口布局

1.点击主页&#xff0c;选择布局 2.选择默认&#xff0c;即可恢复到默认的窗口布局

ollama 部署教程(window、linux)

目录 一、官网 二、安装方式一&#xff1a;window10版本下载 三、安装方式二&#xff1a;linux版本docker 四、 模型库 五、运行模型 六、API服务 七、python调用 ollama库调用 langchain调用 requests调用 aiohttp调用 八、模型添加方式 1.线上pull 2.导入 GGU…

HCIA--实验十九:配置接口DCHP

一、实验内容 1.需求/要求&#xff1a; 通过一台5700交换机和一台PC&#xff0c;通过在交换机的接口上配置接口DHCP来实现PC自动获取ip地址。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给vlan10配置ip地址&#xff0c;进入vlan10开启接口的DHCP&#xff1…

药用植物的空间多组学:从生物合成途径到工业应用-文献精读51

Spatial multi-omics in medicinal plants: from biosynthesis pathways to industrial applications 药用植物的空间多组学&#xff1a;从生物合成途径到工业应用 摘要 随着分子测序和成像技术的快速发展&#xff0c;药用植物的多组学研究进入了单细胞时代。我们讨论了空间多…

EMT-LTR--学习任务间关系的多目标多任务优化

EMT-LTR–学习任务间关系的多目标多任务优化 title&#xff1a; Learning Task Relationships in Evolutionary Multitasking for Multiobjective Continuous Optimization author&#xff1a; Zefeng Chen, Yuren Zhou, Xiaoyu He, and Jun Zhang. journal&#xff1a; IEE…

2024最新windows 11系统 PHP或者idea编译器-配置Git环境和使用教程

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 确保电脑上已安装到git,如下图所示&#xff1a;-是已安装好&#xff1a; 安装git教程&#xff1a; Git安装使用教程_git安装教程-CSDN博客 安装流程 点击左上角如图所示&#xff1a; 需要验证git本地 …