一、进程和PCB
进程是一个正在执行的程序。
进程是程序的一个实例。进程能分配处理器并由处理器执行的实体。
如果从内核的角度看的话:进程是分配系统资源的单位。当一个程序被加载到内存之后并为他分配一个PCB(进程控制块),这时候就称为进程了。在 Linux 中PCB就是一个名字叫做task_struct的结构体,我们叫他”进程描述符”。它里面有进程执行的所有信息,所以CPU对task_struct进行管理就相当于在对进程进行管理。
PCB叫做进程控制块,它用来维护进程相关的信息,每个进程都有一个PCB。在linux中这个PCB是一个叫做task_struct的结构体。
二、task_struct
在linux中,每一个进程都有一个进程描述符,这个”进程描述符”是一个结构体名字叫做task_struct,在task_struct里面保存了许多关于进程控制的信息。
task_struct是Linux内核的一种数据结构,它会被装载到RAM里并包含进程的信息。每个进程都把它的信息放在task_struct这个数据结构里面,而task_struct包含以下内容:
标示符:描述本进程的唯一标示符,用来区别其他进程。
状态:任务状态,退出代码,退出信号等。
优先级:相对于其他进程的优先级。
程序计数器:程序中即将被执行的下一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针。
上下文数据:进程执行时处理器的寄存器中的数据。
I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和正在被进程使用的文件列表。
记账信息:可能包括处理器时间总和,使用的时钟总数,时间限制,记账号等。
三、task_struct分类
- 调度数据成员
(1) volatile long states;
(2) unsigned long flags;
(3) long priority;
(4) unsigned long rt_priority;
(5) long counter;
(6) unsigned long policy; - 信号处理
(1) unsigned long signal;
(2) unsigned long blocked;
(3) struct signal_struct *sig; -
进程队列指针
(1) struct task_struct *next_task,*prev_task;
(2) struct task_struct *next_run,*prev_run;
(3) struct task_struct *p_opptr,*p_pptr;和struct task_struct *p_cptr,*p_ysptr,*p_osptr; -
进程标识
(1) unsigned short uid,gid;
(2) int groups[NGROUPS];
(3) unsigned short euid,egid;
(4) unsigned short fsuid,fsgid;
(5) unsigned short suid,sgid;
(6) int pid,pgrp,session;
(7) int leader; -
时间数据成员
(1) unsigned long timeout;
(2) unsigned long it_real_value,it_real_iner;
(3) struct timer_list real_timer;
(4) unsigned long it_virt_value,it_virt_incr;
(5) unsigned long it_prof_value,it_prof_incr;
(6) long utime,stime,cutime,cstime,start_time; -
信号量数据成员
(1) struct sem_undo *semundo;
(2) struct sem_queue *semsleeping; -
进程上下文环境
(1) struct desc_struct *ldt;
(2) struct thread_struct tss;
(3) unsigned long saved_kernel_stack;
(4) unsigned long kernel_stack_page; -
文件系统数据成员
(1) struct fs_struct *fs;
(2) struct files_struct *files;
(3) int link_count; -
内存数据成员
(1) struct mm_struct *mm; -
页面管理
(1) int swappable:1;
(2) unsigned long swap_address;
(3) unsigned long min_flt,maj_flt;
(4) unsigned long nswap;
(5) unsigned long cmin_flt,cmaj_flt,cnswap;
(6) unsigned long old_maj_flt,dec_flt;
(7) unsigned long swap_cnt; -
支持对称多处理器方式(SMP)时的数据成员
(1) int processor;
(2) int last_processor;
(3) int lock_depth; -
其它数据成员
(1) unsigned short used_math;
(2) char comm[16];
(3) struct rlimit rlim[RLIM_NLIMITS];
(4) int errno;
(5) long debugreg[8];
(6) struct exec_domain *exec_domain;
(7) unsigned long personality;
(8) struct linux_binfmt *binfmt;
(9) int exit_code,exit_signal;
(10) int dumpable:1;
(11) int did_exec:1;
(12) int tty_old_pgrp;
(13) struct tty_struct *tty;
(14) struct wait_queue *wait_chldexit; -
进程队列的全局变量
(1) current;
(2) struct task_struct init_task;
(3) struct task_struct *task[NR_TASKS];
(4) unsigned long volatile jiffies;
(5) int need_resched;
(6) unsigned long intr_count;
Sunnylunch-blog
Sunnylunch-blog
Sunnylunch-blog
Sunnylunch-blog