操作系统概论实践作业(共26页).docx
精选优质文档-倾情为你奉上章节作业第1章 Shell命令操作实践作业(1)在当前登录用户的主目录下创建子目录mysub,进入mysub目录。答: mkdir mysub && cd mysub(2)显示当前目录路径。 答: pwd(3)显示用户名和用户主目录答: echo $HOME $USER(4)将用户主目录添加到可执行文件搜索路径答: export PATH=$PATH:$HOME(5)显示添加后的可执行文件搜索路径答: echo $PATH(6)列出主目录下所有以”.ba”或“.pr”打头的文件名及其属性并将其存入my1文件中答: ls -l $HOME/*.ba $HOME/*.pr > my1(7)列出进程状态信息中含'tty'的进程,并将其存入my2文件中答: ps -ef | grep tty > my2(8)将my1和my2串联成一个新文件my3答: cat my1 my2 > my3(9)将当前目录下的所有文件压缩归档到myf.tar.gz文件中答: tar cvf myf.tar.gz *(10)将my3移动到上级目录中答: mv my3 ./(11)删除文件my1和my2答: rm my1 my2(12)启动vi文本编辑程序答: vi(13)在vi中输入(3) (11)步的操作命令,并将其存入文件mysh答: 按 i 进入编辑模式,按esc退出编辑模式,按 : 输入命令 :save mysh, 输入命令 :wq保存退出(14)将vi放入后台运行答: vi &(15)将文件mysh访问权限改为文件主可执行答: chmod +x mysh(16)将文件mysh复制到上级目录中答: cp mysh ./(17)令vi返回前台,从中追加睡眠1分钟和返回前台的命令,从vi保存退出答: fg 后面追加 sleep 60 && fg(18)以后台运行方式启动mysh答: mysh &(19)找到执行睡眠命令的的进程号答: ps -fu $USER | grep mysh | awk 'print $2'(20)用发送信号命令向睡眠命令进程号发送终止信号,让mysh停止执行。答: kill -15 pid第2章 与处理器管理有关的系统功能调用实践作业 参照“强化实践能力培养课程内容”中“进程创建和执行的实践能力培养考核选例”和“线程的创建及线程间管道通信实践能力培养考核选例”程序,编写一个能建立两个子进程的程序(父进程),让这三个进程并发执行完成以下二元函数的计算: 其中由父进程完成:f(x,y) = f(x) + f(y) 由子进程1 完成阶乘计算: f(x) = f(x-1) * x (x >1) f(x)=1 (x=1) 由子进程2完成非波纳奇序列: f(y) = f(y-1) + f(y-2)(y> 2) f(y)=1(y=1,2)答: #include<stdio.h>int fx(int x);int fy(int y);void main() int x,y; printf("please input x:"); scanf("%d",&x); int ffx,ffy; ffx=fx(x); printf("please input y:"); scanf("%d",&y); ffy=fy(y); int z; z=ffx+ffy; printf("%d",z);int fx(int x) int ffx; if(x=1) ffx=1; else ffx=fx(x-1)*x; return ffx;int fy(int y) int ffy; if(y=1|y=2) ffy=1; else if(y>2) ffy=fy(y-1)+fy(y-2); return ffy;第3章 与存储管理有关的操作系统算法实践作业参照“强化实践能力培养课程内容”中“内存页面置换算法实践能力培养考核选例”程序,编写一个能演示LRU内存页面置换算法的程序,它可根据给定的一组页面引用序列号和实存页数,显示LRU置换页的过程,能统计和报告LRU置换算法情况下依次淘汰的页号、缺页次数(页错误数)和缺页率。答: #include"stdio.h"#include"stdlib.h"void CopyL(intSour,int Dist ,int x); /数组Sour复制到数组Dist,复制到x个数void SetDI(intDiscL); /随机生成磁道数 void Print(intPri,int x); /打印输出数组Privoid DelInq(int Sour,intx,int y); /数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y) void FCFS(int Han,intDiscL); /先来先服务算法(FCFS)void SSTF(int Han,intDiscL); /最短寻道时间优先算法(SSTF)int SCAN(int Han,intDiscL,int x,int y); /扫描算法(SCAN)void CSCAN(int Han,intDiscL); /循环扫描算法(CSCAN)/void N_Step_SCAN(intHan1,int DiscL); /N步扫描算法(NStepScan)void PaiXu(); /寻道长度由低到高排序void Pri();int NAll=0;int Best52; /用作寻道长度由低到高排序时存放的数组 int Limit=0; /输入寻找的范围磁道数iint Jage;float Aver=0; int main() int i; int DiscLine10; /声明准备要生成的随机磁道号的数组 int Hand; /磁道数 int Con=1; int n; while(Con=1) Jage=0; printf("n 请输入初始的磁道数(0<n<65536):"); scanf("%d",&Hand); printf("n+ 输入寻找的范围:"); scanf("%d",&Limit); if(Limit>65536) printf("超出范围!"); elseprintf(" *n");printf(" *磁盘调度算法 *n"); printf(" *n"); printf("* 1.先来先服务算法(FCFS) *n"); printf(" * 2.最短寻道时间优先算法(SSTF) *n"); printf(" * 3.扫描算法(SCAN) *n"); printf(" * 4.循环扫描算法(CSCAN) *n"); printf(" *n"); scanf("%d",&n); if(n=0) exit(0); printf("n"); switch(n) case 1: SetDI(DiscLine); /随机生成磁道数 FCFS(Hand,DiscLine); /先来先服务算法(FCFS) break; case 2: SetDI(DiscLine); /随机生成磁道数 SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) break; case 3: SetDI(DiscLine); /随机生成磁道数 SCAN(Hand,DiscLine,0,9); /扫描算法(SCAN) break; case 4: SetDI(DiscLine); /随机生成磁道数 CSCAN(Hand,DiscLine); /循环扫描算法(CSCAN) break; case 5: SetDI(DiscLine); /随机生成磁道数 SetDI(DiscLine); /随机生成磁道数 FCFS(Hand,DiscLine); /先来先服务算法(FCFS) SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) SCAN(Hand,DiscLine,0,9); /扫描算法(SCAN) CSCAN(Hand,DiscLine); /循环扫描算法(CSCAN) PaiXu(); /寻道长度由低到高排序 printf("nn+ 寻道长度由低到高排序:"); for(i=0;i<5;i+) printf("%4d ",Besti0); break; printf("nn+ 是否继续(按0结束,按1继续)?"); scanf("%5d",&Con); /数组Sour复制到数组Dist,复制到x个数void CopyL(intSour,int Dist ,int x) int i; for(i=0;i<=x;i+) Disti=Souri; /打印输出数组Privoid Print(intPri,int x) int i; for(i=0;i<=x;i+) printf("%5d",Prii); /随机生成磁道数void SetDI(intDiscL) int i; for(i=0;i<=9;i+) DiscLi=rand()%Limit;/随机生成10个磁道号 printf("+ 需要寻找的磁道号:"); Print(DiscL,9); /输出随机生成的磁道号 printf("n");/数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y) void DelInq(intSour,int x,int y) int i; for(i=x;i<y;i+) Souri=Souri+1; x+; /先来先服务算法(FCFS)void FCFS(int Han,intDiscL) int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine int i,k,All,Temp; /Temp是计算移动的磁道距离的临时变量 All=0; /统计全部的磁道数变量 k=9; /限定10个的磁道数 CopyL(DiscL,RLine,9); /复制磁道号到临时数组RLine printf("n+ 按照FCFS算法磁道的访问顺序为:"); All=Han-RLine0; for(i=0;i<=9;i+) Temp=RLine0-RLine1;/求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离 if(Temp<0) Temp=(-Temp);/移动磁道数为负数时,算出相反数作为移动磁道数 printf("%5d",RLine0); All=Temp+All;/求全部磁道数的总和 DelInq(RLine,0,k);/每个磁道数向前移动一位 k-; BestJage1=All;/Best1存放移动磁道数 BestJage0=1; /Best0存放算法的序号为:1 Jage+;/排序的序号加1 Aver=(float) All)/10;/求平均寻道次数 printf("n+ 移动磁道数:<%5d> ",All); printf("n+ 平均寻道长度:*%0.2f* ",Aver);/最短寻道时间优先算法(SSTF)void SSTF(int Han,intDiscL) int i,j,k,h,All; int Temp; /Temp是计算移动的磁道距离的临时变量 int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine int Min; All=0; /统计全部的磁道数变量 k=9; /限定10个的磁道数 CopyL(DiscL,RLine,9); /复制磁道号到临时数组RLine printf("n+ 按照SSTF算法磁道的访问顺序为:"); for(i=0;i<=9;i+) Min=64000; for(j=0;j<=k;j+) /内循环寻找与当前磁道号最短寻道的时间的磁道号 if(RLinej>Han) /如果第一个随机生成的磁道号大于当前的磁道号,执行下一句 Temp=RLinej-Han; /求出临时的移动距离 else Temp=Han-RLinej; /求出临时的移动距离 if(Temp<Min) /如果每求出一次的移动距离小于Min,执行下一句 Min=Temp; /Temp临时值赋予Min h=j; /把最近当前磁道号的数组下标赋予h All=All+Min; /统计一共移动的距离 printf("%5d",RLineh); Han=RLineh; DelInq(RLine,h,k); /每个磁道数向前移动一位 k-; BestJage1=All;/Best1存放移动磁道数 BestJage0=2;/Best0存放算法的序号为:2 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数 printf("n+ 移动磁道数:<%5d> ",All); printf("n+ 平均寻道长度:*%0.2f* ",Aver);/扫描算法(SCAN)int SCAN(int Han,intDiscL,int x,int y) int j,n,k,h,m,All; int t=0; int Temp; int Min; int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine int Order; Order=1; k=y; m=2; /控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到 All=0; /统计全部的磁道数变量 CopyL(DiscL,RLine,9); /复制磁道号到临时数组RLine printf("n+ 按照SCAN算法磁道的访问顺序为:"); Min=64000; for(j=x;j<=y;j+) /寻找与当前磁道号最短寻道的时间的磁道号 if(RLinej>Han) /如果第一个随机生成的磁道号大于当前的磁道号,执行下一句 Temp=RLinej-Han; /求出临时的移动距离 else Temp=Han-RLinej; /求出临时的移动距离 if(Temp<Min) Min=Temp; /Temp临时值赋予Min h=j; /把最近当前磁道号的数组下标赋予h All=All+Min; printf("%5d",RLineh); if(RLineh>=Han) /判断磁道的移动方向,即是由里向外还是由外向里 Order=0; t=1; Han=RLineh; DelInq(RLine,h,k); /每个磁道数向前移动一位 k-; while(m>0) if(Order=1) /order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动 for(j=x;j<=y;j+) h=-1; Min=64000; for(n=x;n<=k;n+) /判断离当前磁道最近的磁道号 if(RLinen<=Han) Temp=Han-RLinen; if(Temp<Min) Min=Temp; /Temp临时值赋予Min h=n; /把最近当前磁道号的数组下标赋予h if(h!=-1) All=All+Min; /叠加移动距离 printf("%5d",RLineh); Han=RLineh; /最近的磁道号作为当前磁道 DelInq(RLine,h,k); k-; Order=0; /当完成向内的移动,order赋予0,执行else语句,使磁道向外移动 m-; /向内完成一次,m减一次,保证while循环执行两次 else /order是0的话,磁道向外移动 for(j=x;j<=y;j+) h=-1; Min=64000; for(n=x;n<=k;n+) /判断离当前磁道最近的磁道号 if(RLinen>=Han) Temp=RLinen-Han; if(Temp<Min) Min=Temp; /Temp临时值赋予Min h=n; /把最近当前磁道号的数组下标赋予h if(h!=-1) All=All+Min; /叠加移动距离 printf("%5d",RLineh); Han=RLineh; /最近的磁道号作为当前磁道 DelInq(RLine,h,k); k-; Order=1; /当完成向内的移动,order赋予0,执行else语句,使磁道向外移动 m-; /向内完成一次,m减一次,保证while循环执行两次 NAll=NAll+All; if(y-x)>5) BestJage1=All;/Best1存放移动磁道数 BestJage0=3;/Best0存放算法的序号为:3 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数 printf("n+ 移动磁道数:<%5d> ",All); printf("n+ 平均寻道长度:*%0.2f* ",Aver); if(t=1) printf("n+ 磁道由内向外移动"); else printf("n+ 磁道由外向内移动"); return(Han);/循环扫描算法(CSCAN)void CSCAN(int Han,intDiscL) int j,h,n,Temp,m,k,All,Last,i; int RLine10; /将随机生成的磁道数数组Discl复制给数组RLine int Min; int tmp=0; m=2; k=9; All=0; /统计全部的磁道数变量 Last=Han; CopyL(DiscL,RLine,9); /复制磁道号到临时数组RLine printf("n+ 按照CSCAN算法磁道的访问顺序为:"); while(k>=0) for(j=0;j<=9;j+) /从当前磁道号开始,由内向外搜索离当前磁道最近的磁道号 h=-1; Min=64000; for(n=0;n<=k;n+) if(RLinen>=Han) Temp=RLinen-Han; if(Temp<Min) Min=Temp; h=n; if(h!=-1) All=All+Min; /统计一共移动的距离 printf("%5d",RLineh); Han=RLineh; Last=RLineh; DelInq(RLine,h,k); k-; if(k>=0) tmp=RLine0; for(i=0;i<k;i+)/算出剩下磁道号的最小值 if(tmp>RLinei) tmp=RLinei; Han=tmp;/把最小的磁道号赋给Han Temp=Last-tmp;/求出最大磁道号和最小磁道号的距离差 All=All+Temp; BestJage1=All;/Best1存放移动磁道数 BestJage0=4;/Best0存放算法的序号为:4 Jage+;/排序序号加1 Aver=(float)All)/10;/求平均寻道次数 printf("n+ 移动磁道数:<%5d> ",All); printf("n+ 平均寻道长度:*%0.2f* ",Aver); void PaiXu() int i,j,Temp; for(i=0;i<5;i+) for(j=0;j<4;j+) if(Bestj1>Bestj+11) /如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句 Temp=Bestj+11; /从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序 Bestj+11=Bestj1; Bestj1=Temp; Temp=Bestj+10; /将每个算法的序号用冒泡法排序 Bestj+10=Bestj0; Bestj0=Temp; 第4章 与文件管理有关的系统功能调用实践作业参照“强化实践能力培养课程内容”中“文件操作实践能力培养考核选例”程序,请构造一个能管理文本文件的学生成绩表的简单数据库管理系统。设文本文件的学生成绩表中每条学生成绩记录有3个字段构成:学号20个字节,姓名20个字节,成绩10个字节,字段间用空格分割对齐。简单数据库管理系统具有基本的功能有: 追加一条记录,(仅允许文件主) 按学号读出一条记录, 按学号升序列出所有记录. (提示:可建立一个学生成绩表文件和一个以学号为主键的索引文件。)答:#include <malloc.h>#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct score)#define DEBUG#include <string.h>typedef struct score charno20;/记录号 charnumber20;/*学号*/ charname20;/*姓名*/ chargrades10;/成绩 structscore *next;/下一个节点score;int m,n;score* load(score *head) score*p1,*p2; intm=0; charfilepn10; FILE*fp; printf("请输入文件路径机文件名n"); scanf("%s",filepn); if(fp=fopen(filepn,"r+")=NULL) printf("不能打开文件n"); exit(0); p1=(score*)malloc(LEN); head=NULL; while(!feof(fp) n=n+1; if(n=1)head=p1; elsep2->next=p1; p2=p1; p1=(score*)malloc(LEN); fscanf(fp,"%s%s %s %s ",p1->no,p1->number,p1->name,p1->grades); p2->next=p1; p1->next=NULL; n+; fclose(fp); returnhead;/追加score *append(score *head) score*p1,*p2,*p3; p3=(score*)malloc(LEN); printf("输入学生信息:n"); printf("记录号 学号 姓名 成绩n"); scanf("%s%s %s %s",p3->no,p3->number,p3->name,p3->grades); p1=head; if(head=NULL) /如果链表为空 head=p3; p3->next=NULL; else if(p1->next=NULL) p1->next=p3; p3->next=NULL; else while(p1->next!=NULL)/若是还没有到尾端的话 p2=p1; p1=p1->next; p1->next=p3; p3->next=NULL; n+; returnhead;第5章 与设备管理有关的操作系统算法实践作业参照“强化实践能力培养课程内容”中“磁盘移臂调度算法实践能力培养考核选例”程序编写一个能演示“最短寻找时间优先算法Sstf”的程序。s该程序能分析出“ ,即能统计和报告出“最短寻找时间优先算法”下磁头响应请求的顺序、移臂的总量和掉头的次数。答:#include "stdio.h" #include "stdlib.h" void CopyL(int Sour,int Dist ,int x); /数组Sour复制到数组Dist,复制到x个数 void SetDI(int DiscL); /随机生成磁道数 void Print(int Pri,int x); /打印输出数组Pri void DelInq(int Sour,int x,int y); /数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y) void SSTF(int Han,int DiscL); /最短寻道时间优先算法(SSTF) void PaiXu(); /寻道长度由低到高排序 void Pri(); int NAll=0; int Best52; /用作寻道长度由低到高排序时存放的数组 int Limit=0; /输入寻找的范围磁道数i int Jage; float Aver=0; int main() int i; int DiscLine10; /声明准备要生成的随机磁道号的数组 int Hand; /磁道数 int Con=1; int n; while(Con=1) Jage=0; printf("n 请输入初始的磁道数(0<n<65536):"); scanf("%d",&Hand); printf("n+ 输入寻找的范围:"); scanf("%d",&Limit); if(Limit>65536) printf("超出范围!"); else printf(" *n"); printf(" * 磁盘调度算法 *n"); printf(" *n"); printf(" * 2.最短寻道时间优先算法(SSTF) *n"); printf(" *n"); scanf("%d",&n); if(n=0) exit(0); printf("n"); switch(n) case 2: SetDI(DiscLine); /随机生成磁道数 SSTF(Hand,DiscLine); /最短寻道时间优先算法(SSTF) break; printf("nn+ 是否继续(按0结束,按1继续)?"); scanf("%5d",&Con); /数组Sour复制到数组Dist,复制到x个数 void CopyL(int Sour,int Dist ,int x) int i; for(i=0;i<=x;i+) Disti=Souri; /打印输出数组Pri void Print(int Pri,int x) int i; for(i=0;i<=x;i+) printf("%5d",Prii); /随机生成磁道数 void SetDI(int DiscL) int i; for(i=0