进程数据结构(进程描述符)
直接查看下源码(这里是0.11版本的内核)中的文件/include/linux/sched.h,Linux的进程控制块为一个由结构task_struct所定义的数据结构,这个结构就在上面的sched.h中。这个文件中有一行代码:
extern struct task_struct *task[NR_TASKS];
为记录指向各PCB的指针,指针数组定义于/kernel/sched.c中,原定义为
struct task_struct * task[NR_TASKS] = {&(init_task.task), };
NR_TASKS为最多可以同时运行的进程的数目,在sched.h中定义(#define NR_TASKS 64)。
task_struct结构的内容如下(为了写注释有改动,像unsigned long start_code,end_code,end_data,brk,start_stack;会展开成多行写):
struct task_struct {
/* these are hardcoded - don't touch */
long state; /* -1 unrunnable, 0 runnable(就绪), >0 stopped */
long counter; //任务运行时间片
long priority;
long signal; //信号。每个比特代表一种信号。
struct sigaction sigaction[32];
long blocked; /* bitmap of masked signals 进程信号屏蔽码*/
/* various fields */
int exit_code; //退出码,父进程会取得
unsigned long start_code; //代码段地址
unsigned long end_code; //代码长度(字节数)
unsigned long end_data; //代码长度+数据长度(字节数)
unsigned long brk; //总长度
unsigned long start_stack; //堆栈段地址
long pid,father,pgrp,session,leader; //进程、父进程、进程组、会话、会话首进程号
unsigned short uid,euid,suid; //用户id、有效用户id、保存的用户id
unsigned short gid,egid,sgid; //组id、有效组id,保存的组id
long alarm; //闹钟定时
long utime,stime,cutime,cstime,start_time; //用户态(系统态)运行时间、子进程用户态(系统太)
unsigned short used_math; //是否使用了协处理器
/* file system info */
int tty; //进程使用tty的子设备号,-1标识没有使用
unsigned short umask; //文件创建屏蔽字
struct m_inode * pwd; //当前工作目录i节点结构
struct m_inode * root; //根节点i节点结构
struct m_inode * executable; //执行文件i节点结构
unsigned long close_on_exec; //执行时关闭文件句柄位图标志
struct file * filp[NR_OPEN]; //进程使用的文件表结构
/* ldt for this task 0 - zero 1 - cs 2 - ds&ss */
struct desc_struct ldt[3]; //本任务的局部表描述符。0-空,1-代码段cs,2&#