Linux操作系统 进程管理课件_第1页
Linux操作系统 进程管理课件_第2页
Linux操作系统 进程管理课件_第3页
Linux操作系统 进程管理课件_第4页
Linux操作系统 进程管理课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章Linux操作系统本章内容:进程管理,存储管理,文件系统,设备管理,中断、异常及系统调用,进程通信。10.1

进程管理内容进程描述符;进程的调度时机及调度算法;进程的创建与消亡。10.1.1进程与进程描述符1.进程概念

2.进程描述符(进程控制块)

由一个task_struct结构表示。task_struct结构是一个复杂的结构,占一千多字节,其各个成员用来准确描述进程在各方面的信息.主要有以下几个部分:

Linux进程与传统UNIX进程的概念没有多大区别;没有真正意义上的线程概念。但Linux通过clone()系统调用支持轻权进程;Linux还支持内核线程的概念,内核线程永远在核心态运行,没有用户空间。(1)进程标识

包括进程的标识号(pid)、进程的用户标识、进程的组标识等。每个进程的标识号是惟一的。

(2)调度相关信息

这部分内容与进程调度有关,一部分信息见后面的第5节。进程描述符中还需要有结构保存当进程被换出时寄存器的状态,该进程恢复运行时便可从正确的状态开始继续运行。(3)进程虚拟空间信息

Linux的进程都在自己的私有地址空间中运行,task_struct的成员mm指向一个mm_struct结构,该结构描述进程空间。

(7)描述进程间关系的指针

所有的进程通过一个双向链表链接在一起。通过宏for_each_task可以对每个进程操作。指向其父进程、子进程、兄弟进程描述符的指针。需要根据pid号能够快速找到进程,系统以pid为关键字建立了一个哈希表,哈希函数值相同的进程通过进程描述符的pidhash_next和pidhash_pprev成员链在一起。10.1.2核心态与核心栈uniontask_union{ structtask_structtask; unsignedlongstack[2048];};

Linux的运行分为两种模式──核心态和用户态。内核总在核心态下运行,而普通进程通常在用户模式下运行,只有通过系统调用才能切换到核心态运行。进程拥有两个栈,用户模式栈与核心模式栈,分别在相应模式下使用。进程描述符和进程核心栈的空间分配在一起,内核为它们分配两个连续的物理页面。

因为进程描述符已经占用了1KB多的空间,所以核心栈的有效空间是6KB多一点,合理的设计使得这个容量已经足够了。核心栈与进程描述符如图10-1所示。两个物理页帧8KB进程描述符核心模式栈图10-1核心栈与进程描述符栈自顶向下增长

TASK_STOPPED:进程处于暂停状态,主要用于调试目的。如正在运行的进程收到SIGSTOP信号将进入TASK_STOPPED状态。

TASK_ZOMBIE:表示进程已经结束运行并释放了大部分占用的资源,但task_struct结构还未被释放。10.1.4进程的切换时机当前进程放弃CPU的情况可以分为两种。一、进程主动地放弃CPU

这种情况大体可以分为两类:

1.隐式地主动放弃CPU。往往是因为需要的资源目前不能获取,如执行read(),select()等系统调用的过程中,这种情况下的处理过程如下:

1)将进程加入合适的等待队列。

2)把当前进程的状态改为TASK_INTERRUTIBLE或TASK_UNINTERRUTIBLE。

3)调用schedule()函数,该函数的执行结果往往是当前进程放弃CPU。

进程的调度时机

进程的调度时机分成两种情形:

例如,进程被动放弃CPU的情形。当进程描述符的need_resched被置1时,并不立即直接调用schedule()调度函数。而是在随后的某个时刻,当进程从内核态返回用户态之前检查need_resched是否为1,如果为1,则调用schedule()调度函数。直接调用schedule()调度函数,例如进程主动放弃CPU的第一类情形;间接调用schedule()。10.1.5进程的调度算法

核心函数是schedule(),该函数的任务是选出一个可运行的进程。1.进程描述符有如下成员与调度有关:

1)policy标识进程的调度策略。

SCHED_OTHER普通进程;SCHED_FIFO实时进程,采用先进先出的调度算法;SCHED_RR实时进程,采用轮转法。2)rt_priority实时进程的优先级,普通进程不使用这个成员;3)nice普通进程的优先级;4)counter进程目前的CPU时间配额。2.对于普通进程来讲CPU时间的分配是典型的时分策略。

在某个时刻,运行队列中的每个进程都有一个counter值,当所有运行队列中的counter值都变为0以后,表明一轮已经结束,每个进程的counter根据其nice重新赋值,开始新的一轮执行过程。拥有CPU的进程每次时钟中断counter值减一。

5)现在进入了函数的核心部分。可运行进程队列的每个进程都将被计算出一个权值,主要是利用goodness()函数,讨论见后。最终最大的权值保存在变量c中,与之对应的进程描述符保存在变量next中。6)检查c是否为0。若为0则表明所有可执行进程的时间配额都已用完,因而对所有进程的counter重新“充电”,然后重新执行第5)步。7)如果next进程就是当前进程,则结束shedule()的运行。否则进行进程切换,CPU改由next进程占据。

4.goodness()函数

goodness()函数计算进程的当前权值。该函数的第一个参数是待估进程的描述符。

如果该进程是实时进程,它的权值为1000+rt_priority,1000是普通进程权值无法到达的数字,因而实时进程总可以优先得到执行。对于普通进程,它的权值为counter+20-nice,如果其又是内核线程,由于无需切换用户空间,则将权值加一作为奖励。10.1.6进程的创建1.进程的起源

Linux最早产生的进程是启动过程中创建出idle进程(不是通过fork(),而是编码制作出来),pid号为0。它是创建一个内核线程,该线程进行一系列初始化动作后最终会执行/sbin/init文件,执行该文件的结果是运行模式从核心态切换到了用户态,该线程演变成了用户进程init,pid号为1。init进程是一个非常重要的进程,一切用户态进程都是它的后代进程。intmain(void){ pid_tpid; if((pid=fork())<0){printf("forkfailed\n");exit(1); } elseif(pid==0){/*子进程执行进入此部分*/ execlp("echoall","echoall",(char*)0); }else{/*父进程*/ printf("forksuccess\n");exit(0);}}

3.sys_clone(),sys_vfork(),sys_fork()三个系统调用可以实现创建子进程,这三个系统调用最终都会调用do_fork()函数完成主要工作。该函数的第一个参数clone_flags可由多个标志位组成,常见的标志位有:CLONE_VM

子进程父进程共享进程空间;CLONE_FS子进程父进程共享文件系统信息;CLONE_FILES

子进程父进程共享打开的文件;CLONE_VFORK

如果父进程想使子进程释放空间时唤醒它,则置该位。

sys_clone()对应的clone_flags可能是多个标志位的组合,取决于具体情况。

sys_fork()对应的clone_flags值是SIGCHILD。SIGCHILD的作用是子进程终结或暂停时给父进程发信号。

sys_vfork()对应的clone_flags值是CLONE_VFORK|CLONE_VM|SIGCHILD。

vfork()是一个老的函数调用,子进程共享父进程的空间,包括页表,父进程被挂起直到子进程执行exec系列函数或子进程退出时。在合适的场合,较之fork()时的“写时拷贝”策略vfork()无疑开销更小。

5)调用get_pid()函数为子进程得到一个pid号。6)依次调用copy_files(),copy_fs(),copy_sighand(),copy_mm()分别复制父进程文件处理、信号处理及进程空间的信息。以上函数的具体行为取决clone_flags参数,例如,copy_mm()时,如果clone_flags包含有CLONE_VM标志,则子进程共享父进程的空间,不会进行复制。7)调用copy_thread()初始化子进程的核心模式栈时,核心栈保存了进程返回用户空间的上文。此处与平台相关,以i386为例,其中很重要的一点是存储寄存器eax值的位置被置0,这个值就执行系统调用后子进程的返回值。

8)将父进程的当前的时间配额counter分一半给子进程。9)利用宏SET_LINKS将子进程插入所有进程都在其中的双向链表。调用hash_pid(),将子进程加入相应的hash队列。10)调用wake_up_process(),将该子进程插入可运行队列。至此,子进程创建完毕,并在可运行队列中等待被调度运行。11)如果clone_flags包含有CLONE_VFORK标志,则将父进程挂起直到子进程释放进程空间。进程描述符中有一个信号量vfork_sem可以起到将进程挂起的作用。12)返回子进程的pid值,该值就是系统调用后父进程的返回值。4)设置进程的退出状态,调用exit_notify()处理该进程与其父进程和子进程的各种关系。在该函数中会将该进程状态置为TASK_ZOMBIE。5)调用schedule()调度函数切换到别的进程。

3.TASK_ZOMBIE进程

在do_exit(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论