进程中的任务状态解析

news2024/11/13 10:04:52

在 Linux 里面,无论是进程,还是线程,到了内核里面,我们统一都叫任务(Task),由一个统一的结构 task_struct 进行管理。

每一个任务都应该有一个 ID,作为这个任务的唯一标识。到时候排期啊、下发任务啊等等,都按 ID 来,就不会产生歧义。

task_struct 里面涉及任务 ID 的,有下面几个:

pid_t pid;
pid_t tgid;
struct task_struct *group_leader; 

所以在内核中,它们虽然都是任务,但是应该加以区分。其中,pid 是 process id,tgid 是 thread group ID。

任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。

但是,如果一个进程创建了其他线程,那就会有所变化了。线程有自己的 pid,tgid 就是进程的主线程的 pid,group_leader 指向的就是进程的主线程。

有了 tgid,我们就知道 tast_struct 代表的是一个进程还是代表一个线程了。

 task_struct 里面关于信号处理的字段。

/* Signal handlers: */
struct signal_struct    *signal;
struct sighand_struct    *sighand;
sigset_t      blocked;
sigset_t      real_blocked;
sigset_t      saved_sigmask;
struct sigpending    pending;
unsigned long      sas_ss_sp;
size_t        sas_ss_size;
unsigned int      sas_ss_flags;

这里定义了哪些信号被阻塞暂不处理(blocked),哪些信号尚等待处理(pending),哪些信号正在通过信号处理函数进行处理(sighand)。处理的结果可以是忽略,可以是结束进程等等。

信号处理函数默认使用用户态的函数栈,当然也可以开辟新的栈专门用于信号处理,这就是 sas_ss_xxx 这三个变量的作用。

state(状态)可以取的值定义在 include/linux/sched.h 头文件中。

/* Used in tsk->state: */
#define TASK_RUNNING                    0
#define TASK_INTERRUPTIBLE              1
#define TASK_UNINTERRUPTIBLE            2
#define __TASK_STOPPED                  4
#define __TASK_TRACED                   8
/* Used in tsk->exit_state: */
#define EXIT_DEAD                       16
#define EXIT_ZOMBIE                     32
#define EXIT_TRACE                      (EXIT_ZOMBIE | EXIT_DEAD)
/* Used in tsk->state again: */
#define TASK_DEAD                       64
#define TASK_WAKEKILL                   128
#define TASK_WAKING                     256
#define TASK_PARKED                     512
#define TASK_NOLOAD                     1024
#define TASK_NEW                        2048
#define TASK_STATE_MAX                  4096

TASK_RUNNING 并不是说进程正在运行,而是表示进程在时刻准备运行的状态。当处于这个状态的进程获得时间片的时候,就是在运行中;如果没有获得时间片,就说明它被其他进程抢占了,在等待再次分配时间片。

在运行中的进程,一旦要进行一些 I/O 操作,需要等待 I/O 完毕,这个时候会释放 CPU,进入睡眠状态。

在 Linux 中,有两种睡眠状态。一种是 TASK_INTERRUPTIBLE,可中断的睡眠状态。另一种睡眠是 TASK_UNINTERRUPTIBLE,不可中断的睡眠状态。

这其实是一个比较危险的事情,除非程序员极其有把握,不然还是不要设置成 TASK_UNINTERRUPTIBLE。TASK_KILLABLE,可以终止的新睡眠状态。进程处于这种状态中,它的运行原理类似 TASK_UNINTERRUPTIBLE,只不过可以响应致命信号。

TASK_STOPPED 是在进程接收到 SIGSTOP、SIGTTIN、SIGTSTP 或者 SIGTTOU 信号之后进入该状态。

TASK_TRACED 表示进程被 debugger 等进程监视,进程执行被调试程序所停止。当一个进程被另外的进程所监视,每一个信号都会让进程进入该状态。

一旦一个进程要结束,先进入的是 EXIT_ZOMBIE 状态,但是这个时候它的父进程还没有使用 wait() 等系统调用来获知它的终止信息,此时进程就成了僵尸进程。

EXIT_DEAD 是进程的最终状态。EXIT_ZOMBIE 和 EXIT_DEAD 也可以用于 exit_state。

此文章为10月Day23学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

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

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

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)十三:通用表格组件封装实现

一、本章内容 本章实现通用表格组件,根据实体配置自动实现表格列识别、数据搜索、表格排序、添加、编辑、删除等操作功能。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 3.1 B站视频地址:

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅳ—— 替换默认证书

目录 博文摘要6. 使用企业 CA 签发的 SSL 证书 替换 vSphere 默认 SSL 证书6.1 确认证书文件6.2 替换默认 vSphere 证书6.3 验证自签名证书6.4 补充说明 关联博文参考资料 博文摘要 博文主要描述了在 vCenter Server 8 上通过实用工具 certificate-manager 将 vSphere 默认 Ma…

【JUC】AQS源码剖析

AQS(AbstractQueuedSynchronizer) 文章目录 AQS(AbstractQueuedSynchronizer)1. 概述2. AQS源码分析前置知识2.1 AQS的int变量2.2 AQS的CLH队列2.3 内部类Node(Node类在AQS类内部)2.3 小总结 3. 以ReentrantLock为突破口进行AQS源码分析3.1 架构原理3.2 lock()方法3.3 AQS中的a…

CNN系列

文章目录 R-CNN(2014)Conclusion R-CNN(2014) 哈哈 创新: (1)人们可以将高容量卷积神经网络(cnn)应用于自下而上的区域建议,以定位和分割对象; (2)当标记训练数据稀缺时,对辅助任务进行监督预训…

vite+vue3+ts开发web日语项目,支持主题切换,pinia状态持久化管理

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习 使用: 安装 使用Npm或其他包管理器安装依赖 npm install 百度翻…

Pyecharts绘图教程(2)—— 绘制多种折线图(Line)参数说明+代码实战

文章目录 🎯 1 简介🎯 2 图表配置项2.1 导入模块2.2 数据配置项2.3 全局配置项 🎯 3 代码实战3.1 基础折线3.2 平滑曲线(is_smooth)3.3 阶梯折线(is_step)3.4 空值过渡(is_connect_n…

C++中->与.的区别

在类中 在 C 中,-> 和 . 都可以用于访问类的成员变量和成员函数。但它们在使用上有一些区别: 1. 对于指针类型的对象,必须使用 -> 来访问其成员;而对于非指针类型的对象,则需要使用 . 。 2. -> 运算符在实…

2023年淘宝天猫京东双11红包活动时间什么时候开始如何使用京东淘宝天猫双十一红包口令抢双11超级红包?

2023年京东双11抢红包时间是什么时候? 京东双11抢红包活动时间是从2023年10月23日20:00开始持续到11月11日23:59结束; 2023年京东双11抢红包口令是什么如何使用? 1、在2023年京东双11红包活动时间内,每天都可以打开京东APP&…

电商接口中API key 和 token 有什么区别?

API key 和 token 就有这种问题,它们都是作为一种身份验证机制。前几天我在一次讨论中,有人提到这两个词可以互换使用。大约两分钟后,我不得不停止谈话并说“你们应该知道它们是不同的,对吧?”‍,说完会上鸦…

json入参取特定分段值--mirth

入参 {"HEADER": {"MSGID": "000","MSGSENDDATE": "2023-10-12 00:00:00","MSGTYPE": "TJ025","AccepterID": "","SenderID": "HIS","MSGSTATUS":…

ChatGPT和DALL-E的系统提示词被曝光;每个开发人员都该了解的GPU知识

🦉 AI新闻 🚀 ChatGPT和DALL-E的系统提示词被曝光,揭示了其规则和操作细节 摘要:开发者和网友通过一种方法成功获取了ChatGPT和DALL-E的系统提示词,揭示了它们在对话和图像生成过程中遵循的规则和操作细节。这些提示…

数据库监控:关键指标和注意事项

【squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 听到模糊的说法“我们的数据库有问题”对于任何数据库管理员或管理员来说都是一场噩梦。有时是真的,有时不是,到底问题出在哪里呢?真…

基于springboot实现车辆充电桩平台管理系统项目【项目源码+论文说明】计算机毕业设计

基于sprinboot实现车辆充电桩平台管理系统演示 摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,车辆充电桩管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大&#…

【全国数据】中国乡镇级矢量面状数据(shp)

数据介绍 中国43655个乡镇,面状,GCS_WGS_1984坐标系。 数据预览 数据举例: 专栏分享常用的地理空间数据,包括矢量数据、栅格数据、统计数据等,订阅专栏后,从私信查收专栏完整数据包,持续同步更新…

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站, 本篇音乐播放器功能完善:顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…

为什么这些网站都在使用CFCA证书

在今天的数字时代,保障数据的安全至关重要,尤其是对于金融机构、政府部门和大型企业等组织而言。证书颁发机构在这一领域扮演着关键的角色,而CFCA(中国金融认证中心)证书已经脱颖而出,展现了其与其他证书的…

提取作者用户名,帖子内容,回复时间

import re import csv# 打开名为a1.txt的文件,并以只读模式(r)读取其内容。这里使用了UTF-8编码。 with open(网页源码a1.txt, r, encodingUTF-8) as f:# 读取文件的所有内容并赋值给变量source source f.read()# 使用正则表达式查找所有匹配region_header clea…

YOLOv8改进实战 | 更换损失函数之MPDIOU(2023最新IOU)篇

前言 YOLOv8官方默认损失函数采用的是CIoU。本章节主要介绍如何将MPDIoU损失函数应用于目标检测YOLOv8模型。 目录 一、MPDIoU二、代码实现添加损失函数更换损失函数一、MPDIoU 论文链接:MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression MPDIoU是一种基于…

【Tensorflow 2.12 智能商城商品推荐系统】

Tensorflow 2.12 智能商城商品推荐系统 前言架构数据召回排序部署调用结尾 前言 基于 Tensorflow 2.12 搭建一个简单的智能商城商品推荐系统demo~ 主要包含6个部分,首先是简单介绍系统架构,接着是训练数据收集、处理,然后是召回模型、排序模型…

Vue3.3指北(一)

Vue3.3指北 1、Vue32、Vue3安装3、Vue指令3.1、配置准备1.1.1、WebStrom配置模板1.1.2、配置devtools1.1.3、Vue3指令概览 3.2、内容渲染指令3.2.1、mustache语法3.2.2、v-once1.3.2、v-text1.3.3、v-html1.3.4、v-pre1.3.5、v-cloak 3.3、属性绑定指令3.3.1、v-bind1、v-bind绑…