进程状态

目录

1.进程排队

硬件的队列

进程排队

2.进程的三大状态

什么是状态

运行状态

阻塞状态

挂起状态

3.Linux系统中的进程状态

4.僵尸状态

5.孤儿进程


1.进程排队

硬件的队列

计算机是由很多硬件组成的,操作系统为了管理这些硬件,通常需要为这些硬件创建数据结构,比如:

在这个数据结构中,有一个 task_struct* q 的东西,这个就是硬件的队列。每个硬件都有属于自己的一个队列;对于CPU来说,我们称它的队列为运行队列;对于键盘、显示器等设备来说,我们称它们的队列为阻塞队列。

进程排队

我们的计算机系统中的进程往往不止一个,但是大多数硬件只有一个,这些进程往往需要使用硬件,这就导致了使用同一个硬件的进程之间必须进行排队。

那么如何进行排队呢?我们可以这样理解。task_struct对象是可以通过双链表的形式组织起来的,task_struct* q 指向一个 task_struct 对象,这样就天然的形成了一个队列。

操作系统就可以 从描述硬件的数据结构中拿到 q 变量,再通过q变量拿到所有需要使用该硬件资源的进程了。

2.进程的三大状态

什么是状态

状态其实就是task_struct中的一个整形变量:

当进程处于不同硬件的队列中,status就对应不同的值,进程就处于不同的状态。 

运行状态

当我们的进程准备就绪,需要运行的时候,操作系统就会改变该进程的task_struct中的prev和next指针,让这两个指针和CPU运行队列中的结点进行连接,并将该进程中的状态设置为运行状态;这样,一个进程就处于运行状态了。

阻塞状态

一个进程在CPU上运行的时候,不可能一直处于运行状态,因为,当代计算机都有一个时间片的概念。也就是说,一个进程占据CPU的最大时间为时间片的大小,当时间片结束之后,不管运行是否结束,都应该从CPU上剥离下来,给其他的进程使用CPU资源。

而且,有些进程在运行的过程中需要获取软硬件资源,比如说一个程序中有一条输入语句,当程序运行到该语句的时候,就需要等待用户输入,也就是等待资源就绪。

我们假设输入设备是键盘,当资源没有就绪的时候,操作系统就会把该进程的PCB链入等待的资源提供的队列中,也就是键盘的队列,并且将该进程的状态设置为阻塞状态:

  • 目前我们就知道了:状态的变化,会引起进程的PCB对象被链入不同硬件的队列中。

挂起状态

挂起状态有一个前提:计算机资源已经比较吃紧了。

比如说:一个程序被加载到内存中形成进程之后,该进程可能在等待某种资源而处于阻塞状态,这个时候,该进程不会被CPU运行,但是内存中却要保存该进程的PCB以及该进程的代码和数据;如果计算机中的资源已经比较吃紧了,也就是说计算机中的进程比较多,已经逼近崩溃的边缘了,操作系统为了不让系统崩溃,就会对该进程的代码和数据进行换出(换出到磁盘的swap分区中),以此来缓解计算机内存的压力,等到系统压力缓解之后,或者该进程的资源准备就绪之后,再对该进程的代码和数据进行换入。

当一个进程的代码和数据被换出到磁盘的swap分区中,操作系统会将该进程的 task_struct 中的进程状态修改为挂起状态,此时的进程就处于挂起状态了。

3.Linux系统中的进程状态

Linux2.6内核源代码中关于进程状态的表示:

  • R:运行状态(running)并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
  • S:睡眠状态(sleeping)意味着进程在等待事件完成,也就是软硬件资源就绪(这里的睡眠有时候也叫做可中断睡眠)。
  • D:磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态,在这个状态的进程通常会等待IO的结束。
  • T:停止状态(stopped)可以通过发送 SIGSTOP 信号给进程来停止当前进程,这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。
  • X:死亡状态(dead)这个状态只是一个返回状态,我们查不到这个状态。
  • Z:僵尸状态,当一个进程退出后,但是它的父进程还没有读取它的退出信息的时候,该进程就处于僵尸状态。

4.僵尸状态

什么是僵尸状态?僵尸状态是进程的一种比较特殊的状态,当进程退出之后,该进程的父进程没有读取到进程的退出信息时,该进程就会处于僵尸状态。在Linux系统中,僵尸状态用Z表示。

为什么要有Z状态呢?我们创建一个进程,是希望这个进程完成某项工作,那我们肯定想要知道子进程把工作完成的怎么样,所以,子进程一定会产生一些结果数据保存在PCB当中,让父进程来读取,只有父进程读取之后,我们才能知道子进程把工作完成的怎么样了。也就是说,进程退出之后,要保持Z状态来让父进程读取子进程的退出信息。

僵尸状态的危害?一个进程只有被父进程读取到退出信息之后才会完全退出,如果父进程一直不读取子进程的退出信息,那么子进程就会一直处于僵尸状态。也就是说,进程不会完全退出,既然不会完全退出,操作系统就要一直维护进程的PCB对象;PCB对象是要占据内存空间的,如果父进程有很多个子进程,父进程一直不读取子进程的退出信息,那么就有大量的PCB需要维护,内存中的这些空间被子进程的PCB对象所占据,自己不用,别人也用不了,就会造成内存泄漏问题。

如何避免僵尸状态的危害呢?在子进程运行结束之后,应该立即读取子进程的退出信息。

  • 读取子进程的退出信息可以使用waitpid等系统调用接口。

5.孤儿进程

如果一个进程创建子进程之后,父进程先退出会发生什么呢?如果父进程先退出,该子进程不就没有父进程了吗?那就不会有进程来读取子进程的退出信息了,子进程不就会一直处于僵尸状态吗?

其实不然,当父进程先退出之后,子进程就会变成孤儿进程,孤儿进程会被系统的init进程,也就是pid为1的进程所领养,当子进程退出的时候,init进程就会立即读取子进程的退出信息,防止子进程变成僵尸状态;所以,我们并不需要担心父进程比子进程先退出的问题。

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

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

相关文章

项目复盘:提炼项目成功与失败的经验

项目复盘,顾名思义,就是在项目结束后,对整个项目过程进行全面、系统、深入的回顾与总结。它不仅仅是对项目成果的简单评价,更是对项目执行过程中所有细节、决策、挑战与解决方案的深入剖析。通过复盘,我们可以清晰地看…

Rhel Centos环境开关机自动脚本

Rhel Centos环境开关机自动脚本 1. 业务需求2. 解决方法2.1 rc.local2.2 rc.d2.3 systemd2.4 systemd附着的方法2.5 tuned 3. 测试 1. 业务需求 一台较老的服务器上面业务比较简单,提供一个简单的网站,但已经没有业务的运维人员. 想达到的效果: 由于是非标准的apache或者nginx…

网络安全威胁是什么

1.网络安全威胁的概念 网络安全威胁指网络中对存在缺陷的潜在利用,这些缺陷可能导致信息泄露、系统资源耗尽、非法访问、资源被盗、系统或数据被破坏等。 2.网络安全威胁的类型 物理威胁系统漏洞威胁身份鉴别威胁线缆连接威胁有害程序危险 (1&#x…

网络工程师 (30)以太网技术

一、起源与发展 以太网技术起源于20世纪70年代,最初由Xerox公司的帕洛阿尔托研究中心(PARC)开发。最初的以太网采用同轴电缆作为传输介质,数据传输速率为2.94Mbps(后发展为10Mbps),主要用于解决…

Java 循环结构进阶

二重循环 1.一个循环体内又包含另一个完整的循环结构 2.外城循环变量变化一次,内层循环变量要变化一遍。 二重循环-冒泡排序

SSL域名证书怎么申请?

在数字化时代,网络安全已成为企业和个人不可忽视的重要议题。SSL(Secure Sockets Layer,安全套接层)域名证书,作为保障网站数据传输安全的关键工具,其重要性日益凸显。 一、SSL域名证书:网络安…

玩转观察者模式

文章目录 什么是观察者模式解决方案结构适用场景实现方式观察者模式优缺点优点:缺点:什么是观察者模式 观察者模式通俗点解释就是你在观察别人,别人有什么变化,你就做出什么调整。观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察…

使用mermaid画流程图

本文介绍使用mermaid画流程图,并给出几个示例。 背景 目前,除有明确格式要求的文档外,笔者一般使用markdown写文档、笔记。当文档有图片时,使用Typora等软件可实时渲染,所见即所得。但如果文档接收方没有安装相关工具…

【JVM详解四】执行引擎

一、概述 Java程序运行时,JVM会加载.class字节码文件,但是字节码并不能直接运行在操作系统之上,而JVM中的执行引擎就是负责将字节码转化为对应平台的机器码让CPU运行的组件。 执行引擎是JVM核心的组成部分之一。可以把JVM架构分成三部分&am…

Vim操作笔记

注:本篇文章是追加笔记,用于记录自己的常用操作。 将文本中A字符串替换成B字符串 基本语法: :{范围}s/{目标}/{替换}/{标志} 作用范围 分为前行(:s)、全文(:%s)、选区(:start,ends)等。选区可以在Visual模式下选择区域后输入&#xff1a…

Linux之kernel(1)系统基础理论(2)

Linux之Kernel(1)系统基础理论(2) Author: Once Day Date: 2025年2月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: Linux内核知识_Once-Day的…

git本地建的分支,删除后内容还能找回

前提&#xff1a; 需要有commit 动作 1、git reflog 命令查看所有分支操作记录&#xff1b; 2、git checkout -b 命令创建一个新的分支&#xff0c;将其指向被删除分支的最后一个提交记录‌&#xff1b; git checkout -b <branch-name> <commit-hash>旨在分享~…

【每日一题 | 2025】2.3 ~ 2.9

个人主页&#xff1a;GUIQU. 归属专栏&#xff1a;每日一题 文章目录 1. 【2.3】P8784 [蓝桥杯 2022 省 B] 积木画2. 【2.4】P8656 [蓝桥杯 2017 国 B] 对局匹配3. 【2.5】[ABC365D] AtCoder Janken 34. 【2.6】P8703 [蓝桥杯 2019 国 B] 最优包含5. 【2.7】P8624 [蓝桥杯 2015…

Unity URP后处理在Game窗口不显示

摄像机勾选这个就可以了&#xff1a; 参考&#xff1a;UNITY3D URP与后处理,在game窗口不显示问题_unity urp 半透明材质game看不到-CSDN博客

Java进阶14 TCP日志枚举

Java进阶14 TCP&日志&枚举 一、网络编程TCP Java对基于TCP协议得网络提供了良好的封装&#xff0c;使用Socket对象来代表两端的通信端口&#xff0c;并通过Socket产生IO流来进行网络通信。 1、TCP协议发数据 1.1 构造方法 方法 说明 Socket(InetAddress address…

C#02项目——Checked用法

知识点 本项目用到的知识点包括&#xff1a; checked。主要用来处理溢出错误 Try.Prarse。将数字的字符串表示形式转换为其等效的 32 位有符号整数。 返回值指示转换是否成功 public static bool TryParse (string? s, out int result);Try…Catch。用于捕捉异常&#xff0c…

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

Windows 系统 GDAL库 配置到 Qt 上

在地理信息开发中广泛使用的开源库&#xff0c;GDAL(Geospatial Data Abstraction Library&#xff09;)库提供了读取和处理各种地理空间数据格式的能力。 准备阶段 下载 GDAL 库&#xff1a;前往 GDAL 的官方网站&#xff08;https://www.gisinternals.com/&#xff09;下载…

自己动手实现一个简单的Linux AI Agent

大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址&#xff1a; https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…

豆包MarsCode “一键Apply”功能测评:编程效率革新利器

本文 前言功能亮点1. 告别重复操作2. 精准问题解决3. 助力新项目开发4.代码快速切换5.注释快速生成&#xff0c;一键Apply直接粘贴 使用体验总结 本文正在参加豆包MarsCode上新Apply体验活动 前言 在当今快节奏的编程开发领域&#xff0c;效率无疑是开发者们追求的核心目标之一…