操作系统原理-内存分配与回收
- 格式:docx
- 大小:1.69 MB
- 文档页数:22
操作系统的资源管理操作系统是计算机系统中的核心软件,起着资源管理的重要作用。
资源管理是指操作系统对计算机系统中的各种资源的合理配置和调度,以实现对资源的高效利用和协调。
本文将从进程管理、内存管理和文件管理三个方面,探讨操作系统的资源管理。
一、进程管理进程是指计算机中正在运行的程序的实例。
操作系统通过进程管理来实现对计算机中运行的多个进程的协调和控制。
进程管理的主要内容包括进程的创建、撤销、调度和通信等。
进程的创建是指在计算机系统中新建一个进程,为其分配必要的资源,使其能够运行。
进程的撤销则是指在进程运行结束后,将其从系统中移除,释放其占用的资源。
进程的调度是指操作系统对多个进程的优先级、时间片等进行合理安排,以实现对计算机资源的有效利用。
进程间通信则是指不同进程之间的信息交换和共享,让它们能够相互协作完成任务。
二、内存管理内存管理是指操作系统对计算机的内存资源进行分配和调度的过程。
计算机的内存是存储程序和数据的地方,操作系统需要对内存进行合理的组织和利用。
内存管理的主要内容包括内存的分配、回收和保护。
内存的分配是指操作系统将可用的内存划分为多个空闲区域,根据进程的需求,选择合适的空闲区域分配给进程。
内存的回收则是指在进程运行结束后,将其占用的内存释放,归还给系统。
内存的保护是指通过硬件和软件机制,对不同进程和操作系统的内存区域进行保护,防止进程之间的干扰和非法访问。
三、文件管理文件管理是指操作系统对计算机中的文件资源进行管理和控制。
文件是计算机中用于存储和组织数据的重要方式,操作系统需要对文件进行创建、存储、读取和删除等操作。
文件管理的主要内容包括文件的命名、存储和保护。
文件的命名是指为每个文件指定一个唯一的名字,使用户能够方便地访问和操作文件。
文件的存储是指将文件的数据存储在磁盘或其他设备中,根据文件的大小和访问特点进行存储的方式。
文件的保护是指通过权限和密码等机制,对文件进行保护,控制用户对文件的访问和修改。
•操作系统概述•进程管理•内存管理•文件系统目录•设备管理•操作系统安全01操作系统概述存储器管理处理机管理程控制、进程同步、进程通信和定义设备管理备,包括设备驱动、设备无关性、缓冲管理和设备分配等。
文件管理早期操作系统批处理操作系统(如IBM的JCL)和分时操作系统(如UNIX的初期版本)等。
现代操作系统随着计算机硬件技术的发展,出现了多道程序设计、中断处理、虚拟内存和分布式系统等概念和技术,推动了现代操作系统的发展。
未来发展趋势随着云计算、物联网和人工智能等技术的快速发展,操作系统将朝着更加智能化、自适应和分布式的方向发展。
分类根据运行环境和应用领域的不同,操作系统可分为批处理操作系统、分时操作系统、实时操作系统、网络操作系统和分布式操作系统等。
允许多个程序同时执行,提高系统资源利用率。
允许多个程序共享系统中的各种资源,提高资源使用效率。
通过技术手段将物理实体变为逻辑上的对应物,为用户提供更加便捷的使用体验。
允许多个程序以不可预知的速度向前推进,提高系统灵活性和适应性。
并发性虚拟性异步性共享性02进程管理进程的概念与状态进程的定义进程的状态进程在其生命周期内会经历多种状态,如创建态、就绪态、运行态、阻塞态和终止态等。
这些状态之间会根据特定的条件进行转换。
进程控制块PCBPCB的定义PCB的作用进程调度算法进程同步与通信进程同步进程通信03内存管理内存的分配与回收回收策略分配方式阐述内存回收的策略,包括如何检测空闲内存、如何合并空闲块等,以确保内存的高效利用。
分配算法内存映射介绍内存映射技术,包括如何将虚拟地址映射到物理地址,以及如何通过内存映射实现进程隔离和共享。
访问控制解释如何通过访问控制机制,如界限寄存器、基址寄存器和限长寄存器等,实现内存保护。
保护机制阐述操作系统提供的内存保护机制,如防止地址越界、防止非法访问等,以确保系统的安全性和稳定性。
虚拟内存概念解释虚拟内存的基本概念,包括虚拟地址空间、物理地址空间、页表等。
gdk操作系统原理课程设计一、课程目标知识目标:1. 理解GDK操作系统的基本原理与架构,掌握其核心功能与模块;2. 掌握操作系统中的进程管理、内存管理、文件系统等基本概念;3. 了解操作系统在计算机系统中的作用,及其与其他软件、硬件的关联。
技能目标:1. 能够描述GDK操作系统的启动过程,分析其工作原理;2. 学会使用GDK操作系统的基本命令,进行简单的系统操作与维护;3. 培养学生对操作系统进行问题诊断与性能优化的能力。
情感态度价值观目标:1. 培养学生对操作系统原理学习的兴趣,激发其探索计算机科学领域的热情;2. 培养学生的团队协作意识,提高其沟通与表达能力;3. 增强学生的信息安全意识,使其认识到操作系统安全的重要性。
本课程针对高年级学生,结合GDK操作系统原理,注重理论与实践相结合。
课程目标旨在使学生在掌握操作系统基本原理与技能的基础上,提高实际问题解决能力,培养其对计算机科学的热爱与责任感。
通过分解课程目标为具体学习成果,有助于教师进行教学设计和评估,提高课程实用性。
二、教学内容1. GDK操作系统概述- 操作系统的概念、功能与分类- GDK操作系统的历史、特点与发展趋势2. GDK操作系统的架构与启动- 系统架构:内核、用户空间、系统调用- 启动过程:BIOS、引导加载器、内核初始化3. 进程管理- 进程与线程的概念、状态与转换- 进程调度算法、同步互斥机制4. 内存管理- 内存分配与回收策略- 虚拟内存、分页与分段机制5. 文件系统- 文件与目录结构- 文件存储、权限管理、磁盘空间分配6. 设备管理- 设备驱动程序、I/O调度策略- 中断处理、DMA传输、设备分配与回收7. 操作系统安全与性能优化- 系统安全策略、权限控制- 性能评价、系统监控与调优教学内容根据课程目标进行选择和组织,注重科学性和系统性。
本课程共分为七个部分,按照教材章节进行安排和进度制定。
教学内容涵盖GDK操作系统的基本原理、架构、关键技术与实践应用,旨在帮助学生全面掌握操作系统知识,提高实际问题解决能力。
mac内存管理机制摘要:一、mac内存管理机制概述二、mac内存管理的关键概念和原理1.虚拟内存2.物理内存3.内存分配与回收策略4.内存保护机制三、mac内存管理的优势与不足四、如何优化mac内存管理1.关闭不必要的程序和服务2.定期清理缓存和临时文件3.升级硬件配置4.合理分配内存资源五、总结正文:mac内存管理机制是苹果公司在其操作系统中采用的一种内存管理策略,旨在高效、安全地管理计算机内存资源。
了解mac内存管理机制有助于我们更好地利用mac设备,提高系统性能和稳定性。
一、mac内存管理概述mac内存管理主要包括虚拟内存、物理内存和内存分配与回收策略等方面。
它通过操作系统内核来协调和管理内存资源,确保程序能够在合适的时间、按需分配到内存,从而提高系统资源利用率。
二、mac内存管理的关键概念和原理1.虚拟内存:虚拟内存是mac操作系统中的一种抽象概念,它将物理内存与磁盘上的虚拟内存文件相互映射。
程序在运行时,操作系统会将所需内存地址映射到虚拟内存地址,从而实现程序在内存中的运行。
2.物理内存:物理内存是实际存在于计算机硬件中的内存条,用于存储运行中的程序和数据。
mac内存管理通过动态分配和回收物理内存,以满足程序运行的需要。
3.内存分配与回收策略:mac内存管理采用了一种名为“伙伴算法”的内存分配与回收策略。
它将物理内存划分为多个块,并根据块的大小进行分配和回收。
这种策略有助于减少内存碎片,提高内存利用率。
4.内存保护机制:mac内存管理通过硬件和软件层面的防护措施,确保程序无法访问非法内存区域。
这有助于防止程序崩溃、数据泄露和系统安全漏洞。
三、mac内存管理的优势与不足mac内存管理在内存资源利用、系统稳定性和安全性方面具有优势。
然而,它也存在一定的不足,如在内存分配和回收过程中可能产生的延迟,以及在高负载情况下可能出现的内存不足问题。
四、如何优化mac内存管理1.关闭不必要的程序和服务:通过系统偏好设置,关闭不需要的程序和服务,减少内存占用,提高系统性能。
《操作系统原理》授课教案-《操作系统原理》操作系统原理授课教案 - 操作系统原理一、教学目标本课程的教学目标主要包括以下几个方面:1. 了解和掌握操作系统的基本概念和原理;2. 熟悉操作系统的常见功能和特性;3. 掌握操作系统的设计和实现方法;4. 培养学生对操作系统的分析和解决问题的能力。
二、教学内容本课程的教学内容将涵盖以下几个模块:1. 操作系统概述- 操作系统的定义和作用- 操作系统的发展历程- 操作系统的分类和特点2. 进程管理- 进程和线程的概念- 进程调度算法和实现- 进程同步和互斥3. 存储管理- 内存管理的基本原理- 内存分配和回收算法- 虚拟内存的实现和管理4. 文件系统- 文件系统的组成和结构- 文件的存储和访问方式- 文件系统的管理和维护5. 设备管理- 设备管理的基本原理- 设备驱动程序的设计和实现- 设备的分配和调度三、教学方法本课程将采用以下教学方法:1. 理论授课:介绍操作系统的基本概念和原理,并通过案例分析进行实际应用的讲解。
2. 实践操作:通过实际操作和编程练,加深学生对操作系统的理解和掌握。
3. 分组讨论:组织学生进行小组讨论,共同分析和解决操作系统相关的问题。
四、教学评估本课程的评估方式将包括以下几个方面:1. 课堂表现:考察学生对操作系统知识的掌握情况和参与讨论的主动性。
2. 实验报告:评估学生在实践操作和编程练中的实际能力和成果。
3. 期末考试:综合考察学生对操作系统的理论知识和应用能力。
五、教学资源本课程的教学资源包括以下几个方面:1. 教材:选用经典的操作系统教材作为参考书。
2. 讲义:提供详细的课堂讲义,帮助学生更好地理解和研究。
3. 实验环境:提供适合操作系统实验的计算机环境和工具。
六、教学进度安排本课程的教学进度安排如下:七、参考资料1. 牛津大学计算机科学系,操作系统原理教学课程手册。
2. 郁才根,操作系统简明教程,清华大学出版社,2018。
内存调度算法内存调度算法是计算机操作系统中的一种重要机制,用于管理和优化系统中的内存使用。
它的目标是合理和有效地分配和回收系统中的内存资源,以提高系统性能和响应速度。
在计算机系统中,内存是一种有限的资源,不同进程或任务需要占用一定的内存空间来运行。
内存调度算法可以根据不同的策略将内存分配给不同的进程,并在需要时回收内存,以确保系统的正常运行。
常见的内存调度算法包括以下几种:1.先进先出(FIFO)调度算法FIFO是最简单的内存调度算法之一。
它根据进程请求内存的顺序进行分配,先到达的进程首先获得内存资源。
然而,FIFO算法存在一个问题,即如果一个进程一直占用内存而不释放,其他进程可能无法获得足够的内存。
因此,FIFO可能导致内存碎片问题。
2.最佳适应(Best-fit)调度算法最佳适应算法是一种基于内存分区的调度算法,它选择与进程大小最接近的空闲内存分区。
这可以最大程度地减少内存碎片,并提高内存空间的利用率。
但是,最佳适应算法需要对整个内存空间进行搜索,可能会增加开销。
3.最差适应(Worst-fit)调度算法最差适应算法与最佳适应算法类似,但它选择与进程大小最不匹配的空闲内存分区。
这意味着,分配给进程的内存空间可能比实际需要的要大,从而增加了内存碎片。
最差适应算法对于大型进程来说可能更有效,但可能会影响其他较小的进程。
4.循环首次适应(Round Robin First-fit)调度算法循环首次适应算法是一个综合了最佳适应和最差适应算法的调度算法。
它从内存的某个位置开始分配,然后沿着循环路径搜索空闲内存分区,直到找到合适大小的分区。
这种算法可以平衡内存利用率和内存碎片的问题,提高系统的整体性能。
5.页面替换算法在虚拟内存系统中,页面替换算法用于管理内存中的页面。
常见的页面替换算法包括最近最久未使用(LRU)、先进先出(FIFO)、最不常用(LFU)等。
这些算法根据页面的使用情况选择被替换出的页面,以减少缺页次数并提高系统的响应速度。
主 题题: 《操作系统原理》学习笔记内 容容:《操作系统原理操作系统原理》》学习笔记学习笔记三三————存储管理存储管理存储管理主存储器又称为内存储器,它是处理机可以直接访问的存储器。
主存速度快,但容量有限。
存储管理主要是对主存的管理,同时也涉及到主存和外存交换信息。
一、存储管理的目的与功能计算机的系统结构是以内存储器为中心。
受系统地址总线的限制,内存空间并不能做的很大。
16位地址总线,内存最大64KB 。
32位地址总线,内存最大4GB 。
在多道系统中,多个用户作业要同时使用有限的内存空间。
内存储器成为系统的“瓶颈”资源。
如何充分利用和有效管理内存空间,是操作系统必须完成的主要任务。
在多道系统中,存储管理的目的是为系统中并发运行的多道作业提供相互独立的存储空间,并为用户使用存储器提供方便。
主存储器的存储空间分为两个部分:系统区:用于存放操作系统的程序和数据。
用户区:存放系统应用程序和用户的程序和数据。
存储管理主要是对用户区的存储空间进行管理。
操作系统中存储管理的功能主要有五个方面:存储分配。
为进入系统的多个作业合理地分配存储空间每个作业的程序及其数据存放在内存空间的什么区域。
使用连续的内存区域,还是把它分成若干块来占用不连续的存储空间。
合理组织作业占用的空间,以达到既便于程序运行时存取信息,又能够最大限度地减小空间的浪费,使内存空间得到充分的利用地址变换。
用户作业调入内存空间时所处的位置是根据内存空间当时的状况决定的。
一般情况下,同一个程序在每次调入内存时所占用的位置是完全不同的。
为了保证程序在使用内存的不同区域时仍能正确地执行,必须把在程序执行时要访问的存储单元的位置,由用户在编制程序时所定的地址变换成它们在内存的实际地址。
地址变换又称为地址重定位。
存储保护。
在整个内存空间中既存放着系统的程序和数据,又有多个用户的程序和数据。
保证系统的程序和数据不被用户非法访问和破坏。
保证每一个用户信息的安全。
操作系统课程实验报告
scanf("%s",algorithm);
if(strcmp(algorithm,"F") == 0||strcmp(algorithm,"B") == 0) break;
else
printf("输入出错,请重新输入\n");
}
if(strcmp(algorithm,"F") == 0){
while(1)
first_fit();
}
else{
while(1)
best_fit();
}
system("pause");
return 0;
}
首次适配算法20多次的测试结果
最佳适配算法结果
分析:
由于只测试20多次分配回收,然后又没有什么很好的测试数据,所以得到的结果如上图所示,发现最佳适配算法所产生的空闲区是少于首次适配算法的。
得分:
实验过程中遇到的问题解决办法与实验体会Q4(需手写,10
分)
问题、解决办法:
这次试验遇到的问题挺多的,其实算法已经很理解了,只是分好空闲区和非空闲区以后,控制输出一直没弄好,所以无法输出正确的结果,有时是节点控制出现问题,有时是大小出现问题。
然后统计空闲区列表和非空闲区列表,还有碎片区都出现了一些错误,所以纠结了很久,最终通过自己细心调试,终于解决了。
体会:
这次试验让我更加深刻的了解到了内存的分配和回收,而且也明白了不同算法之间所产生的一些差别,从而能很好的管理系统内存。
评阅教师特殊评语:。
一.实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。
二.实验内容1.确定内存空间分配表;2.采用最优适应算法完成内存空间的分配和回收;3.编写主函数对所做工作进行测试。
三.实验背景材料实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。
首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。
由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。
总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。
由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。
由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。
分配内存时查找空闲区进行分配,然后填写己分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。
由此可见,内存的分配和回收主要是对空闲区的操作。
这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。
这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。
在实验中,采用顺序表形式,用数组模拟。
由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。
它们的长度必须是系统可能的最大项数。
“已分分区表”的结构定义#define n 10 //假定系统允许的最大作业数量为nstruct{ float address; //已分分区起始地址float length; //已分分区长度、单位为字节int flag; //已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名}used_table[n]; //已分分区表“空闲区表”的结构定义#define m 10 //假定系统允许的空闲区最大为mstruct{ float address; //空闲区起始地址float length; //空闲区长度、单位为字节int flag; //空闲区表登记栏标志,“0”表示空栏目,“1”表示未分配}used_table[n]; //空闲区表第二,在设计的数据表格基础上设计内存分配。
操作系统原理-内存分配与回收给作业。
检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。
若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是否有“大于”的情况代码实现如下:#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define n 64 //定义内存的大小int a[n],count=0;//数组a用来保存内存使用状况1为已分配0为未分配,count用来记name数组中元素个数char name[n];//已分配内存的名称(字符类型)typedef struct linknode{char pid;int start;int length;struct linknode *left,*right;}de_node; //进程节点结构体定义//head1表示未分配内存队列头指针,head2便是已分配进程队列头指针de_node *head1,*head2=NULL;struct linknode* creat()//创建一个进程节点{int len,flag1=1;//用于表示进程是否可以创建char id;struct linknode* p;p = (de_node *)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程if (p==NULL) //p为空,说明系统没有可用内存用于创建此模拟进程{ printf("系统没有足够的内存可供使用!\n");//输出return(NULL);//返回空指针}printf("请输入进程id(字符类型)和长度:");//为进程输入id和分配的长度scanf("%c %d",&id,&len);fflush(stdin);//清除输入缓存if((id>='a'&&id<='z'||id>='A'&&id<='Z')&&(le n>0)){for(int i=0;i<count;i++)//判断输入的进程名,如果已使用,返回空指针,并释放p指针if(name[i]==id){printf("此名称进程已存在!!");flag1=0;//标志位为0,表示下面对p指向内容不做修改free(p);return NULL;}if(len==0) {//如果输入要分配的进程长度为0,释放p,返回空指针printf("输入长度为0!\n");free(p);return(NULL);}if(flag1){//标志位1,可以对p指向内容进行修改p->pid=id; //idp->start=0; //初始开始内存位置,在以后会修改p->length=len;//长度p->left=NULL;//左指针p->right=NULL;//右指针name[count++]=id;//将id存入数组,count 自加return(p);}//返回创建的进程的地址}else {printf("输入进程格式有误\n");free(p);return (NULL);}}//分配内存空间void distribute(de_node *p){ de_node *q=head1,*temp;int flag=0;do{//do_while循法//判断当前指向的内存空间的长度是否满足p所申请的长度,大于就分配if(q->length>=p->length) {p->start=q->start;//把进程的内存开始地址指向内存的可用开始地址处q->start+=p->length;//可用地址起始改变q->length-=p->length;//可用内存长度修改for(int i=p->start;i<p->start+p->length;i++)//将已分配的内存空间全部置1a[i]=1;flag=1;//表示内存可分配//队列不止一个进程,第一个满足条件,并且刚好分配完,修改指针指向if(q->length==0&&q->right!=q){ if(q==head1)//如果第一个满足,修改头指针指向head1=q->right;q->left->right=q->right;q->right->left=q->left;free(q);//把这个已分配完的空间指针释放}}if(flag==1)//已做完处理直接跳出循环break;if(flag==0)//当前指向的内存不满足,指向下一个,继续判断是否满足q=q->right;}while(q!=head1);//搜索一遍可用内存序列if(flag==0){//没有可用的内存printf("没有满足的内存!\n");count--;//由于创建时加1,但在分配内存时失败,把1又减掉free(p);//把这个未分配到内存的进程释放}if(flag==1){//表示上面已分配好内存,并已修改内存链表,下面修改已分配内存的进程队列temp=head2;//把已分配内存的进程队列赋值给临时指针if(temp==NULL)//如果还还没有存在的任何的进程,说明当前是第一个{ head2=p;//让头指针指向第一个进程p->left=p;//双向队列第一个左右指针都指向自己p->right=p;//双向队列第一个左右指针都指向自己}else if(temp!=NULL){//已存在队列,把当前直接链到第一个,与上面的区别是指针指向head2=p;//让头指针指向p指向的进程p->left=temp->left;//p进程左边为原来第一个的左边p->right=temp;//p进程右边指向第一个temp->left->right=p;//原来第一个的左边为ptemp->left=p;//原来第一个的左边的进程为p}}}//对进程的回收void reclaim(){ char id;int flag=0;de_node *q=head2,*p=head1;if(head2==NULL)//表示当前没有进程{ printf("已没有进程!\n");}else {//已分配内存队列如果不为空printf("输入要回收的进程id:");//输入要回收进程的idscanf("%c",&id);fflush(stdin);for(int i=0;i<count;i++)//双重循环把要回收的进程找出来,并把记录的id去掉if(name[i]==id){//判断当前的进程是否满足要求for(int j=i;j<count;j++)name[j]=name[j+1];//向前覆盖name[j+1]=NULL;//置空count--;//减一}//判断是否总共只有一个进程且是够刚好也满足条件if(q->pid==id&&q->right==q&&head2==q) { head2=NULL;//把已分配队列直接置空flag=1;//表示找到满足条件的进程}if(flag==0){//上面的都没找到do{if(q->pid==id){//如果找到if(q==head2)head2=q->right;q->left->right=q->right;//修改指针指向q->right->left=q->left;flag=1;break;}else q=q->right;}while(q!=head2);}//如果找到或是遍历一遍结束if(flag==0) printf("没有此进程号!!!\n");//没有找到满足的进程if(flag==1){//表示找到了for(int i=q->start;i<q->start+q->length;i++)//释放占有的内存a[i]=0;//接下来修改可用内存的队列,while(q->start>p->start&&p->right!=head1){ //从第一个开始找到回收回来的内存开始地址大的那个队列p=p->right;}if(p==head1)//表示比第一个的开始还小,那么就要修改头地址head1=q;//其他情况不用修改头地址,只需找到应该的位置,把此进程插进去q->left=p->left;//修改指针的指向q->right=p;p->left->right=q;p->left=q;if(q->start+q->length==p->start)//可以与后面合并的情况{ q->length+=p->length;//修改指针的指向p->right->left=q;q->right=p->right;free(p);}if(q->left->start+q->left->length==q->start)//可以与前面合并的情况{ q->left->length+=q->length;//修改指针的指向q->left->right=q->right;q->right->left=q->left;free(q);}}}}//打印输出void print(){ de_node *q=head2,*p=head1;if(count==0)printf("没有进程占有内存。
\n");else{ printf("输出进程id号:\n");for(int i=0;i<count;i++)printf("%c\t",name[i]);}printf("\n");printf("输出内存当前使用情况:\n");for(int j=0;j<n;j++)printf("%d %d\t",j,a[j]);printf("\n");printf("内存初始名称为i,回收后可能会变,可以查看回收来自那个进程\n");do //输出可用内存序列{ if(p!=NULL){ printf("进程id:%c 开始地址:%d 长度%d\n",p->pid,p->start,p->length);p=p->right;}}while(p!=head1);printf("\n");printf("已分配进程队列:\n");do //已分配进程队列{if(q!=NULL){printf("进程id:%c 开始地址:%d 长度%d\n",q->pid,q->start,q->length);q=q->right;}}while(q!=head2);}//主函数void main(){ int x;de_node *point,*p1;//创建内存的初始状态point=(struct linknode*)malloc(sizeof(struct linknode));head1=point;point->pid='i';point->start=0;point->length=n;head1->left=point;head1->right=point;print();while(1){printf(" ------MENU-------\n");printf("1----distribute(分配)\n");printf("2----reclaim(回收)\n");printf("3----view (浏览)\n");printf("4----exit(退出)\n");printf("请输入上面的选项(1--4):\n");scanf("%d",&x);fflush(stdin);switch(x){case 1:{ p1=creat();if(p1==NULL) printf("创建进程失败。