读核日记(三)

2016-01-29 19:45 3 1 收藏

读核日记(三),读核日记(三)

【 tulaoshi.com - Linux 】

 

在linux 中每一个进程都由task_struct 数据结构来定义. task_struct就是我们通常所说的PCB.

她是对进程控制的唯一手段也是最有效的手段.

当我们调用fork() 时, 系统会为我们产生一个task_struct结构.然后从父进程,那里继承一些数据,

并把新的进程插入到进程树中, 以待进行进程管理.因此了解task_struct的结构对于我们理解任务

调度(在linux 中任务和进程是同一概念)的关键.在进行剖析task_struct的定义之前. 我们先按照

我们的理论推一下它的结构.

1, 进程状态 ,将纪录进程在等待,运行,或死锁

2, 调度信息, 由哪个调度函数调度,怎样调度等

3, 进程的通讯状况

4,因为要插入进程树,必须有联系父子兄弟的指针, 当然是task_struct型

5,时间信息, 比如计算好执行的时间, 以便cpu 分配

6,标号 ,决定改进程归属

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

7,可以读写打开的一些文件信息

8, 进程上下文和内核上下文

9,处理器上下文

10,内存信息

因为每一个PCB都是这样的, 只有这些结构, 才能满足一个进程的所有要求.

打开/include/linux/sched.h 找到task_struct 的定义

struct task_struct {

/* these are hardcoded - don't touch */

这里是一些硬件设置对程序原来说是透明的. 其中state 说明了该进程是否可以执行,

还是可中断等信息. Flage 是进程号, 在调用 fork() 时给出,addr_limit 是区分内核进程

与普通进程在内存存放的位置不同

volatile long state; /* -1 unrunnable, 0 runnable, 0 stopped */

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

unsigned long flags; /* per process flags, defined below */

int sigpending;

mm_segment_t addr_limit; /* thread address space:

0-0xBFFFFFFF for user-thead

0-0xFFFFFFFF for kernel-thread

*/

struct exec_domain *exec_domain;

long need_resched;

 

/* various fields */

count 是 计数器 priorrity 是优先级

long counter;

long priority;

cycles_t avg_slice;

/* SMP and runqueue state */

为多处理机定义的变量.

int has_cpu;

int processor;

int last_processor;

int lock_depth;

/* Lock depth. We can context switch in and out of holding a syscall kernel lock... */

为了在进程树中排序, 定义的父子,兄弟指针

struct task_struct *next_task, *prev_task;

struct tas74k_struct *next_run, *prev_run;

 

/* task state */

定义可 task 运行的状态, 以及信号

struct linux_binfmt *binfmt;

int exit_code, exit_signal;

int pdeath_signal; /* The signal sent when the parent dies */

/* 定义可进程的用户号,用户组以及进程组*/

unsigned long personality;

int dumpable:1;

int did_exec:1;

pid_t pid;

pid_t pgrp;

pid_t tty_old_pgrp;

pid_t session;

/* boolean value for session group leader */

是不是进程组的头文件

int leader;

/*

* pointers to (original) parent process, youngest child, younger sibling,

* older sibling, respectively. (p-father can be replaced with

* p-p_pptr-pid)

*/

父子进程的一些指针

struct task_struct *p_opptr, *p_pptr, *p_cptr, *p_ysptr, *p_osptr;

 

/* PID hash table linkage. */

在调度中用的一些hash 表

来源:http://www.tulaoshi.com/n/20160129/1510051.html

延伸阅读
标签: 孕前
怀孕日记--怀孕第三周        这一周,受精卵正在悄悄的分裂,在您毫不知情的情况下,大约分裂出了32个细胞。这团细胞簇此时称为桑葚胚。大约在受精后第7天,桑葚胚着床于子宫内膜中,此时您正式怀孕了!当这一细胞团发育成熟为囊胚时,母体内会发生极大的变化,包括下一次月经停止。 ...
胶囊日记怎么删除日记?   胶囊日记怎么删除日记? 胶囊日记可以删除吗?胶囊的规则是只有当天写的日记可以修改和删除。过去的都是历史,不能被改变。 只有当天可以修改删除,过了晚上12:00就不能再删除了。 等到日记本过期的时候可以查看,过期了的也不能修改删除。
标签: 健康养生
樱桃是营养价值很高的水果,不仅可以生吃,还可以制作果酱来使用。可是大家总是在去核这里犯了难,那么怎么才能快速去核呢?我马上就把方法分享给大家!   怎样轻松去除樱桃核 1.首先就是把樱桃统统洗干净,然后把樱桃把给摘掉。 2.拿一根筷子洗干净。 ...
标签: 生活常识
痔核怎么消除 痔核怎么消除 第一,患上了痔疮以后,要注意自己每天的饮食,特别是要多吃一些排毒和促进肠胃蠕动的食物,这样才能够让痔疮的症状慢慢消失。 第二,不能因为我们工作忙碌,从而忽略了对痔疮的护理,要保持清洁,卫生。 第三,要多摄取水分及纤维,便秘是造成痔疮的最大诱因,因此,为防治便秘,须多喝水及多吃富含纤...
奶酪怎么设置已读消息为未读          不小心查看了好友的消息?但是不想好友知道你查看了TA的消息?没关系,小伙伴们可以把已读消息设置为未读,现在就跟小编一起操作,看奶酪怎么设置已读消息唯爱未读。 打开奶酪,点击长按要设置为未读的消息,然后点击即可。

经验教程

649

收藏

97
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部