武汉大学信息安全操作系统实验报告.docx

上传人:啊飒飒 文档编号:11687116 上传时间:2021-08-30 格式:DOCX 页数:26 大小:706.27KB
返回 下载 相关 举报
武汉大学信息安全操作系统实验报告.docx_第1页
第1页 / 共26页
武汉大学信息安全操作系统实验报告.docx_第2页
第2页 / 共26页
武汉大学信息安全操作系统实验报告.docx_第3页
第3页 / 共26页
武汉大学信息安全操作系统实验报告.docx_第4页
第4页 / 共26页
武汉大学信息安全操作系统实验报告.docx_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《武汉大学信息安全操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《武汉大学信息安全操作系统实验报告.docx(26页珍藏版)》请在三一文库上搜索。

1、实验一二三四五六七八九十总评成绩武汉大学计算机学院课程实验(设计)报告专业(班):计算机学院信息安全X班学号:姓名:XX课程名称:操作系统实验2013年 5月 30日实习一 处理器调度一、实习内容选择一个调度算法,实现处理器调度。二、实习目的本实习模拟在单处理器环境下的处理器调度,加深了解处理器调度的工作。三、实习题目设计一个按优先数调度算法实现处理器调度的程序。四、实习内容1设计思想(1)假定系统有5个进程,每个进程用一个PCB来代表。PCB的结构为: 进程名如P1P5。指针按优先数的大小把5个进程连成队列,用指针指出下一个进程PCB的首地址。 要求运行时间假设进程需要运行的单位时间数。优先

2、数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态假设两种状态:就绪和结束,用R表示就绪,用E表示结束。初始状态都为就绪状态。(2) 开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。通过键盘输入这些参数。(3) 处理器总是选择队首进程运行。采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。(4) 进程运行一次后,若要求运行时间不等于0,则将它加入就绪队列,否则,将状态改为“结束”,退出就绪队列。(5) 若就绪队列为空,结束,否则转到(3)重复。要求能接受键盘输入的进程优先数及要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就

3、绪进程的排列情况。2上机代码#include #include #define num 5/5个进程struct PCB/进程控制块 char ID;/进程名 int runtime;/进程运行时间 int pri;/进程优先级 char state; /进程状态;struct PCB pcblistnum;/进程控制块数组int fnum=0;/已运行完成的进程struct PCB temp;/在冒泡排序时用于替换的PCBvoid chushihua()/初始化程序 int i; for(i=0;inum;i+) printf(PCB%d:ID pri runtime n,i+1); sca

4、nf(%s%d%d,&pcblisti.ID,&pcblisti.pri,&pcblisti.runtime); pcblisti.state=R;/将所有进程的状态初始化为就绪状态 getchar(); void show()/显示当前进程状况程序 int i; printf(nID pri runtime staten); for(i=0;inum;i+)printf(%s%6d%9d %sn,&pcblisti.ID,pcblisti.pri,pcblisti.runtime,&pcblisti.state);getchar();void run()/主体执行部分程序,含将优先级进行冒泡

5、排序及运行最高优先级的进程 int i,j,k; int t=0;/所有程序运行总时间 for(j=0;jnum;j+)/计算所有进程总的运行时间 if(pcblistj.runtime=0) pcblistj.state=F; t+=pcblistj.runtime; for(j=0;kt;j+)for(i=0;inum-fnum;i+)/将状态为就绪的进程进行冒泡排序for(j=0;jpcblistj+1.pri)temp=pcblistj;pcblistj=pcblistj+1;pcblistj+1=temp;for(j=num-1;j=0;j-)/在排好序的进程中找到为就绪的最大优先级

6、的进程if(pcblistj.state=R)break;if(pcblist0.state=R)/修改当前运行的进程的各项参数pcblistj.pri=pcblistj.pri-1;pcblistj.runtime=pcblistj.runtime-1; printf(%s,&pcblistj.ID);if(pcblistj.runtime=0)pcblistj.state=F;fnum+;show(); int main()/主函数chushihua();show();run();return 0; 五、上机实验所用平台及相关软件上机平台: Windows 7 +DEV- C+六、运行结果

7、Q1Q5分别是12345,经运行的顺序为Q2Q2Q2Q3Q3Q1Q1Q4Q1Q5Q5Q1Q1Q5Q5测试结果正确无误七、实验心得运用优先级调度算法,最根本的问题在于挑选优先级最高的就绪状态的进程,故而本程序采用符号fnum对已完成的程序数目进行计数,并采用冒牌排序法挑选出优先级最高的就绪状态的进程将之运行并输出。经过本次试验,我更深的理解了操作系统按优先级的调度过程,我会继续努力深入学习。实习二主存空间的分配和回收一、实验内容主存储器空间的分配和回收。二、实习目的通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。三、实习题目可变分区管理方式下采用首次适应算法实现主存分配和

8、回收四、实习内容1.设计思想(1) 可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。假定内存大小为128K,空闲区说明表格式为:起始地址指出空闲区的起始地址;长度一个连续空闲区的长度;状态有两种状态,一种是“未分配”状态;另一种是“空表目”状态,表示该表项目前没有使用。(2) 采用首次适应算法分配回收内存空间。运行时,输入一系列分配请求和回收请求。要求能接受来自键盘的空间申请及释放请求,能显示分区分配及回收后的内存布局情况。2上机代码#include #include #include

9、 const int CANTUSE = 0; const int CANUSE=1; const int MSIZE = 128; /内存分区 struct MZone /空闲区起始地址 int begin_addr; /一个连续空闲区的长度 int length; /状态 int state; /内存中任务名char task_name32; /指向下一个空闲分区 struct MZone *next; ; /内存头指针 struct MZone *Mhead = NULL; /showmemory函数,显示当前内存分配情况 void showmemory() struct MZone *

10、Mpoint = Mhead;printf(内存的使用情况n); printf(beginaddrtlengthtstatettaskn); while( NULL!=Mpoint) printf(%dktt,Mpoint-begin_addr); printf(%dkt,Mpoint-length);if(Mpoint-state=CANTUSE)printf(CANTUSEt);elseprintf(freet); printf(%sn,Mpoint-task_name); Mpoint = Mpoint-next; system(pause); /Minsert函数,功能插入任务到空闲分

11、区 int Minsert(struct MZone* Mnew) struct MZone *Zinsert = Mhead; while( Zinsert-lengthlength | !Zinsert-state) if( NULL!=Zinsert-next ) Zinsert = Zinsert-next; else Zinsert = Zinsert-next; break; if( NULL=Zinsert ) return 0; if( MSIZE = Zinsert-begin_addr+Mnew-length ) Zinsert-state = CANTUSE; strcp

12、y(Zinsert-task_name , Mnew-task_name); Zinsert-next = NULL;return 1; else strcpy(Zinsert-task_name , Mnew-task_name); Zinsert-length = Mnew-length; struct MZone *Ztail = (struct MZone *)malloc(sizeof(struct MZone);Ztail-next=Zinsert-next; Zinsert-next = Ztail; Zinsert-state = CANTUSE;memset( Ztail,

13、0, sizeof(char)*32 ); Ztail-begin_addr = Zinsert-begin_addr + Mnew-length; Ztail-state = 1; if(Ztail-next=NULL)Ztail-length =MSIZE-Ztail-begin_addr; elseZtail-length =Ztail-next-begin_addr-Ztail-begin_addr; return 1; /memoallocate函数,用于分配内存 void memoallocate(void) struct MZone *Mnew = (struct MZone*)

14、malloc(sizeof(struct MZone); printf(输入要分配内存大小(kb):n); scanf(%d,&Mnew-length); printf(输入任务名:n); scanf(%s,&Mnew-task_name); Minsert(Mnew)?printf(分配内存成功n):printf(没有符合大小的空闲分区,内存分配失败。n); system(pause); free(Mnew); /Mreturn函数,功能回收内存 int Mreturn(char taskname) struct MZone *front = NULL; struct MZone *posi

15、tion = Mhead; struct MZone *tail = Mhead-next; while( 0!=strcmp(position-task_name,taskname) ) front = position; if( NULL!=position-next ) position = position-next; else position = NULL; break; tail = position-next; if( NULL=position ) printf(内存中没有此任务!); else if( NULL!=tail&NULL!=front ) if( front-s

16、tate&tail-state ) front-length = front-length + position-length + tail-length; front-next = tail-next; free(position); free(tail); if( front-state&!tail-state ) front-length = front-length + position-length; front-next = position-next; free(position); if( !front-state&tail-state ) position-length =

17、position-length + tail-length; memset( position-task_name, 0, sizeof(char)*32 ); position-next = tail-next; position-state = 1; free(tail); if( !front-state&!tail-state ) memset( position-task_name, 0, sizeof(char)*32 ); position-state = 1; if( NULL!=tail&NULL=front ) if( !tail-state ) memset( posit

18、ion-task_name, 0, sizeof(char)*32 ); position-state = 1; else memset( position-task_name, 0, sizeof(char)*32 ); position-length = position-length + tail-length; position-next = NULL; position-state=1;free(tail); if( NULL=tail&NULL!=front ) if(front-state) front-length = front-length + position-lengt

19、h; front-next = NULL; free(position); else memset( position-task_name, 0, sizeof(char)*32 ); position-state = 1; if( NULL=tail&NULL=front ) memset( position-task_name, 0, sizeof(char)*32 ); position-state = 1; printf(内存回收成功!n); /memoreturn函数,用于回收内存 void memoreturn() char tname32;printf(输入要收回的任务名n);

20、scanf(%s,&tname); Mreturn(tname); system(pause); int main() int func_ = 0;/初始化Mhead Mhead = (struct MZone*)malloc(sizeof(struct MZone); Mhead-begin_addr = 0; Mhead-length = MSIZE; Mhead-state = 1; memset(Mhead-task_name, 0, sizeof(char)*32 ); Mhead-next = NULL; while( 1 ) printf(*首次适应算法实现主存分配和回收系统(内

21、存MSIZE)*); printf(|1:查看内存分配情况n); printf(|2:申请分配内存n); printf(|3:申请回收内存n); printf(|4:退出程序n); printf(*); scanf(%d,&func_); switch( func_ ) case 1 :showmemory();break; case 2 :memoallocate();break; case 3 :memoreturn();break; case 4 :return 1; system(cls); 五、上机实验所用平台及相关软件上机平台: Windows 7 + DEV- C+六、 运行结果

22、依次建立进程1 2 3均分配10个内存单元,并进行重命名和超范围测试,并成功。位视图显示正确。删除2号后,位视图修改正确。试验成功。1. 分配内存2查看内存分配情况:3回收内存:4回收内存后查看内存状况:七心得体会 此代码主要分为三个板块,查看,分配和回收,主要问题在于回收时要考虑是否有两个或三个空闲的块,若有,则将其合并。本程序主要应用指针完成各块的链接,经过本次试验,我进一步加深了对使用指针方式表示和实现主存分配回收的理解,同时也得到了将系统理论实践的机会,让我不断进步。实习三 磁盘存储空间的分配和回收一、实习内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。二、实习目的磁

23、盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。三、实习题目用位示图管理磁盘存储空间四、实习内容1. 设计思想(1) 为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索

24、引文件,这类文件可以把逻辑记录存放在不连续的存储空间。为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。位示图的形式与实习二中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。(2) 申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。假设现在有一个盘组共8个柱面,每个柱面有2个磁道(盘面),每个磁道分成4个物理记录。那么,当在位示图中找到某一字节的某一位为“0”

25、时,这个空闲块对应的磁盘物理地址为:柱面号=字节号磁道号= 位数 / 4物理记录号= 位数 % 4(3) 归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。按照(2)中假设的盘组,归还块在位示图中的位置计算如下:字节号=柱面号位数=磁道号4+物理记录号(4) 设计申请磁盘空间和归还磁盘空间的程序。要求能接受来自键盘的空间申请及释放请求,要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。2. 上机代码#include#include #inclu

26、de struct weishitu /一张位示图表 int bit64 ; char name64; weishitu; struct weishitu *head = NULL; /指向位示图的指针 void showweishitu() /显示位示图 printf(位示图如下(0表示块可用):n); for(int i = 0; ibiti); void fenpei() /分配位示图 int n; int i; int busy=0; /位示图有多少个1char name; printf(请输入你所需的物理块数:n); scanf(%d,&n); printf(请输入这些文件的名字:n

27、); scanf(%s,&name); for( i=0;ibiti; /计算位示图有多少个1 if( 64-busyn ) /判断空闲区是否满足需要 printf(内存不足,分配失败!); else for(i=0 ; ibiti) printf(已分配:第%d个柱面,第%d个磁道,第%d个物理记录n,i/8+1,i%8/4+1,(i%8)%4+1); head-biti = 1; head-namei=name; n-; printf(分配成功!n); void huishou() /回收文件 char hname; int i; int flag=0;/标志回收是否成功printf(请输

28、入你要回收的文件名n); scanf(%s,&hname); for( i=0;inamei=hname ) head-biti = 0; printf(回收第%d字节的第%d位的物理块n,i/8+1,i%8+1); flag+; if(flag=0)printf(回收失败,你输入的文件不存在n); int main () /主函数 int i; head=(struct weishitu*)malloc(sizeof(struct weishitu); /初始化for( i=0;ibiti=0; head-namei=0; char choose = 0; while( 1 ) printf

29、(a:查看磁盘位示图n); printf(b:申请分配磁盘空间n); printf(c:申请回收磁盘空间n); printf(d:退出程序n); scanf(%s,&choose); switch( choose ) case a :showweishitu();break; case b :fenpei();break; case c :huishou();break; case d :return 0; system(pause);system(cls); 五、上机实验所用平台及相关软件上机平台: Windows 7 + DEV- C+六、运行结果1.查看位示图: 2.申请分配磁盘空间 3.申请回收磁盘空间 4.回收后的位示图七、 心得体会本程序采用位示图分配磁盘空间,主要考虑位示图与物理块的对应关系,比较简单。通过本次实验,我进一步加深了对连续磁盘空间的分配回收过程的理解,同时也得到了将系统理论实践的机会,以后还将更加深入的理解这部分的问题,不断加强能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1