【Linux系统编程】第十九弹---进程状态(下)

​​​​​​​

  ✨个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】

目录

1、僵尸进程

2、孤儿进程

3、运行状态

4、阻塞状态

5、挂起状态

6、进程切换

总结


1、僵尸进程

上一弹我们讲解了僵尸状态的基本概念,此处我们通过书写代码查看一下僵尸状态。

当一个进程运行完毕、出现问题或者被杀掉以后,它所占用的内存资源和退出状态没有被它的父进程回收,此时这个进程的状态就称为僵尸状态

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{pid_t id = fork();if (id == 0){//childint cnt = 5;while (cnt){printf("I am a child,cnt: %d,pid:%d\n", cnt, getpid());sleep(1);cnt--;}}else{//parentwhile (1){printf("I am parent,running always,pid: %d\n", getpid());sleep(1);}}return 0;
}

可以明显看到上图中出现了僵尸状态。

1.僵尸进程与僵尸状态的关系???

僵尸进程是指:一个子进程已经结束运行,但是父进程没有调用wait或waitpid来获取子进程的退出状态信息。

僵尸状态是指:当一个进程运行完毕、出现问题或者被杀掉以后,它所占用的内存资源和退出状态没有被它的父进程回收。

僵尸进程与僵尸状态的关系是,僵尸进程是指处于僵尸状态的进程。这种状态下的进程虽然已经结束执行,但是其进程描述符等资源仍然存在于系统中,直到父进程对其进行善后处理。


2.为什么出现僵尸进程???

僵尸进程是由于,子进程先于父进程退出,但是父进程没有对子进程的资源进行回收(这里的资源指的是内核资源PCB),从而导致子进程的用户资源虽然已被释放,但还占据着PCB资源。

子进程在退出时用户区的资源(子进程的代码和数据)可以自己释放,但是其所占据的内核资源(PCB)需要它的父进程来释放。

注意:如果没有父进程读取,僵尸进程会一直存在(内核数据结构task_struct会一直存在)。(kill -9 不能杀掉进程)

3.为什么父进程不回收子进程PCB??

1.父进程要知道子进程为什么要退出,父进程要获取子进程退出的信息。

2.独立性,父进程只读取子进程的信息,不对信息做修改,依旧保持独立性。

将来子进程被 waitpid(系统调用接口) 等待方式读取了,那么这个子进程会由Z(僵尸)状态变为X(死亡)状态,之后由OS来释放。

僵尸进程危害

进程 = task_struct内核数据结构 + 进程的代码和数据,僵尸进程时会释放进程的代码和数据,但是task_struct内核数据结构还占据一块内存,内存不释放会一直存在,内存不释放会引起内存泄漏问题。

2、孤儿进程

孤儿进程:父进程如果先退出,子进程就会变成孤儿进程。孤儿进程被1号init进程(OS本身)领养,当然要有init进程回收喽。

1. 孤儿进程为什么要被OS领养?

依旧要保证子进程正常被回收。(kill -9能回收)

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

直接在命令行中启动的进程它的父进程是bash,bash会自动回收新进程的Z(僵尸)。

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{int cnt = 5;while (cnt--){printf("I am a process,pid: %d\n", getpid());sleep(1);}
}

3、运行状态

 ★ 操作系统为了合理分配CPU以及各种硬件资源,保证各个进程的正常运行。操作系统会为CPU创建一个进程队列,也为每一个硬件都创建一个等待队列。

★ 而某一个进程处于运行状态本质上就是操作系统将该进程对应的PCB放入CPU的运行队列中,然后再将PCB中维护进程状态的变量修改为相应的值。

★ PCB里面有进程的各种属性值,以及对应的代码的地址。所以CPU从运行队列中找到PCB取出数据后,可以根据数据得到进程的各种属性值和指令,然后执行相应代码。进程处于运行状态并不意味着该进程此时一定正在被运行,只要该进程处于CPU的运行队列中即可。

注意:CPU是处理数据的速度在纳秒级,运算速度非常快,所以只要进程处于CPU的运行队列中,我们就可以认为该进程正在被运行。
 

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

不会。CPU基于时间片进行轮转调度的。(Linux不是这样调度的,这只是OS教材调度方法之一)

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

每一个CPU都要有一个自己的运行队列,有两个CPU的话,会存在真正意义上的有两个调度队列。任何时刻,都同时有多个进程在真的同时运行,我们叫做并行
 

4、阻塞状态

阻塞状态:相当于S状态,浅度睡眠,D也算。

用一个C语言代码理解阻塞:

#include<stdio.h>
int main()
{int a=0;scanf("%d",&a);printf("a = %d\n",a);return 0;
}

运行该代码,等待键盘资源是否就绪,键盘上面有没有被用户按下的按键,等待则进程没有被调度,也就不会在运行队列中。

阻塞:把进程从运行队列剥离到等待队列。

操作系统如何对硬件进行管理?

本质是对硬件的数据进行管理,因此在操作内核会有对应该硬件属性的结构体。

#define KEY_BOARD 1
#define SCREEN 2
struct device
{int type;int status;//其他属性struct device* next;task_struct* wait_queue;
}

不是只有CPU有自己的运行队列,各种设备也有自己的wait_queue。

★ CPU处理数据的速度极快,是我们计算机中的各种硬件处理数据的万倍,比如:一个磁盘或者一个网卡同时只能为一个进程服务,但是在计算机中需要使用这些硬件资源(磁盘等)的进程会有很多。

★ 如果在硬件为一个进程服务时,有其他运行中的进程也需要使用该硬件资源,操作系统就会将该进程的PCB放入硬件的等待队列中,进程会等待硬件来为自己提供服务。

 ★由于多个进程需要访问某种硬件,进程PCB在硬件等待队列中等待硬件服务自己的状态就被称为阻塞状态。阻塞状态在本质上就是将进程的PCB从CPU的运行队列中,放入硬件的等待队列中,然后将PCB中维护进程状态的变量也会修改为相应的值。当该进程获得对应的硬件资源服务时,再将该进程放回CPU的运行队列中。

注意:并不是只有等待硬件资源的进程才处于阻塞状态,一个进程等待另一个进程就绪、一个进程等待软件资源就绪等也是阻塞状态。
 

5、挂起状态

上面我们学习了阻塞状态,处于阻塞状态的进程由于需要等待某种资源,所以它对应的代码和数据在短期内不会被处理(这里的短期指的是对于操作系统而言)。但它们的数据仍储存在内存中,占用存储空间但是不执行,相当于浪费了内存资源。而如果当前操作系统处于高IO(大量向内存输入和向外部设备输出数据)的情况下,可用的内存空间不足,操作系统就会选择性的将这些处于阻塞状态的进程对应的代码和数据转移到磁盘中(唤出),从而节省出内存空间,如果需要使用到这些代码和数据,则从硬盘中转移到内存(唤入)。

频繁的唤入唤出会导致效率问题。用效率换空间。

这种由于内存空间不足,操作系统将在等待资源的进程对应的代码和数据放到磁盘中以节省内存空间的状态就被称为(阻塞)挂起状态。挂起状态不会移动进程的PCB,只会移动进程对应的代码和数据。

补充:虚拟机挂起是将整个操作系统以及代码和数据移动到硬盘中。

挂起并不是释放进程,因为对应的PCB仍然在硬件的等待队列中,当该进程获得对应的资源服务以后,操作系统仍然可以将该进程对应的代码和数据从磁盘加载到内存中来继续运行,其本质是对内存数据的唤入唤出。
 

6、进程切换

A进程在CPU运行队列中运行的时间片到了之后,A进程会脱离CPU的运行进程;B进程会进入CPU的运行队列中运行,那么比如:A进程在CPU中已经运行到了第50行代码后,时间片到了,退出CPU,当A进程再次进入CPU的时候,是重新开始运行呢?还是接上上回第50行的代码继续运行呢?

CPU里面有一套寄存器,会保留A进程运行的数据,当A进程退出CPU的时候,A进程在CPU中已经运行的数据,将由 task_struct 这个结构体来保存,当A进程再次进入CPU时,数据还会回到寄存器原来的位置,所以A进程会接着第50行继续运行。

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

CPU内的寄存器:

寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!!CPU内部的数据,可以有多套,有几个进程,就有几套和该进程对应的上下文数据。

寄存器 != 寄存器的内容

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

网工路由基础——动态路由协议(RIP)

一、动态路由协议的分类 1.按工作区域分类&#xff1a; 动态路由协议按用途分类可以分为内部网关协议&#xff08;IGP&#xff09;和外部网关协议&#xff08;EGP&#xff09;。一个Internet网可以被分成多个域或多个自治系统&#xff0c;各自治系统通过一个核心路由器…

基于语义感知的对象草图绘制

摘要 抽象是素描的核心&#xff0c;因为线条画的简单和最小化特性。抽象涉及识别对象或场景的基本视觉属性&#xff0c;这需要语义理解和对高级概念的先验知识。因此&#xff0c;抽象表现对艺术家来说是具有挑战性的&#xff0c;对机器来说更是如此。我们提出了CLIPasso&#…

软考--试题六--访问者模式(Visitor)

访问者模式(Visitor) 意图 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作 结构 适用性 1、一个对象的结构包含很多类对象&#xff0c;他们有不同的接口&#xff0c;而用户想对这些对象实施一些依赖于其具体类的操…

STL <string>--------String的OJ题目

1.题目截图&#xff08;把字符串转换成整数----atoi&#xff09; 1.1题目解析&#xff08;在代码里&#xff09; class Solution { public:int myAtoi(string str) {// 100% 97.45% int len str.size();if(len 0)return 0;int i 0, flag 1, isSignal 0, res 0;while(…

小红书孕妇宝妈暴力拉新玩法,每日两小时,单日收益500+

哎呀&#xff0c;你好呀&#xff0c;亲爱的小伙伴们&#xff01;我今天心血来潮&#xff0c;想和你们分享一个超级棒的方法&#xff0c;这个方法我亲自试过&#xff0c;超级有效&#xff01;就是在小红书上针对孕妇和宝妈们进行引流的方法。听起来是不是很有趣呀&#xff1f;&a…

PyCharm运行程序遇到‘[WinError 1455] 页面文件太小’的问题

最近在云环境的PyCharm运行程序&#xff0c;第一次遇到了WinError 1455的问题&#xff0c;感谢大神们给出的解决方法&#xff0c;特此记录一下。 错误提示是‘页面文件小’导致的问题&#xff0c;那么将页面调大即可。 电脑默认情况下没给D盘分配虚拟内存, 如果Python装在D盘…

【工具】macOS、window11访问limux共享目录/共享磁盘,samba服务安装使用

一、samba服务安装 Samba是一个免费的开源软件实现&#xff0c;使得非Windows操作系统能够与Windows系统进行文件和打印服务共享。它实现了SMB/CIFS协议&#xff0c;并且能够在Linux、Unix、BSD等多种系统上运行。 安装 samba&#xff1a; sudo yum install samba配置 samba…

裁员大盘点:2023年50家知名企业到底“减少”了多少员工?

面对裁员传闻&#xff0c;各家都有各家的说法。 什么“人员盘点”、“广进计划、”“优化”、“毕业”、“正常人员调整”、“瘦身”、“寒冬”…… 那么&#xff0c;国内知名企业在过去一年到底增加or减少了多少人&#xff1f; 博主翻查了一些知名上市企业2023年的财报&#…

【SRC实战】findsomething未授权修改密码

挖个洞先 https://mp.weixin.qq.com/s/i6R7OZ-5h9V5o3Kfho7QWA “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 1、网站只有账号密码登录功能&#xff0c;没有注册&#xff0c;忘记密码 2、利用findsomething发现修改密码接口 find…

2024 年第四届长三角高校数学建模竞赛赛题B题超详细解题思路+问题一二代码分享

2024年第四届长三角数学建模竞赛B题详细解题思路 赛道B&#xff1a;人工智能范式的物理化学家 长三角分享资料&#xff08;问题一代码论文思路&#xff09;链接&#xff08;18点更新&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1lteKvIWNZ4v-Gd7oOcg…

visual studio 2017重命名解决方案或项目名称

1.解决方案->右键->重命名->新的名字 2.项目->右键->重命名->新的名字 3.修改程序集和命名空间名称 项目->右键->属性->修改程序集名称和命名空间名称 4.搜索换名 Ctrl-F->输入旧名称->搜索->将所有旧名称改为新名称&#xff08;注意是整…

弘君资本股市分析|巴菲特“神秘持仓”曝光!盘后大涨

巴菲特“神秘持仓”揭晓。 当地时间5月15日周三&#xff0c;巴菲特旗下伯克希尔哈撒韦提交的13F美股持仓文件显现&#xff0c;一季度伯克希尔持有2592万股安达稳妥&#xff08;Insurer Chubb&#xff09;&#xff0c;持仓市值超67亿美元&#xff08;约合人民币485亿元&#xf…

一套智慧水务平台大概多少钱?

在当今日益发展的水务行业中&#xff0c;如何实现高效、智能的管理&#xff0c;成为了摆在水务企业和相关部门面前的一大挑战。而智慧水务平台作为新时代的解决方案&#xff0c;以其强大的功能和卓越的性能&#xff0c;赢得了广泛的关注。那么&#xff0c;一套智慧水务平台大概…

Metasploit基本命令

1. 开启控制台 命令&#xff1a; msfconsole2. 搜索模块 命令&#xff1a; search ms17-010 # 模块名这里以搜索 ms17-010 为例&#xff0c; auxiliary 开头的为测试模块&#xff0c;也就是 POC&#xff0c;看看存不存在漏洞&#xff0c; exploit 开头的为攻击模块 3. 调…

一款开源简历设计生成器,内置两款设计器,多种免费模板选择,还可以自定义模板、主题等等,支持导出PDF、JSON数据。

&#x1f680; 项目简介 91化简是一个开源免费的简历设计制作以及提供模板下载的网站&#xff0c;当前项目为前端项目&#xff0c;完全开源免费。 网站内置有两款设计器&#xff0c;可以方便快捷的制作出精美的简历&#xff0c;除此之外&#xff0c;网站还提供有完整的后台管…

JL-杰理芯片-认识TA的SDK的第四天

无蓝牙连接关机时间 关机时间&#xff1a;3分钟 60 * 5 300 低功耗 进入低功耗前&#xff0c;要关闭打印 内存D2、D4、D8 芯片&#xff08;主控&#xff09;的内存不能超过一定的数值&#xff0c;超过后就不能烧录 jl_isd.bin这个文件不能超过内存大小 而杰理的内存是…

UI组件解析!5种类型让你迅速掌握!

无论是网页开发项目还是移动应用程序开发&#xff0c;整个项目过程的每一步都需要综合考虑。UI组件是设计师在项目设计过程中经常使用的工具之一。下面将为您详细分析UI组件&#xff0c;产品小白也可以快速启动。 1. 什么是UI组件&#xff1f; UI组件&#xff0c;即用户界面组…

6-10 阶乘计算升级版

void Print_Factorial ( const int N ) {if(N<0){printf("Invalid input");return;} int nN;int a[10000]{};a[0]1; //0和1的阶乘都是1&#xff0c;同时又是用该个位去&#xff0c;所以初始化为1&#xff1b;int i,j;int len0;//当前数组所占的最大下标in…

webpack优化构建速度示例-resolve.extensions:

当项目不仅仅包含.js或.json文件&#xff0c;还包含其他类型文件(如.ts、.vue、.css)作为模块时&#xff0c;配置resolve.extensions可以不必要的文件搜索提高性能。 src/index.ts import { someFuction } from ./modulesomeFuction()src/module.tsimport {otherSomeFuction} f…

2024CCPC郑州邀请赛暨河南省赛(A,B,C,D,F,G,H,J,K,L,M)

2024 National Invitational of CCPC (Zhengzhou), 2024 CCPC Henan Provincial Collegiate Programming Contest 2024 年中国大学生程序设计竞赛全国邀请赛&#xff08;郑州&#xff09;暨第六届 CCPC 河南省大学生程序设计竞赛 比赛链接 这场的题说实话难度其实都不大&…