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


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

■ long cstime是累计行程的子行程內核态执行的时间 (滴答数)。

■ struct start_time是行程生成並开始执行的时刻。

■ struct rlimit rlim[RLIM NLIMITS] 行程资源使用统计阵列。

■ unsigned int flags各行程的标志,0.12內核还未使用。

■ unsigned short used_math是一个标志,指明本行程是否使用了辅助运算器。

■ int tty是行程使用tty终端的子装置号。-1 表示沒有使用。

■ unsigned short umask是行程建立新档时所用的属性遮罩位元,即新建档所设置的存取属性。

■ struct m_inode * pwd是行程的当前工作目录 i节点结构。每个行程都有一个当前工作目錄,用於解析相对路径名,並且可以使用系统呼叫chdir来改变之。

■ struct m_inode * root是行程自己的根目錄 i点节结构。每个行程都可有自己指定的根目錄,用於解析絕对路径名。只有超级用户能透过系统呼叫chroot来修改这个根目錄。

■ struct m_inode * executable是行程执行的执行档在记忆体中i节点结构指标。系统可根据该栏位来判断系统中是否还有另一个行程在执行同一个执行档。如果有的话那麼这个记忆体中i节点参照计数值executable ->i_count会大於1在行程被建立时该栏位被赋予和父行程同一栏位相同的值,即表示正在与父行程执行同一个程式。当在行程中呼叫cxec( )类函数而去执行一个指定的执行档时,该栏位值就会被替換成exec( ) 函数所执行程式的记忆体i节点指标。当行程呼叫exit( )函数而执行退出处理时该栏位所指记忆体i节点的参照引用计数会被減l,並且该栏位将被置空。该栏位的主要作用体现存memory.c程式的share_page()函数中。该函数代码根据行程的executable所指节点的引用计数可判断系统中当前执行的程式是否有多个拷贝存在(起码2个)。若是的话则在他们之间尝试页面共用操作。

■ 在系统初始化时,在第1次呼叫执行execve()牧之前,系统建立的所有任务的executable都是0。这些任务包括任务0、任务1以及任务1直接建立的沒有执行过execve( )的所有任务,即代码直接包含在内核码中的所有任务的executable都是0。因为任务0的代码包含在內核代码中,它不是由系统从档案系统上载入执行的执行档,因此內核代码中固定设置它的executable值为0。另外,建立新行程时,fork( )会复制父行程的任务资料结构,因此任务1的executable也是0。但在执行了exccve( )之后,executable就被赋予了被执行档的记忆体i节点的指标,此后所有任务的该值就均不会为0 了。

■ unsigned long close_on_exec是一个行程档案描述符(档案控制码)点阵图标志。每个Bit位代表一个档案描述符,用於确定在系统呼叫execvc( )时需要关闭的档案描述符(参见include/fcntl.h)。当一个程式使用fork( )函数建立了一个子行程时,通常会在该子行程中呼叫execve( )函数戴入执行另一个新程式。此时子行程将完全被新程式替換掉,並在子行程中开始执行新程式,若一个档案描述符在close_on_exec中的对应Bit位元是置位元状态,那麼在子行程执行execve( )呼叫时对应打开着的档案描述符将被关闭,即在新行程中该档案描述符被关闭。否则该档案描述符将始终处於打开状态。

■ struct file * filp[NR_OPEN]是行程使用的所有打开档的档案结构指标表,最多32项。档案描述符的值即是该结构中的索引值。其中每一项用於档案描述符定位档指标和存取档。

■ struct desc_struct ldt[3]是该行程区域描述符表结构。定义了该任务在虛拟位址空间中的代码段和资料段。其中阵列项0是空项,项l是代码段描述符,项2是资料段(包含数据和堆栈)描述符。

■ struct tss_struct tss是行程的任务状态段TSS(Task State Segment)资讯结构。在任务从执行中被切換出时tss_struct结构保存了当前处理器的所有寄存器值。当任务又被CPU重新执行时,CPU就会利用这些值恢复到任务被切換出时的状态,並开始执行。

当一个行程在执行时,CPU的所有寄存器中的值、行程的状态以及堆栈中的內容被称为该行程的上下文。当內核需要切換( switch)至另一个行程时,它就需要保存当前行程的所有状态,也即保存当前行程的上下文,以便在再次执行该行程时,能夠恢复到切換时的状态执行下去。在Linux中,当前行程上下文均保存在行程的任务资料结构中。在发生中断时,內核就在被中断行程的上下文中,在內核态下执行中断服务常式。但同时会保留所有要用到的资源,以便中断服务结束时能够恢复被中断行程的执行。


5.7.2 行程执行状态

一个程在其生存期內,可处於一组不同的状态下,称为行程状态。见图5-21所示。行程状态保存在行程任务结构的state栏位中。当行程正在等待系统中的资源而处于等待状态时,则称其处於睡眠等待状态,在Linux系统中,睡眠等待状态被分为可中断的和不可中断的等待状态。






执行状态 (TASK_RUNNING)
当行程正在被CPU执行,或已经準备就绪随时可由调度程式执行,则称该行程为处于执行状态(running)。若此时行程沒有被CPU执行,则称其处於就绪执行状态。见图5-21中三个标号为0的状态,行程可以在內核态执行,也可以在用戶态执行。当一个行程在內核代码中执行时,我们称其处於內核执行态,或简称为内核态;当一个行程正在执行用戶自己的代码时,我们称其为处於用戶执行态(用戶态)。当系统资源已经可用时,行程就被喚醒而进入準备执行状态,该状态称为就绪态。这些状态(图中中间一列)在内核中表示方法相同,都被成
为处於TASK_RUNNING状态。当一个新行程刚被建立出后就处於本状态中(最下一个0处)。

可中断睡眠状态 (TASK_INTERRUPTIBLE)

当行程处於可中断等待(睡眠)状态时,系统不会调度该行程执行。当系统產生一个中断或者释放了行程正在等待的资源,或者行程收到一个信号,都可以喚醒行程转換到就绪状态(执行状态)。

不可中断睡眠状态 (TASK_UNINTERRUPTIBLE)

除了不会因为收到信号而被喚醒,该状态与可中断睡眠状态类似。但处於该状态的行程只有被使用wake_up( )函数明确喚醒时才能转換到可执行的就绪状态,该状态通常在行程需要不受干扰地等待或者所等待事件会很快发生时使用。
共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
转载本站内容请注明原作者名.谢谢!