Linux下task_struct详解
背景:为了管理进程,操作系统必须对每个进程所做的事情进行清楚地描述,为此,操作系统使用数
据结构来代表处理不同的实体,这个数据结构就是通常所说的进程描述符或进程控制块。
在linux系统中,这就是task_struct结构,在include\linux\sched.h文件中定义。
每个进程都会被分配一个task_struct结构,它包含了这个进程的所有信息,
在任何时候操作系统都能跟踪这个结构的信息。
这个结构是linux内核汇总最重要的数据结构,下面我们会详细的介绍。
task_struct结构的主要信息:
1、进程状态 (将纪录进程在等待,运行,或死锁)
2、调度信息(由哪个调度函数调度,怎样调度等)
3、进程的通讯状况
4、因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型
5、时间信息,(比如计算好执行的时间, 以便cpu 分配)
6、标号 (决定改进程归属)
7、可以读写打开的一些文件信息
8、 进程上下文和内核上下文
9、处理器上下文
10、内存信息
下面我们看一下linux下是怎么定义task_struct的:
打开/include/linux/sched.h可以找到task_struct 的定义
struct task_struct {
volatile long state; 说明了该进程是否可以执行,还是可中断等信息
unsigned long flags; Flage 是进程号,在调用fork()时给出
int sigpending; 进程上是否有待处理的信号
}
----------------------------------------
mm_segment_t addr_limit; 进程地址空间
进程地址空间,区分内核进程与普通进程在内存存放的位置不同
0-0xBFFFFFFF for user-thead
0-0xFFFFFFFF for kernel-thread
----------------------------------------
volatile long need_resched;
调度标志,表示该进程是否需要重新调度,
若非 0, 则当从内核态返回到用户态,会发生调度
----------------------------------------
int lock_depth; 锁深度
long nice; 进程的基本时间片
----------------------------------------
unsigned long policy;
进程的调度策略,有三种
实时进程:SCHED_FIFO,SCHED_RR
分时进程:SCHED_OTHER
----------------------------------------
struct mm_struct mm; 进程内存管理信息
----------------------------------------
int processor;
若进程不在任何CPU上运行,
cpus_runnable 的值是0,否则是1。
这个值在运行队列被锁时更新.
----------------------------------------
unsigned long cpus_runnable, cpus_allowed;
struct list_head run_list;指向运行队列的指针
unsigned long sleep_time; 进程的睡眠时间
----------------------------------------
struct task_struct next_task, prev_task;
用于将系统中所有的进程连成一个双向循环链表
其根是init_task.
----------------------------------------
struct mm_struct active_mm;
truct list_head local_pages;指向本地页面
unsigned int allocation_order, nr_local_pages;
struct linux_binfmt binfmt;进程所运行的可执行文件的格式
int exit_code, exit_signal;
int pdeath_signal;父进程终止是向子进程发送的信号
unsigned long personality;
Linux 可以运行由其他UNIX操作系统生成的符合iBCS2标准的程序
----------------------------------------
int did_exec:1;
按POSIX要求设计的布尔量,区分进程正在执行从
父进程中继承的代码,还是执行由execve装入的新程序代码
----------------------------------------
pid_t pid; 进程标识符,用来代表一个进程
pid_t pgrp; 进程组标识,表示进程所属的进程组
pid_t tty_old_pgrp;进程控制终端所在的组标识
pid_t session;进程的会话标识
pid_t tgid;
int leader; 标志,表示进程是否为会话主管
----------------------------------------
struct task_struct p_opptr,p_pptr,p_cptr,p_ysptr,p_osptr;
struct list_head thread_group; 线程链表
struct task_struct pidhash_next;用于将进程链入HASH表pidhash
----------------------------------------
struct task_struct pidhash_pprev;
wait_queue_head_t wait_chldexit; 供wait4()使用
struct completion vfork_done; 供vfork() 使用
----------------------------------------
unsigned long rt_priority;
实时优先级,用它计算实时进程调度时的weight值,
----------------------------------------
----------------------------------------
it_real_value,it_real_incr; 用于REAL定时器,单位为jiffies
系统根据it_real_value //设置定时器的第一个终止时间。
在定时器到期时,向进程发送SIGALRM信号,同时根据
it_real_incr重置终止时间,it_prof_value,it_prof_incr
用于Profile定时器,单位为jiffies。当进程运行时,
不管在何种状态下,每个tick都使it_prof_value值减一,
当减到0时,向进程发送信号SIGPROF,并根据it_prof_incr重置时间
it_virt_value,it_virt_value用于Virtual定时器,单位为jiffies。
当进程运行时,不管在何种状态下,每个tick都使it_virt_value值减一
当减到0时,向进程发送信号SIGVTALRM,根据it_virt_incr重置初值。
Real定时器根据系统时间实时更新,不管进程是否在运行
Virtual定时器只在进程运行时,根据进程在用户态消耗的时间更新
Profile定时器在进程运行时,根据进程消耗的时
(不管在用户态还是内核态)更新
----------------------------------------
unsigned long it_real_value, it_prof_value, it_virt_value;
unsigned long it_real_incr, it_prof_incr, it_virt_value;
struct timer_list real_timer;//指向实时定时器的指针
struct tms times; //记录进程消耗的时间,
unsigned long start_time;//进程创建的时间
long per_cpu_utime[NR_CPUS], per_cpu_stime[NR_CPUS]; //记录进程在每个CPU上所消耗的用户态时间和核心态时间
----------------------------------------
mm fault and swap info: this can arguably be seen as either mm-specific or thread-specific
//内存缺页和交换信息:
//min_flt, maj_flt累计进程的次缺页数(Copy on Write页和匿名页)和主缺页数(从映射文件或交换设备读入的页面数);
//nswap记录进程累计换出的页面数,即写到交换设备上的页面数。
//cmin_flt, cmaj_flt, cnswap记录本进程为祖先的所有子孙进程的累计次缺页数,主缺页数和换出页面数。在父进程
//回收终止的子进程时,父进程会将子进程的这些信息累计到自己结构的这些域中
unsigned long min_flt, maj_flt, nswap, cmin_flt, cmaj_flt, cnswap;
int swappable:1; //表示进程的虚拟地址空间是否允许换出
process credentials ///进程认证信息
//uid,gid为运行该进程的用户的用户标识符和组标识符,通常是进程创建者的uid,gid //euid,egid为有效uid,gid
//fsuid,fsgid为文件系统uid,gid,这两个ID号通常与有效uid,gid相等,在检查对于文件系统的访问权限时使用他们。
//suid,sgid为备份uid,gid
uid_t uid,euid,suid,fsuid;
gid_t gid,egid,sgid,fsgid;
int ngroups; //记录进程在多少个用户组中
gid_t groups[NGROUPS]; //记录进程所在的组
kernel_cap_t cap_effective, cap_inheritable, cap_permitted;//进程的权能,分别是有效位集合,继承位集合,允许位集合
int keep_capabilities:1;
struct user_struct user;
limits
struct rlimit rlim[RLIM_NLIMITS]; //与进程相关的资源限制信息
unsigned short used_math; //是否使用FPU
char comm[16]; //进程正在运行的可执行文件名
file system info //文件系统信息
int link_count, total_link_count;
struct tty_struct tty; NULL if no tty 进程所在的控制终端,如果不需要控制终端,则该指针为空
unsigned int locks; How many file locks are being held
ipc stuff //进程间通信信息
struct sem_undo semundo; //进程在信号灯上的所有undo操作
struct sem_queue semsleeping; //当进程因为信号灯操作而挂起时,他在该队列中记录等待的操作
CPU-specific state of this task //进程的CPU状态,切换时,要保存到停止进程的
task_struct中
struct thread_struct thread;
filesystem information文件系统信息
struct fs_struct fs;
open file information //打开文件信息
struct files_struct files;
signal handlers //信号处理函数
spinlock_t sigmask_lock; Protects signal and blocked
struct signal_struct sig; //信号处理函数,
sigset_t blocked; //进程当前要阻塞的信号,每个信号对应一位
struct sigpending pending; //进程上是否有待处理的信号
unsigned long sas_ss_sp;
size_t sas_ss_size;
int (notifier)(void priv);
void notifier_data;
sigset_t notifier_mask; Thread group tracking
u32 parent_exec_id;
u32 self_exec_id;
Protection of (de-)allocation: mm, files, fs, tty
spinlock_t alloc_lock;
void journal_info; journalling filesystem info
};
很复杂有木有,大家挑着自己想要了解的看吧
转载于:https://blog.51cto.com/helloleex/1785328
相关文章:

【Python】数据提取xpath和lxml模块(豆瓣电影排行榜的爬虫)
xpath xpath:一门从html中提取数据的语言 xpath语法 1、选择节点(标签) /html/head/meta :能够选中html下的head下的所有的meta标签 2、// :能够从任意节点开始选择 //li:当前页面上所有的li标签 //html/head/link &a…

qt5.6.3下使用firebird
有人把firebird比作数据库界的瑞士军刀,想学习一下其在QT5.6中的使用,于是便开始了一场自己挖坑,自己埋的旅程。 环境说明:win7 64位QT5.6 mingw4.9 32位(好像官网上也没有64位,当然mingw也是32位的&#x…

【Python】数据提取xpath和lxml模块(糗事百科的爬虫)
程序中用到的一些零碎知识点: 一、列表推导式:帮助我们快速生成一堆数据的列表 1、format:字符串格式化的一种方式 >>> ["10月{}日".format(i) for i in range(1,10)] [10月1日, 10月2日, 10月3日, 10月4日, 10月5日, 1…

Linux Performance
性能专家Brendan Gregg的网站。 Linux性能 该页面链接到我创建的各种Linux性能材料,包括右侧的工具图。它们使用大字体来适合滑盖。您也可以将它们打印出来用于办公室墙壁。它们显示:Linux可观察性工具, Linux静态性能分析工具,…

07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/dunitian/LoTCodeBase/tree/master/LoTUI 先看在LoT.UI里面的应用效果图: 完整Demo:(https://gith…

workerman结合laravel开发在线聊天应用的示例代码
项目背景: 最近由于公司的业务需求,需要用到聊天功能。而且有比较多的个性化需求需要定制。之前使用别人的聊天组件是基于微擎的。如果要移植到普通的H5在逻辑修改还有定制上存在比较多的困难。为此只能克服困难,自己搭建一个吧 什么是Worker…

复杂系统设计 企业开发的困境
复杂系统设计源自我多年对企业复杂系统的设计的一些思考,类似日记吧,不断完善。 为什么从一个大公司的引入架构师甚至架构师组还是很难架构企业开发中的很多问题? 这些问题表现出架构上的复杂性,和业务上的复杂性。 有时候架构…

数据库服务器跟网站服务器间传输慢的问题
数据库服务器和网站服务器是分开的,现在从网站服务器这边查数据比较慢,什么原因??? 一、首先确定服务器之间的网络有没有问题 可以简单的在网站服务器上ping数据库服务器(反过来也可以)…
【Python】百度贴吧图片的爬虫实现(努力努力再努力)
学会爬取图片以后,第一时间去了张艺兴吧,哈哈哈哈哈哈 一定要放上一张爬取的照片,哼唧 import reimport requestsimport urllibclass Baidutieba():def __init__(self):self.url "http://tieba.baidu.com/p/4876047826?pn{}"#u…

cin、cout的重载
一、cin重载 1.cin为ostream类的成员 2.cin重载应为全局函数(毕竟ostream是别人写好的) 3.代码 a.核心代码 ostream & operator<<(ostream &os,const A &a)//const A &a是为了避免复制函数的调用 ;ostream &o 相当…

第二次冲刺第十天
第二次冲刺今天就结束了,这十天来学会了不少的东西。 简单说一下昨天做的:整合各个部件的功能。 今天:小组进行总结,加强性能。 这十天来遇到的问题: 一,对于网络云端,之前都是其他小组成员在使…

说透泛型类和泛型方法以及Class<T>和Class<?>的差异
泛型类和泛型方法看起来似乎可以实现类似的功能,但是很多人并未真正掌握泛型方法,网上很多文章说了很多还是似是而非,特别是初学者还是搞不明白。 一.关于泛型方法 1.泛型方法可以独立于泛型类 2.泛型方法等效于泛型类里泛型参数方法&…
win10 +python 3.6.4安装scrapy
第一步: 首先,我们先在电脑上安装好python3.6并且配置好环境变量,以可以直接在命令行界面输入python命令可以出现如图的界面为主。 第二步: 升级pip ,在cmd窗口中会有提示,没有提示的话就已经是最新版本了…

7 种 Javascript 常用设计模式学习笔记
7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用。 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的脉络: 设计与模式5 大设计原则 7 种常见的设计…

从难免的线上bug说起代码的思考
经常是某司线上又出bug了,然后是给公司造成多少损失,追根究底总是可以找到一些原因,诸如:写代码逻辑考虑不全面,或者代码有硬伤,也有测试不充分,甚至不测试都有,也有是运维的问题等等…

PHP-Fpm应用池配置
//php.net php-fpm配置简介http://php.net/manual/zh/install.fpm.configuration.php//Global Options//pool defined[www]user nobodygroup nobodylisten 127.0.0.1:9000pm dynamicpm.max_children 5pm.start_servers 2pm.min_spare_servers 1pm.max_spare_servers 3s…
【Python】百度首页GIF动画的爬虫
今天百度首页的GIF动画很可爱,就想着用才学的爬虫爬取一下,虽然直接点击“图片另存为”就可以了 import requestsimport urllibclass Gif():def __init__(self):self.url "https://www.baidu.com/"self.headers {"User-Agent": …

CSS题目系列(3)- 实现文字切割效果
描述 有一天逛 Codepen 的时候,看到这么一个效果:将文字上下切开两半。 点进去看了一下代码,发现原理很简单,大概就是通过伪类使用attr()函数获取内容,然后进行定位。 你可以点下方链接查看效果: gd4ark.gi…

Java开发字符串JSON处理
需求很简单就是数据库存json。 数据库字段 varchar 入参request 定义 List<String> 如果不定义这个 而是定义String那么需要加"/转义比较难看 这样就只要入参传这个就行了: "xxxIds": ["33","44"], 数据库也是…

1.JSONObject与JSONArray的使用
参考文献: http://blog.csdn.net/huangwuyi/article/details/5412500 1.JAR包简介 要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包: commons-lang.jarcommons-beanutils.jarcommons-collections.jarcommons-logging.ja…
【Python】Scrapy爬虫实战(豆瓣电影 Top 250)
今天一天都在弄Scrapy,虽然爬虫起来真的很快,很有效率,但是......捣鼓了一天 豆瓣电影 Top 250:https://movie.douban.com/top250 安装好的scrapy 在你想要的文件夹的目录下输入命令: scrapy startproject douban_m…

vmrun 批量创建vmware虚拟机
1 准备模板机 具体步骤如下: 1. 下载镜像安装系统 https://mirrors.aliyun.com/centos/7.5.1804/isos/x86_64/2. 安装完成配置好IP ,关闭SELINUX ,关闭firewalld ,修改网卡名 3. 预设置好修改其他机器IP脚本 1.1 安装系统 略 1.2 模板机的设置 修改网卡名…

暗时间:开发效率为何如此低下
产品 开发 测试 三者都理解不一致。 产品怎么样表达出自己的诉求,是否写清文档就够了。 开发觉得自己沟通了,但是为什么测试一提测又许多问题。 测试的case看似都一起评审了。 而这样的结果必然是重新修修补补,怎么样事前把问题全部解…
【Python】Scrapy爬虫实战(传智播客老师简介)
在文件夹里创建一个爬虫项目 scrapy startproject ITcast 在spiders目录下: scrapy genspider itcast ------------------------------------------------------------------------------------------------------------------------------------------------------…
坑系列 --- 高可用架构的银弹
呵呵,题图是一队困在坑中的鸭子:)作为一个搬砖的,我经常被困着。今天高考,想起15年前的今天(哦,那时候是七月高考),恩,考完了,还不错,…

【TeeChart Pro ActiveX教程】(八):ADO数据库访问(上)
2019独角兽企业重金招聘Python工程师标准>>> 下载TeeChart Pro ActiveX最新版本 介绍 将TeeChart控件连接到ADO.NET数据库可以在设计时使用TeeChart编辑器完成,并在运行时使用几行代码完成。 任何Series都可以使用TeeChart Editor连接到ADO.NET表或查询。…

代码规范碎碎念
代码规范碎碎念 list条件多于2不要写命名上 controller (model-DTO) service (model) repository层 语义化构造 (entity->model) String转map 语义化数据结构 String转model 从数据库层增强语义 组装模型 DAO ( entity) mapper VO(admin) DTO(client) -------…

RRDTool原理简介
1.概述 RRDtool 代表 “Round Robin Database tool” ,作者同时也是 MRTG 软件的发明人。官方站点位于http://oss.oetiker.ch/rrdtool/ 。 所谓的“Round Robin” 其实是一种存储数据的方式,使用固定大小的空间来存储数据,并有一个指针指向最…
【Python】Scrapy爬虫实战(腾讯社会招聘职位检索)
爬虫网页:https://hr.tencent.com/position.php 应用Scrapy框架,具体步骤就不详细说明,前面几篇Scrapy有一定的介绍 因为要涉及到翻页,下面的代码使用拼接的方式获取url,应用在一些没办法提取下一页链接的情况下 直…

一对一直播app源码功能操详解方案分享
一:登录页面:1.快捷登录:可以利用第三方账号进行快捷登录2.手机登录:可以让用户通过输入手机号码和密码进行登录.3.注册:可以使用手机号获取验证码注册账号二:打开一对一直播APP首页打开APP,会显…