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

news2024/10/6 8:32:38

《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.coloradmin.cn/o/1221744.html

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

相关文章

Navicat 基于 GaussDB 主备版的快速入门

Navicat Premium(16.2.8 Windows版或以上) 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结构同步、协同合作、数据迁移等),这…

API接口怎么对接电商平台获取商品详情数据

对于api接口的对接,你可以按照以下步骤进行操作: 1. 确定需求:首先要明确你的对接需求,即想要通过对接api接口实现什么功能,例如获取数据、实现支付等。 2. 寻找文档:在对接之前,要找到相关ap…

一、认识STM32

目录 一、初识STM32 1.1 STM32的命名规则介绍 1.2 STM32F103ZET6资源配置介绍 二、如何识别芯片管脚 2.1 如何寻找 IO 的功能说明 三、构成最小系统的要素 一、初识STM32 1.1 STM32的命名规则介绍 以 STM32F103ZET6 来讲解下 STM32 的命名方法: &…

AH4056线性锂电池充电IC:高效、安全的充电解决方案

随着移动设备的普及,人们对电池续航能力的要求越来越高。为了满足这一需求,电池充电技术不断创新。本文将为您介绍一款AH4056线性锂电池充电IC,采用同步整流技术,具有宽输入电压范围、大充电电流、温度保护等优点,适用…

虾皮产品标题生成器:为您的商品打造吸引眼球的标题

在电商平台上,一个引人注目的商品标题是吸引潜在买家点击进入您的产品页面的第一步。然而,很多商家在创建商品标题时遇到困难,不知道如何吸引更多的目标受众。幸运的是,现在有一个名为知虾工具的强大工具,可以帮助商家…

【Git学习二】时光回溯:git reset和git checkout命令详解

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript小贴士Git等软件工具技术的使用 👐学习格言:成功不是终点,失败也并非末日&a…

基于STM32的无线传感器网络(WSN)通信方案设计与实现

无线传感器网络(Wireless Sensor Network,简称WSN)是由一组分布式的无线传感器节点组成的网络,用于监测和收集环境中的各类物理信息。本文将基于STM32微控制器,设计并实现一个简单的无线传感器网络通信方案&#xff0c…

系统韧性研究(5)| 常用的系统韧性技术

如果不利事件或条件导致系统无法正常运行,则它们可能会对有价值的资产造成各种形式的损害。正如我在本系列的前几篇文章中概述的那样,系统韧性很重要,因为没有人想要一个无法克服“不可避免的逆境”的脆弱系统。 在本系列的第一篇文章中&…

nacos客户端连接服务端报Client not connected, current status:STARTING

说明&#xff1a; nacos服务端版本&#xff1a;v2.1.2 nacos客户端版本&#xff1a;2.1.2 结果启动项目报错&#xff1a; Client not connected, current status:STARTING 解决&#xff1a; 降低客户端版本至 1.4.1 就Ok了 <dependency><groupId>com.alibaba.naco…

AI监管规则:各国为科技监管开辟了不同的道路

AI监管规则&#xff1a;各国为科技监管开辟了不同的道路 一份关于中国、欧盟和美国如何控制AI的指南。 编译 李升伟 茅 矛 &#xff08;特趣生物科技有限公司&#xff0c;广东深圳&#xff09; 插图&#xff1a;《自然》尼克斯宾塞 今年5月&#xff0c;科技公司OpenAI首席…

List is a raw type. References to generic type List<E> should be parameterized

List is a raw type. References to generic type List<E> should be parameterized 都是代码习惯问题懒

syncthing 多设备同步

【精选】linux间文件实时同步(syncthing) ---带历史版本“后悔药”_syncthing linux_井底蛙-jdw的博客-CSDN博客https://blog.csdn.net/qq_41355314/article/details/116694273 wget https://gh-proxy.com/https://github.com/syncthing/syncthing/releases/download/v1.26.1/…

基于R语言平台Biomod2模型的物种分布建模与可视化分析

!](https://img-blog.csdnimg.cn/84e1cc8c7f9b4b6ab60903ffa17d82f0.jpeg#pic_center)

【C++初阶】STL详解(二)string类的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

Redis链表

前言 链表作为一种常见的数据结构&#xff0c;一般都会内置在很多高级语言中。由于Redis使用的是C语言并没有内置这种数据结构&#xff0c;所以Redis构建了自己的链表实现。 链表在Redis中应用广泛&#xff0c;比如列表建的底层实现之一就是链表。当一个列表键包含了数量比较多…

nodejs+vue面向中小学课堂教学辅助软件系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

主要功能有&#xff0c;管理员通过后台会对此教学辅助进行审核&#xff0c;管理员在还可以进行首页、个人中心、学生管理、教师管理、班级信息管理、科目名称管理、课程信息管理、教学资料管理、作业信息管理、作业提交管理、作业成绩管理、在线考试管理、试题管理、考试管理、…

[PHP]关联和操作MySQL数据库然后将数据库部署到ECS

在Mac电脑上使用VS Code进行PHP开发并关联操作MySQL数据库&#xff0c;然后将数据库部署到ECS。 1.安装PHP和MySQL 确保你的Mac上已经安装了PHP和MySQL。你可以使用Homebrew来安装它们&#xff1a; $ brew install php $ brew install mysql 安装mysql完成后记住这一句: …

Notepad++ 通过HexEditor插件查看.hprof文件、heap dump文件的堆转储数据

文章目录 需求场景插件安装查看notepad的版本&#xff0c;看看是32位的还是64位的下载对应的版本解压导入插件打开notepad插件文件夹&#xff1a;Notepad安装目录新建一个HexEditor文件夹选中插件文件导入 重启notepad使用 需求场景 想要查看app内存的某个域的数据。 利用Andr…

2.项目疑问

Day01 1.前后端分离项目的全局异常处理怎么做 使用ControllerAdviceExceptionHandler&#xff08;类.class&#xff09;来实现异常处理 ControllerAdvice: Controller增强器。将异常处理器应用到所有的控制器 ExceptionHandler&#xff1a;异常处理器&#xff0c;只要发生异…

2023年(第六届)电力机器人应用与创新发展论坛-核心PPT资料下载

一、峰会简介 大会以“聚焦电力机器人创新、助力行业数字化转型、促进产业链协同发展”为主题&#xff0c;展示电力机器人产业全景创新技术&#xff0c;探讨数字化战略下电力机器人应用前景和发展趋势。为加快推进电力机器人应用拓新&#xff0c;助力电网数字化转型升级&#…