内存管理有哪几种方式?

常见的内存管理方式:

  1. 块式管理:把主存分为一大块一大块的,当所需的程序片段不在主存时就分配一块主存空间,把程序片段载入主存,就算所需的程序片段只有几个字节也只能把这一块分配给它。这样会造成很大的浪费,平均浪费了50%的内存空间,但是易于管理。

  2. 页式管理:用户程序的地址空间被划分成若干个固定大小的区域,这个区域被称为“页”,相应地,内存空间也被划分为若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,从而实现了离散分配。这种方式的优点是页的大小是固定的,因此便于管理;缺点是页长与程序的逻辑大小没有任何关系。这就导致在某个时刻一个程序只有一部分在主存中,而另一部分则在辅存中。这不利于编程时的独立性,并给换入换出处理、存储保存和存储共享等操作造成麻烦。

  3. 段式管理:段是按照程序的自然分界划分的并且长度可以动态改变的区域。使用这种方式,程序员可以把子程序、操作数和不同类型的数据和函数划分到不同的段中。这种方式将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相连,也实现了离散分配。

  4. 段页式管理:段页式存储组织是分段式和分页式结合的存储组织方法,这样可充分利用分段管理和分页管理的优点。

分段存储主要有以下优点:

  1. 段的逻辑独立性不仅使其易于编译、管理、修改和保护,也便于多道程序共享

  2. 段长可以根据需要动态改变,允许自由调度,以便有效利用主存空间

  3. 方便分段共享,分段保护,动态链接,动态增长

分段存储的缺点如下:

  1. 会产生内存碎片的问题

    1. 外部内存碎⽚,也就是产⽣了多个不连续的⼩物理内存,导致新的程序⽆法被装载;
    2. 内部内存碎⽚,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是很常使⽤,这也会导致内存的浪费;
  2. 内存交换的效率低

段页式管理主要有以下优点:

  1. 用分段方法来分配和管理虚拟存储器。程序的地址空间按逻辑单位分成基本独立的段,而每一段有自己的段名,再把每段分成固定大小的若干页

  2. 用分页方法来分配和管理内存。即把整个主存分成与上述页大小相等的存储块,可装入作业的任何一页。程序对内存的调入或调出是按页进行的,但它又可按段实现共享和保护

什么是虚拟内存?

虚拟内存简称虚存,是计算机系统内存管理的一种技术。它是相对于物理内存而言的,可以理解为“假的”内存。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编写并运行比实际系统拥有的内存大的多的程序,这使得许多大型软件项目能够在具有有限内存资源的系统上实现。而实际上,它通常被分割成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

相比实存,虚存有以下好处:

  1. 扩大了地址空间。无论段式虚存,还是页式虚存,或是段页式虚存,寻址空间都比实存大

  2. 内存保护。每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。另外,虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改

  3. 公平分配内存。采用虚存之后,每个进程都相当于有同样大小的虚存空间

  4. 当进程需要通信时,可采用虚存共享的方式实现

使用虚拟内存也是有代价的,主要表现在以下几个方面的内容:

  1. 虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存

  2. 虚存地址到物理地址的转换,增加了指令的执行时间

  3. 页面的换入换出需要磁盘I/O,这是很耗时的

  4. 如果一页中只有一部分数据,会浪费内存

什么是内存碎片?什么是内碎片?什么是外碎片?

内碎片:分配给程序的存储空间没有用完,有一部分是程序不使用,但其他程序也没法用的空间。内碎片是出于区域内部或页面内部的存储块,占有这些区域或页面的进程并不使用这个存储块,而在进程占有这块存储块时,系统无法利用它,直到进程释放它,或进程结束时,系统才有可能利用这个存储块

外碎片:由于空间太小,小到无法给任何程序分配的存储空间。外部碎片是出于任何已分配区域或页面外部的空闲存储块,这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请

虚拟地址、逻辑地址、线性地址、物理地址有什么区别?

虚拟地址是指由程序产生的由段选择因子和段内偏移量组成的地址。这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换处理后才会对应到相应的物理内存地址。

逻辑地址是指由程序产生的段内偏移地址。有时直接把逻辑地址当成虚拟地址,两者并没有明确的界限。

线性地址是指虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段基址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换产生物理地址。若是没有采用分页机制,那么线性地址就是物理地址。

物理地址是指现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。

虚拟地址到物理地址的转化方法是与体系结构相关的,一般有分段和分页两种方式。

映射是一种多对一的关系,即不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映射到同一个物理地址上。而且,同一个线性地址在发生换页以后,也可能被重新装载到另外一个物理地址上,所有这种多对一的映射关系也会随时间发生变化。

cache的置换算法有哪些?

Cache置换算法有RAND算法、FIFO算法、LRU算法、OPT算法和LFU算法。