Linux原理及应用.ppt
《Linux原理及应用.ppt》由会员分享,可在线阅读,更多相关《Linux原理及应用.ppt(65页珍藏版)》请在三一办公上搜索。
1、LINUX原理及应用,武汉大学计算机学院 郑鹏,第2章 Linux进程管理,程序是为了完成某种任务而设计的软件,是存储在磁盘上包含可执行的机器指令和数据的静态实体。进程是一个程序的一次执行的过程,在操作系统中执行特定的任务,是一个随执行过程不断变化的实体。进程是Linux系统中基本的调度单位。进程具有独立的权限与职责,如果系统中某个进程崩溃,它不会影响到其余的进程。每个进程运行在其各自的虚拟地址空间中,通过内核控制下的通信机制,它们之间才能发生联系。进程在生命期内将使用系统中的资源。它利用系统中的CPU来执行指令,用物理内存来放置指令和数据。使用文件系统提供的功能打开并使用文件,同时直接或者间
2、接地使用物理设备。,2.1 Linux进程,在Linux系统中,进程被称为任务。进程存在于系统的内存之中,是操作系统可感知、可控制的动态实体。Linux的进程在处理机上运行时,处理机提供了两种不同的执行状态:内核态(kernel mode)用户态(user mode),2.1 Linux进程,内核态又称系统态,它具有较高的特权,能执行所有的机器指令,能访问所有的寄存器和存储区域,能直接控制所有的系统资源。Linux在执行内核程序时是处于内核态下。用户态是进程的普通执行状态,在用户态下进程具有较低的特权,只能执行规定的机器指令,不能执行特权指令。进程在用户态下只能访问进程的存储空间。在用户态下进
3、程不能与系统硬件相互作用,不能访问系统资源。在I386结构中,内核态的特权级为0,用户态的特权级为3。,2.1 Linux进程,存放在磁盘上的可执行文件的代码和数据的集合称为可执行映象(Executable Image)。当它被装入系统中运行时,它就形成了一个进程。Linux进程是由三部分组成:(1)正文段(text):存放程序代码的数据,假如机器中有数个进程运行相同的一个程序,那么它们就可以使用相同的正文段,正文段具有只读的属性。(2)用户数据段(user segment):是进程在运行过程中处理数据的集合,它们是进程直接进行操作的所有数据(包括全部变量在内),以及进程使用的进程堆栈。(3)
4、系统数据段(system segment):存放着进程的控制信息,即进程控制块(PCB),它存放了程序的运行环境。Linux中进程控制块PCB是名字为task_struct的数据结构,它称为任务结构体。任务结构体是进程存在的唯一标志。,2.1 Linux进程,系统为每个进程分配一个独立的虚拟地址空间。进程的虚拟地址空间被分做两个部分:用户空间。用户进程本身的程序和数据(可执行映象)映射到用户空间中。系统空间。内核被映射到所有进程的系统空间中。它们只允许在具有较高特权的内核态下访问。进程运行在特权较低的用户态下时,不允许它直接访问系统空间。进程只能通过系统调用(system call)转换为内核
5、态后,才能访问系统空间。一个进程在运行过程中,总是在两种执行状态之间不断地转换。,2.1 Linux进程,进程上下文:系统提供给进程的处于动态变化的运行环境总和。系统中的每一个进程都有它自己的上下文。Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。(1)交互进程由一个Shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。(2)批处理进程这种进程和终端没有联系,是一个进程序列。(3)守护进程Linux系统启动时启动的进程,并在后台运行。,2.2 描述进程的数据结构,Linux的进程控制块用任务结构体task_struct描述。Linux在内核空间专门开辟一个指
6、针数组task,该数组的每一个元素是一个指向任务结构体的指针,所以task数组又称为task向量。将所有进程控制块task_struct的指针存储在task数组中,以便有效地管理。task数组大小限制了系统并发执行的进程总数,而物理内存的大小决定了系统中的最大进程数。在版本中,每个task_struct结构占1680字节。,2.2 描述进程的数据结构,task_struct容纳了一个进程的所有信息,我们主要对如下几个方面的信息进行介绍。(1)进程的状态和标志信息(2)进程的调度信息(3)进程的标识信息(4)进程间通信信息(5)进程的家族关系(6)时间和定时信息(7)文件系统信息(8)存储管理信
7、息(9)CPU现场保留信息,进程的状态和标志信息,进程的状态和标志信息,1state项task_struct中的state项表示进程当前的状态。Linux系统的不同版本,其进程也略有不同。,进程的状态和标志信息,Linux系统版本)进程状态表,进程的状态和标志信息,Linux系统(2.6版本)进程状态表,进程的状态和标志信息,TASK_RUNNING:进程当前正在运行,或正在运行队列中等待调度。TASK_INTERRUPTIBLE:进程处于睡眠状态,正在等待某些事件发生。进程可以被信号中断。接收到信号或被显式的唤醒之后,进程将转换为TASK_RUNNING状态。TASK_UNINTERRUPT
8、IBLE:此进程状态类似于TASK_INTERRUPTIBLE,只是它不会处理信号。中断处于这种状态的进程是不合适的,因为它可能正在完成某些重要的任务。当它所等待的事件发生时,进程将被显式地唤醒。TASK_STOPPED:进程已中止执行,它没有运行,并且不能运行。接收到 SIGSTOP 和 SIGTSTP 等信号时,进程将进入这种状态。接收到 SIGCONT 信号之后,进程将再次变得可运行。TASK_TRACED:正被调试程序等其他进程监控时,进程将进入这种状态。EXIT_ZOMBIE:进程已终止,它正等待其父进程收集关于它的一些统计信息。EXIT_DEAD:最终状态(正如其名)。将进程从系统
9、中删除时,它将进入此状态,因为其父进程已经通过 wait4()或 waitpid()调用收集了所有统计信息。,进程的状态和标志信息,进程状态转换,进程的状态和标志信息,2flags项task_struct中的flags项表示进程的标志。,进程的调度信息,进程的类别、调度策略、优先级等调度属性反映了进程的调度信息。task_struct中的policy、priority、rt_priority、counter、nice等项与进程调度有关。policy表示进程的进程调度策略,可以通过系统调用sys_sched_setscheduler()更改(kernel/sched.c)。Linux操作系统采用
10、的调度策略见下表。,进程的调度信息,priority表示进程优先级,其值给出了进程每次获取CPU后,可使用的时间(按jiffies计)。rt_priority给出实时进程的优先级,rt_priority+1000给出进程每次获取CPU后,可使用的时间(同样按jiffies计)。在轮转法(round robin)调度时表示进程当前还可运行多久。在进程开始运行时被赋为priority的值,以后每隔一个tick(时钟中断)递减1,减到0时引起新一轮调度。重新调度将从run-queue队列选出counter值最大的就绪进程获得CPU,因此counter起到了进程的动态优先级的作用(priority则是
11、静态优先级)。counter表示进程当前还拥有的时间片,nice表示普通进程的动态优先级,可对优先权进行动态调整。,进程的标识信息,task_struct中:pid、ppid等项描述了进程的标识信息。pid是进程标识号,ppid是其父进程标识号。uid和gid:表示运行进程的用户标识号和组标识号。euid和egid:表示运行进程的有效用户标识号和有效组标识号。fsuid和fsgid:表示运行进程的文件系统用户标识号和文件系统组标识号。suid和sgid:表示运行进程的备份用户标识号和备份组标识号。,进程的通信信息,Linux支持经典的Unix IPC机制,如信号、管道以及系统V中IPC机制,包
12、括共享内存、信号灯和消息队列。task_struct结构中存储了与进程通信有关的信息。与进程通信有关的项有sigpending,signal,blocked,*sig,exit_signal,semundo,*semsleeping等。sigpending本身也是一个结构体,包含关于本进程中未决信号的信息。signal域记录进程接收到的信号类型,在I386体系结构中共32位。blocked表示阻塞信号的掩码,*sig是指向信号处理函数表的指针。exit_signal表示进程终止的信号。semundo表示进程要释放的信号量,*semsleeping指向与信号量操作相关的等待队列。,进程的家族关系
13、,Linux系统中所有进程都是相互联系的。*p_opptr项是指向祖先进程任务结构体的指针;*p_pptr项是指向父进程任务结构体的指针;*p_cptr项是指向子进程任务结构体的指针;*p_ysptr项是指向弟进程任务结构体的指针;*p_osptr项是指向兄进程任务结构体的指针。,进程的家族关系,Linux的所有进程还组成一个双向链表。*next_task项指向下一进程任务结构体的指针;*prev_task项是指向上一进程任务结构体的指针。链表的头和尾都是init_task(即0号进程)。Linux还把所有处于可运行状态的进程通过两个指针*next_run和*prev_run连接形成双向循环队
14、列RUN_QUEUE。,时间和定时信息,进程是动态的,在task_struct结构中还有表示时间的数据项。start_time项表示进程创建的时间;utime项表示进程在用户态下耗费的时间;stime项表示进程在内核态下耗费的时间;cutime项表示所有子进程在用户态下耗费的时间;cstime项表示所有子进程在内核态下耗费的时间;timeout项表示进程申请延时。,文件系统信息,task_struct结构保存了进程与文件系统相关的信息。进程可以自由地打开或关闭文件。*fs指针指向进程的可执行映象所在的文件系统;*files指针指向进程打开的文件。下图表明系统中的每个进程有2个数据结构描述文件系
15、统相关的信息。,文件系统信息,存储管理信息,进程是和内存联系在一起的,task_struct结构中有如下几个与内存相关的数据项:*mm进程的虚存信息;*ldt进程的局部描述符表指针;saved_kernel_stack内核态下堆栈的指针;kernel_stack_page内核态下堆栈的页表指针;,存储管理信息,下图显示了一个简单进程的虚存的布局以及管理它的内核数据结构。,2.2.9 CPU现场保留信息,进程运行时,它将使用处理器的寄存器以及堆栈等等。进程被挂起时,进程的上下文所有的CPU相关的状态必须保存在它的task_struct结构中。当调度器重新调度该进程时,所有上下文被重新设定。CPU
16、现场保留信息包括CPU寄存器、堆栈等环境。,2.2.10 task_struct的作用,task_struct是进程存在的唯一标志,用来描述系统中的进程或任务。在Linux系统中,用NR_TASKS定义task数组的大小,NR_TASKS的缺省值一般为512。创建新进程时,Linux将从系统内存中分配一个task_struct结构并将其加入task数组。当前运行进程的结构用current指针来指示。,2.3 Linux的进程控制,进程控制就是研究如何建立、撤消、阻塞或唤醒一个进程,从而使进程状态发生变化。在传统的Unix环境下,有两个基本的操作用于创建和修改进程:函数fork()用来创建一个新
17、的进程,该进程几乎是当前进程的一个完全拷贝;函数族exec()用来启动另外的进程以取代当前运行的进程。Linux的进程控制和传统的Unix进程控制基本一致,只在一些细节的地方有些区别。,创建进程,系统启动时总是处于内核模式,此时只有一个进程:初始化进程。在系统初始化的最后,初始化进程启动一个称为init内核线程(或进程),然后保留在idle状态。如果没有任何事要做,调度管理器将运行idle进程。idle进程是唯一不是动态分配task_struct的进程,它的task_struct在内核构造时静态定义,叫init_task,其标识号为0。init内核线程是系统中第一个真正有用的进程,其标识号为1
18、。它负责完成系统的一些初始化设置任务,以及执行系统初始化程序。init程序使用/etc/inittab作为脚本文件来创建系统中的新进程。这些新进程又创建各自的新进程。,创建进程,Linux系统中,进程是进程映像的执行过程,也就是正在执行的进程实体。它由三部分组成:(1)用户级上、下文。主要成分是用户程序;(2)寄存器上、下文。由CPU中的一些寄存器的内容组成,如PC,PSW,SP及通用寄存器等;(3)系统级上、下文。包括OS为管理进程所用的信息,有静态和动态之分。,创建进程,可用fork()系统调用来创建一个新进程。系统调用格式:pid=fork()fork()返回值意义如下:0:在子进程中,
19、表示当前进程是子进程。0:在父进程中,返回值为子进程的id值(唯一标识号)。-1:创建失败。如果fork()调用成功,它向父进程返回子进程的pid,并向子进程返回0,即fork()被调用了一次,但返回了两次。此时OS在内存中建立一个新进程,所建的新进程是调用fork()父进程的副本,称为子进程。子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。,创建进程,内核为fork()完成以下操作:(1)为新进程分配一进程表项和进程标识号(2)检查同时运行的进程数目(3)拷贝进程表项中的数据(4)子进程继承父进程的所有文件,对父进程当前目录和所有已打开的文件表项中
20、的引用计数加1。(5)为子进程创建进程上、下文(6)子进程执行虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器PC(注意子进程的PC开始位置),然后根据pid变量保存的fork()返回值的不同,执行了不同的分支语句。,创建进程,一个具体使用fork创建进程的实例。,#include int forkvar=0;int main()int pid;pid=fork();/系统调用,创建进程 if(pid 0)/创建不成功,出错 printf(“Fork failed.”);exit(1);/系统调用 else if(pid=0)/子进程执行 printf(“Im the child
21、 process!n”);forkvar=1;else/父进程执行 wait();/系统调用,等待子进程完成 printf(“Im the parent process!n”);forkvar+;printf(“parent,forkvar=%d”,forkvar);exit(0);,创建进程,#include main()int i;if(fork()=0)/*子进程程序*/for(i=1;i 10;i+)printf(“BBBn”);else/*父进程程序*/for(i=1;i 10;i+)printf(“AAAn);利用vi编辑器输入上述代码后,存盘退出,再用gcc编译执行。格式如下:g
22、cc 源文件名-o 执行文件名最后,在shell提示符下输入./执行文件名 就可执行该文件。,2.3.2 执行进程,子进程为了和父进程完成不同的任务,利用exec()系统调用装载新的进程映像,放弃从父进程那里拷贝过来的内容。exec是一个函数族,有6个函数,分别是:int execl(const char*path,const char*arg,.);int execlp(const char*file,const char*arg,.);int execle(const char*path,const char*arg,.,char*const envp);int execv(const c
23、har*path,char*const argv);int execvp(const char*file,char*const argv);int execve(const char*path,char*const argv,char*const envp);其中只有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数。系统调用execve()对当前进程进行替换,替换者为一个指定的程序,其参数包括文件名(filename)、参数列表(argv)以及环境变量(envp)。,2.3.2 执行进程,结合fork与exec的使用可以启动另一程序执行但自己仍继续运行。下面代码显示如何启
24、动运行其它程序:,char command256;void main()int rtn;/*子进程的返回数值*/while(1)/*从终端读取要执行的命令*/printf();fgets(command,256,stdin);commandstrlen(command)-1=0;if(fork()=0)/*子进程执行此命令*/execlp(command,command);/*如果exec函数返回,表明没有正常执行命令,打印错误信息*/perror(command);exit(errorno);else/*父进程,等待子进程结束,并打印子进程的返回值*/wait(/*此程序从终端读入命令并执行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 原理 应用
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-6511187.html