用户态和内核态
用户态(User Mode)和内核态(Kernel Mode)是两种不同的权限级别,用于限制程序对计算机硬件和系统资源的访问。这种权限级别的划分是为了确保系统的稳定性和安全性。
用户态是指程序在正常运行时的权限级别。用户态可以执行cpu调用的非特权指令
- 程序只能访问受限的系统资源,如应用程序的内存空间和部分硬件资源。
- 用户态下的程序不能直接访问操作系统的关键部分和敏感资源,例如硬件中断控制器、时钟、内存管理单元等
内核态是指操作系统内核(Kernel)运行时的权限级别。在内核态下,程序具有对系统的完全控制权,可以直接访问所有硬件资源和系统数据结构,执行特权指令,以及响应硬件中断。内核态可以执行特权指令和非特权指令
用户态——>内核态:系统调用中断 内核态——>用户态:特权指令
中断: 当发生中断时,cpu立即进入内核态;当发生中断后,当前进程暂停运行,并由操作系统内核对中断进行处理;对于不同的中断信号,会进行不同的处理 中断分为内中断和外中断。
系统调用
在操作系统中,系统调用(system call)是运行在用户空间的程序请求操作系统内核提供服务的主要方式。系统调用为用户程序提供了一种方法来请求操作系统核心层的资源和服务,如文件操作、进程控制和网络通信等。 系统调用通常通过软件中断(software interrupt)或陷阱(trap)来实现。在执行系统调用时,程序会触 发一个软件中断,并将系统调用的编号(通常称为系统调用号或系统调用码)和任何必要的参数放置在特定的寄存器或内存位置。然后,控制权传递给操作系统内核,它会根据提供的系统调用号执行相应的服务。
虚拟内存
目的:隔离进程,让物理内存扩充成更大的逻辑内存,方便了内存管理。
地址空间:为了更好的管理内存,操作系统将内存抽象成地址空间,每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。
地址空间页的映射:不需要映射到连续的物理内存 ,不需要所有页都必须映射到物理内存,允许一个程序不需要全部调入内存就可以运行。
虚拟内存是计算机操作系统中的一种内存管理技术,它通过将物理内存(RAM)和磁盘上的存储空间结合起来,为每个进程提供一个抽象的,似乎连续很大的内存空间。
基本工作原理:将进程的虚拟地址空间划分为固定大小的块,称为页面,将物理内存划分为相同大小的页面。当程序访问虚拟内存时,操作系统会根据需要将相应的页面从磁盘或其他存储介质加载到物理内存中。如果物理内存不足,操作系统会将一些不常用的页面交换到磁盘上,从而腾出空间来满足当前活动页面的需要。
虚拟内存(虚拟内存是现代操作系统为每一个进程分配相互隔离的很大的内存空间(4G(32位系统)),各应用程序进程不是直接访问物理内存地址,而是访问虚拟内存地址,通过查询页表(多级页表,快表)查询到对应的虚拟内存,页表为页式管理的虚拟-物理内存建立映射关系。当首次读写 touch 到未建立映射的内存时,会触发缺页中断,CPU 由用户态陷入内核态,调用缺页中断处理程序分配实际物理内存并且建立内存映射,再由内核态返回用户态继续服务应用程序进程)
缺页异常
缺页异常是指程序试图访问尚未调入主纯的页面,并且这个页面当前不再内存中时,会产生异常。在虚拟内存系统中,物理内存被划分成大小相等的页(通常为4KB或其他大小),而程序的地址空间也被划分成相应大小的页面。是操作系统中比较常见的现象。
发生原因:
- 首次访问:程序的某一部分在程序执行过程中首次被访问。页面尚未加载到物理内存
- 页面被交换到磁盘中:操作系统为了腾出物理内存空间,将不常用的页面交换到磁盘上。
处理方式:
- 访问未调入内存的页面: 当程序访问一个尚未被调入物理内存的页面时,即该页面当前在硬盘上,操作系统会触发缺页异常。
- 页面调入内存: 操作系统会根据缺页异常将相应的页面从硬盘调入物理内存中,然后更新页表等数据结构,使得该页面在合适的虚拟内存地址上有一个有效的映射。
- 重新执行引起缺页异常的指令: 一旦缺页异常被处理,引起异常的指令将被重新执行,此时该页面已经在内存中,访问就可以正常进行。
缺页异常发生时的具体流程:
- 用户态——>内核态,发生缺页中断时,操作系统会将控制权从用户态切换到内核态,
- 调用缺页中断处理程序。处理程序的主要任务是为缺失的页面找到一个合适的物理内存页,并将其加载到内存中,
- 然后更新页表,建立虚拟地址到物理地址的映射关系。
- 内核态——>用户态,让程序继续执行。
分页机制
分页机制将物理内存和虚拟内存分成固定大小的块,称为页(Page)。同样,虚拟内存也被划分为相同大小的页面。操作系统通过页表(Page Table)来跟踪虚拟内存和物理内存的映射关系。
-
地址转换: 当程序访问虚拟内存时,操作系统将虚拟地址划分成页号和偏移量。
通过页表查询,找到虚拟页号对应的物理页框号。
将物理页框号与偏移量组合,得到实际的物理地址。 -
页面置换: 当物理内存不足时,操作系统使用页面置换算法将一些页从物理内存中换出到磁盘上。
从磁盘上选择一些页调入物理内存。
更新页表,维护新的映射关系。
分段机制
分段机制将程序的地址空间划分成不同的段,每个段具有不同的属性和权限。与分页不同,分段的大小是不固定的。
-
地址转换:
通过段表(Segment Table)来管理虚拟内存到物理内存的映射关系。
虚拟地址由段号和偏移量组成。
通过查询段表,找到虚拟地址对应的段的基址,再加上偏移量,得到实际的物理地址。 -
段页式(Segmentation with Paging):
结合了分页和分段的优点,通过分段划分逻辑地址空间,再在每个段内使用分页。
通过段表找到段的基址,然后通过页表找到具体的页框号。
分段和分页区别
-
地址映射方式:
- 分页: 虚拟地址被划分成固定大小的页面,物理地址也被划分成相同大小的页框。通过页表将虚拟页映射到物理页框。
- 分段: 虚拟地址被划分为不同的段,每个段具有不同的属性和权限。通过段表将虚拟地址映射到物理地址。
-
大小灵活性:
- 分页: 页面的大小是固定的,通常为4KB或其他常见的大小。程序的地址空间是由许多相等大小的页面组成。
- 分段: 段的大小可以是不固定的,每个段的大小根据程序需要而定,允许程序有更大的灵活性。
-
*碎片问题:
- 分页: 由于固定大小的页面,可能会出现内部碎片,即一个页面中有一部分空间未被充分利用。
- 分段: 分段机制相对于分页来说,更容易处理内部碎片问题,因为段的大小可以根据程序的特性来确定。
-
程序的组织方式:
- 分页: 更适合组织线性地址空间,例如数组、矩阵等数据结构。
- 分段: 更适合组织非线性的地址空间,例如代码段、数据段、堆段等。
-
管理方式:
- 分页: 管理方式更加简单,页表中的条目数量相对较少,可以通过单级页表或多级页表来实现。
- 分段: 管理方式相对复杂,因为需要处理不同段的不同属性和权限,可能需要更复杂的段表结构。
-
页表访问频率:
- 分页: 由于页的大小通常较小,页表可能需要更频繁地被访问,特别是对于大型程序。
- 分段: 段表的访问频率相对较低,因为段的大小可以更大,减少了访问段表的次数。
CPU调度算法,多核下怎么处理
-
单核心调度算法:
- 先来先服务(FCFS): 按照任务到达的顺序进行调度。
- 短作业优先(SJF): 选择执行时间最短的任务。
- 轮转调度(Round Robin): 将任务按照顺序分配给每个核心,每个任务执行一小段时间(时间片),然后轮转到下一个任务。
-
多核心调度算法:
- 对称多处理(SMP): 多个核心共享系统内存,任务可以在任何一个核心上执行。常见的对称多处理系统包括多核处理器和多处理器系统。
- 非对称多处理(ASMP): 不同的核心具有不同的角色,例如一个核心负责执行用户任务,另一个核心负责执行内核任务。
- 多队列调度: 操作系统维护多个任务队列,每个队列分配给一个核心。任务按照优先级分配给队列,每个核心独立调度自己的队列。
- 负载均衡: 操作系统监控各个核心的负载,并根据负载情况将任务动态地分配给负载较低的核心,以实现负载均衡。
-
多线程和并行计算:
- 任务并行: 将一个大任务分解成多个小任务,分别由不同的核心执行,以提高整体性能。
- 数据并行: 将数据分割成多份,每个核心处理一份数据,适用于需要大量数据处理的场景。
操作系统有哪些算法支持高效的内存的申请与释放,同时最大化的减少碎片。
快速适应算法(Quick Fit):
原理: 将内存分为多个大小相等的链表,每个链表对应一个固定大小的块。根据请求的大小选择合适的链表。
优点: 减少搜索时间,可以快速找到合适大小的内存块。
缺点: 可能会浪费部分空间,可能导致内部碎片。