您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 四川大学linux第4章unix进程管理及进程通信
第4章Linux进程管理及进程通信刘循4.1Linux进程及描述4.1.1Linux系统中的进程•Linux操作系统是多进程并发环境,进程和进程之间的关系呈现为多级结构,如图4.1所示。loggerupdatecronlpschedgeety…root(进程0)init(进程1)swapper(对换进程)shellshellshell图4.1进程多级结构关系4.1Linux进程及描述•最上层的进程是系统的根进程,也称为0进程,是系统所有进程的起点,在系统引导时创建。根进程通过系统函数调用fork创建初始化进程(init进程,也称为1进程)。跟进程在创建初始化进程之后,变为对换进程(swapper)存在,其功能为完成内存与外存之间的进程对换工作。•初始化进程通过系统函数调用fork创建一系列的系统进程,如logger、update、cron、lpsched、getty进程等。这些进程长期运行在系统中,被称为驻守进程(daemon进程)。如果系统承担网络服务功能,则还需包含网络服务进程,如httpd、sendmail、ftp等。getty进程负责用户登录,监视每个终端上的用户注册情况。当用户登录进入系统后,便生成相应的子进程,即shell进程。4.1Linux进程及描述•所有进程都会生成一个或多个子进程。除根进程之外,所有进程都有一个父进程。•为了管理方便,Linux操作系统给每个进程分配一个唯一的进程标识符pid。操作系统通过进程标识符管理进程。•无论何时,当用户注册登录后,系统为用户创建一个shell进程(即用户的loginshell),键入一个命令或执行一个程序时,shell进程会产生一个相应的子进程;在子进程中还可以创建子进程,待用户退出(exit)后,又把控制权还给shell进程。•进程拥有者的标识符为进程的用户标识符。用户标识符反映了用户在系统中的地位,决定了用户进程的各种特权,如进程对文件的存取权限等。子进程会继承父进程的用户标识符。4.1Linux进程及描述•所有进程都会生成一个或多个子进程。除根进程之外,所有进程都有一个父进程。•为了管理方便,Linux操作系统给每个进程分配一个唯一的进程标识符pid。操作系统通过进程标识符管理进程。•无论何时,当用户注册登录后,系统为用户创建一个shell进程(即用户的loginshell),键入一个命令或执行一个程序时,shell进程会产生一个相应的子进程;在子进程中还可以创建子进程,待用户退出(exit)后,又把控制权还给shell进程。•进程拥有者的标识符为进程的用户标识符。用户标识符反映了用户在系统中的地位,决定了用户进程的各种特权,如进程对文件的存取权限等。子进程会继承父进程的用户标识符。4.1Linux进程及描述•如果进程的拥有者和进程运行所对应的代码文件拥有者具有相同的用户标识符,则称该用户标识符为有效用户标识符。•直接从终端读写的进程为前台进程,正在运行却又无法直接从终端读写的进程为后台进程。任何时候,一个终端只有一个前台进程但可以拥有多个后台进程。•如果要调度一个进程在后台进程运行,运行时在执行的程序名后加“&”(注意:程序名和符号“&”之间需要有空格),如:•$./httpd&•表示启动进程httpd在后台运行。4.1.2进程状态及其转换54可中断睡眠(interruptible)不可中断睡眠(uninterruptible)76僵死(zombie)停止(stopped)终止终止123就绪(running)核心态运行(running)用户态运行(running)调度返回系统函数调用或中断睡眠睡眠唤醒唤醒中断图4.2Linux进程状态及转换4.1.2进程状态及其转换Linux操作系统采用如下的进程状态描述进程的动态过程:(1)就绪(Running):进程处于预备运行状态,等待系统分配处理器;(2)核心态运行(Running):进程运行在操作系统核心空间。在用户程序中如果有系统函数调用,则进程状态会从用户态执行转入核心态执行。任何一个进程都不可能抢占一个处于核心态执行的进程,除非处于核心态执行的进程正从核心态到用户态切换;(3)用户态运行(Running):进程运行在用户空间。处于用户态运行的进程可被抢占;(4)可中断睡眠(interruptible):由于进程CPU运行时发生了需要等待I/O事件或进程通信时需要相互配合而等待,此时,进程会在内存中处于一种相对静止状态。如果等待的事件已经完成,此时进程可被唤醒,被唤醒后的进程转入内存就绪状态;4.1.2进程状态及其转换(5)不可中断睡眠(uninterruptible):进程在内存中处于一种相对静止状态,此时进程不会被唤醒。产生不可中断睡眠的原因一般是睡眠进程还未进入睡眠,而唤醒它的进程的唤醒操作已经发生。由于错过了唤醒操作,当睡眠进程进入睡眠后则不能唤醒了。不可中断睡眠状态较少使用,可用于进程必须等待时。(6)僵死(zombie):由于父进程死亡而被终止的进程,虽然进程已经死亡,但没有释放系统资源,如没有释放内存和task_struct结构等,所以被称为处于僵死状态。如果系统中处于僵死状态的进程很多,则会引发系统资源短缺问题。用命令“ps–el”可查看进程状态,如果进程状态标识是Z,则进程处于僵死状态。有些处于僵死状态的进程,用命令“kill-9”也不能杀死。例如,如果系统在shutdown时,屏幕显示信息:someprocesswouldn’tdie。则表明系统中存在不能被reboot发出的“kill–9”杀掉的进程,这些进程很可能处于僵死状态;4.1.2进程状态及其转换(7)停止(stopped):进程被停止。如果进程接收到信号,如信号SIGSTOP或SIGTSTP等时,进程则进入停止状态。正在被调试的进程可能处于停止状态。当停止状态的进程接收到SIGCONT信号之后,将再次成为可运行进程。通常,将处于内核态运行和用户态运行的进程状态统一称为进程的运行态。4.1.2进程状态及其转换4.1.3进程映像与进程上下文•一个程序经过编译和链接之后,成为可执行文件。操作系统核心将可执行文件作为进程的实体装入内存时,进程实体分为正文段、数据段和堆栈段。•正文段由程序中的代码构成;•数据段由程序运行所用到的数据构成;•堆栈段由函数调用传递参数、保留现场、存放返回地址和局部变量构成。在程序运行过程中,堆栈段由操作系统创建并不断刷新。堆栈段分为核心堆栈和用户堆栈两种。核心堆栈为进程在核心态下运行的工作区;用户堆栈为进程在用户态下运行的工作区。4.1.2进程状态及其转换•进程控制块分为常驻内存和非常驻内存两部分。•常驻内存部分为进程描述符,非常驻内存部分为USER区,也称为U区。进程描述符可由核心访问,U区只能由在核心态运行的进程访问。•每个进程都有一个U区。为了便于访问U区,操作系统会用一个固定的虚地址对应U区。内核将正处于核心态运行进程的U区地址映射到该固定虚地址上。•虽然每个进程都有U区,不同进程的U区有不同的地址,但是,内核每次都将正在核心态下运行的进程的U区映射到固定的地址,进程访问U区总可以用相同的地址。4.1.2进程状态及其转换U区中的主要信息有:(1)与进程对应的用户标识符;(2)记录进程已打开文件的文件描述符;(3)描述进程位于文件系统的当前目录和根目录;(4)具有系统函数调用结果的返回值字段和出错字段;(5)记录进程与子进程在用户态和核心态运行时的时间;(6)各种输入/输出参数,如进程要读写的数据量、用户地址空间中的数据地址、读写文件的字节数、读写方式、缓冲区长度及地址等;(7)限制进程大小的字段及限制进程读写文件大小的字段;(8)对进程所创建的所有文件设置的许可权方式字段的屏蔽模式;(9)指向进程表的指针。4.1.2进程状态及其转换•进程上下文是进程的环境,当一个进程在执行时,可以看成系统在进程的上下文中执行。通常把进程上下文理解为进程映像,进程切换被认为是进程上下文的切换。•进程上下文由用户级上下文、寄存器上下文和系统级上下文组成。•用户级上下文由进程的正文、数据、用户栈和共享存储区组成,占据进程的虚地址空间。•寄存器上下文由程序计数器、处理器状态寄存器、栈指针和通用寄存器组成。•系统级上下文由进程表表项(进程描述符)、正在核心态运行进程的U区、进程区表表项和区表、页表、核心栈。4.1.2进程状态及其转换4.1.4进程描述符与进程表进程描述符是Linux系统用于描述进程的数据结构,是操作系统管理进程最重要的依据。进程描述符包含的信息可以归纳为以下几大类:4.1.2进程状态及其转换1.进程的运行信息•进程标示信息进程的标识符(pid);进程的父进程标识符(ppid);进程的父进程组标识符(pgrp);进程的会话号(session);进程的会话头(leader);进程的用户标识符(uid);进程的有效用户标识符(euid);进程保存的用户标识符(suid);进程的用户组标识符(gid);进程的有效组标识符(egid);进程的保存组标识符(sgid);4.1.2进程状态及其转换•进程状态描述在include/linux/sched.h中,将进程的状态描述具体化:TASK_RUNNING为0;TASK_INTERRUPTIBLE为1;TASK_UNINTERRUPTIBLE为2;TASK_STOPPED为4;TASK_ZOMBIE为8;TASK_DEAD为16。当进程的状态描述为-1时,表示进程不可运行。4.1.2进程状态及其转换•进程在内存中的分布信息:进程的代码段地址(start_code);进程的代码段长度(end_code,字节数);进程的代码长度加进程的数据段长度(end_data,字节数);进程的总长度(brk,字节数);进程的堆栈段地址(start_stack);进程运行时间片递减计数(counter);进程运行优先数(priority:数字越大优先级越低);发送和接收信号的信号位图(signal),每个比特位代表一种信号;信号将要执行的操作和标志信息结构(sigaction[32]);进程信号屏蔽码(blocked);进程执行停止的退出码,由停止进程的父进程收取(exit_code);4.1.2进程状态及其转换2.进程的时间信息报警定时时间(alarm);用户态运行时间(utime);系统态运行时间(stime);子进程用户态运行时间(cutime);子进程系统态运行时间(cstime);进程开始运行时刻(start_time);4.1.2进程状态及其转换3.进程运行的部分硬件设备信息进程使用协处理器标志(used_math:是,否);进程使用终端设备号(tty:-1表示没有使用);进程的文件系统信息;文件创建属性屏蔽位(umask);当前工作目录i节点结构(m_inode*pwd);根目录i节点结构(m_inode*root);执行文件i节点结构(m_inode*executable);执行时关闭文件句柄位图标志(close_on_exe);文件结构指针表(file*filp[NR_OPEN],表项号为文件描述符值,最多32项);4.1.2进程状态及其转换4.进程局部信息进程的局部描述符表(desc_structldt[3]:空null为0,代码段cs为1,数据和堆栈段ds&ss为2);进程状态段信息结构(tss_structtss);4.1.2进程状态及其转换例在linux0.11版本中,进程描述符用结构(task_struct)表示,在文件linux\sched.h中定义,其源代码如下:structtask_struct{longstate;longcounter;longpriority;longsignal;structsigactionsigaction[32];longblocked;intexit_code;unsignedlongstart_code;unsignedlongend_code;unsignedlongend_data;unsignedlongb
本文标题:四川大学linux第4章unix进程管理及进程通信
链接地址:https://www.777doc.com/doc-315002 .html