磁盘空间管理模拟实验之Linux磁盘空间管理

合集下载

Linux命令行中的磁盘使用和空间管理技巧

Linux命令行中的磁盘使用和空间管理技巧

Linux命令行中的磁盘使用和空间管理技巧Part I 磁盘使用概述在Linux系统中,磁盘使用和空间管理是一项重要任务,不仅涉及到文件的存储、查找和删除,还直接影响系统的性能和稳定性。

本文将介绍一些常用的Linux命令行技巧,以便更有效地管理磁盘空间。

Part II 磁盘分区和文件系统1. 查看磁盘分区使用命令“fdisk -l”可以查看系统中的磁盘分区情况,包括磁盘编号、分区类型和分区大小等信息。

2. 创建磁盘分区使用命令“fdisk /dev/sdx”(其中sdx为磁盘设备名)可以进入磁盘分区编辑界面,通过一系列交互式操作来创建新的磁盘分区。

3. 格式化磁盘分区使用命令“mkfs.ext4 /dev/sdx”(其中sdx为磁盘分区设备名)可以将磁盘分区格式化为ext4文件系统,并为之分配一个文件系统标签。

Part III 磁盘空间的监控和管理1. 查看磁盘使用情况使用命令“df -h”可以查看系统中各个磁盘分区的使用情况,包括分区的总容量、已用空间、可用空间和挂载点等信息。

2. 查找占用空间较大的文件和目录使用命令“du -sh *”可以列出当前目录下所有文件和目录的大小,并按照大小排序。

这样可以快速找到占用空间较大的文件或目录。

3. 清理不再需要的文件和目录使用命令“rm -rf <文件/目录路径>”可以递归地删除指定的文件或目录。

在删除前,建议先备份重要数据,并确保要删除的文件或目录是无用的。

4. 压缩和解压缩文件使用命令“gzip <文件名>”可以将指定的文件压缩为gz格式,使用命令“gunzip <文件名.gz>”可以将gz格式的文件解压缩。

类似地,还有其他压缩和解压缩命令可供选择。

Part IV 硬盘空间的优化与清理1. 清理临时文件使用命令“sudo apt-get clean”可以清理系统临时文件,释放磁盘空间。

此外,还可以手动删除其他不再需要的临时文件。

linux磁盘空间清理方式

linux磁盘空间清理方式

linux磁盘空间清理方式
Linux操作系统是一款常用的开源操作系统,但是它的磁盘空间常常会被占满。

这时我们需要清理磁盘空间,以便获得更多的可用空间。

以下是一些Linux磁盘空间清理的方式:
1. 删除不需要的文件:使用命令`rm`可以删除不需要的文件,例如:`rm filename`。

2. 清空回收站:使用命令`rm -rf ~/.local/share/Trash/*`
可以清空Linux的回收站。

3. 清空日志文件:使用命令`sudo journalctl
--vacuum-size=50M`可以清空系统日志文件,释放磁盘空间。

4. 清空缓存:使用命令`sync && echo 3 | sudo tee
/proc/sys/vm/drop_caches`可以清空缓存,释放磁盘空间。

5. 删除旧的内核:使用命令`sudo apt-get autoremove`可以删除旧的内核文件,释放磁盘空间。

6. 清理临时文件:使用命令`sudo apt-get autoclean`可以清除临时文件,释放磁盘空间。

7. 扫描大文件:使用命令`sudo find / -type f -size +100M`可以扫描大于100M的文件,然后手动删除或移动到其他位置。

以上是几种常用的清理Linux磁盘空间的方式。

需要注意的是,在执行清理操作之前,请确保备份好重要的数据。

- 1 -。

linux实验报告--磁盘管理

linux实验报告--磁盘管理
广东科学技术职业学院计算机工程技术学院软件学院专业计算机网络技术班级成绩评定学号姓名合作者号教师签名实验题目磁盘的管理掌握并熟悉如何利用fdisk在新硬盘上建立分区
广东科学技术职业学院
计算机工程技术学院(软件学院)
实验报告
专业计算机网络技术班级成绩评定______
学号姓名(合作者____号____)教师签名赖小卿
2.实验结果(学生填写)
3.心得体会(学生填写)
实验题目磁盘的管理
第周星期一第节
一、实验目的与要求
1、掌握并熟悉在虚拟机的环境下如何添加一个硬盘;
2、掌握并熟悉如何利用fdisk在新硬盘上建立分区;
3、掌握并熟悉如何按要求格式化分区,并根据需要进行挂载;
4、复习YUM源的使用。
二、实验步骤
1、在虚拟机的环境下添加一个硬盘,硬盘容量为5G;
2、利用fdisk在新硬盘上创建一个1G的主分区,创建一个4G的扩展分区,并在此基础上创建两个逻辑分区,大小分别为3G和1G。
3、格式化相关的分区,文件系统类型均为ext3。
4、在根下。
5、将光盘的Server目录下的所有文件拷贝到新分区中去,并创建一个YUM源。
6、利用YUM源进行gcc软件的安装。
1.思考题(由老师在上机前出好题目,学生通过实验后再回答)

磁盘管理空间实验报告

磁盘管理空间实验报告

一、实验目的本次实验旨在让学生了解磁盘管理的基本概念和操作,掌握磁盘分区、格式化、挂载等基本技能,熟悉磁盘空间分配策略和优化方法,提高学生对磁盘管理的实际操作能力。

二、实验环境操作系统:Linux Ubuntu 20.04硬件环境:虚拟机,CPU:2.5GHz,内存:4GB,硬盘:100GB三、实验内容1. 磁盘分区(1)查看磁盘分区信息使用`fdisk -l`命令查看当前磁盘的分区信息。

(2)创建新分区使用`fdisk /dev/sdb`命令进入磁盘分区编辑模式,创建新分区。

(3)格式化分区使用`mkfs.ext4 /dev/sdb1`命令将新分区格式化为ext4文件系统。

2. 磁盘挂载(1)创建挂载点使用`mkdir /mnt/sdb1`命令创建挂载点。

(2)挂载分区使用`mount /dev/sdb1 /mnt/sdb1`命令将分区挂载到挂载点。

3. 磁盘空间分配策略(1)查看磁盘空间使用情况使用`df -h`命令查看磁盘空间使用情况。

(2)优化磁盘空间分配使用`du -sh `命令查看目录大小,删除不必要的文件。

4. 磁盘碎片整理(1)查看磁盘碎片情况使用`e2fsck -f /dev/sdb1`命令检查磁盘碎片情况。

(2)整理磁盘碎片使用`e2fsck -f /dev/sdb1`命令整理磁盘碎片。

四、实验步骤1. 查看磁盘分区信息执行`fdisk -l`命令,查看当前磁盘的分区信息。

2. 创建新分区执行`fdisk /dev/sdb`命令,进入磁盘分区编辑模式。

(1)输入`n`创建新分区。

(2)选择分区类型(主分区或扩展分区)。

(3)选择分区编号。

(4)设置分区起始扇区。

(5)设置分区结束扇区。

3. 格式化分区执行`mkfs.ext4 /dev/sdb1`命令,将新分区格式化为ext4文件系统。

4. 创建挂载点执行`mkdir /mnt/sdb1`命令,创建挂载点。

5. 挂载分区执行`mount /dev/sdb1 /mnt/sdb1`命令,将分区挂载到挂载点。

磁盘管理分区实验报告

磁盘管理分区实验报告

一、实验目的本次实验旨在掌握Linux系统中磁盘管理的相关操作,包括磁盘分区的创建、格式化、挂载以及分区信息的查看等。

通过实验,加深对磁盘分区概念的理解,并能够熟练运用相关命令进行磁盘管理。

二、实验环境操作系统:Ubuntu 20.04 LTS硬件设备:虚拟机(至少1GB内存,10GB硬盘空间)软件工具:Linux命令行终端三、实验内容1. 磁盘分区(1)查看现有磁盘信息使用`lsblk`命令查看系统中现有的磁盘和分区信息。

```bashlsblk```(2)创建分区使用`fdisk`命令创建新的分区。

以下示例中,我们将对/dev/sdb磁盘进行分区。

```bashsudo fdisk /dev/sdb```在`fdisk`命令的交互式界面中,按照以下步骤操作:- 输入`n`创建新的分区。

- 输入`p`创建主分区。

- 按提示输入分区号(例如1)。

- 按提示输入起始扇区,默认回车即可。

- 按提示输入结束扇区,默认回车即可。

- 输入`w`保存并退出`fdisk`。

(3)查看分区信息再次使用`lsblk`命令查看分区信息,确认新创建的分区。

2. 格式化分区(1)使用`mkfs`命令格式化分区。

以下示例中,我们将格式化新创建的分区/dev/sdb1。

```bashsudo mkfs.ext4 /dev/sdb1```(2)确认格式化结果使用`lsblk`命令查看分区信息,确认分区已格式化。

3. 挂载分区(1)创建挂载点在`/mnt`目录下创建一个挂载点,用于挂载新创建的分区。

```bashsudo mkdir /mnt/new_disk```(2)挂载分区使用`mount`命令将新创建的分区挂载到挂载点。

```bashsudo mount /dev/sdb1 /mnt/new_disk```(3)查看挂载信息使用`df -h`命令查看挂载信息,确认分区已挂载。

4. 卸载分区使用`umount`命令卸载已挂载的分区。

Linux命令高级技巧使用fdisk进行磁盘分区管理

Linux命令高级技巧使用fdisk进行磁盘分区管理

Linux命令高级技巧使用fdisk进行磁盘分区管理磁盘分区是在计算机硬盘上划分出一定大小的逻辑分区,以便存储和管理文件。

在Linux系统中,fdisk是一个常用的命令行工具,用于对硬盘进行分区管理。

本文将介绍如何使用fdisk进行磁盘分区管理的高级技巧。

一、进入fdisk工具要使用fdisk工具进行磁盘分区管理,首先需要进入fdisk工具。

在终端中输入以下命令:```sudo fdisk /dev/sdX```其中,sdX表示要进行分区管理的磁盘名称。

需要根据实际情况替换为正确的磁盘名称,如sda、sdb等。

二、基本操作命令在进入fdisk工具后,可以使用一系列命令来对磁盘进行分区管理。

下面是一些常用的基本操作命令:1. p:打印出当前磁盘的分区表信息;2. n:创建一个新分区;3. d:删除一个分区;4. t:修改分区的类型;5. w:将分区表写入磁盘并退出fdisk。

三、创建新分区创建新分区是在磁盘上划分出一块未被使用的空间,并将其用于存储文件。

使用n命令可以创建新分区。

具体操作步骤如下:1. 输入n命令后,选择要创建分区的类型,可以选择主分区(Primary)或扩展分区(Extended);2. 确定分区的起始位置和结束位置;3. 确定分区的大小。

四、删除分区删除分区是指将磁盘上的某个分区删除,并释放相应的空间。

使用d命令可以删除分区。

具体操作步骤如下:1. 输入d命令后,选择要删除的分区的编号;2. 确认删除操作。

五、修改分区类型修改分区类型是用于更改某个分区的类型。

使用t命令可以修改分区类型。

具体操作步骤如下:1. 输入t命令后,选择要修改的分区的编号;2. 选择要修改的分区类型。

六、写入分区表在对磁盘进行分区管理操作后,需要使用w命令将分区表写入磁盘并退出fdisk工具。

具体操作步骤如下:1. 输入w命令,确认将分区表写入磁盘。

需要注意的是,写入分区表后将无法撤销分区操作,请确保在执行w命令之前已经保存了必要的数据。

实验四Linux系统的磁盘管理..

实验四Linux系统的磁盘管理..
-o 常用的选项有codepage,iocharset(对于中文来说codepage=936,
iocharset=gb2312) - o loop 挂载ISO文件时用
例:mount -o iocharset=cp936 /dev/sda1 /mnt/usb (以保证 正常显示中文字符)
1.文件系统加载
2.磁盘管理基本命令
1. dd命令
功能:
从标准输入、文件或设备读取数据,依照指定的格式来转换数据, 再输出 至文件、设备或标准输出。
命令的格式:
dd [OPTION]...
实用例子:
把一张软盘的内容拷贝到另一张软盘上,利用/tmp/tmpfile作为临时存储文 件 1.把源盘插入驱动器中: $ dd if=/dev/fd0 of=/tmp/tmpfile 2.将源盘从驱动器中取出,把目标盘插入: $ dd if=/tmp/tmpfile of=/dev/fd0 3.软盘拷贝完成后,应该将临时文件删除: $ rm /tmp/tmpfile
-s -a
对每个FILE参数只给出占用的数据块总数。 递归地显示指定目录中各文件及子孙目录中各文件占用的数据块数。 若既不指定-s,也不指定-a,则只显示FILE中的每一个目录及其中 的各子目录所占的磁盘块数。 以字节为单位列出磁盘空间使用情况(系统缺省以k字节为单位)。 以1024字节为单位列出磁盘空间使用情况。 最后再加上一个总计(系统缺省设置)。 计算所有的文件大小,对硬链接文件,则计算多次。 跳过在不同文件系统上的目录不予统计。
1.文件系统加载
mount命令的格式
在一般情况下,本节的命令需要您有root身份才能执行。
mount命令可以加载文件系统到指定的挂接点。
mount [-t vfstype] [-o optoins] device dir

linux系统磁盘管理(磁盘阵列)

linux系统磁盘管理(磁盘阵列)

linux系统磁盘管理(磁盘阵列)1、磁盘阵列简介RAID(Redundant Array of Independent Disks)即独⽴硬盘冗余阵列,简称磁盘阵列。

磁盘阵列是由很多价格较便宜的磁盘,以硬件(RAID卡)或软件(MDADM)形式组合成⼀个容量巨⼤的磁盘组,利⽤多个磁盘组合在⼀起,提升整个磁盘系统效能。

利⽤这项技术,将数据切割成许多区段,分别存放在各个硬盘上。

其中RAID卡有⾃⼰的cpu,由它统⼀管理和控制;数据也由它来进⾏分配和维护,处理速度快。

服务器启动时,就会有显⽰进⼊配置Riad的提⽰。

RAID⽐单硬盘有以下⼀个或多个⽅⾯的好处:增强数据集成度,增强容错功能,增加处理量或容量,磁盘阵列对于电脑来说,看起来就像⼀个单独的硬盘或逻辑存储单元。

2、RAID 分类RAID有很多种类型本章只举4例供⼤家了解RAID技术!RAID类型说明最低磁盘个数空间利⽤率各⾃的优缺点RAID0条带卷2+100%读写速度快,不容错RAID1镜像卷250%读写速度⼀般,容错RAID5带奇偶校验的条带卷3+(n-1)/n读写速度快,容错,允许坏⼀块盘RAID10RAID1的镜像+RAID0的条带450%读写速度快,容错RAID 中主要有三个关键概念和技术:镜像( Mirroring )、数据条带( Data Stripping )和数据校验( Data parity )①RAID0RAID0是最早出现的RAID模式;应⽤条数据条带( Data Stripping )技术,将数据分⽚保存2+个磁盘(最好磁盘的⼤⼩相同)上,多个数据分⽚共同组成⼀个完整数据副本,数据条带具有更⾼的并发粒度,当访问数据时,可以同时对位于不同磁盘上数据进⾏读写操作,从⽽获得⾮常可观的 I/O 性能提升;是组建磁盘阵列中最简单的⼀种形式,只需要2块以上的硬盘即可;成本低,可以提⾼整个磁盘的性能;磁盘利⽤率为100%,但是,RAID 0没有提供冗余或错误修复能⼒,任何⼀个磁盘的损坏将损坏全部数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录摘要 (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. 实验目的磁盘格式化时,系统把磁盘存储空间分成许多磁道。

每个磁道又分成若干个扇区(又叫做块)。

这些空间就是用来存放用户文件的。

当用户的文件不再需要时,就应该删除。

把一个文件存放到磁盘上时,可以组织成连续文件,链接文件,索引文件等。

因此,磁盘空间的分配方法也有两种,一种是连续空间的分配;一种是不连续空间的分配(又叫动态分配)。

如何充分有效的利用磁盘空间,是操作系统应解决的重要课题之一。

通过本实验,使学生对磁盘空间的分配与回收有一个较深入的理解。

2. 设计思想位示图法:一个简单的管理方法是用一张位示图(简称位图)来指示磁盘存储空间的使用情况。

一个盘组的分块确定后,根据分配的总块数决定位图由多少个字组成,位图中的每一位与盘组分块一一对应。

位示图是一张可以反映磁盘空间是否被占有的模拟图,用一个二维数组表示磁盘的空间,数组内每一个元素表示磁盘内相应的分块,数组元素为“1”表示该块已被占,“0”表示该块为空。

数组元素位置与磁盘分块一一对应,即可描述出磁盘空间的利用情况。

成组链接法:首先定义磁盘分配数组并初始化,9个一维数组分别表示9个空闲块,程序运行时,先将专用块A〔0〕复制到内存中,然后进行功能选择,分配时,查MA,从中找出空闲块号,当一组的空闲块只剩第一块时,应把该块中指出的下一组的空闲块数和块号复制到专用块这,然后把该块分配给申请者,当一组的空闲块分配完后则把专用块内容(下一组链接情况)复制到内存,再为申请者分配。

回收时,输入待回收的块号,查找该块是否已被分配,若未分配,退出,否则,当前组不满规定块数时,将归还块登记入该组,若当前组已满,则另建一新组,这时归还块作为新一组的第一块,应把内存中登记的一组链接情况MA复制到归还块中,然后在MA这重新登记一个新组。

显示分组情况。

系统初始化时先将专用块内容读入内存,当有申请空闲块要求时,就直接在内存专用块中找到哪些块是空闲的,每分配一块后把空闲块数减1。

但要把一组中第一块分配出去之前,可以先把登记在该块中的下一组的块号保存在专用块中(此时,原专用块中的信息巳经无用了,因它指示的一组空闲块都已分配掉)。

当中文组空闲块分配完后,则将下一组内容读入内存专用块中,以便继续分配时查找。

3. 实验结构图4. 各模块的伪码算法1)对位示图法申请磁盘块查看位示图找位号等是否找到是:由字位号计算相对块号和柱面号,磁道号,物理记录号,并输出这些相应参数否:返回,磁盘已满,本次无法分配置位示图相应位为1 返回定义分配函数:void assign(){unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;for(i=0 ,k=0;i<5;i++){q=size[i] ;j=0;while(1){j++ ;if((q%2)==0){ if(j==1) size[i]+=1;else{for(m=1;m<j;m++)s*=2 ;size[i]+=s;}k=1;break ;/*完成后退出*/}q=q/2;}if(k==1) /*将找到的位示图位转换成物理地址*/{ if((j-1)/8==1){zhm=2*i+1;cid=(j-9)/4;sq=(j-9)%4;}else{zhm=2*i;cid=(j-1)/4;sq=(j-1)%4;}n=1;break;/*退出for循环*/}}if(n==0)printf("没有空间可分配!\n");else{printf("分配成功!\n");/*输出物理地址*/printf("柱面号为: %d\n",zhm);printf("磁道号为: %d\n",cid);printf("扇区号为: %d\n",sq);}printf("分配后的位示图为:\n");out();}定义回收函数:void callback()/*回收函数*/{ unsigned int i,j,s=1,q,m,sq,zhm,cid;printf("确定要回收块的柱面号、磁道号、扇区号:\n");printf("请输入柱面号:");scanf("%d",&zhm);printf("\n请输入磁道号:");scanf("%d",&cid);printf("\n请输入扇区号:");scanf("%d",&sq);if(zhm%2==0)/*计算对应的位示图位置*/{ i=zhm/2;j=cid*4+sq+1;}else{ i=(zhm-1)/2;j=cid*4+sq+9;}q=size[i];m=j-1;while(m){q=q/2;m--;}if(q%2==1)/*判断该块是否被分配*/{if(j==1)size[i]-=1;/*将位示图对应为置零*/else{for(m=1;m<j;m++)s*=2 ;size[i]-=s;}printf("回收成功!");printf("回收后的位示图为:\n");out();}elseprintf("该块以被分配!");}2)对成组链接法void assign(){int s,i;if(MA[0]>1) /*若该组不止一个空闲块*/ { i=MA[0];s=MA[i];MA[0]--;printf("\nnumber of the block:%d",s);}else if(MA[0]==1) /*只剩一个空闲块*/ {if(MA[1]!=0) /*还有其它空闲块组*/ { s=MA[1];for(i=0;i<=3;i++)A[0][i]=A[s][i];MA[0]--;printf("\nnumber of the block:%d",s);}else /*没有其它空闲块组*/{ printf("\nThere isn't any space");return;}}else /*当前组已分配完*/{for(i=0;i<=3;i++)MA[i]=A[0][i];assign();}display(); /*显示分组情况*/}void callback(){ int i,j,temp;printf("\ninput the No. of the block you want to callback:");scanf("%d",&j);getchar(); /*得到待回收的空闲块号*/for(temp=1;temp<=No;temp++){ if(mark[temp]==j)break;}if(temp<No+1) /*若该空闲块已在,退出*/{ printf("\nThe block is in the disk");return;}if(MA[0]<3) /*当前组不满3块*/{ i=MA[0];MA[i+1]=j;MA[0]++;}else /*已有3块*/{for(i=0;i<=3;i++)A[j][i]=MA[i];MA[0]=1;MA[1]=j;}display(); /*显示*/}5. 测试分析用位示图表示的磁盘空间可以很形象的反映出磁盘中空间的利用情况,不足之处在于每次分配与回收只可以对单一的分块进行操作,不能同时进行几个块的分配与回收,要进行多个块的分配时,只能单独分配,且块之间没有相互链接,对于大的空间分配只能在连续空间进行。

用成组链接法模拟的磁盘空间能够解决用位示图中存在的问题,它可以通过链表的形式存取信息,对于较大的空间分配,若一个磁盘空间不够,通过指针找到下一个空闲的分区,但操作过程比较复杂,没有位示图方便,简捷。

6. 测试结果1)位示图法✧编译及连接时界面:✧刚运行时界面:✧分配空间时界面:✧回收空间时界面:2)成组链接法分配空间时界面:回收空间时界面:7. 源程序位示图法:#include<stdio.h>unsigned int size[5]={1,1,1,1,1};/*保存位示图*/void out()/*输出位示图函数*/{ unsigned int i,j,m;for(j=0;j<5;j++)/*循环输出size的各个数的各个二进制位*/{m=size[j];for(i=0;i<16;i++) /**/{printf("%d ",m%2);m=m/2;if(i==7)printf("\n");}printf("\n");}}void callback()/*回收函数*/{ unsigned int i,j,s=1,q,m,sq,zhm,cid;printf("确定要回收块的柱面号、磁道号、扇区号:\n");printf("请输入柱面号:");scanf("%d",&zhm);printf("\n请输入磁道号:");scanf("%d",&cid);printf("\n请输入扇区号:");scanf("%d",&sq);if(zhm%2==0)/*计算对应的位示图位置*/{ i=zhm/2;j=cid*4+sq+1;}else{ i=(zhm-1)/2;j=cid*4+sq+9;}q=size[i];m=j-1;while(m){q=q/2;m--;}if(q%2==1)/*判断该块是否被分配*/{if(j==1)size[i]-=1;/*将位示图对应为置零*/else{for(m=1;m<j;m++)s*=2 ;size[i]-=s;}printf("回收成功!");printf("回收后的位示图为:\n");out();}elseprintf("该块以被分配!");}void assign(){unsigned int n=0,i,s=1,j,k,q,m,sq,zhm,cid;for(i=0 ,k=0;i<5;i++){q=size[i] ;j=0;while(1){j++ ;if((q%2)==0){ if(j==1) size[i]+=1;else{for(m=1;m<j;m++)s*=2 ;size[i]+=s;}k=1;break ; /*完成后退出*/}q=q/2;}if(k==1) /*将找到的位示图位转换成物理地址*/{ if((j-1)/8==1){zhm=2*i+1;cid=(j-9)/4;sq=(j-9)%4;}else{zhm=2*i;cid=(j-1)/4;sq=(j-1)%4;}n=1;break;/*退出for循环*/}}if(n==0)printf("没有空间可分配!\n");else{printf("分配成功!\n");/*输出物理地址*/printf("柱面号为: %d\n",zhm);printf("磁道号为: %d\n",cid);printf("扇区号为: %d\n",sq);}printf("分配后的位示图为:\n");out();}void menu() /*功能选择函数*/ { int choice;char judge;printf("\n请选择操作:(1--分配,2--回收):");scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();elseprintf("\n没有此项!");printf("\n继续还是退出?(y--继续,n--退出):");scanf("%c",&judge);getchar();if(judge=='y')menu();else{ printf("\n现在的位示图:\n");out();printf("\n按任意键退出!\n");getchar();}}main(){printf("\t\t————欢迎进入磁盘空间管理模拟实验————\n");printf( " \n");printf("★★★★08级计算机一08240128 李彦博★★★★\n");printf("﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌\n");out();menu();}成组链接法:#include<stdio.h>int MA[4]; /*空闲块数组*/intA[9][4]={{3,1,2,3},{3,4,5,6},{0,0,0,0},{0,0,0,0},{3,0,7,8},{0,0,0,0},{0,0,0,0} ,{0,0,0,0},{ 0,0,0,0}}; /*磁盘空间*/int mark[9]; /*存放已分配的块*/int No=0; /*已分配的块数*/void display1(){int i,j,temp,count;No=0;if(MA[1]!=0){i=MA[0];printf("\ngroup1:");for(j=1;j<=i;j++){ printf("%d ",MA[j]);mark[++No]=MA[j];}temp=MA[1];count=2;while(A[temp][1]!=0){ printf("\ngroup%d:",count);i=A[temp][0];for(j=1;j<=i;j++){printf("%d ",A[temp][j]);mark[++No]=A[temp][j];}count++;temp=A[temp][1];}printf("\ngroup%d:",count);i=A[temp][0];for(j=2;j<=i+1;j++)if(A[temp][j]>0){printf("%d ",A[temp][j]);mark[++No]=A[temp][j];}}else{i=MA[0];if(i==1)printf("\nThe blocks are all assigned");else{printf("\ngroup1:");for(j=2;j<=i;j++){printf("%d ",MA[j]);mark[++No]=MA[j];}}}}void display() /*显示分组情况*/{ int i,j;if(MA[0]!=0)display1();else{i=MA[1];for(j=0;j<=3;j++)MA[j]=A[i][j];display1();}}void assign() /*分配空闲块*/{int s,i;if(MA[0]>1) /*若该组不止一个空闲块*/ { i=MA[0];s=MA[i];MA[0]--;printf("\nnumber of the block:%d",s);}else if(MA[0]==1) /*只剩一个空闲块*/ {if(MA[1]!=0) /*还有其它空闲块组*/ { s=MA[1];for(i=0;i<=3;i++)A[0][i]=A[s][i];MA[0]--;printf("\nnumber of the block:%d",s);}else /*没有其它空闲块组*/{ printf("\nThere isn't any space");return;}}else /*当前组已分配完*/{for(i=0;i<=3;i++)MA[i]=A[0][i];assign();}display(); /*显示分组情况*/}void callback() /*回收空闲块*/{ int i,j,temp;printf("\ninput the No. of the block you want to callback:");scanf("%d",&j);getchar(); /*得到待回收的空闲块号*/for(temp=1;temp<=No;temp++){ if(mark[temp]==j)break;}if(temp<No+1) /*若该空闲块已在,退出*/{ printf("\nThe block is in the disk");return;}if(MA[0]<3) /*当前组不满3块*/{ i=MA[0];MA[i+1]=j;MA[0]++;}else /*已有3块*/{for(i=0;i<=3;i++)A[j][i]=MA[i];MA[0]=1;MA[1]=j;}display(); /*显示*/}void menu() /*功能选择函数*/{ int choice;char judge;printf("\n做出选择:(1--分配,2--回收):");scanf("%d",&choice);getchar();if(choice==1)assign();else if(choice==2)callback();elseprintf("\n错误请求!");printf("\ncontinue or not (y--Yes,n--Not):");scanf("%c",&judge);getchar();if(judge=='y')menu();else{ printf("\nNow the graph is:");display();printf("\npress any key to quit");}}main(){ int i;for(i=0;i<=3;i++)MA[i]=A[0][i];display();menu();}总结经过本次课程设计,完成题目“磁盘空间管理模拟实验”,熟悉了UNIX/LINUX 的常用基本命令,理解并掌握了UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

相关文档
最新文档