【Linux系统】进程状态

news2024/11/26 18:24:10

1.直接谈论Linux的进程状态

Linux进程状态本质上是task_struct这个结构体内的一个变量用来存储进程状态。

task_struct

{

    //内部的一个属性

    int status;

}

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

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

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

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

t(tracing stop)

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

R:进程运行的状态

S:休眠状态

进程在等待“资源”就绪

这个状态下是可以用kill命令杀掉

所以又可以被称为可中断睡眠

T/t:让进程暂停,等待被进一步唤醒

kill -l:列出所有可用的信号名称

kill -9 pid:杀掉一个进程

kill -19 pid:暂停一个进程

kill -18 pid:解除进程的暂停

t是我们在调试程序时会出现的一种暂停状态,当我们的程序在断点处停下,此时即是t状态。

D:磁盘休眠状态(深度睡眠或不可中断睡眠)不可被kill杀掉

Linux系统比较特有的一种进程状态!

假设有个进程要将1GB的数据交给磁盘来存储,磁盘收到进程的请求找到一块空间进行存储,这时进程就要等待磁盘输出结束,进程进入S态,当内存严重不足时,Linux操作系统有权利杀掉进程来释放空间,当Linux操作系统刚好把我们正在等待磁盘资源响应的进程杀掉时,就会出现问题,磁盘如果申请空间失败会回来告诉进程,但此时进程已经被杀掉,那怎么办?这就会发生这1GB数据丢失的问题!!!

所以就有了D状态的出现,D状态下的进程是不可被杀的,就不会出现这个问题了!

2.僵尸进程和孤儿进程

僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)

没有读取到子进程退出的返回代码时就会产生僵死(尸)进程,僵死进程会以终止状态保持在进程表中

并且会一直在等待父进程读取退出状态代码。

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 
  5 int main()
  6 {
  7   pid_t id = fork();
  8   if(id == 0)
  9   {
 10     //child
 11     int cnt = 5;
 12     while(cnt--)
 13     {
 14       printf("I am a child process, pid:%d, ppid:%d\n", getpid(), getppid());
 15     }
 16   }
 17   else
 18   {
 19     //parent 
 20     int cnt = 5;
 21     while(cnt)
 22     {
 23       printf("I am a parent process, pid:%d, ppid:%d\n", getpid(), getppid());
 24     }
 25   }                                                                                     
 26   return 0;
 27 }

 

 

已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct中会记录自己的退出信息,未来让父进程进行读取,但该这个子进程已经结束,父进程没有读取到子进程状态。

如果没有父进程读取,这个僵尸进程将会一直存在

因为进程 = task_struct内核数据结构 + 进程的代码和数据,子进程结束即代码和数据读取的结束,但task_struct仍然存在,如果父进程不去回收就会造成内存泄漏问题!!!

僵尸进程会等待着OS释放,这个状态就是X状态,无法查看的状态。

总结:

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

直接在命令行中启动的进程,他的父进程是bash,bash会自动回收新进程的Z

孤儿进程

孤儿进程:父进程如果先退出,子进程就会变成孤儿进程。

孤儿进程一般都是会被1号进程(OS本身)领养

孤儿进程为什么要被OS领养?依旧要保证子进程正常被回收!!!

3.进程的阻塞和挂起,运行(纯理论)

操作系统学科里的阻塞挂起等状态

 

 运行(并发和并行)

 进程在运行队列中, 该进程的状态就是R状态

 我已经准备好了,可以随时被调度!

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

这些进程是基于时间片进行轮转调度的!!!

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

如果我们有多个CPU,每个CPU独立的在调度各自的进程,这时就有了并行的概念。

并行:任何时刻都有多个进程在真的同时运行,我们叫做并行

阻塞态

 我们平常写c语言代码都可能会用到scanf,我们知道scanf函数需要我们输入一些信息,该进程才能继续运行下去!!!

其实这个状态就可以叫做阻塞态

等待,等待键盘资源是否就绪,键盘上面有没有被用户按下的按键,按键数据交给进程。

我们知道操作系统是就是软硬件资源的管理者!!!

操作系统如何对硬件进行管理?先描述,在组织

入队列的不是进程的代码和数据,而是进程的task_struct

不是只有CPU才有自己的运行队列,各种其他的设备,键盘,显示器等也是有着自己的wait_queue等待队列,当键盘没有按下对应的数据时,这时的进程其实是在键盘的等待队列中的,等待键盘输入再链接入CPU的运行队列中去!!!

像这种进程没有处在CPU的运行队列中的状态一般即是阻塞态。

我们常说的S态和D态就是阻塞。

挂起态

 挂起态是一种用空间换取时间的方法。

当OS 内存特别吃紧的时候,为了更合理的使用内存空间。

OS会把那些处于阻塞态的或其他的一些进程换入到swap分区存储该进程对应的代码和数据,需要使用时我们再唤出,这种就叫做阻塞挂起!!!用户层是感受不到这种操作的!

但是如果swap分区过于大的话会发生频繁的唤入唤出,这会导致效率问题,所以swap分区设置一般不易过大。

4.进程切换的话题

 

 我们知道进程都是在并发运行着,一个进程时间片结束又会运行下一个进程,那我们的数据是如何稳定的保存呢?这样频繁的进程切换会不会导致数据的丢失?不会

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

CPU的寄存器:

寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!!

CPU内部的数据,可以有多套,有几个进程,就有几套与该进程所对应的上下文数据

寄存器 != 寄存器的内容

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

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

相关文章

月子会所ERP管理云平台 StarryQuoteEdit.aspx SQL注入漏洞复现

0x01 产品简介 月子会所ERP管理云平台是武汉金同方科技有限公司专为为母婴服务行业提供信息化解决方案,是结合行业顶级月子中心相关企业需求开发的一套综合性管理软件。该系统全面管控月子中心经营过程中的各个环节,提高总店及分店月子中心管理水平,规范月子中心从业人员操作…

达梦的归档日志参数ARCH_RESERVE_TIME测试

达梦的参数ARCH_RESERVE_TIME测试 前面有提到和oracle相比&#xff0c;达梦的归档日志相关参数有个比较特别&#xff0c;可以通过设置它去规定归档日志的保留时间。 ARCH_RESERVE_TIME&#xff1a;归档日志保留时间&#xff0c;单位分钟&#xff0c;取值范围 0~2147483647。只…

SQL 注入之 Windows/Docker 环境 SQLi-labs 靶场搭建!

在安全测试领域&#xff0c;SQL注入是一种常见的攻击方式&#xff0c;通过应用程序的输入执行恶意SQL查询&#xff0c;从而绕过认证和授权&#xff0c;可以窃取、篡改或破坏数据库中的数据。作为安全测试学习者&#xff0c;如果你要练习SQL注入&#xff0c;在未授权情况下直接去…

GmSSL-3.1.1编译

1.源码下载&#xff1a; 下载地址&#xff1a;https://github.com/guanzhi/GmSSL/releases选择对应版本下载。 ​ 2.选择要下载的源码包&#xff1a; ​ 2.编译&#xff1a; 2.1 windows编译&#xff1a;打开vs命令行&#xff0c;选择想要编译的版本&#xff0c;x86或x64…

leetcode73 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 输入&#xff1a;matrix [[0,1,2,0],[3,4…

电脑远程控制esp32上的LED

1、思路整理 首先esp32需要连接上wifi 然后创建udp socket 接受udp数据 最后解析数据&#xff0c;控制LED 2、micropython代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.…

linux fixmap分析

本文基于Linux-4.19.125&#xff0c; ARM V7&#xff0c;dual core, MMU采用2级页表&#xff08;未开启LPAE&#xff09;。 1 为什么需要fixmap Linux内核启动过程中&#xff0c;经过汇编阶段后&#xff0c;mmu功能已经开启&#xff0c;后续只能通过虚拟地址来访问DDR&#x…

如何通过VPN访问内网?

VPN&#xff08;Virtual Private Network&#xff09;是一种通过公共网络建立私有网络连接的技术&#xff0c;可以在不同地点的网络中建立安全通道&#xff0c;实现远程访问内网资源的目的。本文将介绍如何通过VPN访问内网&#xff0c;并介绍一款名为“天联”的VPN服务。 什么是…

solidity(3)

地址类型 pragma solidity ^0.8.0;contract AddressExample {// 地址address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;address payable public _address1 payable(_address); // payable address&#xff0c;可以转账、查余额// 地址类型的成员uint256…

Web前端开发——Vue概述

前言&#xff1a; 整理下学习笔记&#xff0c;打好基础&#xff0c;daydayup!!! Vue Vue是一套前端框架&#xff0c;基于MVVM(Model-View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的专注点放在数据上&#xff0c;可以免除原生JavaScript中的DOM操作&am…

赋能Web3用户:增强在线隐私

随着数字化时代的发展&#xff0c;人们越来越依赖互联网来进行各种活动&#xff0c;从社交互动到金融交易&#xff0c;几乎所有的日常生活都离不开网络。然而&#xff0c;随之而来的是个人隐私安全面临的挑战。在传统的互联网架构下&#xff0c;用户的个人数据往往被中心化的平…

C语言—每日选择题—Day65

前言 我们的刷题专栏又又又开始了&#xff0c;本专栏总结了作者做题过程中的好题和易错题。每道题都会有相应解析和配图&#xff0c;一方面可以使作者加深理解&#xff0c;一方面可以给大家提供思路&#xff0c;希望大家多多支持哦&#xff5e; 第一题 1、如下代码输出的是什么…

【大数据存储】实验五:Mapreduce

实验Mapreduce实例——排序&#xff08;补充程序&#xff09; 实验环境 Linux Ubuntu 16.04 jdk-8u191-linux-x64 hadoop-3.0.0 hadoop-eclipse-plugin-2.7.3.jar eclipse-java-juno-SR2-linux-gtk-x86_64 实验内容 在电商网站上&#xff0c;当我们进入某电商页面里浏览…

小户型装修攻略:8个省空间的布局技巧分享!福州中宅装饰,福州装修

以下是8种小户型空间布局方案分享&#xff1a; 1. 功能分区 将房间划分为不同的功能区域&#xff0c;如休息区、工作区、存储区等。可以使用家具、地毯或窗帘等来划分区域&#xff0c;这样可以让空间看起来更加有组织和有序。 2. 卧室和客厅一体化 对于小户型来说&#xff0…

ubuntu系统安装k8s1.28精简步骤

目录 一、规划二、环境准备2.1 配置apt仓库配置系统基本软件仓库配置k8s软件仓库安装常用软件包 2.2 修改静态ip、ntp时间同步、主机名、hosts文件、主机免密2.3 内核配置2.4 关闭防火墙、selinux、swap2.5 安装软件安装docker安装containerd安装k8s软件包 三、安装配置k8s3.1 …

浏览器工作原理与实践--虚拟DOM:虚拟DOM和实际的DOM有何不同

虚拟DOM是最近非常火的技术&#xff0c;两大著名前端框架React和Vue都使用了虚拟DOM&#xff0c;所以我觉得非常有必要结合浏览器的工作机制对虚拟DOM进行一次分析。当然了&#xff0c;React和Vue框架本身所蕴含的知识点非常多&#xff0c;而且也不是我们专栏的重点&#xff0c…

QT:信号与槽

作业&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

SpringCloud的使用以及五大核心组件

一、SpringCloud介绍 微服务架构的提出者&#xff1a;马丁福勒 https://martinfowler.com/articles/microservices.html // 微服务架构的提出者&#xff1a;马丁福勒&#xff08;中午网&#xff09; http://blog.cuicc.com/blog/2015/07/22/microservices/ 马丁.福勒对微服务…

手写简易操作系统(二十八)--实现简单shell

前情提要 Shell是计算机操作系统中的一个重要概念&#xff0c;它是用户与操作系统内核之间的接口。Shell接受用户的命令&#xff0c;并将其转换为操作系统能够理解的指令&#xff0c;然后执行这些指令&#xff0c;并将执行结果返回给用户。 Shell可以理解为一个命令解释器&am…

全面的网络流量监控

流量监控指的是对数据流进行的监控&#xff0c;通常包括出数据、入数据的速度、总流量。通过网络流量监控&#xff0c;组织可以确保只有业务关键型流量通过网络传输&#xff0c;并限制不需要的网络流量&#xff0c;从而提高网络效率&#xff0c;又可以防止停机、减少 MTTR、帮助…