已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络,如有侵权,请联系网站删除 操作系统实验(minix部分) 显示当前进程信息 实验目的一、 运用操作系统所学原理知识,加深进程机制在Minix操作系统中的实现;二、 分析Minix系统进程PCB数据结构,包括进程调度、内存管理和文件系统三部分中各数据成员的具体含义;三、 了解Minix操作系统整体实现机制;四、 学习Minix操作系统中进程间通信机制,查看Minix这方面的源码。实验过程一、 实验准备在此实验的预习过程中我们需要了解操作系统中有关于进程方面的知识,并且要更深层的了解进程机制在minix中的实现。此外,还有进程的通信机制也需要注重了解。这样我们作实验才能更高效。首先,我们先从最基本的概念入手。进程是操作系统中最重要的一个基本点,深入并且透彻的理解好进程的含义,不仅是做好此次实验的关键,更是我们学好操作系统整个课程的重中之重。“进程”这一术语有许多人在不同角度对其下过定义,其中最能进程实质的定义有:(1) 进程是程序的一次执行;(2) 进程是可以和别的计算并发执行的计算;(3) 进程可定义为一个数据结构及能在其上进行操作的一个程序;(4) 进程是一个程序及其数据在处理机上顺序执行时所发生的活动;(5) 进程是程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。据此,我们可以把“进程”定义为:“可并发执行的程序在一个数据集合上的运行过程”。我们在理解好上述进程定义的基础上,在对进程进行一下自己的思考,是进程的概念在自己的脑海里形成一个自己的概念,然后再去对进程的其他特征进行了解和分析。例如进程的动态性、并发性、独立性、异步性和结构特性。我们还需要知道进程的三个最基本的状态,就绪状态、执行状态和阻塞状态,以及三者之间的相互关系:结束新进程执行就绪阻塞接纳 完成 中断 进程调度 I/O完成或事件发生 I/O请求或等待某事件 此外,我们还需要知道引起进程创建的事件有用户登录、作业调度、提供服务和应用请求。进程的创建又大概分为:1、申请空白PCB;2、为新进程分配资源;3、初始化进程控制块;4、将新进程插入就绪队列。PCB就是进程控制块,它是进程存在的唯一标志,当系统创建一个新进程时,就为它建立一个PCB;进程结束时又收回其PCB,进程于是也随之消亡。 了解完进程的概念,我们开始去认识进程间的通信。进程是经常要与其他进程通信。例如,在一个shell管道中,第一个进程的输出必须传送到第二个进程,这样沿着管道传递下去。因此需要在通信的进程间,最好使用一种结构较好的方式,而不用中断。这就是我们所说的进程通信。我们在做此实验时应该着重去学习消息传递这个概念。这种通信方法使用两条原语SEND和RECEIVE。他们像信号量一样是系统调用,因此很容易地被加入库例程。例如:send(destination,&message); receive(source,&message);前一个调用向一个给定的目标发送一条消息,后一个调用从给定的源接受一条消息。但消息传递系统有它自己的缺点,就是在设计上有很多的难点,消息传递有很多变体,因此对于我们初学者,我们来看如何对消息编址这种方法:为每个进程分配一个唯一的地址,按进程为消息指定地址。 对进程的总体有了了解后,我们该入主题了,看看进程机制是如何在MINIX中实现的。Minix本身就是一组进程的集合。它们相互之间,以及与用户进程之间使用进程间通信机制(消息传递)来进行通信,这种设计使得minix的结构更加模块化和灵活。 我们首先大体浏览一下Minix整个系统,Minix被组织成4层,每一层执行很完好的功能。这4层为:1、进程管理,这是最低层,它捕获所有的中断和陷入,完成进程调度,并向高层提供一个采用消息进行通信的独立顺序进程模型,其中断处理最低层部分用汇编语言编写,其余部分和其他层次用C语言编写;2、I/O进程,每类设备都有一个I/O进程,为了将其与其他普通用户进程相区别我们称之为任务,第2层的所有任务和第一层的代码链接成一个单一的二进制程序,称作内核(kernel),尽管任务和内核被编译在一起,但在执行时内核被赋予比任务更高的特权级,所以真正的内核代码可以访问任一部分内存,及任一处理器寄存器;3、服务器进程,这些服务器进程在低于任务和内核的特权级上运行,不能直接访问I/O端口,也不能访问属于自己段以外的内存,主要有内存管理(Memory Manager,MM)负责执行所有牵涉到内存管理的系统调用,文件系统(File System,FS)负责执行文件系统的调用,尽管从它们的禁用的机器指令来看,它们与用户进程运行在相同的特权级上,但它们的执行优先级比用户进程高;4、用户进程,包含所有的用户进程shell、编译器、编辑器以及用户的a.out程序。 下面我们来了解minix的进程管理。计算机开机时,硬件从引导盘上将第一道第一扇区读入内存并从那里开始执行。Minix的引导程序装入一个更大的程序boot,由boot装入操作系统。一旦装入操作系统完成,内核开始运行,在其初始化阶段,内核先启动各任务,然后是内存管理器、文件系统及所有在第三层运行的服务器。当所有这些都开始运行并完成初始化之后,它们将阻塞,等待执行某种操作。当所有的任务和服务器被阻塞之后,将执行第一个用户进程,init。MINIX中两条最重要的系统调用是FORK和EXEC,FORK是创建一个新进程的唯一途径,EXEC允许一个进程执行一个指定的程序,当一个程序被执行时,将按照文件头中指定的大小为其分配一部分内存。 Minix中的进程间通信。Minix提供了三条原语来发送和接受消息,它们均通过C库例程调用,send(dest,&message)用来向进程dest发送一条消息;receive(source,&message)用来从进程source(或任何地方)接受一条消息;send_rec(src_dst,&message)用来发送一条消息,并等待同一个进程的应答。了解完原理,我们再来看看minix源代码的组织。源代码从逻辑上分为两个目录。在一个标准的minix系统中,其完整路径分别为/usr/include和/usr/src。Include/目录包含了许多符合POSIX标准的头文件,它又包含3个子目录:1、sys/ 包含POSIX头文件;2、minix/ 包含操作系统使用的头文件;3、ibm/ 包含IBMPC特有定义的头文件。Src/目录包含3个重要的子目录,其中包含了操作系统的源代码:1、kernel/ 第1层和第2层(进程、消息和驱动程序);2、mm/ 内存管理器代码;3、fs/ 文件系统代码。操作系统当然要支持在其上运行的命令,所以有一个很大的命令目录src/commands/,其中包含工具程序(如cat、cp、data、ls、pwd)的源代码。由于minix是一个用于教学的操作系统,这就意味着对它常常要做修改,所以有一个src/test/目录包含有一些被设计用来对新编译好的minix系统进行完整测试的工具。最后/src/inet/目录包含了重新编译minix以使之支持网络的源代码。二、设计思想 有了上面的理论指导,具体再实现某个实验应该是比较容易了。对于本次实验,我们应该具体分析进程在minix中实现机制。minix系统本身分为四个进程:kernel、mm、fs、init。而我们所要打印的PCB信息分别在kernel、mm、fs中,要想直接的到这些信息并不是一件容易的事情。因为所有的进程所占用的内存空间都是受一定保护的,更何况这里牵涉到的是操作系统本身的进程,用户进程不可能直接对他们进行访问,因此要得到所需要的信息有一定的困难。 Minix系统所有进程依靠消息进行通信和协作,包括kernel、mm和fs。所以,我们只能从这里开始。然而,系统本身并没有给我们提供用来的到进程控制块所有信息的方法,因此,修改内核、内存管理以及文件系统相应的代码是必需的。据此,我们做出了如下的总体设计。 为了得到系统中的进程控制块信息,我们必须取得对kernel、mm、fs三个进程的内存区域的访问权,而最简单的办法就是修改系统的内核、内存管理、文件系统本身的源代码,将我们所需要的功能在操作系统内部实现,这样一来,就不存在了访问权的问题。 我们这里要用到一个叫做“调用转储”的概念(操作系统:设计与实现第二版上册第213页)。在键盘驱动程序中kb_read的开始调用func_key来检测用来控制和调试的扫描码。在检测到F1和F2键时调用的转储例程位于dmp.c中。首先,p_dmp(第14613行)为所有的进程显示基本的处理信息,包括在按下F1键时显示的内存使用信息。第二,map_dmp(第14660行)在按下F2时提供更详细的内存使用信息。我们利用这个特性,增加了几个功能键的定义:键功能F1显示进程表F2显示进程内存空间的详细使用情况F3在硬件滚屏和软件滚屏之间切换F5显示以太网统计流量(如果网络支持编译)CF7(CtrlF7)发送SIGQUIT信号,同CTRL-效果CF8(CtrlF8)发送SIGINT信号,同DEL效果CF9(CtrlF9)发送SIGKILL信号,同CTRL-U效果F10显示kernel中的PCB信息(除F1种已经有的)(我们的成果)F11显示mm中的PCB信息(我们的成果)F12显示fs中的PCB信息(我们的成果) 对于调用系统信息,我们采用功能键中断方式直接由kernel接受中断,在usr/kernel/keyborad中添加F10、F11、F12分别调用kernel、mm、fs中的子程序输出该部分的进程信息。对于mm和fs我们还要在kernel里添加语句发送消息到mm和fs使之执行相应的处理程序。 程序功能流程图如下: Send(0, &message)Send(1, &message)kernelvirtual consoledo_printpcb打印kernel中的PCBdo_tomm将打印消息传给mmdo_tofs将打印消息传给fsfunc_keycase :F10case :F11case :F12mm:main函数得到消息,并辨别出消息内容,调用pr_mprocpr_mproc打印mm中的PCBfs:main函数得到消息,并辨别出消息内容,调用pr_mprocpr_fproc打印fs中的PCB设计中的思路应该是基于学习过程中的重点,但在实践中的灵活运用更为重要,如何能更方便更有效的完成要求,便是看自己对掌握的知识的深浅。Minix本身就是一种教学软件,所以我们应该从另一个角度去做这个实验,那就是那种方法更能帮助我们更好的理解理论知识,那种方法更能运用更多方面的知识。这样,便会使我们能从多角度的理解问题,能更好的达到做实验的目的。 三、编码阶段:首先,了解Minix的进程结构,Minix进程存放在内核、内存管理和文件系统三部分中,当在系统下键入F1F12时,Minix系统都会有相应。利用此原理,采用中断方式显示进程信息。所以,在src/kernel/keyboard.c中的func_key过程中添加F10、F11、F12的相应程序。程序改为如下:(注:其中黑体部分为Minix源程序,红色粗体为我们添加的程序)PRIVATE int func_key(scode)int scode;/* scan code for a function key */* This procedure traps function keys for debugging and control purposes. */ unsigned code; code = map_key0(scode);/* first ignore modifiers */ if (code F12) return(FALSE);/* not our job */ switch (map_key(scode) /* include modifiers */ case F1:p_dmp(); break;/* print process table */ case F2:map_dmp(); break;/* print memory map */ case F3:toggle_scroll(); break;/* hardware vs. software scrolling */#if ENABLE_NETWORKING case F5:dp_dump(); break;/* network statistics */#endif case F10:do_printpcb();break;/*print pcb 2002.4.20。在 func_key过程中添加控制打印kernel的pcb中内容的F10的中断代码*/ case F11:do_tomm(); break;/*send to mm 2002.4.20。在func_key过程中添加控制打印mm的pcb中内容的F11的中断代码*/case F12:do_tofs(); break;/*send to fs 2002.4.20。在 func_key过程中添加控制打印fs 的pcb中内容的F12的中断代码*/ case CF7:sigchar(&tty_tableCONSOLE, SIGQUIT); break; case CF8:sigchar(&tty_tableCONSOLE, SIGINT); break; case CF9:sigchar(&tty_tableCONSOLE, SIGKILL); break; default:return(FALSE); return(TRUE); 有如上程序知道,按入F10键时,直接调用do_printpcb函数,而do_printpcb函数将进程在kernel中的内容打印在屏幕上,其程序如下:#include kernel.h #include #include proc.h /*在do_printpcb函数中用到的库函数*/PRIVATE void do_printpcb() /*F10调用的打印kernel中pcb的函数*/ register struct proc *rp; /*定义一个指针来指向中断时的某一进程*/ static struct proc *oldrp=BEG_PROC_ADDR; /*定义另一指针来指向进程的 地址,初始值为第一个进程的地址*/ int n=0; /*设置一个计数器,来存放在屏幕上显示的行数*/ printf(nshow kernel info); /*开始打印pcb内容*/ printf(np_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-namen); /*打印要显示的pcb中内容的具体名字*/ for(rp=oldrp;rpp_flags&P_SLOT_FREE) continue; /*在程序外设有标志位p_flag标明程序可以执行,P_SLOT_FREE是标识还有空间给进程分配*/if (+n20) break; /*当打印完20行后使程序跳出*/ printf(n%6u%6x%5d%7d%7u%7u%5u%5x%5d%5d%3x%6x%2u%5c,rp-p_reg,rp-p_ldt_sel,rp-p_int_blocked,rp-p_int_held,rp-child_utime,rp-child_stime,rp-p_alarm,rp-p_callerq,rp-p_getfrom,rp-p_sendto,rp-p_nextready,rp-p_pending,rp-p_pendcount,rp-p_name16); /*将pcb中的各项具体数据按 列打印出来*/ if(rp=END_PROC_ADDR) rp=BEG_PROC_ADDR; else printf(n-more-r); oldrp=rp; /*检验进程是否结束,如果结束指针再指向新的进程,反之打印 more继续打印本进程的内容*/当键入F11键时,调用do_tomm()过程,将打印的消息传送到内存管理中去,其消息的内容是让mm执行第70条语句pr_mproc(在跳转表src/mm/table.c中用户定义):PRIVATE void do_tomm()message mes;mes.m_type=70;send(0,&mes); /*定义do_tomm()过程,将打印的消息传到内存管理中去,让其执行第70条语句pr_mproc(在跳转表src/mm/table.c中用户定义),这就是消息传递的方法,给每个进程分配唯一地址*/当键入F12键时,调用do_tofs()过程,将打印的消息传送到内存管理中去,其消息的内容是让mm执行第70条语句pr_fproc(在跳转表src/fs/table.c中用户定义):PRIVATE void do_tofs()message mes;mes.m_type=70;send(1,&mes);/*这个过程同mm,只是将消息传到fs中*/由以上的程序,完成了kernel部分的任务。然后,开始修改内存管理和文件系统相应代码,以完成进程控制块的输出任务,在mm块中,首先要更改src/mm/table.c的内容: no_sys,/* 68 = TASK_REPLY */no_sys,/* 69 = unused*/pr_mproc,/* 70 = Print Mproc Info user defined 2002.4.20。 在跳转表中定义用户进程,并分配地址。*/do_sigaction,/* 71 = sigaction */do_sigsuspend,/* 72 = sigsuspend */修改完改table表后,由kernel那传来的第70信号,执行pr_mproc,同时,pr_proc是由src/mm/proto.h定义的:/* forkexit.c */_PROTOTYPE( int do_fork, (void);_PROTOTYPE( void pr_mproc, () );/* User Difine 2002.4.20*/_PROTOTYPE( int do_mm_exit, (void);_PROTOTYPE( int do_waitpid, (void);_PROTOTYPE( void mm_exit, (struct mproc *rmp, int exit_status);在此完成的了pr_mproc()定义和调用,而pr_mproc的主程序在src/mm/forkexit.c中,完成了对mproc结构的内容的读取和写入屏幕:/*略去头文件和所用到的库函数,这些在源代码中都有明确写出*/int mm_count=0; /*定义一个计数器,因为pcb中的内容太多,一行不能全打 出所以这是一个所用屏幕数的计数器*/PUBLIC void pr_mproc() /*开始打印mm中的pcb内容*/ register struct mproc *rp;/*定义一个指针来指向中断时的某一个进程*/ static struct mproc *oldrp=&mproc0;/*定义另一个指针指向进程的地址,初始值为第一个进程的地址*/ int n=0; /*设置一个计数器,来存放在屏幕上显示的行数*/ printf(nSHOW stc/mm/mproc.hn); switch(mm_count)/*将pcb中的内容最多分为4个屏幕打出*/ case 0:printf(n-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpid-mp_parentn);/*第一个屏幕打出的pcb内容*/for (rp=oldrp;rp20)break;/*打完一个屏幕程序跳出*/ printf(n%15d%14d%8d%12d%9d%11d,rp-mp_exitstatus,rp-mp_sigstatus,rp-mp_pid,rp-mp_procgrp,rp-mp_wpid,rp-mp_parent); break;/*按列打印出对应的具体数据内容*/ case 1: printf(n-mp_realuid-mp_effuid-mp_realgid-mp_effgid-mp_ino-mp_dev-mp_ctimen); for (rp=oldrp;rp20)break; printf(n%12d%11d%10d%11d%8d%8d%15d,rp-mp_realuid,rp-mp_effuid,rp-mp_realgid,rp-mp_effgid,rp-mp_ino,rp-mp_dev,rp-mp_ctime); break;/*打印第二个屏幕的内容,具体程序同第一个*/ case 2: printf(n-mp_ignore-mp_catch-mp_sigmask-mp_sigmask2-mp_sigpending-mp_sigreturnn); for (rp=oldrp;rp20)break; printf(n%11d%10d%12d%13d%15d%14d,rp-mp_ignore,rp-mp_catch,rp-mp_sigmask,rp-mp_sigmask2,rp-mp_sigpending,rp-mp_sigreturn); break;/*打印第三个屏幕的内容*/ case 3: printf(n-mp_func-mp_flags-mp_procargsn); for (rp=oldrp;rp20)break; printf(n%9d%10d%13d,rp-mp_func,rp-mp_flags,rp-mp_procargs); break;/*打印的第四个屏幕的内容*/ mm_count=mm_count+1; if (mm_count=4) mm_count=0;/*打印完所有内容,初始化mm_count*/dont_reply=TRUE;同样,在文件系统中,要完成进程控制块的输出任务,也要更改相应的src/fs/table.c : no_sys,/* 68 = TASK_REPLY*/no_sys,/* 69 = unused */pr_fproc, /* 70 = Print Fproc Info user defined 2002.4.20。 在fs跳转表中为进程分配地址。*/no_sys,/* 71 = SIGACTION */no_sys,/* 72 = SIGSUSPEND */同样,pr_fproc在src/fs/proto.c中有如下的定义: _PROTOTYPE(void pr_fproc, () );/*2002.4.20。声明过程pr_fproc*/对于pr_fproc的主程序在src/fs/main.c中,完成了对mproc结构的内容的读取和写入屏幕:/*略去头文件和所用到的库函数,这些在源代码中都有明确写出*/int fs_count=0; /*定义一个计数器,因为pcb中的内容太多,一行不能全打 出所以这是一个所用屏幕数的计数器*/PUBLIC void pr_fproc()/*开始打印fs中的pcb内容*/ register struct fproc *rp;/*定义一个指针来指向中断时的某一个进程*/ static struct fproc *oldrp=&fproc0; /*定义另一个指针指向进程的地址,初始值为第一个进程的地址*/ int n=0; /*设置一个计数器,来存放在屏幕上显示的行数*/ printf(show src/fs/fproc.hn); switch(fs_count) /*将pcb中的内容最多分为3个屏幕打出*/ case 0: printf(n-fp_umask-*fp_workdir-*fp_rootdir-); printf(*fp_filpOPEN_MAX-fp_realuid-fp_effuidn); /*第一个屏幕打出的pcb内容*/ for(rp=oldrp;rp20)break; /*打完一个屏幕程序跳出*/ printf(%10d%11d%13x%20x%12d%11dn,rp-fp_umask,(rp-fp_workdir),(rp-fp_rootdir),(rp-fp_filpOPEN_MAX),rp-fp_realuid,rp-fp_effuid); break; /*按列打印出对应的具体数据内容*/ case1: printf(n-fp_realgid-fp_effgid-fp_tty-fp_fd-*fp_buffer-fp_nbytes-fp_cum_io_partialn);for(rp=oldrp;rp20) break; printf(%12d%11d%8d%7d%12c%11d%19dn,rp-fp_realgid,rp-fp_effgid,rp-fp_tty,rp-fp_fd,rp-fp_buffer,rp-fp_nbytes,fp-fp_cum_io_partial); break;/*打印第二个屏幕的内容*/ case2: printf(n-fp_suspended-fp_revived-fp_task-fp_sesldr-fp_pid-fp_cloexecn); for(rp=oldrp;rp20) break; printf(%14c%12c%9c%11c%8d%12ld,rp-fp_suspended,rp-fp_revived,rp-fp_task,rp-fp_sesldr,rp-fp_pid,rp-fp_cloexec); break;/*打印第三个屏幕的内容*/ fs_count=fs_count+1; if(fs_count=3) fs_count=0;/*打印完所有内容,初始化fs_count*/ dont_reply=TRUE;四、编译阶段:在完成了以上的文件的修改和编写输入后,存盘退出,转到/src/tools目录下,对Minix系统进行重新编译,输入: make在编译通过后,在当前目录下生成image文件,是Minix的映象文件,接着输入: mount /dev/hd1a hd1a my image /hd1a/minix.test sync完成后,就可以停机重起!在monitor状态下,键入hd0 image = minix.testhd0 save重新进入Minix ;这时Minix将相应我们定义的功能键!五、运行结果:F10 ( Kernel ) :F10显示在kernel中的进程信息,各项消息如下:p_reg-sel-block-held-chu-chs-alam-carq-from-send-next-ping-pend-name第一次键入F10将显示20个进程信息(如果有这么多的话),其它未能显示的(将会有more给出提示)进程将在再键入F10时显示,每次显示20个,直到全部显示完毕。F11 ( MM ) :F11显示在MM中的进程信息,由于信息内容较多,这需要多次输入F11显示更多的信息,同样,如果未能显示全部进程信息,将有提示再键入F11显示更多进程的信息:-mp_exitstatus-mp_sigstatus-mp_pid-mp_procgrp-mp_wpi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024常年物资采购协议范本
- 2024年舞台搭建项目专用协议协议
- 2024家庭水电安装项目协议范本
- 2024年化建筑砂浆采购协议范本
- 2024年活鸡买卖双方权益保障协议
- 2024建设项目用电合作协议
- 2024年学生违纪行为处理协议
- 2024水电项目专用材料采购协议范本
- 2024年设备采购协议模板2
- 2024年度视频制作项目协议格式
- 华为认证H13-624 HCIP-Storage-存储 V5.5
- 安徽省淮南市2023-2024学年高一上学期第二次月考数学试题2
- 护理美学-第一章 美学概述
- 《父亲、树林和鸟》 公开课一等奖创新教案(共两课时)
- 消防故障排查合同范本
- 2024人工智能AI问答题110道
- 岭南新天地案例分析
- GB/T 43934-2024煤矿土地复垦与生态修复技术规范
- 医院科室合作共建方案
- 3.1DNA是主要的遗传物质课件-高一下学期生物人教版必修二
- 2023年广东广州南沙区总工会招聘社会化工会工作者考试真题及答案
评论
0/150
提交评论