<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 相应进程的任务结构体。

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

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

相关文章

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

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

员工电脑管理软件,企业电脑管理软件是什么

员工电脑管理软件,企业电脑管理软件是什么 企业电脑管理软件是指用于管理和监控企业员工工作电脑的软件。这些软件通常提供多种功能,旨在帮助企业管理员工电脑的使用、监控和维护,同时确保信息安全、提高生产力并确保合规性。推荐一款功能强…

有Mac或无Mac电脑通用的获取安卓公钥的方案

从2023年9月开始,所有上架应用市场的app都需要进行APP备案。 其中后端服务器在阿里云的可以在阿里云备案,后端服务器在腾讯云的可以在腾讯云备案。但无论你是在什么云厂商里做备案,无一例外的是,无论是上架安卓应用还是上架IOS应…

动态规划c++

1. 什么是动态规划动态规划 (英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规…

[Vue 代码模板] Vue3 中使用 Tailwind CSS + NutUI 实现侧边工具栏切换主题

文章归档:https://www.yuque.com/u27599042/coding_star/vzkgy6gvcnpl3u2y 效果示例 配置 src 目录别名 https://www.yuque.com/u27599042/coding_star/ogu2bhefy1fvahfv 配置 Tailwind CSS https://www.yuque.com/u27599042/coding_star/yqzi9olphko9ity1 配置…

绕过类安全问题分析方法

什么是绕过 逻辑漏洞是指程序设计中逻辑不严密,使攻击者能篡改、绕过或中断程序,令其偏离开发人员预期的执行。 常见表现形式 1、接口(功能类)绕过:即接口或功能中通过某参数,绕过程序校验 2、流程类绕…

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添加TreeListControl到项目

此教程示范如何添加TreeListControl到项目和绑定控件自引用数据源: 添加数据模型 绑定tree,并添加如下字段到数据源对象: Key字段包含唯一值索引节点 Parent字段包含父索引节点 添加数据模型(Employee和Staff类)到…

2023年中国涂料树脂需求量、市场规模及行业竞争现状分析[图]

涂料用树脂是涂料的主要原材料,是涂料的主要成膜物,且了为涂料成品提供耐醇、耐磨、耐高温、耐高湿、减少涂料在涂装完成后的损耗、保持涂装后外观以及性状的稳定性等功能。 根据生产产品的性状不同,其下游产品,即涂料成品广泛应用…

Linux使用Docker完整安装Superset3,同时解决please use superset_config.py to override it报错

文章目录 Docker安装Superset流程1. 首先获取镜像2. 生成SSL3. 创建Superset容器4. 更新数据库5. 测试访问Superset Docker安装Superset流程 1. 首先获取镜像 docker pull amancevice/superset2. 生成SSL 接下来我们运行一些额外的程序: openssl rand -base64 4…

电脑监控软,电脑屏幕监控软件

电脑监控软,电脑屏幕监控软件 电脑屏幕监控软件不仅仅是一种工具,更是一种守护。随着互联网的发展,我们工作越来越离不开电脑,但同时,也面临着更多的安全隐患。为了保护个人隐私,提高工作效率,…