操作系统——基础认识——内存管理
操作系统——基础认识

每天一个计算机知识:操作系统基础
一、定义
站在用户视角,操作系统是一个为用户提供便捷、高效使用计算机环境的软件集合。但它的真正使命是:高效地管理硬件资源,并为上层软件提供统一且便捷的服务接口。
它的四个核心设计目标:
1、方便性**:**隐藏底层硬件细节,用户不必直接操控磁盘磁头或外设寄存器。
2、有效性**:**既要提升CPU、内存等资源的利用率,又要通过多道程序设计等技术提高系统吞吐量。
3、可扩充性**:**能够方便地增添新功能、支持新硬件,这要求系统架构具有良好的模块化与可修改性。
4、开放性**:**遵循国际标准,支持不同厂商的硬件与软件协同工作,如POSIX标准确保了UNIX系操作系统的互通。

二、功能
从资源管理的角度看,操作系统就是各类硬件资源的管理者,主要分为五大功能:
1、处理机管理:决定哪个程序可以使用CPU,何时使用,这对应着进程调度。
2、存储器管理:负责内存的分配与回收、地址转换、内存保护,以及实现虚拟存储器,让程序拥有比物理内存大得多的地址空间。
3、设备管理:对所有的I/O设备统一控制,处理中断、提供缓冲、实现设备的分配与虚拟化(如SPOOLing技术让独占打印机变为多用户共享)。
4、文件管理:把外部存储器上的数据组织为文件,提供按名存取、权限控制、空间分配等功能。
5、用户接口:提供用户与系统交互的途径,包括命令接口(命令行)、程序接口(系统调用)和图形用户接口(GUI)。
三、特征
这四个特征互为因果,共同定义了操作系统的运行方式。
并发:并发是操作系统最根本的特征。它指两个或多个事件在同一时间间隔内发生。宏观上“同时进行”,微观上交替执行。注意区分并发与并行:并行是两个事件在同一时刻严格同时执行,需要多核硬件支持;而并发是单核条件下通过快速轮转实现的多任务假象。操作系统正是为了让多道程序并发执行而引入的,也因此引发了进程同步、互斥、死锁等一系列核心问题。
共享:共享指系统中的资源可供多个并发执行的进程共同使用。分为两种:
- 互斥共享:一段时间内只允许一个进程访问,如打印机、某些共享数据。
- 同时共享:宏观上允许多个进程同时访问,但微观上可能仍交替进行,如磁盘可以多个进程的请求交替读写。
并发与共享互为条件:没有并发,共享失去意义;没有共享,并发无法实现有效的资源共享。
虚拟:虚拟是将一个物理实体映射为若干个逻辑上的对应物,使用户感觉到独占使用。这是通过复用技术实现的:
- 时分复用:如CPU分时调度,让每个进程感觉独占CPU;虚拟存储器将磁盘空间当内存用,让程序觉得拥有超大连续内存。
- 空分复用:如将内存划分成多个逻辑独立的分区,每个进程都觉得自己独占了整个内存区域。
虚拟技术极大地提升了资源利用率和用户体验,是操作系统魔法般的抽象能力。
异步:异步也称不确定性。由于进程的并发执行,它们会以不可预知的速度推进,随时可能被打断或挂起。所以,进程的每次执行顺序和完成时间都是不确定的。操作系统必须确保任何时刻都能正确响应任意时刻到来的中断,并保证程序在多次执行下的最终结果一致。这一特性使得设计时必须考虑同步与互斥机制,确保结果的确定性。
四、核心运行机制
如果说并发是操作系统的表象,那么中断就是支撑并发的物理基石,而系统调用则是程序通往内核的唯一大门。
中断:现代CPU只有在发生中断或异常时,才会从用户态强制切回内核态,从而为操作系统执行的机会。没有中断,操作系统就无法重新获得CPU控制权,多道程序并发也就无从谈起。中断分为以下几类:
1、外中断(硬中断),来自CPU外部,如I/O设备完成通知、时钟中断。时钟中断尤其重要,它为操作系统提供了定期夺回CPU的能力,是实现时间片轮转调度的基础。
2、内中断(异常/陷入),来自CPU内部指令执行时发生的意外,如除以零、非法指令、访存越界、缺页等。此外,程序故意触发的软件中断(陷入指令),就是系统调用的进入点。
中断处理流程:

系统调用:操作系统通过内核提供一组精确定义的“应用程序编程接口”,即系统调用。例如,创建进程(fork)、读写文件(read/write)、申请内存(brk)等。应用程序绝对不能直接执行特权指令,必须通过系统调用委托内核代为执行。
典型执行过程(以Linux为例):

系统调用的存在,既保证了内核的安全,又为程序提供了功能强大的服务,是用户程序与操作系统沟通的桥梁。
五、操作系统体系结构
根据内核功能的组织方式,主要分为两大流派:
大内核(宏内核):将所有基本功能(进程调度、内存管理、文件系统、设备驱动)都集成在一个内核进程中,共享内核空间。优点是各模块通信开销小,性能高;缺点是结构庞大,一个模块的错误可能导致整个系统崩溃。Linux、Unix是典型代表。
微内核:只将最核心的功能(如中断处理、进程通信、基本调度)放入内核,其他如文件系统、设备驱动都作为用户进程运行,通过内核提供的消息传递机制通信。优点是结构清晰、可靠性高、易于扩展;缺点是频繁的消息传递会带来较大的运行开销,性能相对较低。鸿蒙系统内核、Mach(曾为Mac OS X所用)是代表。
许多现代操作系统还融合了分层、可加载模块等思想,实现兼顾性能与灵活性的混合内核,但万变不离其宗。
操作系统——内存管理
每天一个计算机知识点:内存管理
操作系统内存管理是计算机系统的核心功能之一,主要负责对计算机内存资源进行分配、回收、保护及优化,以确保多道程序高效、安全地运行。其根本目标是在有限的物理内存中,为多个进程提供逻辑上独立且充足的地址空间,同时最大化内存利用率并减少访问延迟。
一、内存地址
内存地址有两种,分别是逻辑地址和物理地址。
| 逻辑地址(相对地址/虚拟地址):程序在编译、链接后形成的地址空间,从0开始连续编址,是程序视角的地址。 |
|---|
| 物理地址(绝对地址):实际内存单元的硬件地址,从内存芯片的0号存储单元开始。 |
程序只有在运行时才分配到实际的物理内存,因此需要地址重定位,即把逻辑地址转换为物理地址,也就是常说的地址映射。

地址重定位的方式有两种,分别是静态重****定位和动态重定位。
静态重定位:在程序装入内存时,由软件(装入程序)一次性将所有逻辑地址修改为物理地址。这种方式要求程序装入后地址固定,不能移动,灵活性差。
动态重定位:在程序执行过程中,每次访存前,由硬件地址变换机构把逻辑地址加上一个重定位寄存器(基址寄存器)的值,形成物理地址。基址寄存器存放程序在内存中的起始物理地址。这样程序装入后仍可在内存中移动,是实现虚存的基础。
二、内存分配
早期的内存管理采用连续分配方式,即为一个进程分配连续的内存空间。这种方式简单但容易产生外部碎片,导致内存利用率低下。现代操作系统普遍采用非连续分配方式,主要包括分页存储管理和分段存储管理,以及两者的结合,段页式存储管理。
分页存储管理的基本思想是将逻辑地址空间分成固定大小的页,物理内存分成同样大小的页框(帧)。页面大小通常为4KB。分配时以页框为单位,进程的页面可以装入任何空闲页框,不要求连续。页表是系统为每个进程建立一张页表,记录页号到页框号的映射。逻辑地址高位为页号,低位为页内偏移。地址变换时,用页号查页表得到页框号,再拼接偏移量形成物理地址。

硬件提供****页表寄存器,存放页表起始物理地址和长度。每次访存先查页表,再做实际内存访问,因此至少两次访存(一次取页表项,一次读写数据)。这个速度问题由快表(TLB) 解决。TLB是高速缓存,存放最近使用的页表项,命中则只需一次访存。
多级页表:当逻辑地址空间很大时,页表本身可能极大。采用两级或多级页表,将页表再分页,只把用到的部分调入内存,节省页表占用空间。例如32位地址两级页表:页目录(10位)+页表索引(10位)+页内偏移(12位)。
反置页表:整个系统维护一张按物理页框号索引的表,记录每个页框被哪个进程的哪个页面占用。查找时需遍历,可结合哈希加速,可减少页表总内存占用,但地址变换稍复杂。
分段存储管理的产生是因为分页缺乏逻辑意义,一个程序通常由主程序、函数库、数据段、堆栈等逻辑单元组成。分段就是按这些逻辑单元将程序划分成不同段,每段从0编址,有独立名称和长度。段表是每个进程一张,记录段号到段基址和段长度的映射。逻辑地址由段号和段内偏移组成。段号查段表获得段起始物理地址,加上段内偏移。段表也有寄存器指示位置。若偏移超界,产生越界中断。
段页式存储是先分段再分页,每个段拥有自己的页表。逻辑地址由段号、段内页号、页内偏移组成。地址变换需三次访存(段表→页表→数据),同样靠TLB加速。它兼有段的逻辑优势与分页的物理管理优势。

三、虚拟内存
如果程序必须全部装入内存才能运行,可运行的程序大小就被物理内存牢牢限制。虚拟存储器突破了这个限制,它基于局部性原理(时间局部性和空间局部性)允许进程只装入部分页面或段即可运行,其余部分保留在磁盘,用到时再动态载入。当进程访问不在内存中的页面时,触发“缺页中断”,操作系统再从磁盘调入所需页面 。
请求分页系统,是最常用的虚拟存储器实现方式,在基本分页基础上增加了页置换功能。页表项扩展是除了页框号,还需状态位P(标识页面是否已装入内存)、访问字段A(记录访问情况用于置换算法)、修改位M(指示页面是否被修改,决定换出时是否需写回磁盘)、外存地址(页面在磁盘上的位置)。缺页中断是当程序访问的页面不在内存(P=0)时,硬件触发缺页中断。
处理流程:

缺页中断与一般中断的关键区别:它可以在指令执行中间产生,且处理后必须返回重新执行该指令(因为缺页导致指令未完成)。
页面置换算法(核心,必会计算缺页率),当需要调入页面而无空闲页框时,必须选择某一页淘汰。目标:降低缺页率。
| 最佳置换算法(OPT):淘汰未来最长时间不再被访问的页面。需要预知未来,无法实现,仅用作评价其他算法的理论标杆。 |
|---|
| 先进先出(FIFO):淘汰最早调入的页。实现简单,但可能淘汰常用页。注意Belady异常:给进程分配的物理块增多,缺页次数反而可能增加(FIFO特有)。 |
| 最近最久未使用(LRU):淘汰最近最久没有访问的页面。性能接近OPT,需要硬件记录访问次序(如栈或移位寄存器),开销大,常用近似实现。 |
| 时钟算法(Clock,又称NRU):给每页关联一个访问位A,页面被访问时硬件置A=1。置换时,循环扫描页面,遇到A=1则清0并跳过,直到找到A=0的页面淘汰。这是LRU的近似,性能较好,实现开销小,实际系统常用。 |
| 改进型时钟算法:同时考虑访问位A和修改位M。优先淘汰(A=0,M=0)的页,其次(0,1),然后(1,0),最后(1,1)。减少写回磁盘的开销。 |
工作集模式是进程在某一时间间隔Δ内需要访问的页面集合。W(t, Δ)。如果分配给进程的物理块数小于其工作集,进程将频繁缺页,大部分时间都在等待页面调入。多道度太高,分配给每个进程的物理块不足以容纳其工作集时,系统频繁出现缺页中断,大部分CPU时间都花在页面换入换出上,吞吐量急剧下降。就出现了抖动,
预防抖动的方法:
| 采用工作集策略,动态调整物理块分配。 |
|---|
| 控制多道度,监测CPU利用率和缺页率,必要时挂起部分进程(通过中级调度)。 |
| 采用“L=S”准则:使缺页平均时间L等于页面换出时间S。 |
四、内存保护与共享
保护:防止进程非法访问其他进程或操作系统的内存。分页系统中,页表项中添加保护位(读/写/执行),地址变换时硬件检查。分段系统中,段表拥有段长和权限控制,越界或越权即中断。
共享:多个进程的页表项映射到相同的物理页框,实现代码或数据共享。分段因逻辑段独立,共享更方便;分页则需让共享页出现在各进程页表中的相同页框号。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)