文档库 最新最全的文档下载
当前位置:文档库 › linux内存管理实验报告

linux内存管理实验报告

linux内存管理实验报告
linux内存管理实验报告

操作系统实验报告

院别:XXXXXX

班级:XXXXXX

学号:XXXXXX

姓名:稻草人

实验题目:内存管理实验

一、实验目的

1、通过本次试验体会操作系统中内存的分配模式;

2、掌握内存分配的方法(FF,BF,WF);

3、学会进程的建立,当一个进程被终止时内存是如何处理被

释放块,并当内存不满足进程申请时是如何使用内存紧

凑;

4、掌握内存回收过程及实现方法;

5、学会进行内存的申请释放和管理;

二、实验内容

附源代码:

/*宏定义*/

#include

#include

#include

#define PROCESS_NAME_LEN 32 /*进程名称的最大长度*/

#define MIN_SLICE 10 /*最小碎片的大小*/

#define DEFAULT_MEM_SIZE 1024 /*默认内存的大小*/

#define DEFAULT_MEM_START 0 /*默认内存的起始位置*/

/* 内存分配算法 */

#define MA_FF 1

#define MA_BF 2

#define MA_WF 3

int mem_size=DEFAULT_MEM_SIZE; /*内存大小*/

int ma_algorithm = MA_FF; /*当前分配算法*/

int flag = 0; /*设置内存大小标志*/

static int pid = 0; /*初始pid*/

int algorithm;

/*描述每一个空闲块的数据结构*/

struct free_block_type{

int size;

int start_addr;

struct free_block_type *next;

};

/*指向内存中空闲块链表的首指针*/

struct free_block_type *free_block;

/*每个进程分配到的内存块的描述*/

struct allocated_block{

int pid;

int size;

int start_addr;

char process_name[PROCESS_NAME_LEN];

struct allocated_block *next;

};

/*进程分配内存块链表的首指针*/

struct allocated_block *allocated_block_head = NULL;

struct allocated_block *find_process(int id)

{

struct allocated_block *p;

p=allocated_block_head;

while(p!=NULL)

{

if (p->pid==id)

return p;

}

return NULL;

}

void swap(int *p,int *q)

{

int temp;

temp = *p;

*p = *q;

*q = temp;

return;

void do_exit()

{

exit(0);

}

/*初始化空闲块,默认为一块,可以指定大小及起始地址*/

struct free_block_type* init_free_block(int mem_size){

struct free_block_type *fb;

fb=(struct free_block_type *)malloc(sizeof(struct free_block_type)); if(fb==NULL){

printf("No mem\n");

return NULL;

}

fb->size = mem_size;

fb->start_addr = DEFAULT_MEM_START;

fb->next = NULL;

return fb;

}

/*显示菜单*/

display_menu(){

printf("\n");

printf("1 - Set memory size (default=%d)\n", DEFAULT_MEM_SIZE);

printf("2 - Select memory allocation algorithm\n");

printf("3 - New process \n");

printf("4 - Terminate a process \n");

printf("5 - Display memory usage \n");

printf("0 - Exit\n");

}

/*设置内存的大小*/

set_mem_size(){

int size;

if(flag!=0){ //防止重复设置

printf("Cannot set memory size again\n");

return 0;

}

printf("Total memory size =");

scanf("%d", &size);

if(size>0) {

mem_size = size;

free_block->size = mem_size;

}

flag=1; return 1;

}

/*按FF算法重新整理内存空闲块链表*/

rearrange_FF(){

struct free_block_type *tmp, *work;

printf("Rearrange free blocks for FF \n");

tmp = free_block;

while(tmp!=NULL)

{ work = tmp->next;

while(work!=NULL){

if ( work->start_addr < tmp->start_addr)

{ /*地址递增*/

swap(&work->start_addr, &tmp->start_addr); swap(&work->size, &tmp->size);

}

work=work->next;

}

tmp = tmp -> next;

}

}

/*按BF最佳适应算法重新整理内存空闲块链表*/

rearrange_BF(){

struct free_block_type *tmp, *work;

printf("Rearrange free blocks for BF \n");

tmp = free_block;

while(tmp!=NULL)

{ work = tmp->next;

while(work!=NULL){

if ( work->size > tmp->size) { /*地址递增*/

swap(&work->start_addr, &tmp->start_addr); swap(&work->size, &tmp->size);

}

work=work->next;

}

tmp = tmp -> next;

}

}

/*按WF算法重新整理内存空闲块链表*/

rearrange_WF(){

struct free_block_type *tmp, *work;

printf("Rearrange free blocks for WF \n");

tmp = free_block;

while(tmp!=NULL)

{ work = tmp->next;

while(work!=NULL){

if ( work->size < tmp->size) { /*地址递增*/

swap(&work->start_addr, &tmp->start_addr);

swap(&work->size, &tmp->size);

}

else

work=work->next;

}

tmp = tmp -> next;

}

}

/*按指定的算法整理内存空闲块链表*/

rearrange(int algorithm){

switch(algorithm){

case MA_FF: rearrange_FF(); break;

case MA_BF: rearrange_BF(); break;

case MA_WF: rearrange_WF(); break;

}

}

/* 设置当前的分配算法 */

set_algorithm(){

printf("\t1 - First Fit\n");

printf("\t2 - Best Fit \n");

printf("\t3 - Worst Fit \n");

scanf("%d", &algorithm);

if(algorithm>=1 && algorithm <=3) ma_algorithm=algorithm;

//按指定算法重新排列空闲区链表

rearrange(ma_algorithm); }

/*分配内存模块*/

int allocate_mem(struct allocated_block *ab){

struct free_block_type *fbt, *pre, *temp,*work;

int request_size=ab->size;

fbt = free_block;

while(fbt!=NULL)

{

if(fbt->size>=request_size)

{

if (fbt->size - request_size >= MIN_SLICE) /*分配后空闲空间足够大,则分割*/

{

mem_size -= request_size;

fbt->size -= request_size;

ab->start_addr= fbt->start_addr;

fbt->start_addr += request_size;

}

else if (((fbt->size - request_size) < MIN_SLICE)&&((fbt->size - request_size) > 0))

/*分割后空闲区成为小碎片,一起分配*/

{

mem_size -= fbt->size;

pre = fbt->next;

ab->start_addr= fbt->start_addr;

fbt->start_addr += fbt->size;

free(fbt);

}

else

{

temp = free_block;

while(temp!=NULL)

{

work = temp->next;

if(work!=NULL)/*如果当前空闲区与后面的空闲区相连,则合并*/

{

if (temp->start_addr+temp->size ==

work->start_addr)

{

temp->size += work->size;

temp->next = work->next;

free(work);

continue;

}

}

temp = temp->next;

}

fbt = free_block;

break;

}

rearrange(algorithm); /*重新按当前的算法排列空闲区*/

return 1;

}

pre = fbt;

fbt = fbt->next;

}

return -1;

}

/*创建新的进程,主要是获取内存的申请数量*/

new_process(){

struct allocated_block *ab;

int size;

int ret;

ab=(struct allocated_block *)malloc(sizeof(struct allocated_block)); if(!ab) exit(-5);

ab->next = NULL;

pid++;

sprintf(ab->process_name, "PROCESS-%02d", pid);

ab->pid = pid;

printf("Memory for %s:", ab->process_name);

scanf("%d", &size);

if(size>0) ab->size=size;

ret = allocate_mem(ab); /* 从空闲区分配内存,ret==1表示分配ok*/

/*如果此时allocated_block_head尚未赋值,则赋值*/

if((ret==1) &&(allocated_block_head == NULL)){

allocated_block_head=ab;

return 1;

}

/*分配成功,将该已分配块的描述插入已分配链表*/

else if (ret==1) {

ab->next=allocated_block_head;

allocated_block_head=ab;

return 2;

}

else if(ret==-1){ /*分配不成功*/

printf("Allocation fail\n");

free(ab);

return -1;

}

return 3;

}

/*将ab所表示的已分配区归还,并进行可能的合并*/

int free_mem(struct allocated_block *ab)

{

int algorithm = ma_algorithm;

struct free_block_type *fbt, *work;

fbt=(struct free_block_type*) malloc(sizeof(struct free_block_type)); if(!fbt) return -1;

fbt->size = ab->size;

fbt->start_addr = ab->start_addr;

/*插入到空闲区链表的头部并将空闲区按地址递增的次序排列*/

fbt->next = free_block;

free_block=fbt;

rearrange(MA_FF);

fbt=free_block;

while(fbt!=NULL){

work = fbt->next;

if(work!=NULL)

{

/*如果当前空闲区与后面的空闲区相连,则合并*/

if(fbt->start_addr+fbt->size == work->start_addr)

{

fbt->size += work->size;

fbt->next = work->next;

free(work);

continue;

}

}

fbt = fbt->next;

}

rearrange(algorithm); /*重新按当前的算法排列空闲区*/

return 1;

}

/*释放ab数据结构节点*/

int dispose(struct allocated_block *free_ab){

struct allocated_block *pre, *ab;

if(free_ab == allocated_block_head) { /*如果要释放第一个节点*/

allocated_block_head = allocated_block_head->next;

free(free_ab);

return 1;

}

pre = allocated_block_head;

ab = allocated_block_head->next;

while(ab!=free_ab){ pre = ab; ab = ab->next; }

pre->next = ab->next;

free(ab);

return 2;

}

/* 显示当前内存的使用情况,包括空闲区的情况和已经分配的情况 */

display_mem_usage(){

struct free_block_type *fbt=free_block;

struct allocated_block *ab=allocated_block_head;

if(fbt==NULL) return(-1);

printf("----------------------------------------------------------\n");

/* 显示空闲区 */

printf("Free Memory:\n");

printf("%20s %20s\n", " start_addr", " size");

while(fbt!=NULL){

printf("%20d %20d\n", fbt->start_addr, fbt->size);

fbt=fbt->next;

}

/* 显示已分配区 */

printf("\nUsed Memory:\n");

printf("%10s %20s %10s %10s\n", "PID", "ProcessName", "start_addr", " size");

while(ab!=NULL)

{

printf("%10d %20s %10d %10d\n", ab->pid, ab->process_name, ab->start_addr, ab->size);

ab=ab->next;

}

printf("----------------------------------------------------------\n");

return 0;

}

/*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/

kill_process()

{

struct allocated_block *ab;

int pid;

printf("Kill Process, pid=");

scanf("%d", &pid);

ab=find_process(pid);

if(ab!=NULL)

{

free_mem(ab); /*释放ab所表示的分配区*/

dispose(ab); /*释放ab数据结构节点*/

}

}

main()

{

char choice;

pid=0;

free_block = init_free_block(mem_size); //初始化空闲区

for(;;)

{

display_menu(); //显示菜单

fflush(stdin);

choice=getchar(); //获取用户输入

switch(choice)

{

case '1': set_mem_size(); break; //设置内存大小

case '2': set_algorithm(); flag=1; break; //设置分配算法 case '3': new_process(); flag=1; break; //创建新进程 case '4': kill_process(); flag=1; break; //删除进程

case '5': display_mem_usage(); flag=1; break //显示内存使用 case '0': do_exit(); exit(0); break; //释放链表并退出 default: break;

}

}

}

三、实验结果

实验界面:

提示输入以后,输入 1,显示如下:

紧接着输入: 3,设置内存空间为 256,显示如下:

重复一次上一操作。

再输入: 5,显示如下:

再输入: 4后,杀死2号进程,显示如下:

四、实验心得体会

通过本次上机实验让我进一步理解了操作系统对内存分配的相关知识,也使我意识到C语言的重要性,对于内存的分配方法以及思想都能理解,但是在具体实现时就受到了感觉有点困难,通过与同学的交流和查阅相关资料才找到了问题所在,这些都是C语言基础不扎实以及长时间不练习造成的,以后得加大编程方面的练习了。

硬盘分区格式化实验报告

实验报告 课程: 计算机组装与维护 学号: 姓名: 某某某 专业: 软件工程 班级: 软件工程班

实验时间: 2012 年 _月__ _日星期_ 实验地点:逸夫楼A701 实验名称:硬盘的分区格式化 实验目的: 1.掌握分区的原因,了解FAT16、FAT32、NTFS格式。2.掌握硬盘参数的设置。 3.掌握用FDISK命令将硬盘分为多个逻辑盘的方法。4.熟练掌握逻辑盘的格式化。 5、掌握利用第三方工具去分区操作 6、掌握硬盘分区表格式 实验准备: 装有WINDOWS操作系统和VPC的一台计算机。 WINxp、Windows7映象文件。 刻录机一台(利用U盘启动盘制作工具,制作U盘)回忆有关概念 实验环境: 7号微机室

实验理论: 在虚拟机上利用fidisk命令对硬盘进行分区 format命令对硬盘进行高级格式化

实验步骤: 1.硬盘分区 ①用VPC工具虚拟一台PC机,载入WIN98映像文件,启动VPC,引导到光盘。 ②机器启动后进入DOS工作状态,在DOS提示符>后键入硬盘分区命令: A:\>Fdisk↙ 出现如图13-2所示的界面。 ③键入“Y”,进入Fdisk分区主界面。主界面以菜单形式显示,共有的四个菜单项,如图所示。 其中,第一项为建立DOS分区DOS逻辑驱动器;第二项为设置活动分区;第三项为删除分区或逻辑驱动器;第四项为显示有关分区信息。 ④建立分区,选择第一项出现如下菜单,用来建立DOS分区,或DOS逻辑驱动器。 其中,第一项为建立基本分区;第二项为建立扩展分区;第三项为建立扩展分区中的逻辑驱动器。第四项为显示分区信息。 选择"1"后回车,建立主分区(Primary Partition)。这时系统会询问你是否使用最大的可用空间作为主分区,如果回答“Y”,那么软件就会将所有的磁盘空间划分成一个分区,回答"N"则可以划分多个分区,对于现在的硬盘来说,一般都比较大,如果划分成一个分区就不太好管理,因此可以选择输入"N"来分成多个分区。例如,将硬盘创 建三个逻辑盘C:、D:和E:,要求C盘占整个硬盘容量的一半,D盘和E盘各占整个硬盘容量的四分之一。软件会提示你输入主分区C盘的大小(或百分比),输入后回车。 ⑤按键退回上一步,机器重新扫描剩余空间,输入D盘容量大小或百分比,过一会儿,再按照上述方法输入E盘容量大小或百分比即可。 ⑥激活分区。设置完分区后,按键回到Fdisk主界面,选择“2”进入另一个菜单界面,再输入“1”设置活动分区(即把C盘设置为活动分区)。 ⑦删除分区和查看分区信息。在Fdisk主界面中分别选择第3项和第4项,分别用来删除和查看有关分区信息。 2、格式化硬盘 ①分区完成后,系统自动重新启动机器,。在DOS提示符“>”下,使用Format 命令,对各逻辑盘进行格式化:

LINUX实验报告

实验报告 ( 2014/ 2015 学年第一学期) 课程名称操作系统A 实验名称文件系统 实验时间2014 年12 月8 日指导单位计算机学院计算机科学与技术系 指导教师徐鹤 学生姓名王生荣班级学号B12040809 学院(系) 计算机学院专业软件工程

实验名称文件系统指导教师徐鹤 实验类型设计实验学时 2 实验时间2014.12.08 一、实验目的和要求 1. 学习LINUX系统下对文件进行操作的各种命令和图形化界面的使用方法。 2. 深入学习和掌握文件管理系统的基本原理和LINUX等操作系统下常用的系统调用,编写一个使用系统调用的例程。 3.实现一个文本文件的某信息的插入和删除 4.实现一个记录文件的某记录的插入和删除 二、实验环境(实验设备) Windows XP + VMWare + RedHat Linux 8

三、实验过程描述与结果分析 1. 目录/proc下与系统相关的文件和目录 (1) /proc/$pid/fd:这是一个目录,该进程($PID号码进程)每个打开的文件在该目录下有一个对应的文件。 例如:#ls /proc/851/fd 0 1 2 255 这表示,851号进程目前正在使用(已经打开的)文件有4个,它们的描述符分别是0、1、2、255。其中,0、1、2 依次分别是进程的标准输入、标准输出和标准错误输出设备。 (2)/proc/filesystems:该文件记录了可用的文件系统类型。 (3)/proc/mounts:该记录了当前被安装的文件系统信息 例如:#cat /proc/mount (4)/proc/$pid/maps:该文件记录了进程的映射内存区信息。 例如:#cat /proc/851/maps 2.常用命令讲解 ls 命令 用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项。例如: $ ls -liah * 22684 -rw-r--r-- 1 bluher users 952 Dec 28 18:43 .profile

存储管理实验报告

实验三、存储管理 一、实验目的: ? 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办法扩充的主存储器称为虚拟存储器。通过本实验理解在分页式存储管理中怎样实现虚拟存储器。 在本实验中,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二、实验题目: 设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:(任选一种算法实现) 首次适应算法 循环首次适应算法 最佳适应算法 三.实验源程序文件名:cunchuguanli.c

执行文件名:cunchuguanli.exe 四、实验分析: 1)本实验采用可变分区管理,使用首次适应算法实现主存的分配和回收 1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并 且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 为了说明那些分区是空闲的,可以用来装入新作业,必须有一张空闲说明表 ? 空闲区说明表格式如下:? 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址,长度指出空闲区的大小。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业完成后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。 2、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。 有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分

磁盘和文件系统管理(二)实验报告

制作LVM卷的步骤: 裸设备---分区---PV---VG---LV---格式化---挂载使用 [root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 建立pv物理卷 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdc1" successfully created [root@localhost ~]# vgcreate hehe /dev/sdb1 /dev/sdc1 建立vg卷组 Volume group "hehe" successfully created [root@localhost ~]# lvcreate -L 30G -n xixi hehe 建立lv逻辑卷 Logical volume "xixi" created [root@localhost ~]# mkfs.ext3 /dev/hehe/xixi 格式化为ext3的文件系统mke2fs 1.39 (29-May-2006) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) [root@localhost ~]# mkdir /lvm 创建lvm文件夹 [root@localhost ~]# mount /dev/hehe/xixi /lvm 挂载lvm逻辑卷到lvm文件夹下使用[root@localhost ~]# cd /lvm 切换 [root@localhost lvm]# ls 查看 lost+found [root@localhost lvm]# df -hT 查看磁盘使用情况 文件系统类型容量已用可用已用% 挂载点 /dev/mapper/VolGroup00-LogVol00 ext3 38G 3.1G 33G 9% / /dev/sda1 ext3 99M 11M 83M 12% /boot tmpfs tmpfs 177M 0 177M 0% /dev/shm /dev/mapper/hehe-xixi ext3 30G 173M 28G 1% /lvm [root@localhost lvm]# lvextend -L +3G /dev/hehe/xixi 扩展lvm卷的空间Extending logical volume xixi to 33.00 GB Logical volume xixi successfully resized [root@localhost lvm]# resize2fs /dev/hehe/xixi 重新识别文件系统的大小

2《Linux基础》实验报告 基本配置Linux

实验序号: 2 《Linux基础》 实验报告 实验名称:基本配置Linux操作系统 姓名: 学院:计算机学院 专业: 班级: 学号: 指导教师: 实验地址:N6-113 实验日期:2017.3.7

说明 一.排版要求 1.实验报告“文件名”按模板要求填写。 2.一级标题:顶格排版。汉字用宋体,阿拉伯数字用Times New Roman字 体,四号字体,加粗。 3.二级标题:顶格排版。汉字用宋体,阿拉伯数字用Times New Roman字 体,小四号字体,加粗。 4.三级标题:顶格排版。汉字用宋体,阿拉伯数字用Times New Roman字 体,五号字体。 5.正文:每段缩进量:2个汉字。两端对齐;汉字用宋体,阿拉伯数字用 Times New Roman字体,五号字体。 6.图形要求 (1)在正文中要有引用。 (2)要有图名,图名位于图的下方,汉字用宋体,阿拉伯数字用Times New Roman字体,五号字体。 (3)图和图名“居中”。 7.表格要求 (1)在正文中要有引用。 (2)要有表名,表名位于表的上方,汉字用宋体,阿拉伯数字用Times New Roman字体,五号字体。 (3)表和表名“居中”。 二.注意事项 1.复制、拷贝、抄袭者取消成绩。 2.没有安实验报告排版要求者不及格。

实验2基本配置Linux操作系统实验 【实验目的】 1.。。。。 2.。。。。 3.。。。。 4.思考: (1)Linux默认的系统超级管理员帐户是什么? (2)Linux的操作系统引导器是什么?它有哪几种的操作界面? (3)RHEL的支持哪几种X-Window图形管理器?默认是使用哪一种?(4)RHEL支持哪几种Shell?默认是使用哪一种? 【实验原理】 1.。。。 。。。 2.。。。 。。。 (1)。。。 。。。 (2)。。。 。。。 3.。。 【实验环境】 1.实验配置 本实验所需的软硬件配置如表1所示。 表1 实验配置 本实验的环境如图1所示。

linux操作系统实验报告要点

LINUX操作系统实验报告 姓名 班级学号 指导教师 2011 年05月16 日 实验一在LINUX下获取帮助、Shell实用功能 实验目的: 1、掌握字符界面下关机及重启的命令。 2、掌握LINUX下获取帮助信息的命令:man、help。 3、掌握LINUX中Shell的实用功能,命令行自动补全,命令历史记录,命令的排列、替

换与别名,管道及输入输出重定向。 实验内容: 1、使用shutdown命令设定在30分钟之后关闭计算机。 2、使用命令“cat /etc/cron.daliy”设置为别名named,然后再取消别名。 3、使用echo命令和输出重定向创建文本文件/root/nn,内容是hello,然后再使用追加重定向输入内容为word。 4、使用管道方式分页显示/var目录下的内容。 5、使用cat显示文件/etc/passwd和/etc/shadow,只有正确显示第一个文件时才显示第二个文件。 实验步骤及结果: 1.用shutdown命令安全关闭系统,先开机在图形界面中右击鼠标选中新建终端选项中输入 命令Shutdown -h 30 2、使用命令alias将/etc/cron.daliy文件设置为别名named,左边是要设置的名称右边是要更改的文件。查看目录下的内容,只要在终端输入命令即可。取消更改的名称用命令unalias 命令:在命令后输入要取消的名称,再输入名称。 3.输入命令将文件内容HELLO重定向创建文本文件/root/nn,然后用然后再使用追加重定向输入内容为word。步骤与输入内容HELLO一样,然后用命令显示文件的全部内容。 4.使用命令ls /etc显示/etc目录下的内容,命令是分页显示。“|”是管道符号,它可以将多个命令输出信息当作某个命令的输入。

操作系统实验之内存管理实验报告

学生学号 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称 计算机操作系统 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 学生专业班级 2016 — 2017 学年第一学期

实验三 内存管理 一、设计目的、功能与要求 1、实验目的 掌握内存管理的相关内容,对内存的分配和回收有深入的理解。 2、实现功能 模拟实现内存管理机制 3、具体要求 任选一种计算机高级语言编程实现 选择一种内存管理方案:动态分区式、请求页式、段式、段页式等 能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等 能够选择分配、回收操作 内购显示进程在内存的储存地址、大小等 显示每次完成内存分配或回收后内存空间的使用情况 二、问题描述 所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。 动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。 最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。

最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。 最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。 三、数据结构及功能设计 1、数据结构 定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。 //空闲分区 typedef struct Free_Block { int size; int start_addr; struct Free_Block *next; } Free_Block; Free_Block *free_block; 定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。 //已分配分区的结构体 typedef struct Allocate_Block { int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct Allocate_Block *next; } Allocate_Block; 2、模块说明 2.1 初始化模块 对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化

磁盘管理组织的实验报告

实验报告 课程名称:网络操作系统 实验项目名称:Windows Server 2003的磁盘管理 学生姓名:邓学文专业:计算机网络技术学号:1000005517 同组学生姓名:无 实验地点:个人电脑实验日期:2012 年04 月08 日 实训12:Windows Server 2003的磁盘管理 一、实验目的 1、熟悉Windows Server 2003基本磁盘管理的相关操作; 2、掌握Windows Server 2003在动态磁盘上创建各种类型的卷; 3、掌握Windows Server 2003的磁盘限额以及磁盘整理等操作。 二、实验内容 在安装了Windows Server 2003的虚拟机上完成如下操作: 1、在安装了Windows Server 2003的虚拟机上添加五块虚拟硬盘,类型为SCSI,大小为1G,并初始化新添加的硬盘;添加一块IDE 类型的磁盘,大小为1.2GB。 2、选择添加的第一块硬盘,在磁盘上创建主分区“D:”,然后创建扩展分区,在扩展分区中创建逻辑盘“E:”和“F:”,最后将这块磁盘升级为动态磁盘。 3、利用添加五块虚拟硬盘,创建简单卷、扩展简单卷、跨区卷、带区卷、镜像卷、RAID-5卷,对具有容错能力的卷,用虚拟机删除虚拟硬盘来模拟硬盘损坏,并尝试数据恢复操作。 4、对磁盘“D:”做磁盘配额操作,设置用户User1的磁盘配额空间为100MB,随后分别将Windows Server 2003安装源程序和VMWARE Workstation 安装源程序复制到D盘,看是否成功。 5、对磁盘“E:”做磁盘清理和碎片整理。 三、实验步骤 1、启动VMWARE,打开预装的Windows Server 2003虚拟机,为虚拟机添加五块

linux实验报告

实验一 实验名称:Linux 基本命令的使用 实验时间:2学时 实验目的:熟练使用Linux字符界面、窗口系统的常用命令。 实验内容 (一)Linux操作基础 1.重新启动linux或关机(poweroff,shutdown,reboot,init 0,init 6) 2.显示系统信息(uname),显示系统日期与时间,查看2014年日历(date,cal) ①uname:查看系统与内核相关信息 uname -asrmpi 参数: -a :所有系统相关的信息; -s: 系统内核名称; -r: 内核的版本; -m:本系统的硬件名称,如i686或x86_64; -p: CPU的类型,与-m类似,只是显示的是CPU的类型; -i :硬件的平台(ix86). ②date:显示日期的命令 ③cal:显示日历 单独cal:列出当前月份的日历 cal 2014:列出2014年的日历 cal 5 2014:列出2014年五月的目录 3.使用帮助命令(man,help) ①man:是manual(操作说明)的简写,是在线帮助系统 man后跟某个命令就会详细说明此命令,例如:man man就会详细说明man 这个命令的用法; ②help:也是帮助命令,一般会在命令后,例如:cd --help 就会列出cd命令的使用说明。 4.查看当前登陆用户列表(who),显示当前用户(whoami) ①who:显示目前已登录在系统上面的用户信息; ②whoami:查询当前系统账户 5.建立一个新用户mytest,设定密码(useradd,passwd) ①useradd mytest(建立新用户mytest);

计算机操作系统内存分配实验报告记录

计算机操作系统内存分配实验报告记录

————————————————————————————————作者:————————————————————————————————日期:

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。 实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理,在系统运行当然开始,假设初始状态下,可用的内存空间为640KB,存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后,分给作业1(130KB),随着作业1、2、3的进入,分别分配60KB、100KB,经过一段时间的运行后,作业2运行完毕,释放所占内存。此时,作业4进入系统,要求分配200KB内存。作业3、1运行完毕,释放所占内存。此时又有作业5申请140KB,作业6申请60KB,作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理,使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链,为了实现对空闲分区的分配和链接,在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针,由状态位指示该分区是否分配出去了;同时,在分区尾部还设置有一后向指针,用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间,当该分区分配出去后,状态位就由“0”置为“1”。 设置一个内存空闲分区链,内存空间分区通过空闲分区链来管理,在进行内存分配时,系统优先使用空闲低端的空间。 设计一个空闲分区说明链,设计一个某时刻主存空间占用情况表,作为主存当前使用基础。初始化空间区和已分配区说明链的值,设计作业申请队列以及作业完成后释放顺序,实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明

Linux常用命令实验报告

实验二 姓名:陈辉龙学号:201407010201 班级:14计科(1)一.实验目的: 掌握Linux常见命令,为今后的实验打下良好的基础。 二.实验内容 1.新建用户为chenhuilong,配置密码为passwd: 2.切换到chenhuilong用户,并在/home/chenhuilong目录下新建文件夹dir: 3.在文件夹dir下新建文件hello(内容为"printf hello world!"),并将其拷贝至/home/user目录: 4.统计/home/user目录下文件的个数,包括子目录里的首字符为-的普通文件:

5.统计/home下目录的个数,包括子目录里的目录: 6.显示/home/user目录下名为hello的文件的行数、字数以及字符数(使用输入重定向): 7.将上步的结果输出重定向到名为cnt_hello的文件: 8.删除/home/user目录下的hello文件: 9.进入/home/user/dir文件夹,将hello文件属性变为-rwxrw-r--(使用符号标记方式),并为hello文件在/home/user目录下建立软链接,链接文件名为link_hello:

10.查看/home/user/dir/hello文件的详细信息: 11.切换至根目录下查找hello文件: 12.打包home/user/dir/hello文件,并进行压缩,然后再进行解压缩解包: 13.退出user用户,删除/home/user文件夹:

14.将文件夹/home的所有者改为user用户,并删除user用户: 三.实验总结: 本实验旨在熟悉Unix的常用命令,实验较简单,操作起来还算顺利,做了一遍感觉还不是很熟悉,因此做了两遍,第二遍就很得心顺手。通过这次实验,熟悉了一些常用的命令操作,为以后的学习打下坚实的基础,提高自己的动手能力。

可变分区存储管理方式的内存分配和回收实验报告(最优算法)

一.实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。 二.实验内容 1.确定内存空间分配表; 2.采用最优适应算法完成内存空间的分配和回收; 3.编写主函数对所做工作进行测试。 三.实验背景材料 由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。分配内存时查找空闲区进行分配,然后填写己分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。由此可见,内存的分配和回收主要是对空闲区的操作。这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。在实验中,采用顺序表形式,用数组模拟。由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。它们的长度必须是系统可能的最大项数。 “已分分区表”的结构定义 #define n 10 //假定系统允许的最大作业数量为n struct { float address; //已分分区起始地址 float length; //已分分区长度、单位为字节 int flag; //已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名 }used_table[n]; //已分分区表 “空闲区表”的结构定义 #define m 10 //假定系统允许的空闲区最大为m struct { float address; //空闲区起始地址 float length; //空闲区长度、单位为字节 int flag; //空闲区表登记栏标志,“0”表示空栏目,“1”表示未分配 }used_table[n]; //空闲区表 第二,在设计的数据表格基础上设计内存分配。 装入一个作业时,从空闲区表中查找满足作业长度的未分配区,如大于作业,空闲区划分成两个分区,一个给作业,一个成为小空闲分区。 实验中内存分配的算法采用“最优适应”算法,即选择一个能满足要求的最小空闲分区。 第三,在设计的数据表格基础上设计内存回收问题。内存回收时若相邻有空闲分区则合并空闲区,修改空闲区表。 四、参考程序 #define n 10 //假定系统允许的最大作业数量为n

网络配置实验报告

实验一:磁盘管理和文件系统管理 一、实验目的:掌握Windows Server 2008系统中的磁盘管理和文件系统管理,包括基本磁盘中分区的创建,动态磁盘中各种动态卷的创建。 二、实验属性:验证型 三、实验环境 Pentium 550Hz以上的CPU;建议至少512MB的内存; 建议硬盘至少2GB,并有1GB空闲空间。 四、实验内容 磁盘的管理 文件系统的管理五、实验步骤 (一)、磁盘管理 1、在虚拟机中再添加两块磁盘(问题1:在虚拟机中如何添加新的磁盘?)。 答:在虚拟机界面打开VM中点击Settings然后点击ADD,选择Hard Disk,然后继续按next到完成为止。

1、使用磁盘管理控制台,在基本磁盘中新建主磁盘分区、扩展磁盘分区和逻辑驱动器,并对已经创建好的分区做格式化、更改磁盘驱动器号及路径等几个操作。(问题2:在一台基本磁盘中,最多可以创建几个主磁盘分区?问题3:将FAT32格式的分区转换为NTFS格式的完整命令是什么?) 答:最多可有四个主磁盘分区; 将FAT32格式的分区转换为NTFS格式的完整命令是 Convert F:/FS:NTFS 对已经创建好的分区格式化 更改磁盘驱动器号及路径

3、将三块基本磁盘转换为动态磁盘。(问题4:如何将基本磁盘转换为动态磁盘?问题5:什么样的磁盘由基本磁盘转换为动态磁盘后系统需要重新启动?) 答:若升级的基本磁盘中包含有系统磁盘分区或引导磁盘分区,则转换为动态磁盘后需要重新启动计算机。 4、在动态磁盘中创建简单卷、扩展简单卷、创建跨区卷、扩展跨区卷、创建带区卷、镜像卷和RAID5卷,并对具有容错能力的卷尝试数据恢复操作,掌握各个卷的特点和工作原理。(问题6:哪些卷可以扩展?问题7:哪些卷具有容错功能?问题8:哪个卷可以包含系统卷?问题9:哪些卷需要跨越多个磁盘?问题10:哪个卷至少需要3块磁盘?) 答:简单卷、跨区卷可以扩展,镜像卷和RAID5卷具有容错功能,镜像卷可以包含系统卷。跨区卷、带区卷、镜像卷和RAID5卷都需要跨越多个磁盘。AID5卷至少需要3块磁盘。 对于卷的扩展,对于NTFS格式的简单卷,其容量可以扩展,可以将其他未指派的空间合并到简单卷中,但这些未指派空间局限于本磁盘上,若选用了其他磁盘上的空间,则扩展之后就变成了跨区卷。

实验一 Linux基本操作实验报告

实验一Linux基本操作 一.实验目的: 1. 二.实验环境: 虚拟机+Red Hat Enterprise Server 5.0 三.实验内容: 根据以下的文字提示,调用相应的命令来完成,记录相应的运行结果。一)用户和组基本操作 1.添加一个user01用户,家目录为/home/sub2,并设置密码 2.添加一个group1 组 3.将user01用户添加到group1组中 4.修改group1组名称为group2 5.修改user01的家目录为/home/user01 6.判断/etc/password这个目录是否包含user01这个用户 7.修改user01的shell为/bin/tcsh 8.添加一个group3组,把user01和root用户都添加到该组

https://www.wendangku.net/doc/be12905867.html,er01用户从group2组切换到group3组 10.设置user01的密码在2012-5-20过期 11.把/home/user01目录所属的组修改为group3 12.删除user01帐号 13.查看内核版本号 二)进程管理 1.运行cat命令:vi test,输入若干字符如this is a example,挂起vi进程 2.显示当前所有作业 3.将vi进程调度到前台运行

4.将vi进程调度到后台并分别用kill/pkill/killall命令结束该该进程。 三)磁盘管理 1.通过fdisk 将为硬盘增加一个分区(主分区或者逻辑分区)。 2.并格式化ext3系统,

3.检测分区是否有坏道 4.检测分区的完整性 5.加载分区到/mnt目录(或者其他分区)下,并拷贝一些文件到该目录下 6.(选做)为test用户设置磁盘配额(软限制和硬限制参数自行设定) 7.退出/mnt目录后卸载该分区 8.用du查看/usr目录的大小

计算机操作系统内存分配实验报告

一、实验目的 熟悉主存的分配与回收。理解在不同的存储管理方式下.如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。 二、实验内容和要求 主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配.就是解决多道作业或多进程如何共享主存空间的问题。所谓回收.就是当作业运行完成时将作业或进程所占的主存空间归还给系统。 可变分区管理是指在处理作业过程中建立分区.使分区大小正好适合作业的需求.并且分区个数是可以调整的。当要装入一个作业时.根据作业需要的主存量查看是否有足够的空闲空间.若有.则按需要量分割一个分区分配给该作业;若无.则作业不能装入.作业等待。随着作业的装入、完成.主存空间被分成许多大大小小的分区.有的分区被作业占用.而有的分区是空闲的。 实验要求使用可变分区存储管理方式.分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行.分区分配中所用的算法采用首次适应算法、最佳适应算法、最差适应算法三种算法来实现主存的分配与回收。同时.要求设计一个实用友好的用户界面.并显示分配与回收的过程。同时要求设计一个实用友好的用户界面,并显示分配与回收的过程。 三、实验主要仪器设备和材料 实验环境 硬件环境:PC或兼容机 软件环境:VC++ 6.0 四、实验原理及设计分析 某系统采用可变分区存储管理.在系统运行当然开始.假设初始状态下.可用的内存空间为640KB.存储器区被分为操作系统分区(40KB)和可给用户的空间区(600KB)。 (作业1 申请130KB、作业2 申请60KB、作业3 申请100KB 、作业2 释放 60KB 、作业4 申请 200KB、作业3释放100KB、作业1 释放130KB 、作业5申请140KB 、作业6申请60KB 、作业7申请50KB) 当作业1进入内存后.分给作业1(130KB).随着作业1、2、3的进入.分别分配60KB、100KB.经过一段时间的运行后.作业2运行完毕.释放所占内存。此时.作业4进入系统.要求分配200KB内存。作业3、1运行完毕.释放所占内存。此时又有作业5申请140KB.作业6申请60KB.作业7申请50KB。为它们进行主存分配和回收。 1、采用可变分区存储管理.使用空闲分区链实现主存分配和回收。 空闲分区链:使用链指针把所有的空闲分区链成一条链.为了实现对空闲分区的分配和链接.在每个分区的起始部分设置状态位、分区的大小和链接各个分区的前向指针.由状态位指示该分区是否分配出去了;同时.在分区尾部还设置有一后向指针.用来链接后面的分区;分区中间部分是用来存放作业的空闲内存空间.当该分区分配出去后.状态位就由“0”置为“1”。 设置一个内存空闲分区链.内存空间分区通过空闲分区链来管理.在进行内存分配时.系统优先使用空闲低端的空间。 设计一个空闲分区说明链.设计一个某时刻主存空间占用情况表.作为主存当前使用基础。初始化空间区和已分配区说明链的值.设计作业申请队列以及作业完成后释放顺序.实现主存的分配和回收。要求每次分配和回收后显示出空闲内存分区链的情况。把空闲区说明链的变化情况以及各作业的申请、释放情况显示打印出来。

Linux实验报告

Linux实验 一、实验目的 1. 了解Linux基本使用方法; 2. 掌握Linux基本设置方式; 3. 掌握Linux基本操作命令使用。 二、内容要求 1. 了解进程管理、文件管理与内存管理 2.掌握系统设置文件与命令 3. 熟练使用系统操作与维护命令 4. 熟练使用系统操作与维护命令 三、实验原理 Linux 系统常用命令格式: command [option] [argument1] [argument2] ... 其中option以“-”开始,多个option可用一个“-”连起来,如 “ls-l -a”与“ls-la”的效果是一样的。根据命令的不同,参数 分为可选的或必须的;所有的命令从标准输入接受输入,输出结果显示在 标准输出,而错误信息则显示在标准错误输出设备。可使用重定向功能对这 些设备进行重定向。如: ls –lh > a.txt 命令在正常执行结果后返回一个0值,如果命令出错可未完全完成,则返回 一个非零值(在shell中可用变量$?查看)。在shell script中可用此返 回值作为控制逻辑的一部分。 DSL命令操作: 帮助命令: man 获取相关命令的帮助信息 例如:man dir 可以获取关于dir的使用信息。 info 获取相关命令的详细使用方法 例如:info info 可以获取如何使用info的详细信息。 基本操作: echo 显示字符串 pwd 显示当前工作目录 ls 查看当前文件夹内容 ls -a 查看当前文件夹内容(包括隐藏项) ls -l 查看当前文件夹内容(详细) ls / 查看根目录内容 cd / 移动到根目录

pwd 显示当前工作目录 ls -al 查看根目录文件夹内容(详细情况并包括隐藏项) cd /home/dsl 回到“家”目录 pwd 显示当前工作目录 df -h 显示剩余磁盘空间,参数“-h”表示适合人读取(human readable) du -h 显示文件夹(及子文件夹)所占空间 mkdir fd0 在当前目录下创建目录fd0 touch a.txt 创建一个空文件a.txt ls / -lh > a.txt 利用重定向功能将根目录中的内容写入a.txt。 cat a.txt 显示a.txt内容 wc a.txt 显示a.txt的行数,字数与字节数 find / -name *conf 在根目录下(包括子目录)查找以conf结尾的文件 sudo mount /dev/fd0 fd0 将软盘镜像挂载到目录fd0上 cd fd0 进入软盘镜像所挂载的目录 ls -lh 查看软盘镜像中的文件 cd .. “..”表示进入上一层目录 gzip a.txt 使用gzip压缩a.txt ls -lh 查看当前文件夹 sudo cp a.txt.gz fd0/ 将a.txt复制到fd0目录下,即将其复制到软盘镜像中 sudo mv fd0/a.txt.gz ./ 将a.txt移动到当前目录下,“.”表示当前目录 sudo umount /dev/fd0 将软盘镜像卸载 ls fd0 显示fd0 目录内容 gzip -d a.txt.gz 解压缩a.txt.gz ls -lh 查看当前文件夹 权限管理: 假设当前处于/home/dsl 目录下,且有a.txt(文件)与fd0(目录),当前用户名为dsl。 sudo cat /etc/passwd 用户 sudo cat /etc/shadow 密码 sudo cat /etc/group 组 users 查看当前登录用户 sudo chmod -x fd0 更改文件夹权限 ls fd0 fd0不能被执行,则意味着无法打开! sudo chmod +x fd0 更改文件夹权限 ls fd0 fd0能被打开 sudo chown root fd0 更改目录fd0的所有者 ls -lh 注意看fd0目录的属性 sudo chown dsl:root fd0 更改目录fd0的所有者为dsl,所属组为root ls -lh 注意看fd0目录的属性 chmod a-r a.txt 现在a.txt不具有“读”权限,不能被读取

磁盘调度实验报告

操作系统实验报告 磁 盘 调 度

实验六:磁盘调度算法 一.实验目的 复习模拟实现一种磁盘调度算法,进一步加深对磁盘调度效率的理解。 二.实验属性 该实验为设计性实验。 三.实验仪器设备及器材 普通PC386以上微机 四.实验要求 本实验要求2学时完成。 本实验要求完成如下任务: (1)建立相关的数据结构,作业控制块、已分配分区及未分配分区 (2)实现一个分区分配算法,如最先适应分配算法、最优或最坏适应分配算法(3)实现一个分区回收算法 (4)给定一批作业/进程,选择一个分配或回收算法,实现分区存储的模拟管理

实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。 五 .主要算法分析 各个算法分析 1.先来先服务算法(FCFS) 先来先服务(FCFS)调度:按先来后到次序服务,未作优化。 最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。例如,如果现在读写磁头正在50号柱面上执行输出操作,而等待访问者依次要访问的柱面为130、199、32、159、15、148、61、99,那么,当50号柱面上的操作结束后,移动臂将按请求的先后次序先移到130号柱面,最后到达99号柱面。 采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。 2.最短寻道时间优先算法(SSTF) 最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。现在仍利用同一个例子来讨论,现在当50号柱面的操作结束后,应该先处理61号柱面的请求,然后到达32号柱面执行操作,随后处理15号柱面请求,后继操作的次序应该是99、130、148、159、199。 采用最短寻找时间优先算法决定等待访问者执行操作的次序时,读写磁头总共移动了200多个柱面的距离,与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。 但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有

相关文档