Linux进程描述符task_struct结构体简析
进程是处于执行期的程序以及它所管理的资源(如打开的文件、挂起的信号、进程状态、地址空间等等)的总称
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sched.h文件中。
这个结构体中包含了很多的信息,下面就让我们来一一简单的看看这些结构体内容,对进程描述符有一个基本的理解。
进程状态
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
state成员的可能取值如下
/** Task state bitmask. NOTE! These bits are also* encoded in fs/proc/array.c: get_task_state().** We have two separate sets of flags: task->state* is about runnability, while task->exit_state are* about the task exiting. Confusing, but this way* modifying one set can't modify the other one by* mistake.*/#define TASK_RUNNING 0#define TASK_INTERRUPTIBLE 1#define TASK_UNINTERRUPTIBLE 2#define __TASK_STOPPED 4#define __TASK_TRACED 8/* in tsk->exit_state */#define EXIT_DEAD 16#define EXIT_ZOMBIE 32#define EXIT_TRACE (EXIT_ZOMBIE | EXIT_DEAD)/* in tsk->state again */#define TASK_DEAD 64#define TASK_WAKEKILL 128 /** wake on signals that are deadly **/#define TASK_WAKING 256#define TASK_PARKED 512#define TASK_NOLOAD 1024#define TASK_STATE_MAX 2048/* Convenience macros for the sake of set_task_state */
#define TASK_KILLABLE (TASK_WAKEKILL | TASK_UNINTERRUPTIBLE)
#define TASK_STOPPED (TASK_WAKEKILL | __TASK_STOPPED)
#define TASK_TRACED (TASK_WAKEKILL | __TASK_TRACED)
上面的这些状态又分为下面的几类
5个互斥状态
state可以是5个互斥状态中的一种,系统中的进程必须处于5个状态中的一种。
这个5个状态的具体描述如下
状态 | 描述 |
---|---|
TASK_RUNNING | 表示进程要么正在执行,要么正要准备执行(已经就绪),正在等待cpu时间片的调度 |
TASK_INTERRUPTIBLE | 进程因为等待一些条件而被挂起(阻塞)而所处的状态。这些条件主要包括:硬中断、资源、一些信号……,一旦等待的条件成立,进程就会从该状态(阻塞)迅速转化成为就绪状态TASK_RUNNING |
TASK_UNINTERRUPTIBLE | 意义与TASK_INTERRUPTIBLE类似,除了不能通过接受一个信号来唤醒以外,对于处于TASK_UNINTERRUPIBLE状态的进程,哪怕我们传递一个信号或者有一个外部中断都不能唤醒他们。只有它所等待的资源可用的时候,他才会被唤醒。这个标志很少用,但是并不代表没有任何用处,其实他的作用非常大,特别是对于驱动刺探相关的硬件过程很重要,这个刺探过程不能被一些其他的东西给中断,否则就会让进城进入不可预测的状态 |
TASK_STOPPED | 进程被停止执行,当进程接收到SIGSTOP、SIGTTIN、SIGTSTP或者SIGTTOU信号之后就会进入该状态 |
TASK_TRACED | r表示进程被debugger等进程监视,进程执行被调试程序所停止,当一个进程被另外的进程所监视,每一个信号都会让进城进入该状态 |
5个互斥状态
两个附加的进程状态既可以被添加到state域中,又可以被添加到exit_state域中。只有当进程终止的时候,才会达到这两种状态.
/* task state */
int exit_state;
int exit_code, exit_signal;
状态 | 描述 |
---|---|
EXIT_ZOMBIE | 进程的执行被终止,但是其父进程还没有使用wait()等系统调用来获知它的终止信息,此时进程成为僵尸进程 |
EXIT_DEAD | 进程的最终状态 |
新增睡眠状态
进程状态 TASK_UNINTERRUPTIBLE 和 TASK_INTERRUPTIBLE 都是睡眠状态
进程标识符(PID)
pid_t pid;
pid_t tgid;
通过查看源代码我们发现pid_t的类型就是一个整型,每个进程在创建的时候都会返回一个进程标识符(PID),就好像一个身份证号码一样,用来唯一标识一个进程。
在CONFIG_BASE_SMALL配置为0的情况下,PID的取值范围是0到32767,即系统中的进程数最大为32768个。
进程内核栈
void *stack;
这里关于进程内核栈,专门写一篇博客,可以看过来
进程内核栈
进程标记
unsigned int flags; /* per process flags, defined below */
反应进程状态的信息,但不是运行状态,用于内核识别进程当前的状态,以备下一步操作
flags成员的可能取值如下,这些宏以PF(ProcessFlag)开头
例如
PF_FORKNOEXEC 进程刚创建,但还没执行。
PF_SUPERPRIV 超级用户特权。
PF_DUMPCORE dumped core。
PF_SIGNALED 进程被信号(signal)杀出。
PF_EXITING 进程开始关闭。
表示进程亲属关系的成员
/** pointers to (original) parent process, youngest child, younger sibling,* older sibling, respectively. (p->father can be replaced with* p->real_parent->pid)*/
struct task_struct __rcu *real_parent; /* real parent process */
struct task_struct __rcu *parent; /* recipient of SIGCHLD, wait4() reports */
/** children/sibling forms the list of my natural children*/
struct list_head children; /* list of my children */
struct list_head sibling; /* linkage in my parent's children list */
struct task_struct *group_leader; /* threadgroup leader */
在Linux系统中,所有进程之间都有着直接或间接地联系,每个进程都有其父进程,也可能有零个或多个子进程。拥有同一父进程的所有进程具有兄弟关系。
字段 | 描述 |
---|---|
real_parent | 指向其父进程,如果创建它的父进程不再存在,则指向PID为1的init进程 |
parent | 指向其父进程,当它终止时,必须向它的父进程发送信号。它的值通常与real_parent相同 |
children | 表示链表的头部,链表中的所有元素都是它的子进程 |
sibling | 用于把当前进程插入到兄弟链表中 |
group_leader | 指向其所在进程组的领头进程 |
ptrace系统调用
ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image
Performance Event
Performance Event是一款随 Linux 内核代码一同发布和维护的性能诊断工具。这些成员用于帮助PerformanceEvent分析进程的性能问题
进程调度
优先级
用来描述进程的调度方式,调度策略
进程地址空间
内核除了管理本身的内存外,还必须管理用户空间中进程的内存,我们称这个内存为进程地址空间,也就是系统中每个用户空间进程所看到的内存
还有其他的一些
判断标志
时间
信号处理
其他
相关文章:

hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间。 题目大意:从图中的标记开始,向四个相邻的方向…

easyexcel怎么设置表头宽度_easyexcel 自动设置列宽
com.alibabaeasyexcel2.1.4导出controller层代码RequestMapping("/download")public void download(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8…

php ImageMagick扩展
linux下安装php ImageMagick扩展模块下载ImageMagick源码包:#wget ftp://ftp.u-aizu.ac.jp/pub/graphics/p_w_picpath/ImageMagick/p_w_picpathmagick.org/ImageMagick.tar.gz 编译安装:#tar -zxvf ImageMagick.tar.gz #cd ImageMagick-xxxx-0#./confi…

调用浏览器的打印方法打印页面内容
2018-08-30 直接调用浏览器的打印方法 1、打印按钮 <a href"#" target"_self" οnclick"printme()">打印</a> 2、js //打印function printme() {$.messager.confirm(确认, 确认打印?, function (r) {if (r) {document.bo…

jsp中九大内置对象
内置组件 JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):1.request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。序号 方 法 说…

python数组越界_python 整数越界问题详解
python 内部自带大整数运算能力,整数运算不会溢出,只要内存足够,就oK下面的例子演示了两个32位整数加法的情况(通过位运算实现),为了模拟溢出的效果,必须人工的进行位运算,~运算符除了求反,还是…
Linux虚拟机连不上网
问题:我们在使用Linux虚拟机的时候经常会出现各种各样的问题,其中的一个问题就是Linux虚拟机连不上网,这是我最近经常遇到的问题,下面提供一种方法解决这个问题 Linux网络设置 打开虚拟机依次单击【System】–>【Preferences】…

企业如何利用新闻类软文营销策划
新闻软文营销对企业的推广有哪些优势呢? 一、首先让客户有机会直接在门户网上相关频道看到关于企业产品的新闻,产生直接的点击或者评论,带来直接客户。 二、当潜在客户运用百度等搜索引擎搜索企业的公司名或者产品的关键词,那么就会在一个页…

WPF XAML 资源样式模板属性存放位置
WPF XAML 资源样式模板属性存放位置 原文:WPF XAML 资源样式模板属性存放位置WPF的XAML 资源申明 类似HTML。 整体来说分3种1.行类资源样式属性 1.1 行内属性 <Button Content"按钮" Foreground"White" FontSize"30"></Button>1.2 行…

SQL Server 数据库备份
SQL Server 数据库备份 原文 http://www.cnblogs.com/ynbt/archive/2013/04/04/2999642.html 备份数据库是指对数据库或事务日志进行复制,当系统、磁盘或数据库文件损坏时,可以使用备份文件进行恢复,防止数据丢失。 SQL Server数据库备份支持…

Linux下修改PATH环境变量
Linux下有很多环境变量,PATH就是其中的一种 PATH 可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然 而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH 环 境变量的值里面包含了ls命令所在的目…

vscode 终端 进入node_安装了Node.js 从VScode 使用node -v 和 npm -v等命令却无效
前言最近写TypeScript需要安装、配置Node.js环境,楼主是使用的安装包所以环境变量都是自动就配好了(如果是下载的zip压缩包解压后要自己配置到系统环境变量中)。打开系统终端敲入命令 node -v 和 npm -v 也都有显示对应的软件包版本号,但是在VScode(Vis…

display:inline-block的妙用!!列表布局!!
如下图:像这种列表布局我们一般用 float:left; 设置宽度和高度就OK了。 但是,如果高度不同或者文字字数不同呢,再用float:left;布局就全乱了。如下图: 现在,我们可以利用display:inline-block;完美的解决这个问题。如下…

gitlab解决一些问题
一.修改gitlab端口: 打开/etc/gitlab/gitlab.rb文件,修改以下几点: external_url "http://192.168.58.62:9999"unicorn[listen] localhostunicorn[port] 9999 然后 #gitlab-ctl stop #gitlab-ctl reconfugure #gitlab-ctl start …

Linux下控制环境变量
查看环境变量 查看某一环境变量:比如我们需要查看HOME这个环境变量,我们可以在shell下直接输入echo $HOME 我们可以把所有的环境变量和环境变量的值都打印出来 打印环境变量 libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,…

研究性能测试工具之systemtap入门指南(四)
运行脚本[rootBL480-64 jinyz]#stap topexe.stp输出结果: SYSCALL COUNT find 101910 oracle 1562 modclusterd 1184 pcscd 535 clustat …

linux 编译mqtt静态库_编译MQTT C++ Client
nmake -f ms\nt.mak(这是静态库,动态库是ntdll.mak)nmake -f ms\nt.mak test(测试命令,如果成功则最后显示“passed all tests”字样)nmake -f ms\nt.mak install 成功则会在C:\openss\win64目录下生成bin、include、lib、ssl四个文件夹如果需要编译动态库,nm…

ubuntu 目录结构
转载于:https://www.cnblogs.com/perfy/archive/2012/07/08/2581854.html

pandas 读csv文件 TypeError: Empty 'DataFrame': no numeric data to plot
简单的代码,利用pandas模块读csv数据文件,这里有两种方式,一种是被新版本pandas遗弃的Series.from_csv;另一种就是pandas.read_csv 先说一下问题这个问题就是在读csv文件时,默认的数据是object类型,因而没有…

Linux的僵尸进程
僵尸进程的简单理解 linux中有几种进程状态,其中有一种特殊就是僵尸进程,个人理解是可以这样理解,就是我们 的子进程已经退出了,但是子进程退出了之后无家可归,就是一个飘移的孤魂野鬼一样,所以形象的取名字…

class function或class procedure是什么意思
类函数\类过程. 它们是直接操作在类上面(没有实例化的对象) 下面是Delphi Help 的描述 A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the res…

pythonshell画图_Python Shell下使用matplotlib
Python Shell下使用matplotlibCreated Monday 10 December 2012matplotlib默认是延迟绘图直到脚本结束,因为绘图是一个高代价的操作。所以可能不想每次每个属性的改变就更新绘图,只有所有的属性都改变了才更新。但是,当在python shell上工作时…

大地坐标的概念 大地坐标系的举例和说明分类
大地坐标大地测量中以参考椭球面为基准面的坐标。地面点P的位置用大地经度L、大地纬度B和大地高H表示。当点在参考椭球面上时,仅用大地经度和大地纬度表示。大地经度是通过该点的大地子午面与起始大地子午面之间的夹角,大地纬度是通过该点的法线与赤道面…

C# 在用户控件中添加自定义事件
/// <summary> /// 用户控件 /// </summary> public partial class UCMyControl : UserControl {//定义委托//EventArgs 可以自己定义参数的类型,一般情况下定义为(object sender,EventArgs e)public delegate void SelectedValueChanged(o…

标准h5的定位_H5中的定位
这次给大家带来H5中的定位,H5中定位的注意事项有哪些,下面就是实战案例,一起来看一下。一.定位流分类1.1相对定位1.2绝对定位1.3固定定位1.4静态定位二.什么是相对定位?相对定位就是相对于自己以前在标准流中的位置来移动position: relative…

数据库开发基本操作-关于sql server 2005 未开放1433端口的问题
有些sql server 2005在安装过程中,可能将SQL server 服务的端口配置成了动态端口,没有使用默认的1433端口,从而导致了sql server 2005 的服务启动了,但是却没有开启1433端口。解决办法就是取消动态端口,并将端口改成14…

Java8内存模型—永久代(PermGen)和元空间(Metaspace)
一、JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈…

web server大全之GoAhead移植(转载)
转自:http://linux.chinaunix.net/techdoc/develop/2009/06/19/1119124.shtml 注:最近在做goAhead web server和移植其到TI芯片linux上,这里先转一篇相关的文章来学习下,希望有所帮助。。。 ******************************* * web server大全…

tomcat苹果版安装步骤_Mac系统安装和配置tomcat步骤详解
一:下载打开Apache Tomcat官网,选择需要的版本下载:二:存放到本地文件夹重名民为ApacheTomcat,放到/Users/计算机名/Library/目录下三:启动Tomcat打开Terminal,进入ApacheTomcat所在目录的bin目录下$:cd /Users/mymac/Library/ApacheTomcat/bin1启动Tomcat$:./startup.sh1如果出…

Oracle 11g 数据类型
Oracle 11g Datatypes VARCHAR2(size [BYTE | CHAR]) 可变长度的字符串的最大长度有大小字节或字符。最大尺寸是4000字节或字符,最低为1个字节或1个字符。您必须指定VARCHAR2大小。 字节表示该列将有字节长度语义。 CHAR列表示将字符语义。 NVARCHAR2(size) 可变长度…