硬盘分区操作实验报告

2023-05-01

报告是日常生活与学习的常见记录方式,报告有着明确的格式。在实际工作中,我们怎么样正确编写报告呢?以下是小编整理的关于《硬盘分区操作实验报告》,供大家阅读,更多内容可以运用本站顶部的搜索功能。

第一篇:硬盘分区操作实验报告

操作系统实验报告-可变分区存储管理方式的内存分配回收

实验三 可变分区存储管理方式的内存分配回收

一.实验目的

(1)深入了解可变分区存储管理方式的内存分配回收的实现。

二.实验内容

编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。

三.实验原理

在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。

四.实验部分源程序

#include using namespace std; typedef struct SNode { // Space Node

int start,end; // 起始,结束

int length; // 长度大小

struct SNode *next; // 指向下一结点的指针 }* SP; SP Head=(SP)malloc(sizeof(SNode)); // 全局变量,内存空间头结 void DispSpace() { // 显示内存空间分配情况

SP p=Head->next;

cout<<" 空闲区说明表 "

<<"---地址--长度--- ";

while (p)

{

cout<<"

"

<<"

"

p=p->next;

}

cout<<"---------------- "; }

void Initial() { // 初始化说明表

SP p,q;

p=(SP)malloc(sizeof(SNode));

q=(SP)malloc(sizeof(SNode));

p->start=14; p->length=12; p->end=26;

q->start=32; q->length=96; q->end=128; // 指导书上的作业分配

Head->next=p; // 与头结点连接

p->next=q;

q->next=NULL;

DispSpace(); }

void Allocation(int len) { // 分配内存给新作业

SP p=Head->next,q;

while (p) {

if (p->length < len)

p=p->next;

else if (p->length > len)

{

p->start=p->start+len;

p->length=p->length-len;

cout<<"分配成功! ";

DispSpace(); return;

}

else

{//当两者长度相等

q=p->next;

p->next=q->next;

cout<<"分配成功! ";

DispSpace(); return;

}

}

cout<<"分配失败! ";

DispSpace(); return; }

void CallBack(int sta,int len) { // 回收内存

SP p=Head,q=p->next,r; // 开始地址和长度

p->end=0;

int en=sta+len;

while (q) {

if (sta == 0) { // 初始地址为0

if (en == q->start) { // 正好回收

q->start=0;

q->length=q->end;

return;

}

else {

r=(SP)malloc(sizeof(SNode));

r->start=sta; r->length=len; r->end=en;

p->next=r;

r->next=q;

return;

}

}

else if ((p->end < sta) && (q->start > en)) { // 上邻区

r=(SP)malloc(sizeof(SNode));

r->start=sta; r->length=len; r->end=en;

p->next=r;

r->next=q;

return;

}

else if ((p->end < sta) && (q->start == en)) { // 邻区相接

q->start=sta;

q->length=q->end-sta;

return;

}

else if ((p->end == sta) && (q->start < en)) { // 下邻区

p->end=en;

p->length=en-p->start;

return;

}

else if (p->end==sta && q->start==en) { // 邻区相接

p->end=q->end;

p->length=p->end-p->start;

p->next=q->next;

return;

}

else {

p=p->next;

q=q->next;

}

} } void main() {

Initial();

cout<<"现在分配大小为 6K 的作业 4 申请装入主存: ";

Allocation(6); // 分配时参数只有长度

//--------指导书测试数据演示----------

cout<<"现回收作业 3 (起址10,长度4) ";

CallBack(10,4);

DispSpace();

cout<<"现回收作业 2 (起址26,长度6) ";

CallBack(26,6);

DispSpace();

//---------------演示结束-------------

system("pause"); }

五.实验结果与体会

我的体会:

第二篇:组装维护快速入门(三)--硬盘的分区和格式化

第三课 硬盘的分区和格式化

一、学时分配

4学时。

二、学习目的

(1)了解硬盘分区、格式化的作用。

(2)掌握PartitionMagic和DiskMan软件的功能和使用方法。

三、学习内容

(1)介绍PartitionMagic和DiskMan软件的功能和使用方法

(2)利用PartitionMagic软件对硬盘进行分区、格式化等多种操作

四、学习器材

组装完毕的计算机一台、工作台、电源、Ghost XP系统安装工具盘一张(内有PQ软件)

五、实验室具体试验内容

1、介绍PartitionMagic和DiskMan软件的功能和使用方法

PartitionMagic简称PM,主要功能有:创建分区、格式化分区、格式转换、重新分配自由空间(调整分区容量)、合并分区等。

DiskMan简称DM,主要功能有:创建分区、格式化分区、修复分区表等。

2、利用PartitionMagic软件对硬盘进行多种操作

(一)删除硬盘的分区,将硬盘恢复成一张未分区的空白盘。

(二)创建分区:要求创建主分区一个10GB(要求激活),逻辑分区两个容量分别为10GB、剩余容量给最后的分区。(此步骤另用DM练习)

(三)对分区进行格式化,要求分区格式均为FAT32格式。

(四)调整最后一个分区的容量(调整出一部分自由空间),尽量将其等分成两部分。

(五)将划分出的容量(调整出的那部分自由空间),再建一个分区,要求分区为

FAT32格式。

(六)合并最后的两个分区。

(七)将所有分区的格式转换成NTFS格式。

第 1 页 共 1 页

第三篇:数据无价 硬盘数据恢复 一步一步用Winhex手动修复分区表以提取数据

一、初步应用——双分区恢复实例及分析

(一)、现场重现:

提示,切勿随意使用自己的硬盘进行试验,切记试验前保存重要数据。对于移动硬盘,损坏往往发生于硬盘传输数据中断电。现在我将一个有问题的移动硬盘接到电脑上,在“计算机管理”-->“磁盘工具”中我们可以看到这个未被初始化的磁盘显示为黑色(打开磁盘工具时它会提示你要初始化,不理它,点“取消”) ,在“计算机”中也找不到这个磁盘。

对于新手,往往是这样几个表情吧其实俺也是这么过来滴~争取这篇文章之后让大家的表情都变成这样

(二)、手动修复:

(阅读有困难的朋友可以先读完第三节再回过头来看这一节,本节的另一个作用是让新手对Winhex界面有一个初步了解)

1、打开Winhex-->菜单栏-->选择“工具”-->打开磁盘(F9)-->选择要修复的硬盘,这里是HD2。

2、打开之后图中显示从0000H-->01ffH(16进制)之间的数据全部为0。

现在我从一个运转良好的硬盘分区表中将0000H-->01bdH之间的数据复制并粘贴到损坏硬盘的相应位置。 操作步骤为:在良好硬盘中拉选0000-->01bd之间的区块,被选中区块呈亮蓝色; 复制选块;

接下来在损坏硬盘中拉选相应区域,将光标定位至0000;右键-->编辑-->粘贴板数据-->写入。将01fe,01ff填写为55AA,到这里一定保存。

点击黄色区域的图标并转移至63号扇区 菜单“视图”-->模板管理(Alt+F12)-->NTFS引导扇区 。

打开如下图 ,并记录黄色方框内的两个数值(63和63777986)

63+63777986+1=63778050,跳转至63778050扇区 。

稍微向下滚动一点,看到那个粉色框标识出的55AA了嘛?往前找到黄色框内的部分,显示为3F 00 00 00,将其进行反向排列,变为 00 00 00 3F于是3F(十六进制)=63(十进制)——我们称这个数为相对偏移量。

接下来跳转至63778050+63=63778113扇区,我们又发现了一个EB开头的扇区

再次选择菜单“视图”-->模板管理(Alt+F12)-->主引导记录NTFS引导扇区。打开如下图 ,同样记录一下黄色方框中的数值(63和92518271)

跳转至0扇区。菜单“视图”-->模板管理(Alt+F12)-->主引导记录,

打开如下图。填上如图所示的几个数据 :

至于为什么是这些数据,下节会提到。填写完之后千万别忘了保存哦~ 好了,在设备管理器里禁用损坏硬盘再启用。再从磁盘管理里看看结果 ,嗯,一切复原

看,数据都在。

过程看上去有些复杂,其实熟练的话可以控制在5分钟之内,所以它并不难~下面就看看我做了些什么,以及那些数据是怎么来的,做什么用的。

(三)、我做了什么?其实只有3步

上面所做的其实就是修复了硬盘的MBR(主引导分区记录),为什么MBR对于硬盘如此重要呢?看过我前面文章的朋友应该知道分区表就是硬盘的名单:作为一个名单当然不是姓名的简单堆砌,名单也是有分类的,比如哪些人是管理员,哪些人是学生等等~请先看一下刚才修复好的硬盘的MBR全图 (注意其中用亮蓝色、黄色、绿色将512字节的分区表分为了三个部分)

硬盘的MBR在启动时大约是起到下面的一个作用:

可见作为一个MBR,必须要有以下的三个部分:446字节的启动描述;64字节的分区描述(包括分区格式、分区大小等参数);以及最后的55AA结束表示。于是,只要我们能按照一定格式和规律填写这些项目,我们就能自己制作分区表了。对于恢复分区表,我们要做的就是下面的流程:

不难发现,这其中前面的446字节的引导文件和最后添加的“55AA”标识都是ctrl+c然后ctrl+v 的事情,因此修复分区表的关键在于那64个字节的参数是如何寻找及填写的——好在我们利用Winhex自身提供的模板,再加上一点简单的加法运算,就能非常轻松地获得这些参数。如下图,其实需要填写的参数不过8个,而且都非常有规律性:(该图很重要,它显示了那些参数是如何得来的)

上文的(3)(4)两步正是我在计算参数所在的位置,而一旦我定位准确,就调用对应的模板去查看参数,随后在(5)里填写参数(别忘了NTFS+1的问题)

至于第一行活动分区:80表示可以从这个分区启动,00表示不从这个分区启动(这个参数决定电脑能否从该分区引导,和446字节不同,如果没有那个446字节,硬盘都无法识别了)。一般装有系统的主分区需要填写80,其他的00即可。而硬盘参数这一栏:Fat32的代码是0B,NTFS是07,扩展分区是0F~~这些边边角角都很简单,这里就不多说了~至此,分区表修复工作大功告成~~

(四)、小结

恢复原理:硬盘上的文件是链式的,可以顺藤摸瓜。此外,硬盘损坏的往往是MBR,后面各分区的虚拟MBR都完好无损,可以通过计算后面各分区的参数,逆向推出MBR的参数,从而实现硬盘的修复。

大致步骤:填写446字节引导文件-->填写64字节分区参数-->55AA结束标志-->别忘保存

所需参数:活动分区与否(80);分区类型参数(0B, 07, 0F等);各扇区大小——共计8个参数,其他参数不知道如何填写就留空。

所需时间:非常熟练的话,5分钟。

风险:因为只是对MBR这512个字节进行操作,所以即使失败,大不了重来,对硬盘上其他数据没有任何损害。建议将这512字节另存为一个文件,以后遇到MBR损坏的事件只要把备份COPY回去就是了~

二、分区表修复进阶——多分区的计算

(一)、一主分区,三逻辑分区情况下的计算

前面提到过硬盘上的分区结构是链式的,又由于MBR之后的各分区表往往保存完好,就可以利用后面的各分区MBR来逆向推导MBR的参数~请看下面的分区链式图:

在双分区的实例中,填写的参数可表示为:C盘占用扇区+D盘之前的扇区+D盘占用扇区。由于多个逻辑分区的总和算一个扩展分区(不知道什么是扩展分区和逻辑分区的可以看看我前面的那篇文章),于是多分区的参数无非是:C盘占用扇区+扩展分区前的扇区+(逻辑分区D+逻辑分区E+……),总体来讲还是3大块。

由于分区软件的不同,分区前的保留扇区可能有所不同~比如下图的这块硬盘,采用了diskpart进行分区,分区前的保留扇区达到了2048个而不是常见的63个。

记录C盘占用的扇区数为79871999。由于这是在NTFS模板中查看的信息,所以在做跳转时需要+1,即跳转到2048+79871999+1=79874048扇区。

由于这是一个“虚拟MBR”,它仍然拥有部分MBR特征,所以我们可以调用“主分区引导模板”来查看这个分区的信息。可以看到这里的分区信息有两项,相对于上一个实例多了一个“05”分区表示标识,不过这个05标识我们先不用管它。直接看第一项的两个参数为20

48、167772160。

接下来跳转至79874048+2048+167772160=247648256扇区(由于这是在“主引导记录”模板里查看的,所以不需要+1),并调用“主引导扇区”模板查看E盘的信息。

记录两个数值为20

48、167772160,注意这个分区仍然有“05”标识。向下跳转到247648256+2048+167772160=415422464扇区。

到这里,分区信息当中只有一项而没有“05”标识,于是可判定这就是整个扩展分区中的最后一个分区。记录其信息20

48、209715200。

如果觉得混乱,不妨列出下面这样一个表:

由上面的数据不难算出扩展分区的总扇区数为:(2048+167772160)+(2048+167772160)+(2048+209715200)=545265664。C盘主分区的参数为:保留分区2048,C盘本身占用79872000,于是扩展分区之前的总分区数为2048+79872000=79874048。最后需要填写的参数:

注意这个硬盘装有系统,于是第一分区表项填为80,分区格式代码为07(NTFS);第二分区不作为引导区,为00,由于是扩展分区,分区格式代码为0F(扩展分区)。其他参数上面皆已算出,直接填入即可。此外由于现在硬盘容量很大,原来的“开始头、扇区、柱面”这几个参数已经不足以表达如此大的数字,所以如果不知道这几个数字如何填写就放在那不去管它,默认为00。

另一方面,本例不同于前例。前例由于制图需要,是挨个通过MBR或虚拟MBR寻找NTFS引导扇区的位置并调用NTFS模板查看分区信息;而本例中除了在第一分区调用了NTFS模板以寻找扩展分区起始位置以外,其他的分区只在虚拟MBR中调用了“主引导记录”模板。熟练之后可以多采用后面一种方式以节省时间。

(二)、 “05”标识是怎么回事?

由于虚拟MBR一般不会被破坏,所以多分区计算中,我们不去管那个“05”标识也可以完成参数的计算。不过考虑到喜欢刨根问底的一部分朋友的需要,这里补充一个小节用于讲解MBR或虚拟MBR中分区参数的精细结构。

首先要更正一下虚拟MBR的说法:为了能在硬盘上分出多于4个分区,我们引入了扩展分区的概念,N个扩展分区的分区表的信息组合起来成为MBR中的扩展分区项。这种特殊的分区表结构在本节中将不再被称为“虚拟MBR”,而采用EBR(Extended Boot Record也称作扩展MBR)进行代替。

以上面320G硬盘的分区表为例,该硬盘中存在一个主分区和一个扩展分区,而这个扩展分区下面包含三个逻辑分区。而仅从MBR来看,其中仅包含了C盘的信息和整个扩展分区的信息,那么,电脑如何判断扩展分区里的每个逻辑分区有多大?每个逻辑分区各处于扩展分区的什么位置?很显然,仅凭整体的扩展分区信息不能回答上述问题,所以EBR担负着两个任务:一是描述该分区本身的大小、格式、保留空间等信息(这一点和MBR很类似);二是,在扩展分区内部“划清界限”,即描述自身和其他逻辑分区的位置关系。前者的代码采用对 应的分区格式代码(如0B, 07等,但是没有0F,0F是“整体扩展分区”的参数,不是逻辑盘的参数);后者采用“05”这个特殊标识用以“表明身份”。

如果用图示来表示“05”标识的作用,基本上就是下面这个样子:

可以推断,如果还有G盘的话,那么F盘的05标识项就是:前者表示D+E+F盘大小,后者表示G盘大小,而G盘就没有05标识了。至此,逻辑分区在扩展分区内的定位问题得到完美解决。

最后补充一张图用以说明16个字节的分区参数含义(64字节表示4个分区,故每个分区占用16个字节)

(三)、小结

在修复过程中建议利用表格使分区链表变得清晰。

主引导记录 模板中的分区不需要加减,从NTFS模板移动至 主引导记录 中需要+1。

05标识用于扩展分区内部的逻辑分区的定位。

起始磁盘头等信息现在基本停用。占用扇区数最多为FF FF FF FF,每个扇区占用512个字节,计算下来每个分区最大容量为2047G。如果某日硬盘的分区容量大于这个值,那么分区表的计算方式将改写,比如可能把保留分区的4字节让一个给扇区数,那么单分区的最大容量将变为523776G,我想暂时是够用了……三.

总结及写在后面 总体来讲整个恢复过程就是三大步:446字节引导文件、64字节硬盘分区参数、55AA结束标识,其中以64字节的硬盘分区参数最为关键。可以说全文最为精华的部分在于第二章和第三章中那两张扇区和参数的对应关系图,望大家在这两张图上多一些耐心。幸而这些参数通过一点加法运算和现成的模板是非常容易获得的,整个恢复步骤不会超过10分钟,而精确性和安全系数都是非常高的。

希望本文能帮助新手对分区表有进一步的了解,同时也希望本文能帮助到有一定动手能力的朋友。同时还是要提醒大家,如果可能的话还是保存一份硬盘的MBR,这样但凡遇到主分区表问题的时候也能快速复原。此外,Winhex除了恢复硬盘的分区表之外,也可用于恢复U盘的分区表,只要U盘的分区格式是Fat32的,其恢复过程完全和上面一样。Winhex也可用于格式化之后的数据恢复以及误删文件的恢复,此外还有诸多更加强大的功能,限于篇幅,这里就不一一赘述了。

第四篇:操作系统实验报告

实验项目二 进程管理

一、 实验目的

1. 理解进程的概念,掌握父、子进程创建的方法。

2. 认识和了解并发执行的实质,掌握进程的并发及同步操作。

二、 实验内容

1. 编写一C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。

2. 多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。记下这种情况,试简单分析其原因。

3. 修改程序,在父、子进程中分别使用wait()、exit()等系统调用“实现”其同步推进,并获取子进程的ID号及结束状态值。多次反复运行改进后的程序,观察并记录运行结果。

三、 源程序及运行结果

源程序1:

#include #include #include int main(int argc, char ** argv ) { int pid=fork(); if(pid < 0)

printf("error!");

else if( pid == 0 )

{

printf("I am son! ");

}

else

{

int pid=fork();

if (pid < 0)

printf("error!");

else if( pid == 0 )

{

printf(“I am daughter! ");

}

else

printf("I am father! ");

} sleep(1); return 0; }

运行结果:

源程序2:

#include #include #include int main(int argc, char ** argv ) { char *message; int n;

int pid=fork(); if(pid < 0)

printf("error!");

else if( pid == 0 )

{

message="I am daughter!";

pid=getpid();

n=3;

}

else

{

int pid=fork();

if (pid < 0)

printf("error!");

else if( pid == 0 )

{

message="I am son!";

pid=getpid();

n=3;

}

else

message="I am father!";

n=3;

}

for(;n>0;n--) { puts(message); sleep(1); }

return 0; }

运行结果:

四、 实验分析与总结

1. 实验内容1运行结果为什么无固定顺序,fork()函数创建进程是如何并发执行的。

答:因为进程是并发执行的,fork()函数创建的三个进程抢占

cpu不同,从而导致三个程序被cpu 调度顺序不同,所以实验一结果无固定顺序。Fork()函数调用成功后,子进程与父进程并发执行的代码相同,但由于子进程也继承父进程的程序指针,所以子进程是从fork()后执行的,另外fork在子进程和父进程中返回值是不同的。在父进程中返回子进程的pid,而在子进程中返回0,使父进程和子进程执行不同的分支。

2. 实验内容3是如何实现父子进程的同步执行的。

答:wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。程序段主要使用了函数wait()和,exit()这是因为父进程必须等待两个子进程终止后才终。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。子进程终止时执行exit()向父进程发终止信号,当接到信号后,父进提取子进程的结束状态值,从wait()返回继续执行原程序,从而实现了父、子进程的同步推进。

总结:通过进程管理实验,了解fork()函数创建进程是并发执行的,wait()进程表示会暂时停止目前进程的执行,可以灵活运用fork()和wait()进程解决有关问题。在实验中遇到许多问题,如:实验中调用fork()进程失败,可能的原因有系统中有太多的进程或者实际用户ID的进程总数超过了系统的限制。刚接触VMware这个系统,操作不熟悉,多次操作后,了解这个系统有关操作,实验做起来就比较简单了。对实验代码也不熟悉,最后通过请教老师和同学,终于实验理解透彻,并成功运行了。不仅上课要认真听课,要想真正学会,课下也要付出努力。

第五篇:化学实验操作实验报告部分参考答案

试题一溶液变色

1、无红

试题九粗盐提纯

1、滤纸上无不溶性

2、一张大小质量相同的纸片

3、(1)搅拌,加速粗盐的溶解;(2)引流;(3)搅拌,防止液滴飞溅。 试题十

2、2.547.5烧杯玻璃棒玻璃棒加速无 试题十一氧气的制取

2、气泡良好

3、防止高锰酸钾颗粒进入导管

4、导管移出水面停止加热

5、集气瓶中的水排完,有大气泡从瓶口冒出时表明集气瓶里已经收集满氧气。试题十二二氧化碳的制取和性质

2、无熄灭红色

(1)二氧化碳的密度比空气大(2)二氧化碳不能燃烧也不支持燃烧试题十三金属与酸、盐溶液的反应

现象铁丝铝条表面有气泡产生铁丝表面覆盖一层红色物质 结论铁、铝铜铝 铁 铜铁和铝无 试题十四中和反应和溶液的PH值

1、 7红大于等于小于

2、氢氧化铝中和胃酸,熟石灰改良酸性土壤等(合理答案都对)酸

上一篇:药品隐患专项整治总结下一篇:氧气乙炔瓶使用危险源