linux实验五: 磁盘管理含源代码
- 格式:docx
- 大小:21.10 KB
- 文档页数:10
操作系统磁盘调度算法实验报告及代码一、实验目的通过实验掌握磁盘调度算法的实现过程,了解各种不同磁盘调度算法的特点和优缺点,并比较它们的性能差异。
二、实验原理磁盘调度是操作系统中的重要内容,其主要目的是提高磁盘的利用率和系统的响应速度。
常见的磁盘调度算法有:FCFS(先来先服务)、SSTF (最短寻道时间)、SCAN(扫描)、C-SCAN(循环扫描)等。
三、实验过程1.编写代码实现磁盘调度算法首先,我们需要定义一个磁盘请求队列,其中存放所有的IO请求。
然后,根据所选的磁盘调度算法,实现对磁盘请求队列的处理和IO请求的调度。
最后,展示运行结果。
以FCFS算法为例,伪代码如下所示:```diskQueue = new DiskQueue(; // 创建磁盘请求队列while (!diskQueue.isEmpty()request = diskQueue.dequeue(; // 取出队列头的IO请求//处理IO请求displayResult(; // 展示运行结果```2.运行实验并记录数据为了验证各种磁盘调度算法的性能差异,我们可以模拟不同的场景,例如,随机生成一批磁盘IO请求,并使用不同的磁盘调度算法进行处理。
记录每种算法的平均响应时间、平均等待时间等指标。
3.撰写实验报告根据实验数据和结果,撰写实验报告。
实验报告通常包括以下内容:引言、实验目的、实验原理、实验步骤、实验结果、实验分析、结论等。
四、实验结果与分析使用不同的磁盘调度算法对磁盘IO请求进行处理,得到不同的实验结果。
通过对比这些结果,我们可以看出不同算法对磁盘IO性能的影响。
例如,FCFS算法对于请求队列中的请求没有排序,可能会导致一些请求等待时间过长。
而SSTF算法通过选择离当前磁道最近的请求进行处理,能够减少平均寻道时间,提高磁盘性能。
五、实验总结通过本次实验,我们学习了操作系统中磁盘调度算法的原理和实现过程。
不同的磁盘调度算法具有不同的优缺点,我们需要根据实际情况选择合适的算法。
一.准备环境1.硬件设置及安装按下图方式添加3个1G硬盘步骤1步骤2步骤3步骤4步骤5步骤6步骤7步骤8 重复以上步骤,再增加两块硬盘完成后的画面二.为系统添新硬盘在本实验中因使用虚拟机,所以新硬盘已在前面的准备环境中完成。
在真实环境下,如请先将硬件准备并安装到机器上后再进行后续实验。
1.启动我们虚拟机中的RHEL5,并以root 登录系统。
2.用fdisk–l检查是否已找到新硬盘3.对各硬盘分别进行分区:4.保存分区信息并退出fdisk5.格式化分区6.Mount 使用分区:7.实验完成三.创建linux 软件RAID1.删上一实验中的硬盘分区删前请umount分区,以保证分区没有被使用分区没有了2.创建分区3.修改分区类型,并保存设置分区类型并保存设置4.重复以上2,3步骤,将另两块硬盘都进行相应的分区设置(如有其它分区,则请按第1步操作删掉分区)5.建立raidmdadm --create –v /dev/md0 –level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1操作信息如下图:6.检查raid状态7.生成RAID的配置文件,以便系统启动时自动激活RAID8.在RAID上的创建文件系统9.按一般文件系统使用10.实验完成四.LVM 逻辑卷管理1.删上一实验中建立的RAID删除方法如下:A.移除/etc/mdadm.conf (rm/etc/mdadm.conf –f)B. 将RAID成员硬盘移出RAIDmdadm –f /dev/md0 /dev/sdb1mdadm –f /dev/md0 /dev/sdc1mdadm –f /dev/md0 /dev/sdd1C. 停止RAIDmdadm –S /dev/md0D. 清除各硬盘上的RAID信息mdadm --zero-superblock /dev/sdb1mdadm --zero-superblock /dev/sdc1mdadm --zero-superblock /dev/sdd12.参考“为系统添加新硬盘”实验,对各硬盘进行分区3.分区后修改分区类型4.创建物理卷:5.建立卷组:6.建立逻辑卷7.格式化逻辑卷8.mount使用逻辑卷扩大逻辑卷空间假设目前Sybase这个逻辑卷空间需要扩展空间9.检查目前逻辑所在卷组中是否还有未使用的空间,如有,可直接将未用空间扩展到逻辑卷中.检查逻辑卷处于哪一个卷组:检查卷组Data是否还有剩余空间如无,可先在它有多余空间的逻辑卷中进行缩减,以扩大卷组的剩余空间。
第1篇---进程管理实验报告一、实验目的1. 理解进程的概念和进程管理的基本原理。
2. 掌握进程的创建、调度、同步和通信等操作。
3. 通过编程实现简单的进程管理功能。
二、实验环境1. 操作系统:Windows/Linux2. 编程语言:C/C++3. 开发环境:Visual Studio/Code::Blocks三、实验内容1. 进程的创建与终止2. 进程的同步与互斥3. 进程的通信4. 进程调度算法四、实验步骤1. 进程的创建与终止```cinclude <stdio.h>include <sys/types.h>include <unistd.h>int main() {pid_t pid;// 创建子进程pid = fork();if (pid < 0) {// 创建进程失败perror("fork failed");return 1;} else if (pid == 0) {// 子进程printf("Child process, PID: %d\n", getpid()); // 执行子进程的任务...sleep(5); // 子进程暂停5秒_exit(0); // 子进程退出} else {// 父进程printf("Parent process, PID: %d\n", getpid()); wait(NULL); // 等待子进程结束printf("Child process has terminated.\n");}return 0;}```2. 进程的同步与互斥```cinclude <stdio.h>include <pthread.h>pthread_mutex_t mutex;void thread_func(void arg) {pthread_mutex_lock(&mutex); // 加锁printf("Thread %ld is running\n", (long)arg);sleep(1); // 模拟任务执行pthread_mutex_unlock(&mutex); // 解锁return NULL;}int main() {pthread_t thread1, thread2;// 初始化互斥锁pthread_mutex_init(&mutex, NULL);// 创建线程pthread_create(&thread1, NULL, thread_func, (void )1); pthread_create(&thread2, NULL, thread_func, (void )2); // 等待线程结束pthread_join(thread1, NULL);pthread_join(thread2, NULL);// 销毁互斥锁pthread_mutex_destroy(&mutex);return 0;}```3. 进程的通信```cinclude <stdio.h>include <stdlib.h>include <sys/ipc.h>include <sys/shm.h>int main() {key_t key;int shmid;int data;// 生成共享内存标识符key = ftok("shmfile", 65);// 创建共享内存段shmid = shmget(key, sizeof(int), 0666 | IPC_CREAT); if (shmid == -1) {perror("shmget failed");exit(1);}// 连接到共享内存段data = (int )shmat(shmid, (void )0, 0);if (data == (int )(-1)) {perror("shmat failed");exit(1);}// 使用共享内存data = 100;printf("Data in shared memory: %d\n", data); // 分离共享内存段if (shmdt(data) == -1) {perror("shmdt failed");exit(1);}// 删除共享内存段if (shmctl(shmid, IPC_RMID, NULL) == -1) { perror("shmctl failed");exit(1);}return 0;}```4. 进程调度算法```cinclude <stdio.h>include <stdlib.h>include <sys/time.h>typedef struct {int pid;int arrival_time;int burst_time;int waiting_time;int turnaround_time;} Process;int main() {Process processes[] = {{1, 0, 5, 0, 0},{2, 1, 3, 0, 0},{3, 4, 8, 0, 0}};int n = sizeof(processes) / sizeof(processes[0]);// 计算等待时间和周转时间int total_waiting_time = 0, total_turnaround_time = 0;for (int i = 0; i < n; i++) {if (i == 0) {processes[i].waiting_time = 0;} else {processes[i].waiting_time = processes[i - 1].turnaround_time;}processes[i].turnaround_time = processes[i].burst_time + processes[i].waiting_time;total_waiting_time += processes[i].waiting_time;total_turnaround_time += processes[i].turnaround_time;}printf("Average Waiting Time: %f\n", (float)total_waiting_time / n);printf("Average Turnaround Time: %f\n", (float)total_turnaround_time / n);return 0;}```五、实验结果与分析(此处应填写实验结果,包括运行程序输出、图表等,以及对实验结果的分析。
目录摘要 (2)前言 (3)正文 (4)1. 实验目的 (4)2. 设计思想 (4)3. 实验结构图 (5)4. 各模块的伪码算法 (5)5. 测试分析 (10)6. 测试结果 (11)7. 源程序 (14)总结 (24)参考文献 (25)致谢 (26)摘要要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块。
存储介质上某个文件不再需要时,又要收回它所占的存储空间作为空闲块。
用户作业在执行期间经常要求建立一个新文件或撤消一个不再需要的文件,因此,文件系统必须要为它们分配存储空间或收回它所占的存储空间。
如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存储空间的分配和收回的方法:位示图法(用一张位示图(简称位图)来指示磁盘存储空间的使用情况),空闲块链接法(在UNIX操作系统中,把磁盘存储空间的空闲块成组链接)。
关键词:磁盘的分配和回收管理;位示图;成组链接。
前言通过该题目的设计过程,掌握磁盘存储管理的原理、软件开发方法并提高解决实际问题的能力。
学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的物理地址过程。
学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。
了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。
希望通过本次设计过程可以提高自己的分析问题的能力和实际动手的能力,将学到的知识用于实践中。
正文1. 实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。
每个磁道又分成若干个扇区(又叫做块)。
这些空间就是用来存放用户文件的。
当用户的文件不再需要时,就应该删除。
把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。
因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。
如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。
管理磁盘和文件系统英语单词:1、i节点:inode(文件的数字标记)2、物理卷:Physical Volume(PV)3、卷组:Volume Group(VG)4、逻辑卷:Logical Volume(LV)命令:磁盘分区与文件系统命令1、fdisk –l:查看系统能识别到的磁盘。
(在新加磁盘后,要使用的命令)2、fdisk 磁盘设备(如fdisk /dev/sdb):对指定的磁盘设备进行分区操作。
1)d:删除分区2)n:创建新分区3)t:指定分区的文件系统类型4)p:查看磁盘的分区信息5)a:为指定分区添加启动标志6)w:保存并退出7)q:退出而不保存3、mkfs -t 文件系统类型分区设备(如mkfs –t ext4 /dev/sda):创建磁盘文件系统4、mkfs.文件系统类型分区设备(如mkfs.ext4 /dev/sda1):创建磁盘文件系统5、用普通文件模拟磁盘设备:1)创建普通文件:touch /tmp/test.img2)将文件模拟成磁盘:dd if=/dev/zero of=/tmp/test.img bs=10M count=103)为test.img创建磁盘文件系统:mkfs.ext4 /tmp/test.img4)挂载test.img:mount -o loop /tmp/test.img /mnt至此,进入目录/mnt下进行的任何磁盘操作,其相关信息都会被写进test.img文件中。
6、mkswap 分区设备(mkswap /dev/sda2):创建交换分区7、free:查看内存及交换分区的使用情况8、交换分区的激活与卸载:swapon、swapoff9、mount [-t 文件系统类型] [-o 挂在类型] 分区设备挂载点1)通常不需要指定,一些可用的文件系统类型:光盘或光盘镜像:iso9660DOS fat16文件系统:msdosWindows 9x fat32文件系统:vfatWindows NT ntfs文件系统:ntfsMount Windows文件网络共享:smbfsUNIX(LINUX) 文件网络共享:nfs2)挂载类型:loop:用来把一个文件当成硬盘分区挂接上系统ro:采用只读方式挂接设备rw:采用读写方式挂接设备iocharset:指定访问文件系统所用字符集3)挂载光盘镜像文件:①从光盘制作光盘镜像文件。
第五章Linux中的磁盘系统管理一、磁盘管理基本命令1.转换软盘数据--- dd (Convert and Copy a File)1)dd命令可以帮助我们将软盘中的数据写成一个文件,或是将硬盘中的文件写入软盘,如果要将软盘中的数据写成名为floppyfile的文件,可以输入以下命令:[root@localhost root]# dd if=/dev/fd0 of=floppyfile“if”表示输入的文件(Input File), /dev/fd0是指第1部软驱,而“of”表示要输出的文件(Output File)。
2)还可以运用dd命令在Linux下制作引导盘,其范例如下:[root@localhost root]# dd if=boot.img of=/dev/fd0 bs=1440kboot.img可用于Linux的开机,而bs表示输出软盘的字节数(Bytes),因为软盘的容量为1.44MB,所以可以指定为1440K3)利用dd命令进行将文件内容的大小写互换,以下是范例:[root@localhost root]# cat >./lowercaseLinux is a free Unix-type operating system originally created by Linus Torvalds with the assistance of developers around the world.[root@localhost root]# dd if=./ lowercase of=./uppercase conv=ucase0+1 records in0+1 records out[root@localhost root]# cat >./ uppercaseLINUX IS A FREE UNIX-TYPE OPERATING SYSTEM ORIGINALLY CREATED BY LINUS TORV ALDS WITH THE ASSISTANCE OF DEVELOPERS AROUND THE WORLD.范例中利用dd命令加上“conv=ucase”, 其中的“conv”参数表示指定文件转换的方式,它的选项有很多,如下:ascii 转换EBCDIC 为ASCII。
实验五:磁盘管理实验学时:2学时实验类型:设计实验要求:必修一、实验目的怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过本实习使学生掌握磁盘存储空间的分配和回收算法。
二、实验内容模拟磁盘空闲空间的表示方法,以及模拟实现磁盘空间的分配和回收。
本实习模拟用位示图管理磁盘存储空间的管理方法。
设计申请一块磁盘空间和归还一块磁盘空间的程序。
要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
假定已有如表1的磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,显示或打印运行的结果。
然后再归还如表2的空间,运行回收程序,显示或打印运行结果。
表1表2三、实验原理、方法和手段磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。
用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。
一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续的存储空间。
为了表示哪些磁盘空间已被占用,哪些磁盘空间是空闲的,可用位示图来指出。
位示图由若干字节构成,每一位与磁盘上的一块对应,“1”状态表示相应块已占用,“0”状态表示该块为空闲。
位示图的形式与实习四中的位示图一样,但要注意,对于主存储空间和磁盘存储空间应该用不同的位示图来管理,绝不可混用。
当申请一块磁盘空间时,由分配程序查位示图,找出一个为“0”的位,计算出这一位对应块的磁盘物理地址,且把该位置成占用状态“1”。
假设现在有一个盘组共80个柱面,每个柱面有两个磁道,每个磁道分成4个物理记录。
那么,当在位示图中找到某一字节的某一位为“0”时,这个空闲块对应的磁盘物理地址为:柱面号=字节号磁道号=[位数/4] 物理记录号={位数/4} 当归还一块磁盘空间时,由回收程序根据归还的磁盘物理地址计算出归还块在位示图中的对应位,把该位置成“0”。
归还块在位示图中的位置计算如下:字节号=柱面号位数=磁道号 4+物理记录号四、实验组织运行要求该实验采用集中授课形式。
1.学生在进行实验前必须进行充分的预习,熟悉实验内容,写出实验步骤,特别是算法流程;2.学生严格遵守实验室的各项规章制度,注意人身和设备安全,配合和服从实验室人员管理;3.教师在学生实验过程中予以必要的辅导,独立完成实验;4.教师审查、分析学生实验方案和实验结果;5.综合评定学生的实验成绩。
五、实验条件实验机器要求安装Visual C++ 6.0编程平台;实验要求一人一机。
六、实验步骤本实验在Visual C++ 6.0编程平台下进行编程实现,详见实验内容。
1.按照学生自行设计的算法流程,进行编程;2.编译、调试程序;3.运行程序,记录结果。
七、思考题1. 磁盘调度哪些算法?八、实验报告1.实验预习在实验前每位学生都需要对本次实验进行认真的预习,并写好预习报告,在预习报告中要写出实验目的、要求,实验步骤、算法流程,形成一个操作提纲。
2.实验记录学生开始实验时,应该将记录本放在近旁,按照自行设计的实验方案和步骤进行编程,记录结果。
实验记录中应有指导教师的签名。
3.实验报告(1) 实习题目、实验目的、实验要求。
(2) 程序中使用的数据结构及符号说明。
(3) 流程图。
(4) 打印一份源程序并附上注释。
(5) 要求能显示或打印程序运行前和运行后的位示图;分配时把分配到的磁盘空间的物理地址显示或打印出来,归还时把归还块对应于位示图的字节号和位数显示或打印出来。
假定已有如表6-1的磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序,按(4)中要求显示或打印运行的结果。
然后再归还如表6-2的空间,运行回收程序,按(4)中的要求显示或打印运行结果。
表6-1表6-2九、其它说明学生在实验过程中应遵守实验室的各项规章制度,注意人身和设备安全,配合和服从实验室人员管理。
源程序:#include<iostream.h>#include<stdlib.h>#include<iomanip.h>#define A 10#define B 2#define C 4int koko[A][B][C];int M,N;int i,j,k;char ch;void i_koko(){for(i=0;i<A;i++){for(j=0;j<B;j++){for(k=0;k<C;k++){koko[i][j][k]=1;}}}}void Dispense(){do{cout<<"请输入字节号:"<<'\t';cin>>M;cout<<"请输入位数:"<<'\t';cin>>N;i=M;j=N/4;k=N%4;koko[i][j][k]=0;cout<<"是否继续输入(Y/N):"<<'\t';cin>>ch;}while(ch=='Y'||ch=='y');}void Recycle(){do{cout<<"请输入柱面号"<<'\t';cin>>i;cout<<"请输入磁盘号"<<'\t';cin>>j;cout<<"请输入逻辑记录号"<<'\t';cin>>k;koko[i][j][k]=1;cout<<"是否继续输入(Y/N):"<<'\t';cin>>ch;}while(ch=='Y'||ch=='y');}void Display(){int i,j,k;int flag=0;cout<<"**位示图**"<<endl;cout<<"字\位"<<setw(3);for(i=0;i<B*C;i++){cout<<i<<setw(3);}cout<<endl;for(i=0;i<A;i++){cout<<setw(3)<<i<<setw(6);for(j=0;j<B;j++){for(k=0;k<C;k++){cout<<koko[i][j][k]<<setw(3);flag++;if(flag%8==0)cout<<endl;}}}cout<<endl;cout<<"**磁盘分配图**"<<endl;cout<<"柱面号"<<'\t'<<"磁道号"<<'\t'<<"物理记录号"<<endl;for(i=0;i<A;i++){for(j=0;j<B;j++){for(k=0;k<C;k++){if(koko[i][j][k]==0)cout<<i<<'\t'<<j<<'\t'<<k<<endl;}}}cout<<endl<<endl;}void KOKO(){cout<<"**********************************"<<endl;cout<<"* 1.分配"<<"2.回收"<<"3.显示"<<"4.退出*"<<endl;cout<<"**********************************"<<endl;cout<<"选择所要执行的功能:"<<'\t';int x;cin>>x;cout<<endl;switch(x){case 1:Dispense(); break;case 2:Recycle();break;case 3:Display();break;case 4:exit(1);break;default:cout<<"Error! 该功能不存在请重新输入"<<endl<<endl;}}void main(){i_koko();while(1){KOKO();}}2.编译、调试程序;3.运行程序,记录结果。
假定已有如表6-1的磁盘空间被占用了,现在要申请五块磁盘空间,运行分配程序。
然后再归还如表6-2的空间,运行回收程序,。
输出申请表(2)四、思考题1. 此磁盘调度有哪些算法?答:磁盘调度算法有:FCFS算法、最短寻道时间优先SSTF 算法、扫描算法(如:扫描SCAN算法、循环扫描CSCAN算法)。