操作系统基本概念
定义
操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。本质上是一个运行在计算机上的软件程序 ,主要用于管理计算机硬件和软件资源。 它的存在屏蔽了硬件层的复杂性,就像是硬件使用的负责人,统筹着各种相关事项。内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
主要功能
- 进程和线程的管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等。
- 存储管理:内存的分配和管理、外存(磁盘等)的分配和管理等。
- 文件管理:文件的读、写、创建及删除等。
- 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
- 网络管理:操作系统负责管理计算机网络的使用。网络是计算机系统中连接不同计算机的方式,操作系统需要管理计算机网络的配置、连接、通信和安全等,以提供高效可靠的网络服务。
- 安全管理:用户的身份认证、访问控制、文件加密等,以防止非法用户对系统资源的访问和操作。
用户态与内核态
什么是用户态和内核态
- 用户态(User Mode) : 用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。当应用程序需要执行某些需要特殊权限的操作,例如读写磁盘、网络通信等,就需要向操作系统发起系统调用请求,进入内核态。
- 内核态(Kernel Mode):内核态运行的进程几乎可以访问计算机的任何资源包括系统的内存空间、设备、驱动程序等,不受限制,拥有非常高的权限。当操作系统接收到进程的系统调用请求时,就会从用户态切换到内核态,执行相应的系统调用,并将结果返回给进程,最后再从内核态切换回用户态。
为什么需要用户态/内核态
简单来说就是实现权限的隔离,将一些风险性高、可能影响系统稳定或者通用的功能封装起来,不允许随意调用,维持系统的安全和稳定,便于控制和管理, 并且提供某些功能的抽象和简化。
- 安全性:用户态和内核态的区分是操作系统设计中最重要的安全机制之一。用户态应用程序受限于访问权限,不能直接操作硬件资源和内核数据结构,从而防止恶意或错误的程序对系统资源造成破坏。只有操作系统内核才能在内核态下访问和操作这些资源。
- 稳定性:通过区分用户态和内核态,可以防止用户态应用程序的错误影响操作系统的稳定性。如果一个应用程序崩溃或出现错误,它只能影响自身的执行,不会影响操作系统内核和其他应用程序的运行。
- 控制和管理:操作系统通过内核态来控制和管理系统资源。用户态应用程序必须通过系统调用请求操作系统提供的服务,操作系统可以在这些请求中执行各种检查和控制措施,确保资源的合理分配和使用。这种设计使得操作系统能够更好地管理多任务并发和资源共享。
- 抽象和简化:区分用户态和内核态使得操作系统能够提供一致的接口和抽象,简化了应用程序的开发。开发人员不需要关心底层硬件的细节,只需通过操作系统提供的API接口进行操作。
用户态和内核态的切换方式
系统调用
系统调用是用户态进程主动请求内核服务的方式。用户进程通过系统调用进入内核态,操作系统执行请求的操作后再返回用户态。系统调用通常用于文件操作、进程控制、内存管理和设备控制等。
切换步骤:
- 用户态进程发起系统调用,通过库函数调用。
- 系统调用库函数执行特定的指令(如
int
、syscall
指令)触发软中断或陷阱。 - CPU 切换到内核态,保存当前进程的上下文。
- 跳转到内核中对应的系统调用处理例程。
- 内核完成请求的操作,将结果返回用户态。
- CPU 切换回用户态,恢复进程的上下文,继续执行用户态代码。
中断
中断是由硬件设备发起的异步事件,通知操作系统需要处理某个事件,例如 I/O 完成、中断请求等。中断处理程序在内核态执行。
切换步骤:
- 硬件设备发出中断信号,CPU停止当前执行的用户态进程。
- CPU 切换到内核态,保存当前进程的上下文。
- 跳转到内核中的中断处理例程。
- 内核处理中断请求,完成后返回中断前的执行点。
- CPU 恢复用户态进程的上下文,继续执行用户态代码。
异常
异常是由CPU检测到的同步事件,例如非法指令、除零错误、页面错误等。异常处理程序在内核态执行。
切换步骤:
- 用户态进程执行非法操作,触发异常。
- CPU 切换到内核态,保存当前进程的上下文。
- 跳转到内核中的异常处理例程。
- 内核处理异常,根据情况决定是否终止进程或修复错误。
- 处理完成后,CPU 恢复用户态进程的上下文(如果进程未被终止),继续执行用户态代码。
操作系统结构
操作系统的结构决定了其功能的实现方式和系统的整体性能。常见的操作系统结构包括单体结构(Monolithic Kernel)、微内核结构(Microkernel)、模块化结构(Modular Kernel)和混合内核结构(Hybrid Kernel)。每种结构都有其优点和缺点,适用于不同的应用场景。下面是对这些操作系统结构的详细介绍:
单体结构(Monolithic Kernel)
- 所有功能在内核态:单体内核包含操作系统的所有基本功能模块,如进程管理、内存管理、文件系统和设备驱动程序,所有这些模块都在内核态运行。
- 高性能:由于所有服务在内核态运行,系统调用和服务之间的调用开销较低,性能较高。
- 复杂性和维护:由于所有模块在内核态运行,内核代码复杂,难以调试和维护。
- 优点:性能高,系统调用开销低;直接访问硬件,效率高。
- 缺点:内核庞大,代码复杂,难以维护;错误或崩溃会影响整个系统的稳定性。
微内核结构(Microkernel)
- 最小化内核:微内核结构将内核功能最小化,只保留基本的进程间通信(IPC)、基本的进程管理和内存管理,其余功能(如文件系统、设备驱动)在用户态实现。
- 增强的可靠性:由于大部分操作系统服务在用户态运行,内核变得简单且更容易维护,错误隔离性更强,一个服务的崩溃不会影响整个系统。
- 灵活性:容易扩展和修改操作系统服务,因为大部分服务运行在用户态,可以独立开发和测试。
- 优点:内核小且简单,容易调试和维护;服务之间的隔离性强,提高系统稳定性。
- 缺点:用户态和内核态之间频繁的上下文切换带来性能开销;系统调用开销较高,影响整体性能。
模块化结构(Modular Kernel)
- 模块化设计:模块化内核将操作系统功能划分为多个独立的模块,各模块可以在运行时动态加载和卸载。
- 灵活性和可扩展性:可以根据需要加载和卸载模块,系统更灵活,易于扩展和定制。
- 简化开发和维护:模块化设计使得各功能模块独立开发和测试变得更容易。
- 优点:灵活性高,易于扩展和定制;各模块独立开发和测试,减少内核复杂性。
- 缺点:动态加载和卸载模块可能导致性能开销;内核模块之间的依赖关系需要精心管理。
混合内核结构(Hybrid Kernel)
- 结合单体和微内核优点:混合内核结合了单体内核和微内核的优点,既保留了单体内核的高性能,又引入了微内核的模块化和可靠性。
- 核心服务在内核态:核心服务(如进程管理、内存管理)在内核态运行,部分服务(如设备驱动、文件系统)在用户态或内核态运行。
- 性能和稳定性平衡:在性能和稳定性之间找到平衡点,既保证了高效的系统调用,又增强了系统的可靠性。
- 优点:结合了单体内核和微内核的优点,提供高性能和高可靠性;核心功能集中在内核态,确保高效的系统调用和服务。
- 缺点:设计和实现复杂度较高;内核态和用户态之间的通信和协调需要精心管理。
评论