20250117面试鸭特训营第25天
更多特训营笔记详见个人主页【面试鸭特训营】专栏
250117
1. 什么是用户态和内核态?
用户态(User Mode)
和内核态(Kernel Mode)
是操作系统中的两种运行模式,用于区分应用程序与操作系统内核的操作权限。
用户态(User Mode)
- 权限
- 应用程序在用户态下运行,权限较低,不能直接访问硬件或进行特权操作和敏感操作。
- 应用程序需要通过系统调用与内核进行通信,由内核代为执行敏感操作。
- 安全性
- 用户态的优势是安全性高,即使程序出现问题也不会影响操作系统的稳定性和安全性。
- 应用程序在用户态下崩溃通常不会对系统的其他部分产生影响。
- 执行内容
- 应用程序(如浏览器、文本编辑器等)通常运行在用户态。
- 当这些程序需要操作硬件资源(如磁盘、网络或显示器)时,它们不能直接访问这些资源,而是通过系统调用请求操作系统内核的帮助。
内核态(Kernel Mode)
- 权限
- 内核态是操作系统内核运行的模式,具有最高的权限,可以直接访问硬件资源和执行各种特权操作(如内存管理、进程调度)。
- 安全性
- 由于内核态具有最高权限,内核态的代码错误或漏洞,可能会导致系统崩溃,也可能会被一些坏怂利用,存在安全隐患,相较于用户态安全性较低。
- 执行内容
- 操作系统的核心运行在内核态。
- 负责管理系统资源、调度任务、提供硬件抽象、处理中断、管理文件系统等。
- 当程序执行系统调用或硬件中断时,操作系统会将其切换到内核态。
上下文切换
-
- 当一个用户程序需要执行更高权限的操作(如文件读写、网络通信等),他会发起一个【系统调用】,请求操作系统进入内核态来完成这些操作。
- 用户态切换到内核态的过程被成为**【上下文切换】**。
- 内核态执行完毕后会切换回用户态,继续执行用户程序。
-
上下文切换时,需要保存当前进程的寄存器、状态和堆栈等信息,并加载内核态的状态以处理系统调用。
-
上下文切换的成本较高,所以优化系统性能时,需要减少不必要的系统调用和状态切换。
-
- 举例说明
- 用户态:当我使用浏览器浏览网页时,浏览器本身在用户态运行。
- 内核态:当浏览器需要与网络进行通信,或者,需要从硬盘读取网页资源时,操作系统会切换到内核态来处理这些操作。
类比理解用户态和内核态
- 用户态是驾驶员,内核态是汽车发动机。
- 驾驶员(用户态程序)可以操控方向盘、油门和刹车,但无法控制发动机的内部运作。
- 发动机的内部运作(内核态)由专门的操作系统来处理,驾驶员通过踩油门或刹车(系统调用)简介控制发动机。
- 这种设计保证了即使驾驶员做出不当操作,车辆的核心部件也能保持正常运作。
设计内核态和用户态的原因
- 安全性
- 用户态和内核态的划分确保了普通应用程序无法直接访问硬件资源或执行敏感操作,避免了程序或用户恶意操作对系统核心的破坏。
- 防止应用程序随意读写内存或控制硬件设备,保护了操作系统和其他应用的安全。
- 稳定性
- 通过在内核态中运行关键系统服务(如内存管理、文件系统、设备驱动等),操作系统可以对资源进行集中管理和保护。
- 如果某个应用程序崩溃,只会应用用户态中的进程,不会影响到整个系统。
- 访问控制
- 通过设置不同的权限级别,操作系统能够更好地控制对资源的访问。
- 只有在内核态下,操作系统才有权对硬件资源进行操作,而用户态程序必须通过系统调用请求内核服务。
- 这种设计确保了对资源系统的统一管理。
- 性能优化
- 虽然用户态和内核态的切换有一定开销,但这种设计可以减少用户程序直接操作硬件带来的复杂性,避免频繁的资源争夺和死锁问题,从而提升系统的整体性能。
表格对比
特性 | 用户态 (User Mode) | 内核态 (Kernel Mode) |
---|---|---|
权限 | 受限,无法直接访问硬件或系统资源 | 具有最高权限,能够直接访问硬件和系统资源 |
执行内容 | 应用程序、用户进程 | 操作系统内核,系统调用和驱动程序 |
访问范围 | 只能访问应用程序内存, 无法直接访问内核内存 | 可以访问所有内存,包括内核空间和硬件资源 |
安全性 | 高,用户程序出错通常不会影响整个系统 | 低,内核错误可能导致整个系统崩溃或安全问题 |
CPU指令权限 | 只能执行非特权指令 | 能执行特权指令(如I/O操作、内存管理、硬件访问等) |
切换方式 | 通过系统调用或中断机制进入内核态 | 内核执行完毕后,通过上下文切换回到用户态 |
典型应用 | 浏览器、文本编辑器、游戏等应用程序 | 操作系统内核、设备驱动程序、文件系统、网络协议栈等 |
崩溃影响 | 崩溃通常只影响当前应用程序 | 崩溃可能导致整个操作系统崩溃或严重的安全问题 |
2. 到底什么是 Reactor?
- Reactor 是一种【用于处理并发 I/O 事件】的设计模式,特别适合于高并发、低延迟的系统(如网络服务器的开发)。
- 它通过实践驱动机制和非阻塞 I/O ,能够高效地处理大量并发连接。
- Reactor 模式的核心思想是【将 I/O 事件与响应的处理程序解耦】,并通过事件分发器来管理事件和响应操作(通过【事件分发】和【事件处理】的机制来避免阻塞I/O操作,并提高资源的利用率。)。
Reactor 的工作方式
- 事件驱动
- Reactor 通过监听多个事件源(如 Socket 连接、读写事件),在有事件发生时调用对应的处理程序(Handler)。
- 非阻塞 I/O
- 使用非阻塞 I/O 模型,Reactor 能够在多个或少数线程中高效处理大量 I/O 操作,避免了线程的频繁切换。
- 事件分发与处理
- Reactor 会将接收到的事件(如连接可达、数据可读、数据可写)分发给响应的事件处理器,处理器对事件进行处理。
Reactor的核心组件
-
Reactor(事件反应器)
- 负责等待和分发事件。
- 它通常封装了一个多路复用器(如
select
、epoll
),在事件到达时将其分发给相应的事件处理器。
-
Handler(事件处理器)
- 每个事件处理器与一个具体的 I/O 事件绑定,如读、写、连接等。
- Handler 定义了在事件发生时应该执行的逻辑。
-
Acceptor
- 在服务器端,
Acceptor
用于接受新的客户端连接,并为每个新连接分配一个 Handler 进行后续的数据处理。
- 在服务器端,
Reactor的工作流程
- Reactor 通过多路复用器监听多个通道(如SocketChannel),等待事件(如连接到达、数据可读等)的发生。
- 当某个通道有事件发生时,Reactor 将事件分发给相应的 Handler 。
- Handler 根据事件类型执行相应的操作,如读取数据、写入数据或处理业务逻辑。
- 事件处理完成后,Reactor 继续监听其他事件。
3. 为什么要有虚拟内存?
- 虚拟内存的主要作用是【提升系统效率和简化内存管理】。
内存拓展能力
-
物理内存是有限的,如果程序使用的内存超过了物理内存的大小,需要借助虚拟内存。
-
虚拟内存允许操作系统把磁盘空间作为拓展内存的一部分,允许程序运行在比实际物理内存大的地址空间上。
-
即使物理内存不足,系统也可以通过交换(swapping)将不常用的内存页移到磁盘中,使得多个程序能够同时运行。
进程隔离
- 每个进程拥有独立的虚拟地址空间,防止进程间的内存访问冲突,实现了进程隔离。
- 如果一个进程崩溃,只会影响到自己的虚拟内存空间,不会影响其他进程,提高系统稳定性和安全性。
- 使用虚拟内存,操作系统可以通过页面表设置访问权限,防止非法访问。
简化内存管理
- 操作系统可以更灵活地分配和回收内存,无需手动考虑物理内存分布问题。
- 虚拟内存可以将程序逻辑地址和物理地址解耦。