操作系统精髓-内存管理、调度及其他基础总结

操作系统内存管理及其他相关基础知识总结,需要详细了解可以参考《操作系统-精髓及设计原理》。

一、内存管理相关

1.1、地址逻辑空间与物理空间

  1. 地址逻辑空间:即CPU所生成的地址,也被称为虚拟地址空间
  2. 物理地址空间:即数据位于内存中的真实地址
  3. 逻辑地址与物理地址通过内存管理单元MMU进行映射

操作系统精髓-内存管理、调度及其他基础总结

1.2、连续内存分配

  1. 首次适应:寻找到第一块满足分配要求的空间就进行内存的分配,会产生空间碎片化问题。
  2. 最佳适应:找到和内存分配大小差值最小的一块空间进行分配,避免空间碎片化。
  3. 最差适应:在和内存分配大小差值最大的一块空间进行分配,留出更多的碎片空间。

1.3、非连续内存分配

TIP:为什么需要非连续内存分配

因为在连续内存分配中,无论是采用首次适应策略或最佳适应策略都会存在内存空间碎片化问题,所以为了有效利用内存空间,操作系统通常采取非连续的内存分配。

1.3.1、分段机制

(1)为什么要分段

分段是为了更好地区别和隔离开不同的内存区域,以便更高效地去区分和使用内存。在比较老的操作系统如x86操作系统中,使用了分段机制来逻辑地址和物理地址之间的对应关系。

分段有助于内存区域的共享和保护。

操作系统精髓-内存管理、调度及其他基础总结

操作系统精髓-内存管理、调度及其他基础总结

(2)段映射机制

由段映射到物理地址的机制称为段映射机制,段映射到内存块需要一个二维的映射条件,即段号(segment)与段内偏移(addr)。

操作系统精髓-内存管理、调度及其他基础总结

(3)段映射的硬件实现:段表

在硬件中,通过段表来实现段映射,每个段表中储存着段号与偏移量用来映射到真实的物理空间。

操作系统精髓-内存管理、调度及其他基础总结

1.3.2、分页

分页指的是将物理内存分为固定大小的块,每一块称为帧;将逻辑内存分为固定大小的块,每一块称为页。由页对应帧的过程,即实现了逻辑地址对应物理地址。分页技术被现代操作系统大量使用,取代了分段技术。

操作系统精髓-内存管理、调度及其他基础总结

(1)页寻址过程
  1. CPU生成逻辑地址,包含页号(page number)与页偏移(page addr)
  2. 由逻辑地址的页号定位到页表中的帧号
  3. 帧号加页地址偏移量(帧偏移量和页偏移量是同一单位)确定到具体的物理地址

TIP:通常页的大小为2的n次幂(byte)。

操作系统精髓-内存管理、调度及其他基础总结

(2)页表与段表的区别
  1. 页表是一维的,只含有页号-》帧号的映射,而段表是二维的,含有段号与偏移量
  2. 页表通过页表基址与页号定位到帧号,段表通过段号与偏移量直接定位到物理地址
(3)分页和分段的区别

分页中,页的大小固定;而分段中,段的大小不固定,每块段都可不一样大。

(5)分页的作用
  1. 将用户视角下的内存与真实的物理内存所分离。
  2. 用来实现虚拟内存
(6)分页后的逻辑空间远大于真实物理空间

操作系统精髓-内存管理、调度及其他基础总结

二、虚拟内存技术

虚拟内存技术用于解决系统内存太小的问题,传递的扩充内存的做法有如下两种:

2.1、传统虚拟内存技术

2.1.1、覆盖技术

覆盖技术实现了小内存允许大程序的目标。它将程序分为不同的模块,不会同时运行的模块分配到同一内存空间中,模块按时间分时执行。

操作系统精髓-内存管理、调度及其他基础总结

缺点

(1) 设计开销,程序员要划分模块和确定覆盖关系,编程复杂度增加了

(2) 覆盖模块从外存装入内存,实际是以时间来换空间。

2.1.2、交换技术(unix系统)

交换技术将暂时不能运行或空闲的程序换入(swap in)磁盘中以节约内存的使用,当需要使用到程序时,再从磁盘中换出(swap out),这一项技术在unix/linux系统中得以应用

操作系统精髓-内存管理、调度及其他基础总结

缺点

换入换出需要的开销大、时间多

2.2、现代虚拟内存技术

采用小部分存在于内存中,大部分存在与磁盘中的思想,将程序中经常使用的一部分数据放入内存,而不经常使用的数据放入磁盘中,就可以实现优化内存使用大目的。

虚拟内存 = 内存 + 内存置换算法 + 磁盘

操作系统精髓-内存管理、调度及其他基础总结

2.2.1、程序局部性原理-数组i,j和j,i遍历问题

程序在运行时,其内存分配空间存在一定的连续性,在同一页中可以直接获取。

由于程序局部性原理,在声明数组array[i][j]时,每一行都是一个局部的整体,会在内存中以同一页的方式出现。如果按照列来遍历时,每次取值都会从不同的页中去获取,由于内存中不存在该页,所以会频繁地发生缺页中断,导致开销变大很多。

2.2.2、页面置换算法

在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。

页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。

页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。

(1) 最佳置换算法

OPT, Optimal replacement algorithm

所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。

是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。

(2) 最近最久未使用

LRU, Least Recently Used

LRU 将最近最久未使用的页面换出。

为了实现 LRU,需要在内存中维护一个所有页面的链表。当一个页面被访问时,将这个页面移到链表表头。这样就能保证链表表尾的页面是最近最久未访问的。

因为每次访问都需要更新链表,因此这种方式实现的 LRU 代价很高。

(3) 最近未使用

NRU, Not Recently Used

每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。

NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。

(4) 先进先出

FIFO, First In First Out

选择换出的页面是最先进入的页面。

该算法会将那些经常被访问的页面也被换出,从而使缺页率升高。=

(5) 第二次机会算法

FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问题,对该算法做一个简单的修改,会考虑该页面是否是经常使用到的**。

(6) 时钟

Clock

第二次机会算法需要在链表中移动页面,降低了效率。时钟算法使用环形链表将页面连接起来,再使用一个指针指向最老的页面。

操作系统精髓-内存管理、调度及其他基础总结

三、文件系统相关和寻址相关

为什么32位操作系统内存最大为4GB,64位内存最大又为多少?

  1. 32位系统的寻址范围在2^ 32,每个地址所占用1个字节(8bit),所以2^ 32 * 8bit = 4GB
  2. 64位系统的寻址范围理论上为2^64,但是目前最大就是256GB

四、其他基础问题

4.1、操作系统中的栈和堆指的是什么

  1. 栈(操作系统):由编译器自动分配释放 ,存放函数调用、函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。栈的内容存放在一级缓存中,在函数调用完毕后自动弹栈释放。
  2. 堆(操作系统): 需要手动释放或者由虚拟机释放,存在与二级缓存中,在堆中分配的是各种内存操作系统的堆内存分配方式是链表状的。
  3. 用户栈:用户栈指的是用户态程序所能使用的栈,其地址空间位于用户态地址空间,程序的调用会产生栈帧入栈,调用完毕会弹栈。
  4. 内核栈:内核栈和用户栈作用相似,位于内核态空间中。

4.2、操作系统中有哪些进程调度算法

4.2.1、批处理操作系统

1.1 先来先服务 first-come first-serverd(FCFS)

非抢占式的调度算法,按照请求的顺序进行调度。

有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

1.2 短作业优先 shortest job first(SJF)

非抢占式的调度算法,按估计运行时间最短的顺序进行调度。

长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

1.3 最短剩余时间优先 shortest remaining time next(SRTN)

最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

4.2.2、交互式操作系统

(1)2.1 时间片轮转

将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实时性就不能得到保证。

操作系统精髓-内存管理、调度及其他基础总结

(2)优先级调度

为每个进程分配一个优先级,按优先级进行调度。

为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

(3)多级反馈队列

一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。

多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。

每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。

可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

操作系统精髓-内存管理、调度及其他基础总结

4.3、批处理操作系统和分时操作系统

  1. 批处理操作系统:批处理操作系统是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。批处理操作系统不具有交互性,它是为了提高CPU的利用率而提出的一种操作系统。批处理操作系统可以分为多道和成批两种:

1.多道:在内存中同时存放多个作业,一个时刻只有一个作业运行,这些作业共享CPU和外部设备等资源。2.成批:用户和他的作业之间没有交互性。用户自己不能干预自己的作业的运行,发现作业错误不能及时改正。

  1. 交互操作系统:在交换操作系统中,存在着大量用户干预的操作,用户可以通给给操作系统发送指令去动态地调整和干预程序的运行。

4.4、select和epoll的作用是什么,有什么区别

select和epoll都是操作系统中的内核函数,它们的作用都是实现IO多路复用。

区别在于select会将fd放入数组中,数组容量最多为1024个,所以只能遍历监听1024个fd;而epoll将fd以红黑树的形式组织起来,不限制容量,并且采用监听通知的方式,无需遍历,效率高了很多。

1.文件描述符(FD)

在Linux中,一切皆可视为文件,当打开或创建一个文件时,内核就会返回文件描述符,使用文件描述符可以定位到该文件

2.Socket也可视为一种文件描述符,每个Socket中包括了目标IP、目标端口、通信协议。

简单地讲,select的效率低于epoll,因为它需要对Socket列表进行遍历,并大量拷贝fd_set;而epoll是基于响应事件的方式,不需要进行大量的fd拷贝。

五、存储器结构及高速缓存

5.1、存储器结构

操作系统精髓-内存管理、调度及其他基础总结

存储器结构从顶层至下层分为:寄存器、高速缓存、内存、磁盘,存取速度越来越慢,存储大小越来越大,制造成本越来越低。

5.2、高速缓存的作用

操作系统精髓-内存管理、调度及其他基础总结

高速缓存的作用是缓存内存中的数据块,在高速缓存空间不足时通过置换算法将缓存淘汰(高速缓存就相当于内存的“缓存”)。在读取内存数据时首先会判断高速缓存中是否含有该数据,如果存在则返回,如果不存在则为其添加缓存,以加快数据读取的效率。(程序局部性原理一般发生在高速缓存之中)。