Linux进程管理实验.pdf

上传人:赵** 文档编号:36409422 上传时间:2022-08-27 格式:PDF 页数:7 大小:402.38KB
返回 下载 相关 举报
Linux进程管理实验.pdf_第1页
第1页 / 共7页
Linux进程管理实验.pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《Linux进程管理实验.pdf》由会员分享,可在线阅读,更多相关《Linux进程管理实验.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、.Linux 进程管理实验一、实验容:1. 利用bochsbochs观测linux0.11linux0.11下的PCBPCB进程控制构造。2. 利用bochsbochs观测linux0.11linux0.11下的fork.cfork.c源代码文件,简单分析其中的重要函数。3. 在fork.cfork.c适当位置添加代码,以验证forkfork函数的工作原理。二、Linux 进程管理机制分析Linux有两类进程:一类是普通用户进程,一类是系统进程,它既可以在用户空间运行,又可以通过系统调用进入核空间, 并在核空间运行;另一类叫做核进程,这种进程只能在核空间运行。在以 i386 为平台的 Linu

2、x 系统中,进程由进程控制块,系统堆栈,用户堆栈,程序代码及数据段组成。Linux 系统中的每一个用户进程有两个堆栈:一个叫做用户堆栈,它是进程运行在用户空间时使用的堆栈;另一个叫做系统堆栈,它是用户进程运行在系统空间时使用的堆栈。1.Linux1.Linux 进程的状态:进程的状态:Linux进程用进程控制块的state域记录了进程的当前状态,一个Linux进程在它的生存期中,可以有下面6种状态。1.就绪状态 (TASK_RUNNING):在此状态下, 进程已挂入就绪队列,进入准备运行状态。2.运行状态(TASK_RUNNING):当进程正在运行时,它的state域中的值不改变。 但是Lin

3、ux会用一个专门指针(current)指向当前运行的任务。.v.3.可中断等待状态(TASK_INTERRUPTIBLE): 进程由于未获得它所申请的资源而处在等待状态。 不管是资源有效或者中断唤醒信号都能使等待的进程脱离等待而进入就绪状态。即浅睡眠状态。4.不可中断等待状态(TASK_UNINTERRUPTIBLE):这个等待状态与上面等待状态的区别在于只有当它申请的资源有效时才能被唤醒, 而其它信号不能。即深睡眠状态。5.停顿状态TASK_STOPPED):当进程收到一个SIGSTOP信号后就由运行状态进入停顿状态,当收到一个SINCONT信号时,又会恢复运行状态。挂起状态。6.终止状态T

4、ASK_ZOMBIE):进程因某种原因终止运行,但进程控制块尚未注销。即僵死状态。状态图如下所示:2.Linux2.Linux 进程控制块:进程控制块:在Linux中,进程控制块为数据构造task_struct,它包含了大量该进程的信息,这些信息大致为以下几类:1.进程的当前状态2.调度信息3.进程标识4.进程的通信信息5.进程与其它进程之间关系的信息6.使用文件的信息7.虚拟存与物理存的关系.v.8.计时器9.处理器与进程的有关信息3. Fork3. Fork函数:函数:父进程创立一个子进程最方便快捷的方式就是把父进程的控制块照原样复制一个, 然后再根据子进程的修改特点对它进展必要的修改,形

5、成子进程的控制块。系统调用fork()fork()通过调用find_empty_processfind_empty_process及copy_processcopy_process等函数复制一个当前进程的进程控制块, 然后用新进程标识修改旧标识, 填写子进程与父进程关系,创立子进程堆栈和数据区。因此,fork()fork()执行后,父子进程共享同一个存储空间,父进程的所有可共享资源都被子进程通过数据构造的复制继承了过来。在父进程调用 fork()fork()与在子进程中调用 fork()fork(),fork()fork()的返回值不同!如果是在父进程调用 fork()fork(),那么 fo

6、rk()fork()就复制出一个子进程,并返回子进程的标识 IDID,如果创立子进程失败,那么 fork()fork()的返回值为-1;-1;而如果在子进程调用 fork(),fork(),那么它返回的是 0 0。三、实验步骤及结果在安装目录下双击bochs.exe,选择提供好的linux0.11配置文件,点击start,启动虚拟机,如以下图所示:一、一、 利用利用bochsbochs观测观测linux0.11linux0.11下的下的PCBPCB进程控制构造进程控制构造1. 1.切换工作目录到/usr/src/linux/include/linux/usr/src/linux/include

7、/linux文件夹,如下所示:2. 2.利用vi vi编辑器翻开sched.hsched.h头文件,寻找struct task_structstruct task_struct构造体的定义,如下:.v.观察进程控制块的容,对里面的一些变量分析:Long stateLong state:表示当前进程所处的状态。-1为不可运行, 0可运行(就绪), 0 已停顿。进程执行时,它会根据具体情况改变状态。 Linux中的进程主要有如下状态,如下所示:核表示TASK_RUNNING含义可运行TASK_INTERRUPTIBLETASK_ZOMBIETASK_UNINTERRUPTIBLETASK_STOP

8、PED可中断的等待状态僵死暂停不可中断的等待状态TASK_SWAPPING换入/换出Long counter:Long counter:表示当前进程所剩余的时间片Long priority:Long priority:表示当前进程的优先级。Long signal:Long signal:存储进程收到的信号。Unsigned short uid:Unsigned short uid:用户 ID,指的是进程执行者是谁。Struct file* filpNR_OPEN:Struct file* filpNR_OPEN:进程翻开的文件列表:进程可以翻开或关闭文件,文件属于系统资源, Linux 核要对

9、进程使用文件的情况进展记录。 task_struct 构造中有两个数据构造用于描述进程与文件相关的信息。其中, fs_struct 中描述了两个 VFS 索引节点 VFSinode ,这两个索引节点叫做root 和 pwd,分别指向进程的可执行映象所对应的根目录和当前目录或工作目录。file_struct 构造用来记录了进程翻开的文件的描述符。二、二、 利用利用bochsbochs观测观测linux0.11linux0.11下的下的fork.cfork.c源代码文件,分析其中的源代码文件,分析其中的重要函数:重要函数:1. 1.切换工作目录到/usr/src/linux/kernel/usr/

10、src/linux/kernel文件夹,利用vi vi编辑翻开fork.cfork.c.v.文件:通过观察该程序主要实现了以下几个函数:find_empty_process,copy_mem,copy_processfind_empty_process,copy_mem,copy_process等,其中,调用关系大体如下所示: :ForkFork调用调用find_empty_processfind_empty_process,而后者又调用,而后者又调用copy_processcopy_process;然后;然后Copy_processCopy_process调用copy_memcopy_mem

11、,Copy_memCopy_mem调用copy_page_tablescopy_page_tables,下面,下面找到copy_processcopy_process函数,如下:在该函数中有*p=*current 代码,这句代码表示:current是指向父进程PCB构造体的指针, p是指向子进程PCB构造体的指针,操作系统先把父进程的PCB构造体完完整整的复制了一份给子进程。2.找到copy_mem函数,发现其调用copy_page_tables。其中,copy_page_tables的实现在/usr/src/linux/mm/memory.c文件中, 其代码截图如下:上述代码说明把两个进程的

12、不同线性空间映射到同一片物理存上。2. 当copy_processcopy_process调用完毕后,整个创立进程的过程就已经完成了大半局部,此后,再对子进程的信息做必要修改后,子进程就可以像父进程一样被执行了。三、三、 在在fork.cfork.c适当位置添加代码,以验证适当位置添加代码,以验证forkfork函数的工作原理函数的工作原理1. 1. forkfork函数复制了父进程的PCBPCB,这里验证一下具有父子关系的两个进程,是否一致。2. 2. 翻开/usr/src/linux/kernel/fork.c/usr/src/linux/kernel/fork.c文件, 找到其中copy

13、_processcopy_process函数如下, ,在函数的最后,参加相关打印信息代码在程序的后面,并去除.v.注释:程序中程序中if(p-pid5&p-father!=4)if(p-pid5&p-father!=4)是为了区别系统进程与用户进程而设置的。因为,如果不这样区分,会导致打印出一些我们不想看到的信息,造成混乱,不方便实验观察。p-start_codep-start_code是p p所指向进程的页目录信息。exper_page_tableexper_page_table是p p所指向进程的页表信息。For(k1=0;k1NR_TASKS;k1+)For(k1=0;k1NR_TASK

14、S;k1+)循环是在系统的进程槽中找到p p所指向进程的父进程,然后,将父进程相关页目录,页表信息打印。3.保存并退出vi vi编辑器,切换工作目录到/usr/src/linux/usr/src/linux执10行. makemakecleanclean命令,将系统以前的编译信息去除掉。4.然后执行makemake命令,重新编译linux0.11linux0.11核5. 编译完成后,输入dd bs=8192 if=Image of=/dev/fd0dd bs=8192 if=Image of=/dev/fd0,用新生成的核替换掉旧的核。6. 点击bochsbochs中中的resetreset按

15、钮,重启虚拟机;重启后,编译运行experiment.cexperiment.c文件,观察实验效果,其中experiment.cexperiment.c程序代码如以下图所示:编译运行结果显示如下:由运行结果可以看出,父子进程的页表指向了同一个物理地址,从而验证了我们之前的理论, ,子进程会复制父进程的PCBPCB,共享其存空间。四、 实验结果与心得本次实验主要通过学习Linux系统进程管理机制,并通过Bochs进展验证。实验过初步阅读linux0.11linux0.11操作系统源代码,了解其创立进程.v.的大体流程。另外,通过修改源代码,验证了fork函数的工作原理。实验中首先要比较深入的理解进程控制块以及fork 函数, 我觉得自己理解起来还是有点困难。 不过通过实验, 阅读核代码的能力有所提高,并初步学会如何去修改代码并实现验证。 为以后的学习打下一个良好的根底,所以收获颇多。.v.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁