东北大学秦皇岛分校操作系统实验4110314董家华-代码原创_第1页
东北大学秦皇岛分校操作系统实验4110314董家华-代码原创_第2页
东北大学秦皇岛分校操作系统实验4110314董家华-代码原创_第3页
东北大学秦皇岛分校操作系统实验4110314董家华-代码原创_第4页
东北大学秦皇岛分校操作系统实验4110314董家华-代码原创_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机操作系统实验报告学 号:4110314姓 名:董家华提交日期: 2013.11.28成 绩:东北大学秦皇岛分校计算机操作系统 实验报告 实验一 熟悉Linux/UNIX操作系统实验目的:1 熟悉Linux/UNIX操作系统的基本操作。2 掌握常用基本命令和系统调用。实验内容:1学会开机、登录、退出与关机(1) 开机很多时候,一台机器上会安装多个操作系统(Operating System,简称OS),因此,在开机时会让用户选择进入哪个OS。例如,显示“Linux LILO:”,或在Windows2000平台下的菜单选择OS。选择进入Linux后,Linux初始化过程中会显示大量初始化信息,

2、要求学习者逐渐读懂这些初始化信息,以从这个角度来理解Linux的工作原理。(2)登录与修改口令在打开终端或在Neterm之类的程序上进行远程连接后,Linux/UNIX在相应初始化完成后,会在屏幕上显示“login:”。此时输入用户名(帐号)并键如回车,则系统显示“password:”,然后输入保密字(口令)并键入回车。此时,系统验证所键入的用户名和保密字,若正确则成功进入系统,显示命令提示符#,若不正确则显示“login incorrect”,并重新显示“login:”,让用户重新输入正确的用户名和保密字。有时用户可能想修改保密字,则可以在成功进入系统后,在命令提示符后输入“password

3、”并键入回车,则系统再显示“new password:”。当用户键入新保密字并键入回车后,系统再显示“retype new password:”,此时需再次重复键入刚才输入的新保密字并键入回车,则系统接收并记住新的保密字。如果用户在登录时忘了保密字,则只能找系统管理员解决问题。或者,如果用户想修改自己的用户名,也只能找系统管理员解决。(3) 退出、注销当用户不再使用Linux/UNIX时,在离开前,通常应键入logout命令或ctrk+D开退出帐号。若是在PC上安装Linux/UNIX下,则此步骤可以省略而键入halt或reboot命令。若是在多用户机器上(终端/网络登录),则此步骤最好不要略

4、过,否则会导致计帐或安全上的问题。(4) 关机或重启在Linux/UNIX下,涉及到关机或重启的命令有:a) 键入halt命令。这是最常用的关机方式。b) 如果用户只是想退出Linux操作系统,并不想关机,还想再进入其他OS(例如Windows),则键入reboot命令(重启)。c) 在多用户机器上,系统管理员在关机(键入halt命令)前,通常要键入shutdown命令。这是一条广播性质的命令,通知各用户即将关机,以便给各用户留下一定的时间作保存、退出等工作。d) 在窗口工作方式下,可以通过与Windows类似的开始菜单来关机或重启:“开始”“关闭系统”“关机或重启”。2窗口工作方式与中断工作

5、方式早期的UNIX版本都是传统的终端工作方式,这种工作方式在系统启动后就显示命令提示符,没有多个窗口。随着Macintosh和Windows这样的窗口界面的出现和普及,UNIX和Linux开始引入窗口工作方式。UNIX和Linux下的窗口平台都基于X-Windows,有KDE窗口平台,GNOME窗口平台、SUN OpenWindows窗口平台等。用户登录后就进入终端工作方式,用户可以在终端工作方式下键入“starts”命令进入窗口工作方式。进入窗口工作方式后,可以按Ctrl+Alt+F2进入终端工作方式,之后可按Ctrl+Alt+F7再从终端工作方式回到窗口工作方式。窗口工作方式与在Windo

6、ws下的工作方式类似,可以在桌面上开多个窗口。Linux/UNIX窗口工作方式下,一个窗口可以对应一个进程,也可以对应多个进程,例如一个Shell窗口(类似与Windows下的DOS窗口)。3 常用命令/系统调节列表表1.1给出了Linux/UNIX各章实验开始前必须掌握的最基本的常用命令。表1.2给出了Linux/UNIX下各章实验开始前必须掌握的最基本和常用的系统调用。表1.1 Linux/UNIX各章实验开始前必须掌握的基本常用命令命令名功 能Rs显示进程状态Kill给进程发信号,杀死进程Rm删除文件或目录(remove files or directories)Cp复制文件和目录(co

7、py files and directories)Cat将指定文件(或标准输入)内容输出至标准输出(通常的用途是显示文件内容),当输入文件为多个时则为合并输出(concatenate files and print on standard output)More文件分页显示的交互式工具(files perusal filter for crt viewing)Ls显示文件属性和目录内容Chmod改变文件访问权限(change file access permissions)mkdir建立目录(make directories)Pwd显示当前目录名/工作目录名(print name of cur

8、rent/working directory)Echo显示一行(display a line of text)chear清屏(clear the terminal screen)表1.2 Linux/UNIX各章实验开始前必须掌握的基本常用系统调用名 称功 能Open,creat打开和/或建立一个文件或设备(open and possibly create a file or device)Close关闭一个文件描述字(close a file descriptor)Read读文件(read from a file descriptor)。对于一个已打开的文件,通过它的文件描述字,读该文件的内

9、容Write写文件(write to a file descriptor)。对于一个已打开的文件,通过它的文件描述字,写该文件的内容Lseek改变文件内当前读写指针位置(reposition read/write file offset)4 外存目录树结构以Linux 2.2 版为例,外存目录树结构如图1.1所示。图中,Linux命令实用程序放在/bin和/usr/bin下,源码放在/usr/src下,内核程序文件vmlinux放在/boot下,设备特别文件放在/dev下,帮助文件放在/usr/man下,用户主目录通常放在/home下 / root bin boot dev home lib

10、mnf proc usr bin src man lib 图1.1 Linux外存目录树结构5 程序开发工具:编辑、编译、连接、调试i. 编辑程序Linux/UNIX的编辑程序有Emacs、vi、ed等。笔者建议使用Emacs.ii. 编译程序编译、调试C程序时,可以在Emacs中编译,也可以在命令行下编译: # cc f.c上述命令行编译C源程序 f.c ,输出的可执行目标程序为a.out。 # cc f.c o f上述命令行编译C源程序 f.c ,输出的可执行目标程序为f。 # cc c f.c上述命令行编译C源程序 f.c ,但只输出目标模块f.o 。iii. 调试程序 Linux下的常

11、用调试程序是GDB。此外,ptrace系统调用(跟踪进程执行)、strace命令(跟踪系统调用与信号)、Ltrace命令(跟踪库函数调用,a library call tracer)等,也可以用来辅助调试。iv. make程序如果所编制的程序由几十个模块组成,修改其中任一模块时都要将这几十个模块重新连接,则此时make可以大大提高工作效率,减少很多重复性劳动。6 SHELLLinux/UNIX的命令解释器俗称SHELL,具有以下两个功能:(1)显示命令提示符,接收、解释、启动执行命令行。(2)解释执行批处理文件(Shell script),提供很多内部命令和大量命令组合功能。Linux/UNI

12、X下的SHELL有很多种,有CSH、BSH、KSH等。7 如何获得帮助信息和技术资料(1)联机帮助命令man、info和help选项例如,要查询cat命令的功能和用法,键入以下3个命令行中的任意一个即可。# man cat# info cat# cat helpman 命令提供的联机帮助信息有8节,分别对应以下内容:man 1 命令man 2 系统调用man 3 库函数man 4 设备驱动程序和设备特别文件man 5 系统文件man 6 游戏man 7 宏程序包和语言约定man 8 系统管理和维护工具(2)其他帮助这包括厂家提供的手册、市场上销售的各种参考书,各种网上资源等。此外,有些窗口平台

13、带有联机帮助菜单项。 实验二 进程的创建和控制 一,实验目的:(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)加深对进程管理概念的理解。(4)分析进程的创建过程。 二,实验内容:(1) 阅读Linux的forkc源码文件。(2) a. Linux/UNIX的进程和CPU管理类命令:(8个)命令名功能Ps显示进程状态Pstree显示进程树(display a tree of processes)Kill给进程发信号Killhall按名给进程发信号(kill processes by name)Skill,snice报告进程状态(report process

14、 status)Top显示进程状态(display top CPU processes)Procinfo显示从/proc搜集的系统状态信息Idle使进程0进入idle状态(make process 0 idle) b. Linux/UNIX进程和CPU管理类系统调用:类别个数列 举进程建撤与状态改变13Fork( ),clone( ),vfork( ),execve( ),exit( ),nanosleep( ),pause( ),wait( ),waitpid( ),wait4( ),wait3( ),kill( ),killpg( )进程调度优先级管理11Getpriority, setp

15、riority, nice, sched_get_priority_max, sched_get_priority_min,Sched_setparam, sched_getparam, sched_setscheduler, sched_getscheduler, sched_rr_get_interval, sched_yield进程号(组)的设置与查看7Getpid, getppid, setpgid, getpgid, setpgrp, getpgrp, setsid进程跟踪调试和进程运行时间2Ptrace( ), times其他与进程/CPU管理相关的系统调用6Personality

16、, vm86, prctl, acct, idle, vm86oldc. Linux/UNIX进程和CPU管理类系统调用(1):与进程建撤和状态有关的系统调用(13个)名/格式/参数功能参数/返回值的解释其他说明fork( ),vfork ( )建立一个子进程(create a child process)对父进程:返回子进程号。对子进程:返回0不成功:返回-1Linux2.2下, vfork只是fork的一个别名而已,两者完全相同。而在UNIX下两者则有所区别。viint clone(int(*fn)(void*arg),Void*childstack, int flags, void *

17、arg)建立一个子进程(creat a child process)仅在Linux下有。int execve (const char*filename,char*const argv ,char*const envp );执行程序(execute program)功能:用指定程序覆盖当前程序代码返回:成功与否在库函数级对应execle, execlp, execl, execv, execvp五个函数。参见man3_exitterminate the currentprocess终止当前进程nanosleeppauseexecution for a specified time暂停执行指定的一

18、段时间wait,waitpidwait for processtermination等待进程终止wait3,wait4wait for processTermination,BSD tyleBSD风格的等待进程终止killsend signal to a process向一个进程发信号killpgsend signal to a process group向一个进程组发信号pausewait for signal等待信号d. Linux/UNIX进程和CPU管理类系统调用(2)与进程号/组有关的系统调用(7个)名/格式功 能Getpid,getppid获得进程号(get process ide

19、ntification)Setpgid,getpgid,setpgrp,getpgrp设置/查询进程组(set/get process group)setsid建立一个会话并设置进程组号(creates a session and sets the process group ID)e. Linux/UNIX进程和CPU管理类系统调用(3):与进程调度有关的系统调用(11个)名/格式功 能getpriority,setpriority设置/查看程序调度优先级(get/set program scheduling priority)nice改变进程优先级(change process prior

20、ity)sched_get_priority_max,sched_get_priority_min设置静态优先级范围(get static priority range)sched_setparam,sched_getparam设置/查看调度参数(set and get scheduling parameters)sched_setscheduler,sched_getscheduler设置/查看调度算法和参数(set and get scheduling algorithm/parameters)sched_rr_get_interval查看指定进程的SCHED_RR值(get the SC

21、HED_RR interval for the named process)f. Linux/UNIX进程管理类系统调用(4):与进程跟踪/进程运行时间有关的系统调用(2个)名/格式功 能ptrace进程跟踪(process trace)times得到进程时间(get process times)g. Linux/UNIX进程和CPU管理类系统调用(5):其他与进程和CPU管理有关的系统调用(6个)名/格式功 能prctl进程控制(operations on a process)personality设置进程执行域(set the process execution domain)acct开/

22、关进程记帐(switch process accounting on or off)idle使进程0进入idle状态(make process 0 idle)vm86old,vm86进入虚拟8068方式(enter virtual 8068 mode)h. Linux线程库常用函数函数名功 能pthread_create建立一个新线程pthread_cancel,pthread_setcancelstate,pthread_setcanceltype,pthread_testcancel线程撤消(thread cancellation)pthread_join等待另一线程终止pthread_e

23、xit退出当前线程pthread_sigmask,pthread_kill,sigwait线程中的信号处理三,实验步骤: (1) 进程的创建编写一段程序,使用系统调用fork ( ) 创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。# includemain ( )int p1,p2;while (pl = fork ( ) = = -1 ); /* 创建子进程p1 */if (pl=0) /* 子进程创建成功 */ putchar (b)

24、;elsewhile (p2 = fork ( ) = = -1); /* 创建另一个子进程 */if ( p2 = = 0) /* 子进程创建成功 */putchar (c);else putchar(a);/* 父进程执行 */ 分析:从进程并发执行来看,输出bac,acb等情况都有可能。 原因:fork()创建进程所需的时间要多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了“b”,而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。 (2 ) 进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原

25、因。如果在程序中使用系统调用lockf ( )来给每一个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。# includemain ( )int pl,p2,i;while (p1 = fork( ) ) = = -1);if (p1 = =0) for ( i0 ; i500;i+) printf ( child dn”,i);elsewhile (p2 = fork ( ) ) = = -1);if (p2 = =0) for (i = 0 ; i500 ; i+) printf ( “sondn” ,i )elsefor (i0,i500; i+)printf (daughter

26、dn”,i ); 分析:由于函数printf( )输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。# includemain( )int p1,p2,i; while (pl = fork ( ) ) = = -1);if (pl = = 0)lockf(1,1,0),for(i = 0 ; i500 ; i+) printf (“child %d/n”,i );lockf(1,0,0);elsewhile (p2 =fork ( ) = =

27、 -1);if (p2 = =0)lockf(1,1,0);for(i = 0; i500; i+) printf(“son %dn”,i );lockf(1,0,0);elselockf(1,1,0);for(i = 0; i0)priority-=3;public void modifycputime()cputime+=1;public void modifyalltime()if (alltime0)alltime-=1;public void modifystartblock()if(startblock0)startblock-=1;public void modifyblockt

28、ime()if(blocktime0)blocktime-=1;public void modifystat1()stat=1;public void modifystatnegative()stat=-1;public void modifystat0()stat=0;class Runprivate static final Queue Queue = null;PCB id=new PCB5;id0=new PCB(0,9,0,3,2,3,0);id1=new PCB(1,39,0,3,-1,0,0);id2=new PCB(2,30,0,6,-1,0,0);id3=new PCB(3,

29、29,0,3,-1,0,0);id4=new PCB(4,0,0,4,-1,0,0);int m,n;/PCB a4=1,2,3,4,5,6,7,2,3,4,5,6,7,7,2,3,4,5,6,7,7,2,3,4,5,6,7,7,2,3,4,5,6,7,7;/int id=1,2,3,4,5;public void getid()m=Math.max(Math.max(id0.priority,id1.priority),Math.max(Math.max(id2.priority,id3.priority),id4.priority);for(int i=0;i5;i+)if(idi.pri

30、ority=m)n=idi.id;void priorityrun()idn.modifystat1();idn.modifypriority();idn.modifycputime();idn.modifyalltime();if(idn.alltime=0)idn.priority=-100;void otherpriority()for(int i=0;i5;i+)idi.modifystartblock();if(idi.startblock=0)idi.modifyblocktime();idi.modifystatnegative();if(idi.startblock=0&idi

31、.blocktime=0)idi.modifystat0();for(int s=1;s5;s+)if(ids.id!=n)ids.modifystat0();if(i!=n)idi.priority+;void goblocktime()for(int i=0;i5;i+)if(idi.startblock=0&idi.blocktime!=0)idi.blocktime-=1;public Run()n=1;for(int p=1;p20;p+)String b=null;Que queue=new Que(5);getid();priorityrun();otherpriority();

32、/modifystate();goblocktime();for(int i=0;i5;i+)if(idi.stat=-1)b =Integer.toString(i);for(int i=0;i5;i+)if(idi.stat=0)queue.insert(i);System.out.println(Progress:+p);System.out.println(Running Prog:+n);System.out.print(Ready Queue:);while(!queue.isEmpty()int q=queue.remove();System.out.print(q);Syste

33、m.out.print( );System.out.println();System.out.println(Block Queue:+b);System.out.println(=);System.out.print(ID+ );for(int i=0;i5;i+)System.out.print(idi.id+ );System.out.println();System.out.print(PRIORITY+ );for(int i=0;i5;i+)System.out.print(idi.priority+ );System.out.println();System.out.print(

34、CPUTIME+ );for(int i=0;i5;i+)System.out.print(idi.cputime+ );System.out.println();System.out.print(ALLTIME+ );for(int i=0;i5;i+)System.out.print(idi.alltime+ );System.out.println();System.out.print(STARTBLOCK+ );for(int i=0;i5;i+)System.out.print(idi.startblock+ );System.out.println();System.out.pri

35、nt(BLOCKTIME+ );for(int i=0;i5;i+)System.out.print(idi.blocktime+ );System.out.println();System.out.print(STATE+ );for(int i=0;i5;i+)System.out.print(idi.stat+ );System.out.println();System.out.print(请按任意键继续);Scanner input = new Scanner(System.in);String str = input.next();System.out.println(The pro

36、gram has finished!Totally spend 19 processes);System.out.println(Thanks for your view);System.out.println(Made by Dongjiahua using JAVA);Main.javaimport java.util.Queue;public class Mainpublic static void main(String args)Run run=new Run(); 四,实验总结: 通过本次实验加深对动态优先权调度算法的理解。进一步认识动态优先权调度算法的实质。加深对动态优先权调度算

37、法是如何进行的,以及了解进程控制块对进程的作用,使进程能并发运行,使我了解了许多的知识。 实验六 使用动态分区分配方式的模拟1、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。2、实验内容(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB。作业2申请60KB。作业3申请100KB。作业2释放60KB。

38、作业4申请200KB。作业3释放100KB。作业1释放130KB。作业5申请140KB。作业6申请60KB。作业7申请50KB。作业6释放60KB。请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。3、示例程序:#include#include#include/#include#include#define Free 0#define Busy 1#define OK 1#define ERROR 0#define Status int;int n=0;int MAX_length=640;typedef struct FreeAreai

39、nt number;int size; /int address; /int state;ElemType;typedef struct DuLNodeElemType data;struct DuLNode *prior;struct DuLNode *next;DuLNode,*DuLinkList;DuLinkList first;DuLinkList last;int request;int allocation(int,int,int);int free(int);int FF(int,int);int BF(int,int);void show();int InitList();i

40、nt InitList()first=(DuLinkList)malloc(sizeof(DuLNode);last=(DuLinkList)malloc(sizeof(DuLNode);first-prior=NULL;first-next=last;last-prior=first;last-next=NULL;last-data.address=0;last-data.size=MAX_length;last-data.number=0;last-data.state=Free;return OK;int FF(int number,int request)DuLinkList DLL=

41、(DuLinkList)malloc(sizeof(DuLNode);DLL-data.number=number;DLL-data.size=request;DLL-data.state=Busy;DuLNode *p=first-next;while (p)if(p-data.state=Free&p-data.size=request)p-data.state=Busy;p-data.number=number;return OK;break;if(p-data.state=Free&p-data.sizerequest)DLL-prior=p-prior;DLL-next=p;DLL-data.address=p-data.address;p-prior-next=DLL;p-prior=DLL;p-data.address=DLL-data

温馨提示

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

评论

0/150

提交评论