操作系统:进程状态

news2024/12/23 20:26:51

目录

1.进程状态

1.1.运行状态

1.2.阻塞状态

1.3.挂起状态

 1.4.终止状态

2.Linux下的进程状态

2.1.常规的进程状态 

 2.2.僵尸进程和孤儿进程

2.2.1僵尸进程 

2.2.2.孤儿进程


1.进程状态

进程状态是指一个进程在其生命周期中所处的不同状态

1.1.运行状态

当操作系统选择一个就绪状态的进程来执行时,该进程进入运行状态。在运行状态下,进程占用CPU资源,执行其指令。

当PCB进入运行队列后就可以修改它的pcb->status的值,表示可以被CPU调度

1.2.阻塞状态

当一个进程在执行过程中发生某些事件,如等待用户输入、等待I/O操作完成等,它可能会进入阻塞状态。在阻塞状态下,进程暂停执行,直到事件发生并得到处理。

我们知道在代码运行的过程中,或多或少会访问系统中的某些资源!比如:磁盘、硬盘、网卡等各种硬件设备。当我们在使用cin>> scanf() 时如果我们故意不输入,这时候进程就一直无法继续也就是处于阻塞状态,不具有访问条件,进而进程代码无法继续向后执

在这个进程开始运行到因为不输入导致阻塞的过程中,这个pcb从运行队列中转移到硬件等待队列,如果这个进程开始就绪,那么就退出等待队列回到运行队列中。

这时我们可以猜到操作系统中会有许许多多的不同的队列,运行队列,等待队列,也就可以更好的理解为什么需要pcb这一个结构了!并且一个进程的pcb并不只在一条链表里

那么进程状态变化本质

1.更改pcb->status这个整型变量

2.将pcb连入不同的队列中

也就是进程相关的过程,只与pcb的状态有关,与代码和数据无关。并且操作系统是第一个知道他所管理的设备状态的变化(操作系统是第一时间察觉进程状态的改变并对pcb进行操作),处于资源无法就绪,阻塞状态时,就把PCB连入相应的等待队列。当资源就绪时,就把进程状态换为R,放入运行队列,准备好给CPU调度。

1.3.挂起状态

是指一个进程或线程暂时停止执行,但仍然保留在内存中等待重新调度的状态。在挂起状态下,进程或线程不会占用CPU资源,但其在内存中的状态和数据仍然被保存

如果一个进程处于阻塞状态,那么我们知道该进程是无法被调度,处于内存中等待资源就绪。如果此时,os恰好内存资源已经严重不足时,这时候会怎么样? 

实际上磁盘上会专门开辟一块swap分区,留一部分空间给操作系统进行内存外存数据的置换(用时间换取空间,会牺牲时间)。当进程的资源就绪并被OS调度时,曾经被置换的进程代码和数据,又要重新加载进来。

那么这个场景就为:阻塞挂起

 1.4.终止状态

当一个进程完成其任务或被操作系统终止时,它进入终止状态。在终止状态下,进程释放占用的资源,并从系统中移除。

2.Linux下的进程状态

因为在不同操作系统中,进程的状态也会不同,这里我们主要以Linux为主要讲解对象

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
};

  上述代码为kernel源代码中对于状态的定义,也就是Linux的进程状态 

2.1.常规的进程状态 

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

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

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

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

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

我们发现为什么已经有了S状态的同时还是需要D状态?他们两个不都是休眠状态吗?

首先休眠状态对应进程状态中的阻塞状态,也就是此时资源不足以让某些进程被CPU调度。如果内存中运行队列已有大量进程,这时候操作系统为缓解内存的资源不足,会主动杀掉某些阻塞状态的进程。在某些场景中,假如某个进程正在往磁盘中写入一些重要数据,当写入过程中数据无法正常写入造成的阻塞状态被操作系统误删掉这个进程导致重要数据的丢失!所以我们需要一个特定的阻塞状态,也就是D状态,来保证当进程在向磁盘中写入数据时,被操作系统标志为不可中断的睡眠状态,从而跳过D状态的进程,保留这一份数据,返回错误信息给用户。 

 2.2.僵尸进程和孤儿进程

 进程退出的核心工作之一:将 PCB 和 自己的代码和数据 从内存中释放。

也就是在进程退出时,我们不仅需要释放资源,还需要接收进程退出的相关信息,一般就是该进程对应的父进程读取子进程的PCB,来了解子进程对任务的完成情况。

实际操作系统会在进程退出时,将退出信息写入当前进程的PCB,允许代码和数据空间立即释放,但是进程的PCB不可以被立即释放,需要被父进程接收退出信,得出子进程的退出原因。 

2.2.1僵尸进程 

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    pid_t id = fork();
    if(id < 0)
    {
        perror("fork");
        return 1;
    }
    else if(id > 0)
    { 
        while(1)
        {
            printf("parent is running...\n");
            sleep(1);
        }
    }
    else
    {
        int count = 5;
        while(count--)
        {
            printf("child is running  \n");
            sleep(1);
        }    
        printf("child is zombie\n");
        exit(EXIT_SUCCESS);
    }
    return 0;
}

 我们在Linux下运行上述代码,并观察进程信息,发现经过子进程退出时,父进程未读取到子进程的退出信息,确实会导致子进程进入僵尸进程。

僵尸进程的危害:我们知道当一个进程一直处于Z状态,这时它的PCB一直没有被父进程读取,就一直在内存中占据空间,最终导致内存泄漏。

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

2.2.2.孤儿进程

我们知道僵尸进程是子进程退出后没有被父进程读取PCB,那么如果子进程在正常运行时,父进程意外退出,那么后续子进程将要退出时的PCB也无法被读取。这个时候的子进程即为孤儿进程。(正常运行的子进程,没有父进程了)

实际上当子进程进入孤儿进程时,会被操作系统分配给init进程,也就是被其他进程领养,进而当该子进程退出时,也会有父进程来接收它的PCB中的退出信息。

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

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

相关文章

【MySQL知识体系】第1章 初识 MySQL

文章目录 第1章 初识 MySQL1.1 MySQL 介绍1.1.1 什么是 MySQL&#xff1f;1.1.2 MySQL 的特点&#xff1f;1.1.3 MySQL 默认端口&#xff1f; 1.2 安装 MySQL1.2.1在MacOS上安装MySQL1.2.2 在Windows上安装MySQL 1.3 如何选择 MySQL 客户端1.3.1 在MacOS上安装Workbench1.3.2 在…

“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开

2024杭州国际智慧城市及安防展览会&#xff0c;将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会&#xff0c;不仅汇集了全球智慧城市与安防领域的顶尖企业&#xff0c;更是展示最新技术、交流创新理念的重要平台。近日&#xff0c;从组委会传来消息&#xff0c;展会…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展&#xff0c;并搜索remote ssh 它大概长这样&#xff0c;点击安装 安装成功后&#xff0c;在左侧栏会出现远程连接的图标&#xff0c;点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…

typescript 学习

一.typescript是Javascript的超集,在javascript中添加特性的语言扩展,支持ES6标准。 二.typescript中新增了:类型批注和编译时类型检查,类型推断,类型擦除,接口,枚举,Mixin,泛型编程,名字空间,元组,await等 三.vscode 中怎样使用typescript 1. 安装VSCode (官网下…

考研数学|到底要不要做张宇《1000题》

根据你自身能力来选择真正适合你的题集&#xff0c;最后的做题效果会加倍。&#x1f60e; 我先分析一下张宇1000题集的特点&#xff0c;张宇1000更适合基础不错&#xff0c;想冲刺高分的同学。 1000分为强化和提高&#xff0c;是没有基础部分的&#xff0c;着重考察数学概念和技…

外汇天眼:频繁交钱却无法出金,只因误入假冒HFM惨成冤大头!

在外汇市场上这么久了&#xff0c;天眼君总结出了一个不争的事实&#xff0c;但凡是不给出金或者以各种理由拒绝出金的平台一定有问题&#xff01;想必不管是在外汇天眼还是其他地方&#xff0c;大家总是能看到一些外汇交易者投诉自己向平台申请出金需要缴纳各种费用&#xff0…

FreeRTOS学习笔记——列表和列表项及其API函数讲解

目录 精华总结&#xff1a; 列表和列表项 架构脑图&#xff1a; 列表和列表项的简介 列表的结构 列表项 迷你列表项 列表和列表项的关系 FreeRTOS 列表和列表项相关 API 函数 架构脑图&#xff1a; 列表和列表项相关 API 函数 函数 vListInitialise() 函数 vListIni…

python3安装chrome,chromedriver亲测有效

客户用python写了个脚本&#xff0c;需要用到chrome和chromedriver扩展&#xff0c;结果说安装不了&#xff0c;各种报错&#xff0c;好吧我来研究一下。众所周知linux自带python2.7&#xff0c;根据报错查了一下资料发现是版本冲突导致的&#xff0c;系统自带2.7&#xff0c;代…

字节总部大楼私照流出,做他们的员工需要多牛!

在大厂上班究竟有多香&#xff1f; 大厂的工作环境&#xff0c;只有你想不到的硬核&#xff0c;没有它做不到的。 前段时间&#xff0c;字节跳动在北京办公室的一组私照在网上刷屏&#xff0c;看完我只有一个表情—— 抛开薪资和大厂光环不谈&#xff0c;就冲它的工作环境&…

基于JavaWeb开发的springboot游戏商城平台论文【附源码】

基于JavaWeb开发的springboot游戏商城平台论文 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

算法---双指针练习-3(快乐数)

题目 1. 题目解析2. 讲解算法原理鸽巢原理 3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 本题根据鸽巢原理是一定会有环的&#xff0c;最后要么无限循环1&#xff0c;要么碰到一个不为1的重复数继续循环 鸽巢原理 鸽巢原理&#xff08;Pigeonhole P…

个性化服务:选择能提供定制化咨询的六西格玛公司

在全球化竞争加剧的商业版图中&#xff0c;每一家企业都在寻求提高效率和质量的方法。六西格玛咨询公司为这一追求提供了强有力的支持。选择正确地六西格玛培训公司合作&#xff0c;不仅能够帮助企业精简流程、提升产品质量&#xff0c;还能够助力构建内部持续改进的文化。如何…

MyBatis Oracle 批量插入数据

MyBatis Oracle 批量插入数据 1.需求描述2.实现方案2.1 循环 insert 插入2.2 insert all 插入2.3 insert union all 插入 3.分析总结 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在一次项目中实施过程中&#xff0c;后台需要将地区…

基于H5的旅游攻略平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 系统开发相关技术 3 1.1框架技术 3 1.1.1 SSM框架 3 1.1.2 SpringBoot框架 3 1.1.3 Spring框架 3 1.2开发语言 3 1.2.1 HTML 3 1.2.2 JAVA 4 1.2.3 JavaScript 4 1.3数据库 4 1.4本章小结 4 2 系统分析 5 2.1 可行性分析 5 2.2 功能需求分…

南京观海微电子---PCIe协议接口

1. PCIe引脚定义 PCI Express&#xff0c;官方简称PCIe&#xff0c;是计算机总线的一个重要分支, 插槽图片如下&#xff1a; 下表列出在边缘连接器上的PCI Express卡两侧的导线。在印刷电路板&#xff08;PCB&#xff09;的焊接侧为A侧&#xff0c;并且组件侧的B侧。PRSNT1# 和…

Windows Server 2012 R2 安装SNMP服务失败,提示:无法打开匿名级安全令牌。错误:0x8007050543

Windows Server 2012 R2 安装SNMP服务失败&#xff0c;提示&#xff1a;无法打开匿名级安全令牌。错误&#xff1a;0x8007050543 解决方法如下&#xff1a; 1、打开运行&#xff0c;输入&#xff1a;dcomcnfg.exe 2、依次进入&#xff1a;【组件服务】-【计算机】-【我的电脑】…

FMEA视角下的未来:拥抱变化,探索无限可能!

在快速发展的现代社会中&#xff0c;预测未来变得越来越具有挑战性。FMEA&#xff08;失效模式与影响分析&#xff09;作为一种预防性质量工具&#xff0c;虽然主要用于评估产品设计或过程中的潜在故障&#xff0c;但其核心理念——识别风险、预防失误&#xff0c;同样适用于我…

StarCoder 2:GitHub Copilot本地开源LLM替代方案

GitHub CoPilot拥有超过130万付费用户&#xff0c;部署在5万多个组织中&#xff0c;是世界上部署最广泛的人工智能开发工具。使用LLM进行编程辅助工作不仅提高了生产力&#xff0c;而且正在永久性地改变数字原住民开发软件的方式&#xff0c;我也是它的付费用户之一。 低代码/…

基于SSM框架的艺术交流平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1相关技术 3 1.1 jQuery技术简介 3 1.2 SSM框架简介 3 1.3 Bootstrap框架简介 3 1.4 ECharts框架简介 4 1.5 MVC设计模式简介 4 1.6 Ajax技术简介 4 1.7 MySQL数据库简介 4 1.8本章小结 4 2.1功能需求 5 2.2非功能需求 9 2.3本章小结 10 3系…

C++程序设计-第四/五章 函数和类和对象【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下C程序设计中的重点概念&#xff0c;以供大家期末复习和考研复习的时候使用。 文章目录 前言第四章 函数 函数和类和对象4.1 说明带参数的宏与内联函数有什么不同4.2 全局变量和局部变量有什么区别是怎么实现的…