Linux 进程概念(下)

目录

前言

4.进程状态

一.普遍的操作系统层面上宏观概念:

二.具体的Linux操作系统的状态:

5.进程优先级(了解)

6.其他概念

进程切换


前言

  本篇是接着上一篇的内容继续往下了解进程相关的一些概念!

4.进程状态

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

[^]  进程这么多状态本质都是用来满足不同的运行场景的 

一.普遍的操作系统层面上宏观概念:

image-20250421141807429

1.一个cpu对应一个运行队列

2.让进程入队列本质就是将该进程的task_struct结构体对象放入运行队列中

3.状态是进程内部的属性,存于描述进程的task_struct中(在该进程对应的PCB中存放),这个状态可以理解成整数表示(比如:1表示运行状态,2表示停止状态......),这个整数是几就意味着这个进程的状态是几

4.运行状态:进程PCB在运行队列中就是运行状态,不是说这个进程正在运行才是运行状态

5.阻塞状态:进程并不是只会等待(占用)cpu资源,也可能随时随地需要外设资源,所以我们的所有外都设有一个wait队列,当这个进程需要外设资源但这个外设正在工作时,cpu就把这个进程对应的task_struct对象放到这个外设的队列中同时把这个进程的状态修改为阻塞状态(都是对task_struct对象进行放到不同的队列中)

当这个外设空闲下来了,就通知操作系统将这个进程PCB从阻塞队列拉出来改为运行状态,然后放入cpu运行队列中

6.所谓的进程不同的状态,本质是进程在不同的队列当中等待某种资源(比如:进程等待外设时称其为阻塞状态)

7.挂起状态:

阻塞不一定挂起,挂起一定阻塞

image-20250422092222189

总结:上面解释了什么叫做运行,什么叫做阻塞,什么叫做挂起

二.具体的Linux操作系统的状态:

通过查看进程指令:ps ajx | grep 进程名来查看状态

image-20250422101537410

1.S表示浅度睡眠,可以被终止,是阻塞状态的一种,一般如果进程要使用外设的情况下基本状态都会是S

比如:如果代码中有printf要访问显示器,这个进程在默认情况下大概率是S

image-20250422101833330

D表示深度睡眠(面试不重要,但对于我们理解Linux比较重要)

在该状态下的进程,无法被操作系统杀掉终止,只能通过断电或者进程自己醒来才能结束该状态

(在高IO的情况下才有可能看到D状态的进程)

2.R表示运行状态

image-20250422102056700

当在运行状态时,使用命令:kill -19 进程id,进程会进入暂停状态

3.T表示暂停,暂停也算是阻塞状态的一种

image-20250422102507205

使用指令:kill -18 进程id,进程会从暂停回到运行状态

image-20250422102909682

[^]  (注意R后面的+号不见了) 

关于后面的+号:

在后面有+号时,当我们在shell命令下使用其他命令进程还是在跑并且无法对指令做出回应(shell命令行无法获取命令行解析了),只有按ctrl+c才能终止,我们把这种进程叫做前台进程

在后面没有+号后,我们在shell命令下使用指令会有回应(可以获取命令行解析),但是此时在命令行按ctrl+c也无法结束进程,进程始终在跑,我们把这种进程叫做后台进程

4.在Linux下,因为用户不需要知道进程是否在挂起状态,因为这是操作系统内部做管理自己把它交换到磁盘上,和用户其实没关系也对用户而言没啥意义,所以Linux下看不到挂起的状态

5.t状态:表示的是当前进程正在被追踪时的暂停,也是一种阻塞状态

比如在gdb调试进程时打上断点运行后,该进程就处于t状态

image-20250422120503794

image-20250422120359563

6.Z状态:进程退出时,不能立即释放该进程对应的资源,需要保存一段时间,让父进程或者操作系统来进行读取,进程退出了,但是没有被回收,此时我们把这个进程叫做僵尸进程,Z状态(僵尸状态) !僵尸状态是一种需要解决的问题,不回收僵尸进程会造成内存泄漏,我们之后才能解决

我们这里通过创建子进程,让父进程不要退出并且什么都不做,让子进程正常退出,来让此时这个子进程变成僵尸状态

image-20250422165552395

image-20250422165420363

此时我们把子进程终止了,但父进程还在,子进程此时就是僵尸状态

子进程的名字也改为[myprocess] <defunct> (adj.失效的,不再存在的,n.死者,死人)

image-20250422165702522

Linux下各状态变化图:

除此之外还有一种特殊的进程:

孤儿进程:父进程先退出,此时该子进程被操作系统领养(1号进程)

1.这种现象一定存在

2.如果操作系统不领养,那么子进程退出的时候,对应的僵尸进程便无人可以进行回收了

3.如果是由前台进程创建的子进程,如果孤儿了,就会自动变成后台进程

5.进程优先级(了解)

1.什么叫做优先级?

权限和优先级的区别:

权限是能做还是不能做的问题

优先级则是能做,但是先做还是后做的问题

2.为什么会存在优先级?

答:因为资源太少了

3.Linux优先级特点(很快)

a.优先级本质就是pcb里面的一个整数数字(也可能是几个)

b.最终优先级=老的优先级(linux下为80) + nice(Linux支持进程运行中进行优先级的调整,通过更改nice值完成调整)

image-20250423095704642

[^]  nice值默认为0,PRI为优先级,越小优先级越高 

使用top命令更改nice

进入top后按r,输入进程id,再输入更改的nice值 nice范围[-20,19]

那么优先级的范围: [60,99]

image-20250423101620281

image-20250423101751597

6.其他概念

进程切换

cpu工作:1.取指令 2.分析指令 3.执行指令

1.当我们程序在运行的时候,一定会产生非常多的临时数据,这些数据属于当前进程,cpu内部虽然只有一套寄存器硬件,但是寄存器里面保存的数据是属于当前进程的(在任何时刻,cpu里面的寄存器里面的数据看起来是在寄存器上,但实际上是只属于当前运行的进程的,寄存器被所有进程共享,寄存器内的数据是每个进程各自私有的——上下文数据)

寄存器硬件 != 寄存器内的数据

2.进程在运行的时候占有cpu,但进程不是一直占有cpu直到该进程结束,因为进程在运行的时候都有自己的时间片

3.时间片结束后该进程不占有cpu时,需要先保留该进程在cpu内的在寄存器中存储的数据(注意不是寄存器),这个操作为上下文保护;下一个进程的时间片开始,下个进程开始占有cpu时,要先恢复在寄存器中存储的数据,该操作为上下文恢复;完成以上操作就记为一次进程切换

进程在切换的时要进行进程的上下文保护

进程在恢复运行时要进行上下文的恢复

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

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

相关文章

使用java实现word转pdf,html以及rtf转word,pdf,html

word,rtf的转换有以下方案&#xff0c;想要免费最靠谱的是LibreOffice方案, LibreOffice 是一款 免费、开源、跨平台 的办公软件套件&#xff0c;旨在为用户提供高效、全面的办公工具&#xff0c;适用于个人、企业和教育机构。它支持多种操作系统&#xff08;Windows、macOS、…

IP证书的作用与申请全解析:从安全验证到部署实践

在网络安全领域&#xff0c;IP证书&#xff08;IP SSL证书&#xff09;作为传统域名SSL证书的补充方案&#xff0c;专为公网IP地址提供HTTPS加密与身份验证服务。本文将从技术原理、应用场景、申请流程及部署要点四个维度&#xff0c;系统解析IP证书的核心价值与操作指南。 一…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

超简单Translation翻译模型部署

Helsinki-NLP/opus-mt-{en}-{zh}系列翻译模型可以实现200多种语言翻译&#xff0c;Helsinki-NLP/opus-mt-en-zh是其中英互译模型。由于项目需要&#xff0c;在本地进行搭建&#xff0c;并记录下搭建过程&#xff0c;方便后人。 1. 基本硬件环境 CPU&#xff1a;N年前的 Intel…

Go语言JSON 序列化与反序列化 -《Go语言实战指南》

JSON&#xff08;JavaScript Object Notation&#xff09;是一种常见的数据交换格式。Go 标准库提供了 encoding/json 包&#xff0c;用于方便地将结构体与 JSON 之间互转。 一、序列化&#xff08;Marshal&#xff09; 将 Go 中的数据结构&#xff08;如结构体、map、slice 等…

免费PDF工具-PDF24V9.16.0【win7专用版】

【百度】https://pan.baidu.com/s/1H7kvHudG5JTfxHg-eu2grA?pwd8euh 提取码: 8euh 【夸克】https://pan.quark.cn/s/92080b2e1f4c 【123】https://www.123912.com/s/0yvtTd-XAHjv https://creator.pdf24.org/listVersions.php

网络 :序列和反序列化

网络 &#xff1a;序列和反序列化 &#xff08;一&#xff09;序列和反序列 概念&#xff08;二&#xff09;实例1. 封装socket 接口2. 制定协议&#xff08;用于实现序列和反序列化&#xff09;3. 计算(实现计算器功能)4. 服务器(将上面所有的类功能调用起来)5. 服务端6.客户端…

LiveQing 视频点播流媒体 RTMP 推流服务功能:搭建 RTMP 视频流媒体服务详细指南

LiveQing视频点播流媒体RTMP推流服务功能&#xff1a;搭建RTMP视频流媒体服务详细指南 一、流媒体服务搭建二、推流工具准备三、创建鉴权直播间四、获取推流地址五、配置OBS推流六、推流及播放七、获取播放地址7.1 页面查看视频源地址7.2 接口查询 八、相关问题解决8.1 大疆无人…

UE5 Niagara 如何让四元数进行旋转

Axis Angle中&#xff0c;X,Y,Z分别为旋转的轴向&#xff0c;W为旋转的角度&#xff0c;在这里旋转角度不需要除以2&#xff0c;因为里面已经除了&#xff0c;再将计算好的四元数与要进行旋转的四元数进行相乘&#xff0c;结果就是按照原来的角度绕着某一轴向旋转了某一角度

【微服务】SpringBoot 对接飞书审批流程使用详解

目录 一、前言 二、前置准备 2.1 开通企业飞书账户 2.2 确保账户具备多维表操作权限 2.3 获取飞书开放平台文档 2.4 创建应用 2.5 发布应用 2.6 应用添加操作权限 2.7 获取SDK 三、审批流程对接过程 3.1 配置流程审批定义(流程审批模型) 3.2 自定义应用添加审批AP…

主键与唯一键详解:概念、区别与面试要点

主键与唯一键详解:概念、区别与面试要点 一、核心概念解析 1.1 主键(Primary Key) 主键是数据库表中用于唯一标识每一行记录的列或列组合,具有以下核心特性: 唯一性:主键值在整个表中必须唯一,不允许重复非空性:主键列不允许包含NULL值不可变性:主键值一旦确立,原则…

前端面试准备-1

1.NodeJS的优缺点 优点&#xff1a;   高并发&#xff08;最重要的优点&#xff09;   适合I/O密集型应用 缺点&#xff1a;   不适合CPU密集型应用&#xff1b;CPU密集型应用给Node带来的挑战主要是&#xff1a;由于JavaScript单线程的原因&#xff0c;如果有长时间运行的…

GO并发过高导致程序崩溃如何解决

#作者&#xff1a;曹付江 文章目录 1.并发过高导致程序崩溃2. 如何解决2.1 利用 channel 的缓存区2.2 利用第三方库 3 调整系统资源的上限3.1 ulimit3.2 虚拟内存(virtual memory) 1.并发过高导致程序崩溃 看一个非常简单的例子&#xff1a; func main() {var wg sync.WaitG…

Linux -- gdb/cgdb的认识和使用

预备知识 程序的发布⽅式有两种&#xff0c; debug 模式和 release 模式&#xff0c; Linux gcc/g 出来的⼆进制程 序&#xff0c;默认是 release 模式。 要使⽤gdb调试&#xff0c;必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项&#xff0c;如果没有添加&#x…

window 显示驱动开发-Direct3D 呈现性能改进(四)

调用资源创建、映射和取消映射函数的行为更改 对于 WDDM 1.3 及更高版本驱动程序实现的这些函数&#xff0c;Direct3D 运行时为映射默认方案提供一组受限的输入值。 这些受限值仅适用于支持功能级别 11.1 及更高版本的驱动程序。 CreateResource (D3D11) 函数— 这些输入 D3…

3.python操作mysql数据库

前言&#xff1a;在现代应用程序中&#xff0c;数据库扮演者至关重要的角色。mysql是一个流行的关系型数据库管理系统&#xff0c;广泛应用于各种规模的应用中。在pytho中&#xff0c;我们可以通过连接库与mysql数据库进行交互&#xff0c;实现数据的增删改查操作。与此同时&am…

day023-网络基础与OSI七层模型

文章目录 1. 网络基础知识点1.1 网络中的单位1.2 查看实时网速&#xff1a;iftop1.3 交换机、路由器 2. 路由表2.1 查看路由表的命令2.2 路由追踪命令 3. 通用网站网络架构4. 局域网上网原理-NAT5. 虚拟机上网原理6. 虚拟机的网络模式6.1 NAT模式6.2 桥接模式6.3 仅主机模式 7.…

DeepSeek智能对话助手项目

目录&#xff1a; 1、效果图2、实现代码3、温度和TopK的作用对比 1、效果图 2、实现代码 # import gradio as gr# def reverse_text(text): # return text[::-1]# demogr.Interface(fnreverse_text,inputs"text",outputs"text")# demo.launch(share&q…

视觉中国:镜头下的中国发展图景

2025年5月下旬&#xff0c;从北国草原到江南水乡&#xff0c;从文化遗产到科技创新&#xff0c;中国大地上演着一幕幕生机勃勃的图景。河北张家口的沙狐幼崽与湿地生态和谐共生&#xff0c;湖北襄阳的茶园雕琢出诗意田园&#xff1b;北京殷商文创的活力、沈阳文物情景剧的创意&…

LabVIEW 中内存释放相关问题

在LabVIEW 编程领域&#xff0c;内存管理是一个关键且复杂的议题。我们常常关注 LabVIEW 如何将内存释放回操作系统&#xff08;OS&#xff09;&#xff0c;以及是否有方法确保在特定数据结构&#xff08;如队列、变体属性、动态数据引用 DVR 等&#xff09;销毁、删除或清空后…