首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
深入学习LINUX内核之七(图文讲解)
来源:http://www.unix5.com 作者:riechelr_hl 发布时间:2008-04-15  


5.7.1 任务资料结构

內核程式透过行程表对行程进行程管理,每个行程在行程表中佔有一项。在Linux系统中,行程表项是一个task_struct任务结构指标。任务资料结构定义在标头档include/linux/sched.h中。有写书上称其为行程控制块PCB(Process Control Block)或行程描述符PD (Processor Descriptor) 。其中保存著用于控制和管理行程的所有信息。主要包括当前执行的状态信息、信号、行程号、父行程号、执行时间累计值、正在使用的档案和本任务的区域描述符以及任务状态段信息。该结构每个栏位的具体含义如下所示。


};


■ long state栏位含有行程的当前状态代号。如果行程正在等待使用CPU或者行程正被执行,那麼state的值是TASK_RUNNING。如果行程正在等待某一事件的发生因而处於空閒状态,那麼state的值就是TASK_INTERRUPTIBLE或者TASK_UNINTERRUPTIBLE。这两个值含义区別在于处于TASK_INTERRUPTIBLE状态的行程能夠被信号喚醒並啟动,而处於TASK_UNINTERRUPTIBLE状态的行程则通常是在直接或间接地等待硬件条件的满足因而不会接受任何信号。TASK_STOPPED状态用於說明一个行程正处於停止状态。例如行程在收到一个相关信号时(例如SIGSTOP、SIGTTIN或SIGTTOU等)或者当行程被另一个行程使用ptrace系统呼叫监控並且控制权在监控行程中时。TASK_ZOMBIE状态用於描述一个行程已经被终止,但其任务资料结构项仍然存在於任务结构表中。一个行程在这些状态之间的转換过程见下面說明。

■ long counter栏位保存著行程在被暂时停止本次执行之前还能执行的时间滴答数,即在正常情況下还需要经过几个系统时钟周期才切換到另一个行程。调度程式会使用行程的counter值来选择下一个要执行的行程,因此counter可以看作是一个行程的动态特性。在一个行程刚被建立时counter的初值等於priority。

■ long priority用於给counter代入初始值。在Linux0.12中这个初值为15个系统时钟週期时间(15个滴答)。当需要时调度程式会使用priority的值为counter代入一个初值,参见sched.c程式和fork.c程式。当然,priority的单位也是时间滴答数。

■ long signal栏位是行程当前所收到信号的点阵图,共32个Bit位,每个Bit位元代表一种信号,信号值二位元偏移值 +l。因此Linux內核最多有32个信号。在每个系统呼叫处理过程的最后,系统会使用该信号点阵图对信号进行预处理。

■ struct sigaction sigaction [32]结构阵列用来保存处理各信号所使用的操作和属性。阵列的每一项对应一个信号。

■ long blocked栏位是行程当前不想处理的信号阻塞点阵图。与signal栏位类似,其每一Bit位代表一种被阻塞的信号。

■ int exit栏位是用来保存程式终止时的退出码。在子行程结束后父行程可以查询它的这个退出码。

■ unsigned long start_code栏位是行程代码在线性空间中的开始位址。

■ unsigned long end_code栏位保存著行程代码的位元组长度值。

■ unsigned long end_data栏位保存著行程的代码长度 + 资料长度的总位元组长度值。

■ unsigned long brk栏位也是行程代码和资料的总位元组长度值(指标值) ,但是还包括未初始化的的资料区bss,参见图13-6。这是brk在一个行程开始执行时內初值。透过修改这个指标,內核可以为行程添加和释放动态分配的记忆体。这通常是透过呼叫malloc( )函数並透过brk系统呼叫由內核进行操作。

■ unsigned long start_stack栏位值指向行程逻位址空间中堆栈的起始处。同樣请参寻图13-6中的堆栈指标位置。

■ long pid是行程标识号,即行程号。它被用来唯一地标识行程。

■ long pgrp是指行程所属行程群组号。

■ long session是行程的会话号,即所属会话的行程好。

■ long leader是会话首行程号。有关行程群组和会话的概念请参见第7章程序列表后的說明。

■ int groups[NGROUPS]是行程所属各个组的群组号阵列。一个行程可属於多个组。

■ task_struct *p_pptr是指向父行程任务结构的指标。

■ task_struct *p_cptr是指向最新子行程任务结构 旨标o

■ task_struct *p_ysptr是指向比自己后建立的相邻行程的指标。

■ task_struct *p_osptr是指向比自己早建立的相邻行程的指标。以上4个指标的关系参见图5-20所示。在Linux 0.11內核的任务数据结构中专门有一个父行程号栏位彻father,但是0.12內核中已经不用。此时我们可以使用行程的pptr->pid来取得父行程的行程号。






■ unsigned short uid是拥有该行程的用戶标识号(用戶id)。

■ unsigned short euid是有效用戶标识号,用于指明存取档的权力。

■ unsigned short suid是保存的用戶标识号。当执行档的设置用戶ID标志。
(set-user-ID)置位元时,suid中保存著执行档的uido。否则suid等於行程的euid。

■ unsigned short gid是用戶所属组标识号(组id)。指明了拥有该行程的用戶群组。

■ unsigned short egid是有效群组标识号,用于指明该群组用戶存取档的许可权。

■ unsigned short sgid是保存的用戶组标识号。当执行档的设置组ID旗标(set-group-ID)置位元时,sgid中保存着执行档的gid。否则sgid等於行程的egid。有关这些用戶号和群组号的描述请参第5章sys.c程式前的概述。

■ long timeout內核定时超时值。

■ long alarm是行程的报警定时值(滴答数) 主系统定时中断中会递減该值。当使用系统呼叫alarm( ) (sched.c第338行) 设置了该值后(参数是以秒为单位,但在保存到alarm栏位中之前內核会把它转换为系统滴答数),那麼在经过了指定的秒数后,该值递減为0,此时系统就会向该行程发送一个SIGALRM信号,预设时该信号会终止程式的执行。当然也可以使用信号捕捉函数(signal( )或signal ())来捕捉该信号进行指定的操作。

■ long utime是累计行程在用戶态执行的时间(滴答数)。

■ long stime是累计行程在系统态(內核态) 执行的时间 (滴答数)。
共12页: 上一页 [1] [2] 3 [4] [5] [6] [7] [8] [9] [10] [11] [12] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
  相关文章
·深入学习LINUX内核之六(图文讲解
·深入学习LINUX内核之五(图文讲解
·深入学习LINUX内核之四(图文讲解
·Linux系统内核漏洞分析
·深入学习LINUX内核之三(图文讲解
·如何在Linux内核中的实现SYN Coo
·深入学习LINUX内核之二(图文讲解
·简析Linux与FreeBSD的syscall
·深入学习Linux内核文档一(图文讲
·Linux操作系统“警惕”内核汉化
·Linux操作系统核心的汉字显示机
·如何利用异常表处理Linux内核态

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!