读核日记(三)

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,标号 ,决定改进程归属

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 */

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;

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

 

/* various fields */

count 是 计数器 priorrity 是优先级

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

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 表

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

延伸阅读
记记日记怎么导出日记   在记记(图老师整理)日记里面添加了日记想要导出手机?很多小伙伴是新手不知道怎么导出日记?不知道怎么导出日记的话就跟图老师小编一起操作吧,看记记日记怎么导出日记。 1)打开记记日记,点击右下角的,然后点击下方的;(如下图) 2)点击下方的,接着点击即可。(如下图) 记记日记怎...
奶酪怎么设置已读消息为未读          不小心查看了好友的消息?但是不想好友知道你查看了TA的消息?没关系,小伙伴们可以把已读消息设置为未读,现在就跟小编一起操作,看奶酪怎么设置已读消息唯爱未读。 打开奶酪,点击长按要设置为未读的消息,然后点击即可。
标签: 山楂
山楂去核妙招1:小钢管 1.工具最好找一个跟山楂头大小一样的白钢管,留意生活中到处都能看到,10公分就够了,留着可以一劳永逸。如果实在是没有的话就用钢笔帽或者碳素笔、油笔管代替也可,但是效果不是很好,稍费力些。 2.首先洗净山楂,用钢管挖去山楂头部黑色的部分。 3.摘掉山楂蒂。 4.右手用力握住山楂,左手从底部向头部用力捅,就...
/* Readfile.java 读取文件的内容,并将原样输出至屏幕上 使用方法:java Readfile 文件名 */ import java.io.*; public class Readfile { public static void main(String[] args) { byte[] buff = new byte[1024]; boolean cont = true; FileInputStream infile = null; // 生成对象infile 准备读取文件 try { infile = new FileInputSt...
一、以前的dos版要读、写、格式化第0轨的第1个磁区,程式大致如下: char buffer[512]; reg.x.dx=0 ;  /* for drive a * reg.x.cx=0x0001 /* for boot sector */ reg.x.bx=fp_off(buffer); sreg.es=fp_seg(buffer); resg.x.ax=0x0201;  /* 02 for read, 03 for write ,05 for format */ int86x(0x13,&reg,&reg...

经验教程

618

收藏

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