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

下载本文档

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

文档简介

1、计算机操作系统实验报告学写4110314姓名:董家华提交日期:2013. 11.28成绩:东北大学秦皇岛分校°计算机操作系统实验报告实验一熟悉l i nux/unix操作系统实验目的:1. 熟悉linux/unix操作系统的基本操作。2. 掌握常用基本命令和系统调用。实验内容:1. 学会开机、登录、退出与关机(1)开机很多时候,一台机器上会安装多个操作系统(operating system,简称os),因此,在开机时 会让用户选择进入哪个os。例如,显示“linux lilo: ”,或在windows2000平台下的菜单选择 oso选择进入linux后,linux初始化过程中会显示大

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

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

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

5、系统” 一 “关机或重/s” 一。2. 窗口工作方式与中断工作方式早期的unix版本都是传统的终端工作方式,这种工作方式在系统启动后就显示命令提 示符,没有多个窗门。随着macintosh和windows这样的窗门界面的出现和普及,unix和实验报告计算机操作系统linux开始引入窗门工作方式。unix和linux卜*的窗口平台都基于x-windows,有kde 窗口平台,gnome窗口平台、sun openwindows窗口平台等。用户登录后就进入终端工作方式,用户可以在终端工作方式下键入“sum”命令进入窗 口工作方式。进入窗口工作方式后,可以按ctrl+alt+f2进入终端工作方式,之后

6、可按 ctrl+alt+f7再从终端工作方式冋到窗u工作方式。窗口工作方式与在windows卜*的工作方式类似,可以在桌面上开多个窗口。linux/unix 窗口工作方式下,一个窗口可以对应一个进程,也可以对应多个进程,例如一个shell窗口(类 似与windows下的dos窗口)。3. 常用命令/系统调节列表表1.1给出了 linux/unix各章实验开始前必须掌握的最基本的常用命令。表1.2给出丫 linux八jnix下各章实验开始前必须掌握的最基本和常用的系统调用。表1.1 linux/unix各章实验开始前必须掌握的基木常用命令命令名功能rs显示进程状态kill给进程发信号,杀死进程r

7、m删除文件或目录(remove files or directories )cp复制文件和目录(copy files and directories )cat将指定文件(或标准输入)内容输出至标准输出(通常的用途是显 示文件内容),当输入文件为多个时则为合并输出(concatenate files and print on standard output)more文件分页显不的交互式 具(files perusal filter for ert viewing)ls显示文件属性和目录内容chmod改变文件访问权限(change file access permissions)mkdir建立 0

8、 录(make directories )pwd品75当前 a 衆名 / 工作 a 荣名(print name of current/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)

9、readfe文件(read from a file descriptor)。別于个已打开的文件,通过 它的文件描述字,读该文件的内容write写文件(write to a file descriptor)。对丁一个己打开的文件,通过它 的文件描述字,写该文件的内容i.seek改变文件内当前读写指针位置(reposition read/write file offset)4. 外存目录树结构计算机操作系统实验报告 以linux 2.2版为例,外存目录树结构如图1.1所不。图中,linux命令实用程序放在/bin和/usr/bin下,源码放在/usr/src下,内核程序文件vmlinux放在/bo

10、ot下,设备特别文件放在/dev 卜,帮助文件放在/usr/man下,用户主目录通常放在/home卜*图1.1 linux外存目录树结构5. 程序开发工具:编辑、编译、连接、调试i. 编辑程序linux/unix的编辑程序有emacs、vi、ed等。笔者建议使用emacs.ii. 编译程序编译、调试c程序时,可以在emacs中编译,也可以在命令行下编译:# cc f.c上述命令行编译c源程序f.c,输出的可执行0标程序为a.om。# cc f.c -of上述命令行编译c源程序f.c,输出的可执行目标程序为f。# cc -c f.c上述命令行编译c源程序f.c ,但只输出目标模块f.o。iii.

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

12、令和大量命令组合功能。linux八jnix下的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、手册、市场上销售的各种参考书,各种网上资源等。此外,有些窗口平台带有 联机帮助菜单项。实验二进程的创建和控制一,实验目的:加深对进程概念的理解,明确进程和程序的区别。(2) 进一步认识并发执行的实质。0)加深对进程管理概念的理解。(4)分析进程的创建过程。二,实验内容:(1) 阅读linux的fork, c源码文件。(2) a. linux/unix的进程和cpu管理类命令:(8个)命令名功能ps显示进程状态pstree显不进程树(display a tree of processes )kill给进程发信号killhau按名给进程发信号(kill processes by name)skil

14、l,snice报告进程状态(report process status)top品不进程状态(display top cpu processes )procinfo显示从/pmc搜集的系统状态信息idle使进程()进入idle状态(make process 0 idle)b. linux/unix进程和cpu管理类系统调用:类别个数列举腿趣埔細s13fork( ),clone( ),vfork( ),execve( ),exit( ),nanosleep(), pause( ),wait( ),waitpid( ),wait4( ),wait3( ),kill( ),killpg()进程11ge

15、tpriority,setpriority,nice, sched get priority max,度先管$调优级t5 f e -uldtechtseudechsr,ldleeu t.n,edd_nihecrrc hltscbe ssis-al,rioedpt-pschlntee, i-gmetd_2 4earhtrr二ed_ched-smraa中sed-echs进程号(组)的设置与查看7id si et stpge9.tgpsegidtpgedtpesdp1中ged 1tpeg髓觸顧柵飯価肖2sem曇,ccatrpt難城程/cp魏臟臟蹦用6ido6(8rnve11d pcapr68rnvt

16、rr巧el11an0rs(erlinux八jnix进程和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 * arg)建立一个子进

17、 程(creat a child process)仅在linux卜有。int execve (const char*filename,执行程序 (execute功能:用指 定程序覆在.库函数级对应cxcclc, execlp, execl,execv,char*const argv ,char*const envp);program )盖当前程 序代码 返冋:成功 与否exeevp五个函数。参见 man3一exitterminate thecurrentprocess终止当前 进程nanoslccppauseexecution for a specified time暂停执行 指定的一 段时间

18、'vait,waitpidwait for process termination等待进程 终止wait3,wait4wait for process termination, 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 p

19、rocess identification)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 p

20、rocess priority)sched_get一priority一max, schcd gct priority min设置静态优先级范围(get static priority range)sched_setparam,sched_getparam设置/查看调度参数 (set and get scheduling parameters)schcd_sctschcdulcr>schcd_gctschcdulcr设置/查看调度算法和参数 (set and get scheduling algorithm/ parameters)sched_rr_get_interval查看指定进程的s

21、ched.rr值(get the sci ied rr interval for the namedprocess)°计算机操作系统实验报告f. unux/unix进程管理类系统调用:与进程跟踪/进程运行时间有关的系统调用(2个)名/格式功能p trace进系呈足艮踪(process trace)times得到进程时间(get process times)g. linux/unix进程和cpu管理类系统调用(5):其他与进程和cpu管理有关的系统调用(6个)名/格式功能pred进程控制(operations on a process)personality设置进程执行域(set th

22、e process execution domain)acct开/关进程记中长(switch process accounting on or off)idle使进程 0 进入 idle 状态(make process 0 idle)vm86old,vm86进入虚拟 8068 方式(enter virtual 8068 mode)h. linux线程库常用函数函数名功能pthrcad crcatc建立一个新线程pthrcad_canccl,pthrcad_sctcancclstatc, pthread setcanceltype,pthread testcancel线程撤消(thread ca

23、ncellation)pthread一join等待另一线程终止pthread exit退出当前线程pthread sigmask,pthread k 川,sigwait线程屮的信号处理三,实验步骤:(1)进程的创建编写一段程序,使用系统调用fork 创建两个子进程。当此程序运行时,在系统中有一个父 进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分 别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。<程序1# include<stdio.h> main ()intpl, p2;while (pi = fork () =

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

25、输出一个字符改为每个进程输出一句话,在观察程序执行时 屏幕上出现的现象,并分析原因。如果在程序中使用系统调用bckf()来给每一个进程加锁,可以实现进程之间的互斥,观察并 分析出现的现象。<程序2# include<stdio. h> main ()intpl,p2,i;while (pi = fork() = = -1); if (pi = =0)for(i = 0; i<500; i+) printf ("child %dn”,i);elsewhile (p2 二 fork () ) = = -1); if(p2 =()for(i = 0;i<500

26、;i+) printf (“son%dn”,i)elsefor(i=0, i<500; i+)printf (daughter % dn”,i);分析:由于函数primfg输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时 不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序 和先后随着执行的不同而发生变化。这与打印单字符的结果相同。<程序3# includc<stdio. h> main()intpl,p2,i;while (pi = fork () = = -1);if (pi = = 0)lockf(l,1,0),for(

27、i = 0 ; i<500 ; i+) printf (“child %d/n”,i); lockf(l, 0, 0);elsewhile (p2 =fork() = = -l); if (p2 = =0)lockf(l, 1, 0);for(i = 0; i<500; i+) printffson %dn”,i); lockf(l,0,0);elselockf(l,1,0);for(i = 0;i<500;i+) printf(“daughter %dn”,i);lockf(l, 0, 0);大致与未上锁的输出结果相同,也是随着执行吋间不同,输出结果的顺序有所不同。分析:因

28、为上述程序执行时,不同进程之间不存在共享临界资源(其屮打印机的互斥性已由操 作系统保证)问题,所以,加锁与不加锁效果相同。四,实验总结:通过本次实验加深对进程概念的理解,明确了进程和程序的区别。进一步认识并发执行的 实质。加深对进程是如何管理的。学会了 linux的fork, c源码文件。limix/unix的进程和 cpu管理类命令更加明白了进程的创建过程使我收益匪浅。实验五使用动态优先权的进程调度算法模拟一、实验目的通过动态优先权算法的模拟加深对进程概念进程调度过程的理解。二、实验内容(1) 用c语言来实现对n个进程采用动态优先权优先算法的进程调度。(2) 每个用来标识进程的进程控制块pc

29、b用结构来描述,包括以下字段:1,进程标识数id。2, 进程优先数priority,并规定优先数越大的进程,其优先权越高。3, 进程已占用的cpu时间cputime。4, 进程还需占用的cpu时间alltime。当进程运行完毕时,alltime变为0。5, 进程的阻塞时间startblock,表示当进程再运行startblock个时间片后,将进入阻塞状6, 进程被阻塞的时间blocktime,表示已足赛的进程再等待blocktime个时间片后,将转换 成就绪状态。7, 进程状态start。8, 队列指针next,用来将pcb排成队列。(3) 优先数改变的原则:1,进程在就绪队列屮呆一个时间片,

30、优先数加1。2,进程每运行一个时间片,优先数减3。(4) 假设在调度前,系统中有5个进程,它们的初始状态如下:id01234pr1ority9383()290cputime00000alltime33634startbl2-1-1-1-1ockblockti30000mestatereadyreadyreadyreadyready(5) 为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的異体 格式如下:running prog: i ready-queue: -> idl-id2 block-queue: -id3-> id4id01234priorityp

31、0plp2p3p4cuptimecoclc2c3c4alltimeaoa1a2a3a4startblocktot1t2t3t4blocktimebobib2b3b4statesosis2s3s4三,实验步骤:que.javapublic class que private int maxsize; private int quearray; private int front; private int rear; private int nltems; public que(int s) maxsize=s;quearray=new intmaxsize;front=0;rear=-l;nlt

32、ems=0;public void insert(int j) if(rear=maxsize-l) rear=-l;quearray+rear=j;nltems+;public int remove()int temp=quearrayfront+; if(front=maxsize) front=0;nltems-; return temp;public int peekfront()return quearrayfront;public boolean isempty() return(nltems=0);public boolean isfull()return(nitems=maxs

33、ize);public int size() return nltems;pcb.javaimport java.util.ijnkedust; import java.util.qucuc; import java.util.scanner;public class pcb public int id; public int priority; public int cputimc; public int alltime; public int startblock; public int blocktime; public int stat;/int id,int priority,int

34、 cputimc,int alltimc,int startblock,int blocktimc,int state public pcb (int id,int cputime,int alltime,int blocktime,int stat) / supero;this.id=id;tbis.priority=priority;this.cputimc=cputimc;this.alltime 二alltime;this.startblock=startblock;this.blocktime=blocktime;this.st

35、at=stat;public void modifypriorityq if(priority>0) priori ty-=3;,public void modifycputimeq cputime+=l;public void modi fyalltimeq if (alltime>0) all time-=1;public void modifystartblockq if(startblock>0) startblock-=l;public void modifyblocktimcq if(blocktime0) block time-=1;public void mo

36、di fystat 10 stat= 1;public void modifystatnegativeq 实验报告°计算机操作系统 stat=-l;public void modifystatoq stat 二 0; class runprivate static final queue queue = null;pcb| id=new pcb5; id0=new pcb(0,9,0,3,2,3,0); idl=new pcb(1,39,03,-1,0,0); id2=new pcb(2,30,0,6,-l,0,0); id3|=new pcb(3,29,0,3,-l,0,0); i

37、d4=new pcb(4,(),0,4,-1,0,0); int m,n;/pcb a4=l,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; /imid| = l,2,3,4,5;public void getido m=math.max(matb.max(ido.priority,idjlj.priorit7),math.max(matb.max(id2.priority,id3-priority)3d4.pr ority);for(int i 二 0;i<5;i+) if(idi.priorit

38、y=m) n=idi.id;void prioriuruno id | n | .modify stat 10; idn .modifypriorityo; idn.modifycputime();idn.modifyalltimco; if(idn).alltime=0) id n .priority=-100;void otherpriorityq for(int i=();i<5;i+) id i .modi fystartblockq;实验报告计算机操作系统 if(idi.startblock=0) idi.modifyblocktimeq; idi.modifystatnega

39、tiveo;if (id i |. startblock=0&id i .blocktime=0) idi .modifystatoq;for(int s=l;s<5;s+) if(ids.id!=n) ids .modifystato q;if(i!=n)idi.priority+;void goblocktimcq for(int i 二 0;i<5;i+)if(idi.startblock=()&&idi.blocktime!=0) idi.blocktime-= 1;public runq n=l;for(int p二l;p<20;p+)str

40、ing b=,nuuh;que queue=new que(5);getid();priorityrunq;otherpriorityq;/modifystateqgoblocktimeq;for(int i=0;i<5;i+)if(idi.stat=-l)b =integer.tostring(i);for(inti=0;i<5;i+)if(idi.stat=o)queue.insert(i);实验报告计算机操作系统 system.out.prindn(progress:+p); system.out.println(nrunning prog:n+n); system.out.

41、print(ready queue:"); whilc(!qucuc.isempty 0) int q=queue.remove(); system.out.print(cj);system.out.print(n );systcm.out.printlnf); system.out.println(nblock queue:n+b): system.out.println(=system.out.print(mid',+n for(int i=0;i<5;i+) system.out.print(id|i|.id+m );fsystem.out.printlnq; s

42、ystem.out.printc,priorityn+h for(int i=0;i<5;i+) system>out.print(id |i | .priority + nh i 9«system.out.printlnq; system.out.printf alltime"+'* for(int i=0;i<5;i+) system.out.print(id|i|.alltime+hfsystem.out.printlnq; system.out.print(mstartbi.ockm for(int i=0;i<5;i+)system

43、.out.print(id|i|.startblock+hfsystem.out.printlnq; system.out.print(nbmci<ttmr for(int i=0;i<5;i+) system.out.print(id|i| .blocktime+fsystem.out.printlnq; system.out.print(mstate for(int i=0;i<5;i+) system.out.print(idi|.stat+nfsystem.out.printlnq;ft i ylivml"system.out.printlnq; syste

44、m.out.print(ncputtme for(int i=0;i<5;i+) system.out.print(id|i|.cputime+us计算机操作系统实验报告systcm.out.print("请按任意键继续");scanner input = new scanner(system.in);string str = input.nextq;system.out.printlnfthe program has finished!totally spend 19 processes” system.out.prindn(mthanks for your vie

45、w);system.out.printlnfmade by dongjiahua using java);main.javaimport "java.util,queue; public class mainpublic static void main(string args) run run=new run();四,实验总结:通过本次实验加深对动态优先权调度算法的理解。进一步认识动态优先权调度算法的实质。加 深对动态优先权调度算法是如何进行的,以及/解进程控制块对进程的作用,使进程能并发运行, 使我了解了许多的知识。实验六使用动态分区分配方式的模拟1、实验目的了解动态分区分配方式

46、中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及 其实现过程的理解。2、实验内容(1) 用c语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程albc()和回收过程 free()o其中,空闲分区通过空闲分区链来管理:在进行内存分配吋,系统优先使用空闲区低端的 空间。(2) 假设初始状态下,可用的内存空间为640kb,并有下列的请求序列:作业1中请130kb。作业2申请60kb。作业3申请lookbo 作业2释放60kb。作业4申请200kb。作业3释放100kb。作业1释放130kb。作业5申请140kb。作业6申请60kb。作业7申请50kb。计算机操作系统实验报告

47、作业6释放60kb。请分别采用首次适应算法和最佳适应算法,对内存块进行分配和冋收,要求每次分配和冋收后显 示出空闲分区链的情况。3、示例程序:#include<stdio-h>#include<stdlib. h>#include<string. h>/#includc<iostrcam. h>#include<windows> h>#define free 0#define busy 1define ok 1define error 0#define status int;int n=0;int max_length=640;

48、typedef struct freearea int number: int size; / int address; / int state;elemtype;typedef struct dulnodcelemtype data; struct dulnodc 氺prior; struct dulnode 氺next;dulnode, *dulinklist;dulinklist first;duli nkki st last;int request;int allocation(int, int, int);int free(int):int ff(int, int);int be (

49、int, int);void show();int initlist ();int initlist() f irst=(i)ulinklist)malloc(sizeof (dulnodc): last=(dulinklist)malloc(sizeof(dulnode); first->prior=null:first->ncxt=last;ast->prior=first; last-next=nlll; last->data. addresso;s计算机操作系统实验报告last->data. size-mx_length; last->data. n

50、umber); last->data. state=eree; return ok; int fe(int number, int request)dulinklist dll=(dulinklist)malloc(sizcof(dulnodc): dll-data. number=number;dll-data. size=rcqucst;dll->data. state=busy;dulnode *p=first->next; while (p) if (p->data. state=free&&p-data. size=reciuest) p-da

51、ta. state=busy; p->data. number=number; return ok; break:if (p->data. statefree&&p->data. size>request) dll-prior=p-prior;dll->ncxt=p;dij,->data. address=p->data. address; p->pr ior->next=i)ll; p->prior=dll;pdata. address=dll->data. address+dll->data. size

52、; p->data. sizc-=rcquest: return ok;break;p=p-next;return error;int be(int number, int request) int ch;dulinklist dll=(dulinkli st)malloc(sizeof(dulnode); l)ll->data. numbcr=numbcr;dll->data. size=request:dll->data. state=busy;dulnodc *p=first->ncxt;dulnode *q=first>next;whi le(p)

53、计算机操作系统实验报告if(p->data. state=erec&&(p->data. size>rcquest|p-data. size=rcqucst)q=p;ch=p->data. size-request; break: p=p->next;while (p) if (p->data. state=eree&&p->data. size>request) if(p->data. size-request/ch) ch=p->data. size-request; q=p;p=p-next;if

54、(q=null) return error; elsedll->prior=q->prior;dll-next=q;dll->data. addrcss=q->data. address:q->prior_nex t=dll;q-prior=dll;q->data. address+=request;q->data. size=ch;return ok;int free(int number)dulnode *p=first; while(p) if(p->data. number=number) p->data. statc=frco; p->data. number=free; if(p->prior>data. state=free)p->prior->data. size+=p->data. size; p-prior->next=p-next; p->ncxt->prior=p->prior:if(p->next->data. state=frec) p->data. size+=p->next->data. size; p-next-next-prior=p; p->ncxt=

温馨提示

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

评论

0/150

提交评论