交大网络教育操作系统实验一 可变分区存储管理_第1页
交大网络教育操作系统实验一 可变分区存储管理_第2页
交大网络教育操作系统实验一 可变分区存储管理_第3页
交大网络教育操作系统实验一 可变分区存储管理_第4页
交大网络教育操作系统实验一 可变分区存储管理_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一 可变分区存储管理(一)      实验题目编写一个C程序,用char *malloc(unsigned size函数向系统申请一次内存空间(如size=1000,单位为字节),用循环首次适应法addr = (char *lmalloc(unsigned size 和lfree(unsigned size,char * addr模拟UNIX可变分区内存管理,实现对该内存区的分配和释放管理。 (二)      实验目的1加深对可变分区的存储管理的理解;2提高用C语言编制大型系统程序

2、的能力,特别是掌握C语言编程的难点:指针和指针作为函数参数;3掌握用指针实现链表和在链表上的基本操作。 (三)      实验要求要分配函数lmalloc的参数size和释放函数lfree的参数size、addr以键盘命令的形式输入,每次分配和释放后显示自己的空闲存储区表。空闲存储区表可采用结构数组的形式(基本要求)或双向链接表的形式(提高一步),建议采用的数据结构为:结构数组的形式:struct map unsigned m_size;char * m_addr;struct map coremapN; 或双向链接表的形式:stru

3、ct map unsigned m_size;char *m_addr;struct map *next, *prior;;struct map *coremap;整个系统的基本框架为:程序结束前将整个存储区归还给系统。 (四)      实验注意事项键盘命令的简单形式如:malloc 100 enter 通过lmalloc函数申请100字节的内存空间。free 100 2567899 enter 通过lfree函数释放起始地址为2567899的那个内存区,该地址先前通过lmalloc申请的有效存储区地址。命令输入可用C函数scanf

4、 (“%c”, &cmdchar; cmdchar =getchar ( 或scanf (“%s”, &cndstring后跟scanf (“%u”, &size 或scanf (“%u %u”, &size, &addr。如采用通用的命令串的形式,还要调用一个串匹配函数,以判断是哪个命令。如采用简单的读取单个命令字符的形式,由于getchar或scanf可能读入的是前一个命令留在键盘输入缓冲区内的 ,/t,/n等空白字符,为了正确地读入m,f等本次命令字符,需要预先滤去输入缓冲区的空白字符:do c=getchar(;while(c=/n|c=/t|c

5、= 程序输入、调试和测试可以在Linux的环境下进行,也可在turbo C的环境中进行,但turbo C不支持I/O转向,故在完成此项工作时应将编译后产生的执行文件如myproc.exe存入磁盘的某个目录中,然后进入DOS环境运行程序,用I/O转向生成结果文件。如:myproc.exe > result.txt在Linux的环境下可直接运行:myproc > result  (五)      测试要求在程序调试基本通过后,应进行较为全面的测试,建议采用白盒法的路径测试方法,测试路径应包含lmalloc的“循环”、

6、“首次”,lfree的与邻近空闲分区联系的四种情况,还要包含一些必要的出错处理路径。测试通过后可用I/O转向使屏幕的输出结果转至指定文件。注意,由于此时看不到提示字符串和空闲存储区表的输出内容,欲释放存储地址较难正确输入,可采用以下几种方法:1在不采用输出转向时先完整地运行一遍,并记下所有的命令和参数,再用I/O转向时“摸瞎”似地依次输入各个命令和参数,由于malloc所分配的存储区地址时用户程序的虚地址空间,故同一程序的两次运行的结果应当是一样的。为了使输出结果文件也含有输入的命令串,应在输入命令后,再将命令和参数输出至标准输出设备。2如lmalloc和lfree,是采用相对地址的管理方法(

7、malloc所分配的地址+偏移地址),那么输入lfree的释放地址就容易得多。3输入也可采用I/O转向,将预先设计好的所有输入次序(部分数据可在不采用I/O转向运行时输入)写入输入文件,再用:myprog.exe < inputfile.txt > result.txt的形式执行。4对于文件的I/O较熟悉的学生可采用每次在屏幕输出后重复向文件输出的方法,这样上述的问题就很容易解决了。 (六)      实验数据和结果学生最后应当将程序、输出结果文件和输入命令文件(如果有的话)合并成一个文件,如progres.txt上载到作

8、业系统中。在DOS中的合并方法是:copy myprog.c + input.txt + result.txt progres.txt在Linux中的合并方法是:cat myprog.c input result > progress.txt 每一个程序的开头应当注上班级、姓名和学号。 (七)      实验报告要求要采用标准的实验报告纸。它包含以下几个方面:1题目。2算法思想和概要设计和重要模块的详细设计及功能和接口说明。3重要数据结构和变量的说明。4源程序、注释和结果。注释如在上机时来不及打入,可在写报告时补上。5

9、测试方法,对测试结果的分析,错误的分析。6程序及测试的改进、本次上机经验及体会。C代码:#include #include #include #include #include #include #define maxsize 1000  /定义原始分配区的大小。struct map    unsigned m_size;  /本表项所指空闲区的大小。    char* m_addr;    /本表项所指空闲区的首地址。    struct map *ne

10、xt,*prior;  /本表项的前后表项。;struct map *coremap,*start;  /coremap指向首表项,start指向当前的查找首表项。char * mmalloc(unsigned size  /分配空闲区的函数。    struct map *current=start; /记录查找的起点。    char * c;    do        if(start->m_s

11、ize>size /有足够大的空闲区,有余。             start->m_size=start->m_size-size; /减小分配过的表项空间。             c=start->m_addr;          

12、60;   start->m_addr+=size; /修改表项的首地址。             return c;                else if(start->m_size=size /有正好大小的空闲区。       

13、;      start->next->prior=start->prior; / 从链表中删除该表项。             start->prior->next=start->next; / 从链表中删除该表项。    start->m_size=0;        &#

14、160;    return start->m_addr;                 else start=start->next; /当前表项所指的空闲区不够,start指向下一个表项。     while(start!=current; / 一直循环查找表项,直到回到起点。     return NULL; 

15、0;   /没有找到合适大小的分配区,分配失败。int mfree(unsigned size,char * addr /释放的函数。     struct map *current=coremap; /     struct map *temp;     /若释放的空间在循环链表的首表项的前头,则要插入首表项。     if(coremap->m_addr>addr && (corema

16、p->m_addr-addr>(signed size   temp=(struct map *malloc(sizeof(struct map; /新建首表项。   temp->m_addr=addr;   temp->m_size=size;   temp->next=coremap;   temp->prior=coremap->prior;   coremap->prior->next=temp;/插入循环链表&#

17、160;  coremap->prior=temp;   coremap=coremap->prior;   return 1;/释放成功。       /若释放的空间紧挨着循环链表的首表项的前头,则要修改首表项。     else if(coremap->m_addr>addr && (coremap->m_addr-addr=size   coremap->m_addr=addr;

18、/修改首表项的首地址。   coremap->m_size+=size;   return 1;/释放成功。       /若释放的空间在循环链表的首表项的后头,则有四种情况:  do        /若释放的空间不紧挨着别的空闲区的边界。        if(current->m_addr+current->m_size next->

19、;m_addr>addr+size              temp=current->next;             current->next=(struct map * malloc(sizeof (struct map;         

20、    current->next->prior=current;             current->next->next=temp;             current->next->m_size=size;     current->next

21、->m_addr=addr;    temp->prior=current->next;             return 1; /释放成功。                /若释放的空间紧挨着上边空闲区的边界,不紧挨着下边空闲区的边界。    &

22、#160;   else if(current->m_addr+current->m_size=addr && (current->next->m_addr>addr+size             current->m_size+=size;             return 1

23、; /释放成功。                /若释放的空间不紧挨着上边空闲区的边界,紧挨着下边空闲区的边界。        else if(current->m_addr+current->m_size next->m_addr=addr+size           

24、;   current->next->m_addr=addr;             current->next->m_size+=size;             return 1; /释放成功。          &#

25、160;     /若释放的空间紧挨着上边空闲区的边界,紧挨着下边空闲区的边界。        else if(current->m_addr+current->m_size=addr && (current->next->m_addr=addr+size             current->m_size+=(siz

26、e+current->next->m_size;             current->next->next->prior=current;             current->next=current->next->next;      &

27、#160;      return 1; /释放成功。                else current=current->next; /释放的空间不在当前表项和下一表项间。     while(current!=coremap;/一直寻找,直到回到起点。     return 0; /没有匹配的空间可以释放,释放失

28、败。void printall(/打印当前的所有表项。     struct map * temp=coremap;  printf("/n"     do        printf("%u,%u;",temp->m_addr,temp->m_size;        temp=temp->next;

29、0;    while(temp!=coremap;main(    char c;    char *addr;    unsigned size;    printf("Welcome to use my operation system!" coremap=(struct map * malloc(sizeof(struct map;/创建循环链表的首表项。    coremap->m_addr=(char * malloc(maxsize;/分配给首表项原始的一片空间。 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论