Linux中的进程描述符

来源:互联网 发布:软件专业有哪些课程 编辑:程序博客网 时间:2024/06/04 18:28

一、进程和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. 调度数据成员 
    (1) volatile long states; 
    (2) unsigned long flags; 
    (3) long priority; 
    (4) unsigned long rt_priority; 
    (5) long counter; 
    (6) unsigned long policy;
  2. 信号处理 
    (1) unsigned long signal; 
    (2) unsigned long blocked; 
    (3) struct signal_struct *sig;
  3. 进程队列指针 
    (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;

  4. 进程标识 
    (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;

  5. 时间数据成员 
    (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;

  6. 信号量数据成员 
    (1) struct sem_undo *semundo; 
    (2) struct sem_queue *semsleeping;

  7. 进程上下文环境 
    (1) struct desc_struct *ldt; 
    (2) struct thread_struct tss; 
    (3) unsigned long saved_kernel_stack; 
    (4) unsigned long kernel_stack_page;

  8. 文件系统数据成员 
    (1) struct fs_struct *fs; 
    (2) struct files_struct *files; 
    (3) int link_count;

  9. 内存数据成员 
    (1) struct mm_struct *mm;

  10. 页面管理 
    (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;

  11. 支持对称多处理器方式(SMP)时的数据成员 
    (1) int processor; 
    (2) int last_processor; 
    (3) int lock_depth;

  12. 其它数据成员 
    (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;

  13. 进程队列的全局变量 
    (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

Sunnylunch-blog


0 0
原创粉丝点击