<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 2》(6)

《Linux操作系统原理分析之Linux 进程管理 2》(6)

  • 4 Linux 进程管理
    • 4.2 Linux 进程的状态和标识
      • 4.2.1 Linux 进程的状态及转换
      • 4.2.2 Linux 进程的标识
      • 4.2.3 进程标识哈希表

4 Linux 进程管理

4.2 Linux 进程的状态和标识

4.2.1 Linux 进程的状态及转换

linux 中进程状态分为 5 种,每个进程在系统中所处的状态记录在它的任务结构体的成员项 state 中。进程的状态用符号常量表示,它们定义在/include/linux/sched.h 下:

状态定义
可运行态(运行态、就绪态)#define TASK_RUNNING 0
可中断的等待态#define TASK_INTERRUPTIBLE 1
不可中断的等待态#define TASK_UNINTERRUPTIBLE 2
僵死态#define TASK_ZOMBLE 3
暂停态#define TASK_STOPPED 4

1.运行态(running)——运行
该进程称为当前进程(current process),实际上 linux 并没有该状态,而是将其归结在可运行态。系统中设置全局指针变量 current,指向当前进程。

2.可运行态(Running)——就绪
Linux 中把所有处于运行、就绪状态的进程链接成一个双向链表,称为可运行队列(run_queue)。使用
任务结构体中的两个指针:

Struct task_struct *next_run;/*指向后一个任务结构体的指针*/
Struct task_struct *prev_run;/*指向前一个任务结构体的指针*/
该链表的首结点为 init_task。系统设置全局变量 nr_running 记录处于运行、就绪态的进程数。

在这里插入图片描述
3.等待态(wait)——阻塞
在 linux 中将该状态进一步划分为:可中断的等待态( interruptible)和不可中断的等待状态(uninterruptible)。
👉可中断的等待态的进程可以由信号(signal)来解除其等待态,收到信号后进程进入可运行态。
👉不可中断的等待状态的进程,一般都是直接或间接在等待硬件条件,只能用特定的方式来解除其等待状态,如是用 wakeup()。

处于等待态的进程根据其等待的事件排在不同的等待队列中。Linux 中等待队列是由一个 wait_queue结构体组成的单向循环链表。该结构体定义在 include/linux/wait.h 中,如下所示:

Struct wait_queue {
Struct task_struct *task;/*指向一个等待态的进程的任务结构体*/
Struct wait_queue *next;/*指向下一个 wait_queue 结构体*/
}

注:
👉与可运行队列不同,等待队列不是直接由进程的任务结构体组成队列,而是由于任务结构体对应的wait_queue 构成。
👉每个等待队列都有一个指向该队列的队首指针,它一般是个全局指针变量。
在这里插入图片描述
4.暂停态(stopped)
暂停态:进程由于需要接受某种特殊处理而暂时停止运行所处的状态。通常,进程在接受到外部进程的某个信号(SIGSTOP、SIGSTP、SIGTTOU)而进入暂停态。通常正在接受调试的进程就处于暂停态。

5.僵死态(zombie)
僵死态:进程的运行已经结束,但是由于某种原因它的进程结构体仍在系统中。

在这里插入图片描述

4.2.2 Linux 进程的标识

Linux 中,进程的标识是系统识别进程的依据,也是进程访问设备和文件时的凭证。Linux 为每个进程设置多种标识,不同的标识的用途不同。Task_struct 中记录着进程的各种标识:

Int pid进程标识号
Unsigned short uid ,gid用户标识号,组标识号
Unsigned short euid ,egid用户有效标识号,组有效标识号
Unsigned short suid ,sgid用户备份标识号,组备份标识号
Unsigned short fsuid ,fsgid用户文件标识号,组文件标识号
1Pid 32 位,但是为了与 UNIX 兼容(16 位),故 linux 也使用 16 位,最大值 32767Pid 按照进程创建的先后顺序依次赋予进程,即前面进程 PID 值加 1。当达到最大值时,重复使用已经撤销进程的 PID2. 设置 Uid,gid 目的:文件保护。Linux 把文件的所有用户分为 3 类:所有者、同组用户、其他用户。
3. 一般情况下 euid=uid;egid= gid;fsuid= uid;fsgid= gid;
4Euid 和 egid:在进程企图访问特权数据或代码时,系统内核需要检查进程的有效标识 Euid 和 egid。需要其他进程服务时,这两个指将变为服务进程 uid 和 gid。
5. fsuid ,fsgid:在进程企图访问文件时,系统内核需要检查进程的文件标识 fsuid ,fsgid。需要其他进程服务时,这两个指将变为服务进程 uid 和 gid。
6. 没有将 euid 和 fsuid,egid 和 fsgid 统一,原因:防止具有访问特权后,用户对系统造成破坏。
7Suid 和 sgid 是 POSIX 标准要求的标识。当用户执行系统调用而使其用户标识 uid 或组标识 guid 改变时,suid 和 sgid 保存原来的值,以便恢复。

4.2.3 进程标识哈希表

Linux 的进程标识哈希表提供了按照哈希算法从进程 PID 快速查找对应任务结构体的方法,实现哈希算法的哈希函数定义为带参数的宏 pid_hashfn(x),如下所示:

#define pid_hashfn(x) ((((x)>>8)^(x))&(PIDHASH_SZ-1))???
其中:参数 x 就是进程的标识 PID,计算结果的哈希值用于检索对应的任务结构体。例如 PID228的哈希值是 100PID27536 的哈希值是 123PID27535 的哈希值是 100

为了解决哈希值冲突的问题,Linux 把具有相同哈希值的 PID 对应的进程组成一个个双向循环链表。在 task_struct 中的两个成员项:

Struct task_struct * pidhash_next;/*指向后一个任务结构体的指针*/
Struct task_struct * pidhash _prev;/*指向前一个任务结构体的指针*/

1.进程标识哈希表
Linux 使用一个称为 pidhash[]的指针数组管理这些链表,称为进程标识哈希表。该表中记录各个链表首结点地址,数组元素的下标与链表的哈希值相同。

在 include/linux/sched.h 中 pidhash[]数组定义如下:
Struct task_struct * pidhash[PIDHASH_SZ];

pidhash 数组由 PIDHASH_SZ 个元素组成,每个元素是指向一个进程任务结构体的指针。
数组元素个数 PIDHASH_SZ 是系统中最多可容纳的进程数 NR_TASKS 除以 4,定义如下:

#define PIDHASH_SZNR_TASKS>>2)???

2.进程标识哈希表操作函数:

标识说明
Hash_pid()进程创建时,将其任务结构体插入哈希链表
Unhash_pid()进程撤销时,将其任务结构体从哈希链表中删除。
Find_task_by_pid()根据 PID 相应进程的任务结构体。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提高Producer的发送速度

发送一条消息出去要经过三步,一是客户端发送请求到服务器,二是服务器处理该请求,三是服务器向客户端返回应答,一次消息的发送耗时是上述三个步骤的总和。在一些对速度要求高,但是可靠性要求不高的场景下,比…

2023年中国机动车拍卖网络化趋势加速,网络拍卖专场数量大幅上升至47489场[图]

2022年,由于机动车拍卖网络化趋势继续加速,网络拍卖专场数量大幅上升,全国机动车专场拍卖会高达59450场,较上年攀升125.31%。在389家拍卖企业中,举办场次超过100场的企业有27家,合计54850场,占比…

11.4MyBatis(基础)

一.搭环境 1.创建完SSM项目,添加MySQL和MyBatis后,项目启动一定会报错,这是正常情况. 2.配置文件 properties: server.port9090 spring.datasource.urljdbc:mysql://127.0.0.1:3306/test1?characterEncodingutf8&useSSLfalse spring.datasource.usernameroot spring.d…

快速入门:构建您的第一个 .NET Aspire 应用程序

##前言 云原生应用程序通常需要连接到各种服务,例如数据库、存储和缓存解决方案、消息传递提供商或其他 Web 服务。.NET Aspire 旨在简化这些类型服务之间的连接和配置。在本快速入门中,您将了解如何创建 .NET Aspire Starter 应用程序模板解决方案。 …

贪吃蛇、俄罗斯方块

贪吃蛇 一、创建新项目 创建一个新的项目,并命名。 创建一个名为images的文件夹用来存放游戏相关图片。 然后再在项目的src文件下创建一个com.xxx.view的包用来存放所有的图形界面类, 创建一个com.xxx.controller的包用来存放启动的入口类(控制类) 二…

通信原理板块——脉冲编码调制(PCM)

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、脉冲编码调制PCM原理 将模拟信号…

C++第一讲:起源和规范

面向过程和面向对象 大千世界中,事务的发展规律都是面向过程的状态。例如一颗种子从生根到发芽,从发芽到开花,从开花到结果。 但是面向过程是一个更贴近**“机械”**的表达方式,而更贴近人类思想的却是面向对象的表达方式。 以…

2023年中国冲击波治疗仪市场发展趋势分析:未来市场增长空间更大[图]

冲击波在临床医学领域最早应用于体外冲击波碎石,在二十世纪八十年代末期,体外冲击波碎石技术开始被运用到骨科及康复理疗领域,经过十余年的临床研究,冲击波疗法日益完善,应用范围也日益扩大。冲击波作为一种介于保守疗…

【MATLAB】史上最全的9种数据拟合算法全家桶

有意向获取代码,请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有9种数据拟合算法,绝对不亏,知识付费是现今时代的趋势,而且都是我精心制作的教程,有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

什么是等保测评?

随着近几年随着网络技术的发展,互联网应用的普及和丰富,互联网安全问题也日益严重,利用信息技术进行的高科技犯罪事件呈现增长态势。从2004年度CNCERT的信息网络安全工作报告中我们看到,信息网络安全事故在逐年上升,20…

leetcode:移除链表元素

1.题目描述 题目链接:203. 移除链表元素 - 力扣(LeetCode) 2.解题思路 我们定义一个cur指向当前结点,定义prev指向前一个结点,next指向下一个结点 如果cur->valval,那我们就删除这个结点 怎么删除呢…

PHP写一个电商 Api接口需要注意哪些?考虑哪些?

随着互联网的飞速发展,前后端分离的开发模式越来越流行。编写一个稳定、可靠和易于使用的 API 接口是现代互联网应用程序的关键。本文将介绍在使用 thinkphp6 框架开发 电商API 接口时需要注意的要点和考虑的问题,并提供详细的逻辑步骤和代码案例。 1. …

Spring Cloud Hystrix:服务容错保护

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring Cloud Hystrix:服务容错保护 Spring Cloud Hystrix是Spring Cloud中的一个子项目,主要用于服务容错保护;分布式系统中&…

系列一、JVM概述

一、概述 1.1、Java发展中的重大事件 1.2、虚拟机 vs Java虚拟机 1.2.1、虚拟机 1.2.2、Java虚拟机 1.2.3、Java虚拟机的作用 Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令指令。每一条Java指令&#…

矩阵乘法的性质

矩阵乘法满足结合律和分配律,不满足交换律。 - 结合律 (AB)CA(BC) 其中为常数 - 分配律 A(BC)ABAC (AB)CACBC

MPN – 制造零件号

S/4 1610 中的 MPN – 基于 NAST 的输出管理 我试图查找有关 MPN 设置的信息,但找不到详细的配置步骤。在浏览了一些信息和 help.sap 链接后,我能够在 S/4 1610 系统中配置 MPN 设置,这与使用旧输出类型(Nast 和输出类型 NEU&…

力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码

题目 695. 岛屿的最大面积 中等 相关标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你…

9.jvm调优相关工具-java自带

目录 概述jdk工具包jpsjps -qjps -mjps -vjps -l jstatjstat -gcjstat -gcutiljinfo jmapjmap heapjmap histo[:live]jmap clstatsjmap dump jhatjstack 结束 概述 做了一些 1.8 与1.17.x jdk对比,最重要的是实际操作一次。 这些是java自带的命令,属于离…

wpf devexpress在未束缚模式中生成Tree

TreeListControl 可以在未束缚模式中没有数据源时操作,这个教程示范如何在没有数据源时创建tree 在XAML生成tree 创建ProjectObject类实现数据对象显示在TreeListControl: public class ProjectObject {public string Name { get; set; }public string Executor {…

【C++学习手札】模拟实现string

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:缶ビール—みゆな 0:41━━━━━━️💟──────── 2:52 🔄 ◀️ ⏸ ▶️ ☰ &…