Linux进程管理系统实验.docx
《Linux进程管理系统实验.docx》由会员分享,可在线阅读,更多相关《Linux进程管理系统实验.docx(11页珍藏版)》请在冰豆网上搜索。
Linux进程管理系统实验
Linux进程管理实验
一、实验内容:
1.利用bochs观测linux0.11下的PC进程控制结构。
2.利用bochs观测linux0.11下的fork.c源代码文件,简单分析其中
的重要函数。
3.在fork.c适当位置添加代码,以验证fork函数的工作原理。
二、Linux进程管理机制分析
Linux有两类进程:
一类是普通用户进程,一类是系统进程,它
既可以在用户空间运行,又可以通过系统调用进入内核空间,并在内
核空间运行;另一类叫做内核进程,这种进程只能在内核空间运行。
在以i386为平台的Linux系统中,进程由进程控制块,系统堆栈,用户堆栈,程序代码及数据段组成。
Linux系统中的每一个用户进程有两个堆栈:
一个叫做用户堆栈,它是进程运行在用户空间时使用的堆栈;另一个叫做系统堆栈,它是用户进程运行在系统空间时使用的堆栈。
1.Linux进程的状态:
Linux进程用进程控制块的state域记录了进程的当前状态,一个Linux进程在它的生存期中,可以有下面6种状态。
1.就绪状态(TASK_RUNNING):
在此状态下,进程已挂入就绪队列,进入准备运行状态。
2.运行状态(TASK_RUNNING):
当进程正在运行时,它的state域中
的值不改变。
但是Linux会用一个专门指针(current)指向当前运行的
任务。
3.可中断等待状态(TASK_INTERRUPTIBLE):
进程由于未获得它所
申请的资源而处在等待状态。
不管是资源有效或者中断唤醒信号都能使等待的进程脱离等待而进入就绪状态。
即”浅睡眠状态”
4.不可中断等待状态(TASK_UNINTERRUPTIBLE):
这个等待状态与上面等待状态的区别在于只有当它申请的资源有效时才能被唤醒,而其它信号不能。
即深睡眠状态”
5.停止状态(TASK_STOPPED):
当进程收到一个SIGSTOP信号后就由运行状态进入停止状态,当收到一个SINCONT信号时,又会恢复运行状态。
挂起状态。
6.终止状态(TASK_ZOMBIE)进程因某种原因终止运行,但进程控制块尚未注销。
即僵死状态”
状态图如下所示:
2.Linux进程控制块:
在Linux中,进程控制块为数据结构task_struct,它包含了大量该进程的信息,这些信息大致为以下几类:
1).进程的当前状态
2).调度信息
3).进程标识
4).进程的通信信息
5)•进程与其它进程之间关系的信息
6).使用文件的信息
7).虚拟内存与物理内存的关系
8).计时器
9).处理器与进程的有关信息
3.Fork函数:
父进程创建一个子进程最方便快捷的方式就是把父进程的控制块照原样复制一个,然后再根据子进程的修改特点对它进行必要的修改,形成子进程的控制块。
系统调用fork()通过调用find_empty_process及copy_process等函数复制一个当前进程的进程控制块,然后用新进程标识修改旧标识,填写子进程与父进程关系,创建子进程堆栈和数据区。
因此,fork()执行后,父子进程共享同一个存储空间,父进程的所有可共享资源都被子进程通过数据结构的复制继承了过来。
在父进程调用fork(与在子进程中调用fork(),fork()的返回值不同!
如果是在父进程调用fork(),则fork()就复制出一个子进程,并返回子进程的标识ID,如果创建子进程失败,则fork()的返回值为-1;而如果在子进程调用fork(),则它返回的是0。
三、实验步骤及结果
在安装目录下双击bochs.exe,选择提供好的linux0.11配置文件,点击start,启动虚拟机,如下图所示:
Licencedforusemithboch^>courtesyofMandralkcSoft-
ForinforMotiononthisopotherUGAdeuelopmentproducts^contactEl^inSysternsat-(800)723-9938oruuu.eljitin.com
HochsJ31US-builA:
RRftuisinn:
1.Z31$SDrtte:
Z6fi^n4/2617:
1?
;0?
S
PptioT^E:
apirtbiospcibidse1toritorembi0^32
Ct妞曲master:
Keneric1Z34ATA-bHard-Disk(59IIBytesI
PressF12forbootmenuk
Bootie。
fromFloppy,..
'hD«(1iFiysystem’*.
Partitinntflbleok.
45^10/fcG09Gfreeblocks
19ZZ0/Ze0O&freeInodes
3462buffers=3545G08bytesbufferspace
Freemetfl:
1253291Zbytes
Ok・
L/usr/rootJtt
利用bochs观测linuxO.11下的PCB进程控制结构
文件夹,如下所
1.切换工作目录到/usr/src/linux/include/linux
示:
Llitcdex*1inmix*iirtclude^linu>r
L^usr~Zsx'c(^1ifiux/inu1,ndu”1inuLxl#1s
匚oifiFig.hFs・hhead・hrm・hsys・Fi
fdresf・hhdregkerineI.hsclied・titty.h
[zusrzsi*c/1inuxzincLudezlinuxIS
2.利用vi编辑器打开sched.h头文件,寻找structtask_struct结构
体的定义,如下:
unsignedLong0士孔1*电_匚口|4空#eindl_u口亠亡』Endl_dlE*艮』brk」舍七也「七_w±£it;k:
Lon(rpid,father,pgrp,session‘leader;
unsigned£hoi'-thi4jEuidt£ilidiunsignedshorttjldjegid,sqid;longalam;
lon({utimejstime,cutime,cstimejstart11meJ
nsEd_raa七}>:
Z*—1ifriatty±
unasl<;
•*pudJ
*ront;
_unsiqnedLDnqcloseonexec:
观察进程控制块的内容,对里面的一些变量分析:
Longstate:
表示当前进程所处的状态。
-1为不可运行,0可运行(就
绪),>0已停止。
进程执行时,它会根据具体情况改变状态。
Linux
中的进程主要有如下状态,如下所示:
内核表示
含义
TASK_RUNNING
可运行
TASK_INTERRUPTIBLE
可中断的等待状态
TASKJJNINTERRUPTIBLE
不可中断的等待状态
TASK_ZOMBIE
僵死
TASK_STOPPED
暂停
TASK_SWAPPING
换入/换出
Longcounter:
表示当前进程所剩余的时间片
Longpriority:
表示当前进程的优先级。
Longsignal:
存储进程收到的信号。
Unsignedshortuid:
用户ID,指的是进程执行者是谁。
Structfile*filp[NR_OPEN]:
进程打开的文件列表:
进程可以打开
或关闭文件,文件属于系统资源,Linux内核要对进程使用文件
的情况进行记录。
task_struct结构中有两个数据结构用于描述
进程与文件相关的信息。
其中,fs_struct中描述了两个VFS索引节点(VFSinode),这两个索引节点叫做root和pwd,分别指
向进程的可执行映象所对应的根目录和当前目录或工作目录。
file_struct结构用来记录了进程打开的文件的描述符。
二、利用bochs观测linux0.11下的fork.c源代码文件,分析其
中的重要函数:
1.切换工作目录到/usr/src/linux/kernel文件夹,利用vi编辑打开
fork.c文件:
通过观察该程序主要实现了以下几个函数:
find_empty_process,copy_mem,copy_process等,其中,调用关系大体如下所示:
Fork调用find_empty_process,而后者又调用copy_process;然后Copy_process调用copy_memCopy_me调用copy_page_tables,下面找到copy_process函数,如下:
intcopy_process(intnr>longebpPlongedijlongesi>lonygsjtongnoneTlongebxJlongecXjlongedx,longfs>longesjLongdsj
eipjlonqcs,longeflags,iofiffespj1ongssJ
<
structtask_sIrueL;
inti:
structFile"f;
un百ignedIdt^exper;unsiffnsdlrnn(y*experir:
unsigned】ong*experpnyuteble:
intkl;
p=(structtask_struct*)get_free^pa^et);
if(tp)
return-EFlGAJH;
taskInrJ=p;
*p=*curreint]/»*MOTE!
thisdoesn"xcopythesuperuisorstack*/
p->slaLe-TA5K_UMINTERKUFTIBLE,p>pid工lci3t_pid;p>fither=currentid:
p->couriter=p->priotity:
_p->signal=0;
在该函数中有*p=*current代码,这句代码表示:
current是指向父进程PCB吉构体的指针,p是指向子进程PCB吉构体的指针,操作系统先把父进程的PC结构体完完整整的复制了一份给子进程。
2.找到copy_mer函数,发现其调用copy_page_tables。
其中,
copy_page_tables的实现在/usr/src/linux/mm/memory.c文件中,其
代码截图如下:
inicopy^mewitintnrtstructtask_3trnct*p)
unsigned.1ong□td_datfl_has:
e,nRU_(iata_bfixe,data_Jinit;unsianFdInngn・n巳u_r:
rHl亡一血穴否亡.jmit:
cudii_lini1mlICGxGf);
latalimiL-irEL_liiiillCGxi?
)>
uld_c;udr_lKLJir-tLitiTEiiL->ldl1