操作系统
进程管理、内存管理、文件管理、设备管理
- 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
- 文件管理:完成文件的读、写、创建及删除等功能。
- 进程管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等功能。
- 内存管理:完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
1 虚拟内存
程序需要被载入内存才能被调度和执行,在没有虚拟内存时,物理内存便是程序的地址空间,程序的地址空间受限于物理内存的大小。有了虚拟内存,通过对虚拟内存和物理内存进行划分,将程序运行所需要的部分载入物理内存中,建立虚拟内存和物理内存之间的映射,程序不必全部载入
虚拟内存(Virtual Memory):作为进程访问主存(物理内存)的桥梁并简化内存管理
-
隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应。每个进程都认为自己拥有了整个物理内存,进程之间彼此隔离,一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
-
提升物理内存利用率:有了虚拟地址空间后,操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存。
-
简化内存管理:进程都有一个一致且私有的虚拟地址空间,程序员不用和真正的物理内存打交道,而是借助虚拟地址空间访问物理内存,从而简化了内存管理。
-
多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。
-
提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性。
-
提供更大的可使用内存空间:可以让程序拥有超过系统物理内存大小的可用内存空间。这是因为当物理内存不够用时,可以利用磁盘充当,将物理内存页(通常大小为 4 KB)保存到磁盘文件(会影响读写速度),数据或代码页会根据需要在物理内存与磁盘之间移动。
[! note]
受限于物理内存的大小,程序可能一次性无法完全载入内存,因此有了虚拟内存的概念。程序有自己的逻辑地址空间,并映射到物理内存。程序可以不必全部载入内存,而只载入需要的部分。虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。
为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。
这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。
虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序成为可能。
[!note] 虚拟内存、常驻内存和共享内存
- 虚拟内存:指系统用分段,分页的方法把物理内存划分,映射给进程看到的连续的虚拟地址空间。好处允许多程序隔离,内存可以超过物理上限。可能有性能开销,页面抖动。
- 共享内存:多个进程共享一片物理内存,允许同时访问,可以用来进程间通信和共享数据。
- 常驻内存:未被交换给磁盘的常用部分页
页表是存储在内存里的,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的工作。
2 页表、段表
-
把虚拟内存地址,切分成页号和偏移量;
-
根据页号,从页表里面,查询对应的物理页号;
-
直接拿物理页号,加上前面的偏移量,就得到了物理内存地址。
通过段表找到段基地址,与段界限判断,加上偏移量
3 页面置换算法
-
最佳页面置换算法(OPT,Optimal):优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,只是理论最优的页面置换算法,可以作为衡量其他置换算法优劣的标准。
-
先进先出页面置换算法(FIFO,First In First Out) : 最简单的一种页面置换算法,总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法易于实现和理解,一般只需要通过一个 FIFO 队列即可需求。不过,它的性能并不是很好。
-
最近最久未使用页面置换算法(LRU ,Least Recently Used):LRU 算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 T,当须淘汰一个页面时,选择现有页面中其 T 值最大的,即最近最久未使用的页面予以淘汰。LRU 算法是根据各页之前的访问情况来实现,因此是易于实现的。OPT 算法是根据各页未来的访问情况来实现,因此是不可实现的。
-
最少使用页面置换算法(LFU,Least Frequently Used) : 和 LRU 算法比较像,不过该置换算法选择的是之前一段时间内使用最少的页面作为淘汰页。
-
时钟页面置换算法(Clock):可以认为是一种最近未使用算法,即逐出的页面都是最近没有使用的那个。
4 内存分区,进程内存映象,linux内存模型
-
内存分区(Memory Partitioning): 内存分区是指将计算机的物理内存划分成不同的区域,每个区域用于存储不同类型的数据。常见的内存分区包括:
-
代码段(Code Segment):存储程序的执行代码。
-
数据段(Data Segment):存储全局变量等数据。
-
堆(Heap):用于动态分配内存,由程序员进行手动管理。
-
栈(Stack):用于存储函数调用的局部变量、函数参数等。
-
-
进程内存映像(Process Memory Image): 进程内存映像是指一个运行的进程在内存中的布局和组织。它包括以下部分:
-
代码段:存储进程的执行代码。
-
数据段:包括初始化的全局变量和静态变量。
-
堆:用于动态分配内存,比如通过
malloc
和free
。 -
栈:存储函数调用的局部变量、函数参数等。
进程内存映像使得操作系统能够有效地管理多个进程,并确保它们之间不会相互干扰。
-
-
Linux内存模型: Linux操作系统采用了分页机制来管理内存,其中有两个关键概念:
-
虚拟内存(Virtual Memory):允许程序使用比实际物理内存更大的地址空间。这使得每个进程都有独立的地址空间,提高了系统的稳定性和安全性。
-
分页(Paging):将物理内存划分成大小固定的页面,与虚拟内存中的页面相对应。当一个程序需要访问某个页面时,操作系统将其加载到物理内存中。这有助于提高内存的利用率和管理效率。
-
5 中断的基本框架,以键盘中断为例
中断是计算机系统中一种异步事件处理的机制,允许系统在执行当前任务的同时响应外部事件。以下是处理中断的基本框架,以键盘中断为例:
-
中断发生:
-
用户按下键盘上的某个键触发中断,键盘控制器产生中断请求(IRQ)。
-
硬件层处理:
-
CPU检测到中断请求,停止当前执行的任务。
-
CPU保存当前执行任务的上下文(程序计数器、寄存器等)。
-
中断向量表:
-
硬件通过中断向量表确定中断的类型和处理程序的入口地址。
-
在键盘中断的情况下,中断向量表会指向处理键盘中断的中断服务程序。
-
中断服务程序(Interrupt Service Routine,ISR):
-
控制权转移到相应中断的处理程序。
-
在键盘中断的情况下,键盘中断服务程序负责处理键盘输入。
-
软件层处理:
-
中断服务程序执行完毕后,CPU从中断返回指令(iret)返回到之前被中断的任务。
-
恢复之前保存的任务上下文。
-
继续执行任务:
-
控制权返回到之前被中断的任务,任务继续执行。
在这个基本框架下,中断服务程序是中断处理的核心。键盘中断服务程序将负责读取键盘输入、更新相应的数据结构、触发事件等。整个中断处理流程实现了异步事件的响应,使得系统能够在执行任务的同时处理来自外部的事件,提高了系统的响应性。