版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十章Linux操作系统本章包括进程管理、存储管理、文件系统、设备管理、中断、异常和系统传输以及进程通信。10.1过程管理,内容过程描述符;过程的调度时机和调度算法;过程的创造和消亡。10.1.1过程和过程描述符1。过程概念2。过程描述符(过程控制块)由task_struct结构表示。任务结构是一种复杂的结构,占用了一千多个字节,其成员用来准确地描述过程的各个方面的信息。主要有以下几个部分:(Linux进程的概念与传统的UNIX进程没有太大的不同;没有真正的线程概念。但是Linux通过克隆()系统调用支持轻量级进程。Linux还支持内核线程的概念,它总是在内核模式下运行,没有用户空间。(1)过
2、程标识包括过程标识号(pid)、过程用户标识和过程组标识。每个流程的标识号都是唯一的。(2)调度相关信息本部分与工艺调度相关,部分信息见以下第5节。进程描述符中还有一个结构,用于在进程被换出时保存寄存器的状态,以便进程可以在恢复运行时从正确的状态继续运行。(3)进程虚拟空间信息Linux进程在它们自己的私有地址空间中运行,任务结构的成员mm指向描述进程空间的mm结构。(4)信号处理信息Linux支持传统的UNIX信号语义。该部分记录信号处理功能、信号屏蔽等信息。(5)文件相关信息包括进程和文件系统之间的交互信息。本文主要分为两个部分。一部分描述了进程在访问文件时使用的当前目录和根目录信息。另一
3、部分描述了进程使用的文件信息。这部分主要有一个文件结构数组,数组中的有效项指向一个文件对象。(6)会计信息和统计信息资源是有限的,每个过程对每个资源的使用都有限制。此外,还有统计信息来记录系统所需的信息,如页面异常次数、CPU使用时间等。(7)描述进程之间关系的指针,所有进程通过双向链表链接在一起。每个任务的宏允许您对每个进程进行操作。指向其父进程、子进程和同级进程描述符的指针。有必要根据pid编号快速找到流程。系统建立一个以pid为关键字的哈希表,具有相同散列函数值的进程通过进程描述符的pidhash_next和pidhash_pprev成员链接在一起。10.1.2核心状态和核心堆栈,联合任
4、务_联合结构任务_结构任务;无符号长stack2048;Linux分为两种模式:核心模式和用户模式。内核总是以核心模式运行,而普通进程通常以用户模式运行,只有通过系统调用,它们才能切换到核心模式。该过程有两个栈,用户模式栈和核心模式栈,它们在相应的模式中使用。进程描述符和进程核心堆栈的空间被一起分配,并且核心为它们分配两个连续的物理页面。由于进程描述符占用了1KB以上的空间,核心堆栈的有效空间略大于6KB,通过合理的设计就足够了。核心堆栈和流程描述符如图101所示。两个物理页帧8KB,进程描述符,核心模式堆栈,图101核心堆栈和进程描述符,10.1.3进程状态和状态转换图在Linux中有五种进
5、程状态,它们是:TASK_RUNNING:表示进程有资格运行,或者正在运行,或者正在等待调度执行。进程描述符有一个run_list成员,通过这个成员,处于TASK_RUNNING状态的所有进程被链接在一起,这被称为可运行队列。可中断任务和不可中断任务:这两种状态都表示进程处于睡眠状态。可中断任务不仅可以在资源满足时被唤醒,还可以被信号唤醒,但不可中断任务不能。TASK_STOPPED:进程处于挂起状态,主要用于调试目的。如果正在运行的进程收到停止信号,它将进入停止状态。任务_僵尸:表示进程已经完成运行并释放了大部分被占用的资源,但是任务_结构还没有被释放。10.1.4进程的切换定时当前进程放弃
6、中央处理器有两种情况。1.这个过程自动放弃了中央处理器,大致可以分为两类:1 .隐蔽自愿放弃中央处理器。这通常是因为目前所需的资源不可用,例如,在执行read(),select()和其他系统调用的过程中,这种情况下的处理过程如下:1)将该过程添加到适当的等待队列中。2)将当前流程的状态更改为任务间可执行或任务统一。3)调用schedule()函数,这通常会导致当前进程放弃CPU。4)检查资源是否可用,如果不可用,跳到步骤。5)如果资源可用,从等待队列中删除该进程。2。这个过程明确地自愿放弃中央处理器。例如,系统调用sched _ yield()、sched _ setscheduler()、p
7、ause()和nanosleep()将导致当前进程放弃CPU。其次,进程被动地放弃了中央处理器,这将导致当前进程描述符的需求重新调度被设置为1。当前流程的时间片已经用完;新唤醒的进程比当前进程具有更高的优先级。进程的调度机会可以分为两种情况:例如,进程被动放弃CPU的情况。当过程描述符的需求被设置为1时,schedule()调度函数不会立即被直接调用。相反,稍后,在进程从内核模式返回到用户模式之前,检查needed _ need _ resched是否为1,如果为1,则调用schedule()调度函数。直接调用schedule()调度函数,例如,进程自愿放弃第一种CPU调度()是间接调用的。1
8、0.1.5进程调度算法的核心功能是schedule(),该功能的任务是选择一个可运行的进程。1.进程描述符具有以下与调度相关的成员:1)策略标识进程的调度策略。其他普通程序;先进先出实时处理,采用先进先出调度算法;实时进程,使用旋转方法。2)rt _ priority实时进程的优先级,不用于普通进程;3)尼斯普通流程的优先级;4)计数器进程的当前CPU时间配额。CPU时间的分配是普通进程的典型时分策略。在某个时刻,运行队列中的每个进程都有一个计数器值。当所有正在运行的队列中的计数器值变为0时,表示该轮已结束。每个进程的计数器都根据它的nice重新分配,新一轮的执行开始了。每次带有中央处理器的进
9、程将计数器值中断一次。3。3.schedule()函数的执行过程:1)检查是否有软中断服务请求,如果有,先执行这些请求。2)如果当前进程调度策略为SCHED_RR,计数器为0,则将进程移动到可执行进程队列的末尾,并重新分配计数器。3)检查当前流程的状态。如果它是可中断的,并且进程接收到信号,将进程状态设置为任务运行。4)如果当前进程的状态不是TASK_RUNNING,将其从可执行进程队列中删除,然后将当前进程描述符的需求恢复为0。5)现在它已经进入了函数的核心部分。可运行进程队列中的每个进程将被计算一个权重,主要使用good()函数,这将在后面讨论。最终的最大重量保存在变量c中,相应的过程描述
10、符保存在下一个变量中。6)检查C是否为0。如果为0,则意味着所有可执行进程的时间配额都已用完,因此“重新填充”所有进程的计数器,然后重新执行步骤5)。7)如果下一个进程是当前进程,则结束进程的操作()。否则,将执行进程切换,而下一个进程将占用CPU。4。函数的作用是:计算流程的当前权重。该函数的第一个参数是要评估的过程的描述符。如果进程是一个实时进程,它的权重是1000rt_priority,而1000是一个普通进程无法达到的数字,因此实时进程总是可以优先执行的。对于普通工艺,它的重量是20磅。如果是一个内核线程,因为不需要切换用户空间,权重将增加一个作为奖励。10.1.6流程1的创建。进程的
11、起源由Linux产生的最早的进程是创建一个空闲进程(不是由fork()产生的,而是通过编码产生的),进程号为0。它是创建一个内核线程。在一系列初始化操作之后,线程将最终执行/sbin/init文件。作为执行文件的结果,运行模式从核心模式切换到用户模式,并且线程演变成pid号为1的用户进程init。Init进程是一个非常重要的进程,所有用户模式的进程都是它的后代。2.2.fork/exec新进程的生成模式通常,fork()创建一个新进程,然后新进程通过调用exec系列函数来执行实际任务。如果函数fork()被成功调用,则当前进程有一个子进程。该函数返回两个值,其中子进程返回0,父进程返回子进程的
12、pid值。下面是一个示例代码。内部主(无效)pid _ t pidif(PID=fork()0)printf(fork failed dn);出口(1);否则,如果(pid=0) /*子进程执行进入此部分*/execlp(全部回显,全部回显,(char *)0);否则/*父进程*/printf(分支成功);退出(0);3。Sys _ clone(),Sys _ vfork(),Sys _ fork(),三个系统调用可以创建子进程,这三个系统调用最终将调用do_fork()函数来完成主要工作。该函数的第一个参数clone_flags可以由多个标志组成。常见标志是:克隆虚拟机子进程的父进程共享进程
13、空间;克隆_文件系统子进程的父进程共享文件系统信息;克隆_文件子进程和父进程共享打开的文件;如果父进程希望子进程在释放空空间时将其唤醒,则会设置CLONE_VFORK。根据具体情况,对应于sys_clone()的clone_flags可以是多个标志位的组合。对应于sys_fork()的克隆_标志的值是SIGCHILD。SIGCHILD的功能是在子进程终止或暂停时向父进程发送信号。对应于sys_vfork()的克隆标志的值是克隆_ VFORK |克隆_虚拟机| SIGCHILD。Vfork()是一个旧的函数调用,子进程共享父进程的空间,包括页表,父进程被挂起,直到子进程执行exec系列函数或子进
14、程退出。在适当的情况下,vfork()无疑比fork()中的“写时复制”策略更便宜。4。4.do_fork () 1)的执行进程调用alloc_task_struct()为子进程描述符分配空间。严格来说,子流程还没有生成。2)将父进程描述符的所有值分配给子进程描述符。3)检查是否超过资源限制,如果超过,完成并返回错误消息。更改一些统计信息。4)修改子进程描述符的一些成员的值,以正确反映子进程的状态,例如,进程状态被设置为TASK _ UNITERE。5)调用get_pid()函数获取子进程的pid号。6)依次调用copy _ files()、copy _ fs()、copy _ sighand
15、()和copy _ mm()来复制父进程文件的处理、信号处理和进程空间信息。上述函数的具体行为取决于clone_flags参数。例如,当copy_mm()包含CLONE_VM标志时,子进程共享父进程的空间,并且不会复制它。7)当调用copy_thread()来初始化子进程的核心模式堆栈时,核心堆栈保存返回用户空间的进程文本。这与平台有关。以i386为例。最重要的一点是,存储寄存器中eax值的位置设置为0,该值将是执行系统调用后子进程的返回值。8)将父进程的当前时间配额计数器对半分给子进程。9)使用宏SET_LINKS将子进程插入所有进程所在的双链表中。调用hash_pid(),并将子进程添加到
16、相应的哈希队列中。10)调用wake_up_process()将子进程插入到可运行队列中。此时,子进程已经创建,并且正在等待调度以在可运行队列中运行。11)如果clone_flags包含CLONE_VFORK标志,则挂起父进程,直到子进程释放进程空间。进程描述符中有一个信号量vfork_sem,它可以挂起进程。12)返回子进程的pid值,即系统调用后父进程的返回值。10.1.7工艺1的销毁。定时,当一个进程在其正常操作后被破坏时,最常见的情况是显式或隐式调用exit()函数。当一个进程接收到某个信号时,该信号的处理功能会结束该进程并将其销毁。示例1: kill如果没有指定信号,默认信号SIGTERM将被发送到进程,导致进程结束。示例2:用户程序访问非法空间,导致内核向进程发送SIGSEGV信号,导致进程结束。2.进程销毁的最后一个动作是通过调用函数do_exit()来完成的。1)设置标志表示进程正在被破坏。2)如果进程在计时器队列或信号量队列中等待,将其移出。3)调用_ _ exit _ mm()、_ _ exit _ files()、_ _ exit _ fs()和exit_sighand()来释放进程占用的各种资源。通常,如果一个资源被释放,它的共享计数器应该减少1。如果此时有其他进程正在使用该资源,则共享计数器不会被设置为0,而是会在此时直接返回。如果为0,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 插花摆摊活动方案策划(3篇)
- 施工方案项目部人员(3篇)
- 机房下送风施工方案(3篇)
- 楼道底部刷漆施工方案(3篇)
- 池塘清淤护坡施工方案(3篇)
- 活动食物策划方案范文(3篇)
- 滑板冲浪提供营销方案(3篇)
- 盖板勾缝施工方案(3篇)
- 移动入户活动方案策划(3篇)
- 纸包鱼店面营销方案(3篇)
- 2026石家庄新天智慧能源有限公司招聘44人考试备考试题及答案解析
- 2026春季江西铜业集团有限公司贵溪冶炼厂校园招聘变更20人笔试备考试题及答案解析
- 2026年全民营养周营养餐桌家庭健康宣传课件
- 算电协同发展契机 (课件)
- 2026年四川省成都市网格员招聘考试参考试题及答案解析
- ISO140012026标准解读文件
- 机关工会财务审批制度
- 八年级义务教育劳动国测模拟试题
- 2026年职工职业技能竞赛(泵站运行工赛项)参考试指导题库(含答案)
- 2026年如何制定有效的设备维护计划
- 招商运营部制度汇编范本
评论
0/150
提交评论