武汉大学信息安全操作系统实验报告Word文件下载.docx
- 文档编号:20688193
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:26
- 大小:416.96KB
武汉大学信息安全操作系统实验报告Word文件下载.docx
《武汉大学信息安全操作系统实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《武汉大学信息安全操作系统实验报告Word文件下载.docx(26页珍藏版)》请在冰豆网上搜索。
初始状态都为就绪状态。
(2)开始运行之前,为每个进程确定它的“优先数”和“要求运行时间”。
通过键盘输入这些参数。
(3)处理器总是选择队首进程运行。
采用动态改变优先数的办法,进程每运行1次,优先数减1,要求运行时间减1。
(4)进程运行一次后,若要求运行时间不等于0,则将它加入就绪队列,否则,将状态改为“结束”,退出就绪队列。
(5)若就绪队列为空,结束,否则转到(3)重复。
要求能接受键盘输入的进程优先数及要求运行时间,能显示每次进程调度的情况,如哪个进程在运行,哪些进程就绪,就绪进程的排列情况。
2.上机代码
#include<
stdio.h>
string.h>
#definenum5//5个进程
structPCB//进程控制块
{
charID;
//进程名
intruntime;
//进程运行时间
intpri;
//进程优先级
charstate;
//进程状态
};
structPCBpcblist[num];
//进程控制块数组
intfnum=0;
//已运行完成的进程
structPCBtemp;
//在冒泡排序时用于替换的PCB
voidchushihua()//初始化程序
inti;
for(i=0;
i<
num;
i++)
{
printf("
PCB[%d]:
IDpriruntime\n"
i+1);
scanf("
%s%d%d"
&
pcblist[i].ID,&
pcblist[i].pri,&
pcblist[i].runtime);
pcblist[i].state='
R'
;
//将所有进程的状态初始化为就绪状态
getchar();
}
}
voidshow()//显示当前进程状况程序
\nIDpriruntimestate\n"
);
printf("
%s%6d%9d%s\n"
pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&
pcblist[i].state);
getchar();
voidrun()//主体执行部分程序,含将优先级进行冒泡排序及运行最高优先级的进程
inti,j,k;
intt=0;
//所有程序运行总时间
for(j=0;
j<
j++)//计算所有进程总的运行时间
if(pcblist[j].runtime==0)
pcblist[j].state='
F'
t+=pcblist[j].runtime;
for(j=0;
k<
t;
j++)
for(i=0;
num-fnum;
i++)//将状态为就绪的进程进行冒泡排序
num-i-1-fnum;
if(pcblist[j].pri>
pcblist[j+1].pri)
temp=pcblist[j];
pcblist[j]=pcblist[j+1];
pcblist[j+1]=temp;
for(j=num-1;
j>
=0;
j--)//在排好序的进程中找到为就绪的最大优先级的进程
if(pcblist[j].state=='
)
break;
if(pcblist[0].state=='
)//修改当前运行的进程的各项参数
pcblist[j].pri=pcblist[j].pri-1;
pcblist[j].runtime=pcblist[j].runtime-1;
%s"
pcblist[j].ID);
if(pcblist[j].runtime==0)
pcblist[j].state='
fnum++;
show();
}
intmain()//主函数
chushihua();
run();
return0;
五、上机实验所用平台及相关软件
上机平台:
Windows7+DEV-C++
六、运行结果
Q1—Q5分别是12345,经运行的顺序为
Q2Q2Q2Q3Q3Q1Q1Q4Q1Q5Q5Q1Q1Q5Q5
测试结果正确无误
七、实验心得
运用优先级调度算法,最根本的问题在于挑选优先级最高的就绪状态的进程,故而本程序采用符号fnum对已完成的程序数目进行计数,并采用冒牌排序法挑选出优先级最高的就绪状态的进程将之运行并输出。
经过本次试验,我更深的理解了操作系统按优先级的调度过程,我会继续努力深入学习。
实习二主存空间的分配和回收
一、实验内容
主存储器空间的分配和回收。
通过本实习帮助理解在不同的存储管理方式下应怎样进行存储空间的分配和回收。
可变分区管理方式下采用首次适应算法实现主存分配和回收
四、实习内容
1.设计思想
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存容量查看是否有足够的空闲空间,若有,则按需分配,否则,作业无法装入。
假定内存大小为128K,空闲区说明表格式为:
起始地址——指出空闲区的起始地址;
长度——一个连续空闲区的长度;
状态——有两种状态,一种是“未分配”状态;
另一种是“空表目”状态,表示该表项目前没有使用。
(2)采用首次适应算法分配回收内存空间。
运行时,输入一系列分配请求和回收请求。
要求能接受来自键盘的空间申请及释放请求,能显示分区分配及回收后的内存布局情况。
stdlib.h>
constintCANTUSE=0;
constintCANUSE=1;
constintMSIZE=128;
//内存分区
structMZone
{
//空闲区起始地址
intbegin_addr;
//一个连续空闲区的长度
intlength;
//状态
intstate;
//内存中任务名
chartask_name[32];
//指向下一个空闲分区
structMZone*next;
//内存头指针
structMZone*Mhead=NULL;
//showmemory函数,显示当前内存分配情况
voidshowmemory()
structMZone*Mpoint=Mhead;
内存的使用情况\n"
beginaddr\tlength\tstate\ttask\n"
while(NULL!
=Mpoint)
%dk\t\t"
Mpoint->
begin_addr);
%dk\t"
length);
if(Mpoint->
state==CANTUSE)
CANTUSE\t"
else
free\t"
%s\n"
task_name);
Mpoint=Mpoint->
next;
}
system("
pause"
//Minsert函数,功能插入任务到空闲分区
intMinsert(structMZone*Mnew)
structMZone*Zinsert=Mhead;
while(Zinsert->
length<
Mnew->
length||!
Zinsert->
state)
if(NULL!
=Zinsert->
next)
Zinsert=Zinsert->
if(NULL==Zinsert)
if(MSIZE==Zinsert->
begin_addr+Mnew->
length)
state=CANTUSE;
strcpy(Zinsert->
task_name,Mnew->
next=NULL;
return1;
length=Mnew->
length;
structMZone*Ztail=(structMZone*)malloc(sizeof(structMZone));
Ztail->
next=Zinsert->
next=Ztail;
memset(Ztail,0,sizeof(char)*32);
begin_addr=Zinsert->
begin_addr+Mnew->
state=1;
if(Ztail->
next==NULL)
length=MSIZE-Ztail->
begin_addr;
length=Ztail->
next->
begin_addr-Ztail->
//memoallocate函数,用于分配内存
voidmemoallocate(void)
structMZone*Mnew=(structMZone*)malloc(sizeof(structMZone));
输入要分配内存大小(kb):
\n"
scanf("
%d"
输入任务名:
Minsert(Mnew)?
分配内存成功\n"
):
没有符合大小的空闲分区,内存分配失败。
free(Mnew);
//Mreturn函数,功能回收内存
intMreturn(chartaskname[])
structMZone*front=NULL;
structMZone*position=Mhead;
structMZone*tail=Mhead->
while(0!
=strcmp(position->
task_name,taskname))
front=position;
=position->
position=position->
position=NULL;
tail=position->
if(NULL==position)
内存中没有此任务!
"
=tail&
&
NULL!
=front)
if(front->
state&
tail->
state)
front->
length=front->
length+position->
length+tail->
next=tail->
free(position);
free(tail);
!
next=position->
if(!
position->
length=position->
memset(position->
task_name,0,sizeof(char)*32);
NULL==front)
else
state=1;
if(NULL==tail&
if(front->
else
内存回收成功!
//memoreturn函数,用于回收内存
voidmemoreturn()
chartname[32];
输入要收回的任务名\n"
tname);
Mreturn(tname);
intmain()
intfunc_=0;
//初始化Mhead
Mhead=(structMZone*)malloc(sizeof(structMZone));
Mhead->
begin_addr=0;
length=MSIZE;
memset(Mhead->
while
(1)
******************首次适应算法实现主存分配和回收系统(内存MSIZE)***************"
|1:
查看内存分配情况\n"
|2:
申请分配内存\n"
|3:
申请回收内存\n"
|4:
退出程序\n"
********************************************************************************"
func_);
switch(func_)
case1:
showmemory();
case2:
memoallocate();
case3:
memoreturn();
case4:
cls"
Windows7+DEV-C++
六、运行结果
依次建立进程123均分配10个内存单元,并进行重命名和
超范围测试,并成功。
位视图显示正确。
删除2号后,位视图修改正确。
试验成功。
1.分配内存
2.查看内存分配情况:
3.回收内存:
4.回收内存后查看内存状况:
七.心得体会
此代码主要分为三个板块,查看,分配和回收,主要问题在于回收时要考虑是否有两个或三个空闲的块,若有,则将其合并。
本程序主要应用指针完成各块的链接,经过本次试验,我进一步加深了对使用指针方式表示和实现主存分配回收的理解,同时也得到了将系统理论实践的机会,让我不断进步。
实习三磁盘存储空间的分配和回收
模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。
磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。
用位示图管理磁盘存储空间
1.设计思想
(1)为了提高磁盘存储空间的利用率,可在磁盘上组织成链接文件、索引文件,这类文件可以把逻辑记录存放在不连续的存储空间。
为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。
位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
位示图的形式与实习二中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
(2)申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。
假设现在有一个盘组共8个柱面,每个柱面有2个磁道(盘面),每个磁道分成4个物理记录。
那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:
柱面号=字节号
磁道号=位数/4
物理记录号=位数%4
(3)归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。
按照
(2)中假设的盘组,归还块在位示图中的位置计算如下:
字节号=柱面号
位数=磁道号4+物理记录号
(4)设计申请磁盘空间和归还磁盘空间的程序。
要求能接受来自键盘的空间申请及释放请求,要求能显示或打印程序运行前和运行后的位示图;
分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
2.上机代码
#include<
structweishitu//一张位示图表
intbit[64];
charname[64];
}weishitu;
structweishitu*head=NULL;
//指向位示图的指针
voidshowweishitu()//显示位示图
位示图如下(0表示块可用):
for(inti=0;
i<
64;
i++)
if(0==i%8)
%2d:
%d\t"
i+1,head->
bit[i]);
voidfenpei()//分配位示图
intn;
inti;
intbusy=0;
//位示图有多少个1
charname;
请输入你所需的物理块数:
n);
请输入这些文件的名字:
name);
for(i=0;
busy=busy+head->
bit[i];
//计算位示图有多少个1
if(64-busy<
n)//判断空闲区是否满足需要
内存不足,分配失败!
for(i=0;
i++)
if(n!
=0)
if(0==head->
bit[i])
已分配:
第%d个柱面,第%d个磁道,第%d个物理记录\n"
i/8+1,i%8/4+1,(i%8)%4+1);
head->
bit[i]=1;
name[i]=name;
n--;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 武汉大学 信息 安全 操作系统 实验 报告