操作系统的组成

成员描述
内核(Kernel) 内核是操作系统的核心部分,直接与硬件打交道。它提供了基本的服务用于创建和管理进程、内存管理、文件系统管理以及设备驱动程序接口等。
外壳(Shell) 外壳是用户与操作系统之间的交互层,可以是一个命令行解释器或图形用户界面(GUI)。用户通过外壳向操作系统发送指令,并接收响应结果。
实用工具(Utilities) 这些是操作系统自带的一些辅助程序,如文件管理器、文本编辑器等,它们帮助用户执行常见的任务。
设备驱动程序(Device Drivers) 设备驱动程序是连接硬件设备与操作系统之间的桥梁,使得硬件设备能够与操作系统通信,执行特定功能。
文件系统(File System) 文件系统用于组织、存储和检索数据。操作系统使用文件系统来管理文件的存储、检索和保护。
服务与应用程序接口(APIs) 操作系统提供了一系列的应用程序接口,允许应用程序与操作系统进行通信。API定义了开发人员编写应用程序的方式,确保了应用程序的一致性和互操作性。
网络功能(Networking) 许多现代操作系统都内置了网络功能,支持TCP/IP协议栈,允许计算机连接到网络并与其他设备通信。
安全机制(Security Mechanisms) 安全机制包括认证、授权和加密等功能,用以保护操作系统免受未经授权的访问和恶意攻击。
用户界面(User Interface) 用户界面可以是命令行界面(CLI)或图形用户界面(GUI),它决定了用户如何与操作系统互动。

操作系统类型

桌面操作系统

桌面操作系统(Desktop Operating Systems)是指安装在个人计算机(PC)上,为用户提供图形用户界面(GUI)以便管理和控制计算机硬件与软件资源的操作系统。以下是几种常见的桌面操作系统:

💿 Microsoft Windows

微软公司开发的主流桌面操作系统,包括多个版本,如Windows XP、Windows Vista、Windows 7、Windows 8、Windows 10和最新的Windows 11。Windows系统在全球范围内拥有广泛的用户基础。

💿 macOS

苹果公司为其Mac系列计算机开发的操作系统。早期版本称为Mac OS X或OS X,后来改名为macOS。最新的版本包括macOS High Sierra、macOS Mojave、macOS Catalina、macOS Big Sur、macOS Monterey等。

💿 Linux发行版:Linux是一个开源的操作系统内核,基于它开发出了各种各样的桌面操作系统,适合不同的用户群体和技术偏好。一些流行的Linux桌面发行版包括:

  • Ubuntu:用户友好,适合初学者。
  • Fedora:适合技术爱好者和开发者。
  • Debian:稳定可靠,适合服务器和个人使用。
  • Mint:基于Ubuntu,界面友好。
  • openSUSE:适合企业级应用。
  • Arch Linux:适合高级用户,注重最新技术和定制化。

💿 Chrome OS

由Google开发的操作系统,主要设计用于使用Web应用的笔记本电脑(Chromebook)。Chrome OS的特点是启动速度快,主要依赖于云端应用和服务。

💿 FreeBSD

一个类Unix的操作系统,基于4.4BSD-Lite,适用于服务器和个人电脑。虽然不如Linux流行,但在某些专业领域和服务器应用中受到欢迎。

💿 ReactOS

开源项目,目标是兼容Windows API,使得Windows应用程序和驱动程序能够在ReactOS上运行。

💿 Haiku

Haiku是一个试图重现BeOS精神的开源操作系统,专注于高性能的多媒体体验。

💿 Elementary OS

基于Ubuntu的Linux发行版,设计风格类似于macOS,注重用户体验和美观。

移动设备操作系统

移动设备操作系统(Mobile Operating Systems)是专为智能手机、平板电脑和其他移动设备设计的操作系统。这些操作系统通常具有触摸屏界面,并支持移动应用和联网功能。以下是当前市场上主要的移动设备操作系统:

💿 iOS

由苹果公司(Apple Inc.)开发,专为iPhone、iPad和iPod touch设计。iOS以其封闭的生态系统著称,所有应用必须通过App Store审核才能发布。

💿 Android

由Google主导开发,是目前全球市场份额最大的移动操作系统。Android基于Linux内核,支持开源社区的贡献,并允许设备制造商进行一定程度的定制。

💿 华为鸿蒙操作系统(HarmonyOS)

由中国华为公司开发,旨在支持多种设备,包括智能手机、平板电脑、智能穿戴设备等。华为原生鸿蒙操作系统是完全自主研发的操作系统,是继 iOS 和 Android 之后的全球第三大移动操作系统。

💿 其他操作系统:

  • Windows 10 Mobile:尽管微软已经停止了Windows Phone和Windows 10 Mobile的新版本开发,但仍有一些老设备在使用此系统。
  • KaiOS:一种基于Linux的轻量级操作系统,用于功能手机和低端智能设备。
  • Sailfish OS:由芬兰公司Jolla开发,基于MeeGo,主要用于智能手机和平板电脑。
  • LineageOS:一个基于Android的开源操作系统,支持多种设备,提供了一个替代官方Android系统的选项。
  • Ubuntu Touch:由Canonical公司开发,基于Linux,专为触控设备设计。
  • webOS:最初由Palm开发,后被惠普(HP)收购,最后被LG用于其智能电视产品线上。
  • BlackBerry OS:虽然黑莓(BlackBerry)公司已经停止了新设备的生产,并转向了Android平台,但旧的黑莓设备仍然使用BlackBerry OS。

服务器操作系统

服务器操作系统(Server Operating Systems)是指专门设计用于服务器环境的操作系统,它们通常需要具备高性能、高可靠性、易于管理及安全性强等特点。以下是当前市场上主要的服务器操作系统:

💿 Windows Server

由微软公司开发,包括多个版本,如Windows Server 2008、Windows Server 2012、Windows Server 2016、Windows Server 2019、Windows Server 2022等。Windows Server支持Active Directory、Hyper-V虚拟化技术以及其他企业级功能。

💿 Linux

Linux是一个开源的操作系统内核,基于它开发了多个服务器版本的发行版,包括但不限于:

  • Red Hat Enterprise Linux (RHEL):商业版本,广泛用于企业级应用。
  • CentOS Stream:一个开源的RHEL克隆版本。
  • Ubuntu Server:基于Debian的发行版,用户友好,适合各种规模的企业。
  • Debian:一个稳定的发行版,适用于服务器环境。
  • Fedora:适合开发者和测试环境。
  • openSUSE Leap:适用于企业级应用。
  • Arch Linux:适合高级用户,注重最新技术和定制化。

💿 Unix

传统的Unix操作系统,包括:

  • Sun Solaris:Sun Microsystems开发的Unix版本,现归Oracle所有。
  • IBM AIX:IBM公司的Unix版本,适用于Power架构。
  • HP-UX:Hewlett-Packard公司的Unix版本。

💿 NetWare

由Novell公司开发,曾是局域网市场的领导者,但近年来市场份额有所下降

💿 FreeBSD

一个类Unix操作系统,基于4.4BSD-Lite,适用于服务器和个人电脑

💿 OpenBSD

一个强调安全性的类Unix操作系统

💿 NetBSD

另一个类Unix操作系统,以其广泛的硬件支持著称

💿 ARM服务器操作系统

支持ARM架构的服务器操作系统,如华为提供的支持iBMA的Arm服务器操作系统

💿 其他

  • OpenVMS:由HP开发,用于关键业务应用。
  • IBM z/OS:用于大型机系统。
  • IBM z/VM:IBM的虚拟机操作系统,用于大型主机环境。

嵌入式操作系统

嵌入式操作系统(Embedded Operating Systems, EOS)是指用于嵌入式系统的操作系统。这类操作系统通常需要满足实时性、可靠性、低功耗、小体积等要求,并且能够根据具体应用需求进行裁剪。以下是几个常见的嵌入式操作系统:

💿 嵌入式Linux

  • Yocto Project:一个开源项目,用于创建定制的Linux系统,适用于嵌入式设备。
  • Buildroot:另一个用于创建嵌入式Linux系统的工具。
  • Angstrom Distribution:一个轻量级的Linux发行版,专为嵌入式设备设计。

💿 专用嵌入式操作系统

  • Windows Embedded:微软为嵌入式设备开发的操作系统。
  • Intewell:一种国内的嵌入式操作系统。
  • 华为鸿蒙操作系统(HarmonyOS):华为推出的一个操作系统,支持多种设备,包括手机、手表、汽车等,具有分布式特性,可以跨设备协同工作。

💿 其他嵌入式操作系统

  • eCos:一个开源的嵌入式操作系统,适用于多种微控制器。
  • Zephyr RTOS:一个由Linux基金会支持的RTOS,适用于资源受限的设备。
  • RIOT (Rigorous Initiation Oriented Testing):一个针对物联网应用的开源RTOS。
  • Contiki:一个用于无线传感器网络的开源RTOS。
  • FreeDOS:一个自由的DOS兼容操作系统,可用于一些简单的嵌入式应用。
  • NuttX:一个用于嵌入式系统的RTOS,支持多种架构。
  • BlackBerry QNX:用于汽车及其他嵌入式设备。
  • Symbian:虽然不再更新,但在某些旧设备中仍然存在。
  • Palm OS:同样不再更新,但在某些老款设备中可见。
  • WebOS:最初由Palm开发,后被惠普(HP)收购,现在由LG用于其智能电视产品线上。

分布式操作系统

分布式操作系统(Distributed Operating Systems)是一种特殊类型的操作系统,它管理分布在多个计算机上的资源,并使这些资源看起来像是一个单一的系统。这种操作系统的设计目的是为了提高系统的性能、可用性和扩展性。下面列举了一些知名的分布式操作系统或与分布式系统相关的技术:

💿 Unix/Linux系统

Unix系统及其衍生产品,如Linux,可以被配置成分布式系统,通过网络连接多台计算机来共同完成任务。

💿 华为鸿蒙系统(HarmonyOS)

鸿蒙操作系统是华为推出的一个多终端分布式操作系统,旨在实现不同设备间的无缝协同。

💿 Kubernetes

虽然通常被视为容器编排工具,但实际上Kubernetes可以看作是一种微内核的分布式操作系统,它管理着容器化的应用程序和服务。

💿 Plan 9

Plan 9是从Unix发展出来的一个研究性质的操作系统,它强调分布式计算,并引入了统一的文件系统概念。

💿 CloudKit

Apple的CloudKit为开发人员提供了构建分布式应用的能力,使得应用可以在多个设备间共享数据。

💿 CTWing OS

天翼物联网分布式操作系统(CTWing OS)是由中国电信自主研发,用于物联网连接管理和实时控制。

💿 其他分布式系统

  • 分布式数据库系统:例如Apache Cassandra、MongoDB等,用于存储和检索分布在网络中的大量数据。
  • 分布式文件系统:例如Google File System (GFS)、Hadoop Distributed File System (HDFS)等,用于在多台机器之间共享文件。
  • 分布式计算框架:例如Apache Hadoop、Apache Spark等,用于执行大规模的数据处理任务。
  • 分布式消息队列:例如Apache Kafka、RabbitMQ等,用于构建可靠的异步消息传递系统。

💿 分布式中间件

  • Apache ActiveMQ:一个消息中间件,支持多种消息协议。
  • ZeroMQ:一个轻量级的网络消息库,可以用来构建分布式或者并发模式的应用程序。

💿 分布式服务框架

  • Apache Thrift:一个用于构建可扩展的服务框架的软件库。
  • gRPC:一个高性能、开源的通用RPC(远程过程调用)框架。

网络操作系统

网络操作系统(Network Operating System, NOS)是指那些专门设计来管理和促进网络资源使用的操作系统。这类操作系统不仅管理本地计算机资源,还管理网络上的资源共享,支持网络通信、网络服务等功能。以下是常见的网络操作系统:

💿 Windows Server

微软公司推出的服务器操作系统,包括Windows Server 2008、Windows Server 2012、Windows Server 2016、Windows Server 2019、Windows Server 2022等。它们广泛应用于企业和小型办公环境中,提供文件共享、打印服务、域控制器等网络管理功能。

💿 Unix/Linux

包括各种Unix系统(如Solaris、AIX、HP-UX)和Linux发行版(如Red Hat Enterprise Linux、Ubuntu Server、Debian)。Unix/Linux系统因其稳定性和安全性,在服务器市场占有重要地位,尤其适合于服务器集群、大数据处理和云计算环境。

💿 NetWare

Novell公司的NetWare操作系统,以高效稳定著称,主要用于中型企业网络,支持文件和打印共享、网络管理等功能。尽管近年来市场份额有所下降,但仍有一定的用户基础。

💿 macOS Server

苹果公司的服务器操作系统,主要用于管理苹果的Mac OS X客户端,提供网络服务、邮件服务、目录服务等功能。

💿 FreeBSD/Cisco IOS/Juniper Junos

FreeBSD是一个类Unix操作系统,常用于服务器和个人电脑。Cisco IOS和Juniper Junos则是专门用于路由器和交换机等网络设备的操作系统。

💿 其他系统

有些操作系统虽然不是专门为网络设计,但在实际应用中经常作为网络操作系统使用,如早期的Novell NetWare系统,还有基于Linux的嵌入式系统如OpenWrt,常用于家庭路由器等设备。

实时操作系统

实时操作系统(RTOS, Real-Time Operating Systems)是指那些能够对时间敏感的事件作出快速响应的操作系统。这类操作系统被设计用于需要精确和可靠的时间控制的应用场景,比如控制系统、工业自动化、航空电子设备、汽车控制系统、医疗设备等。以下是一些常见的实时操作系统:

💿 FreeRTOS

一款免费的RTOS,广泛应用于微控制器单元(MCU),支持多种微处理器架构

💿 μC/OS-II 和 μC/OS-III

分别是第二代和第三代的实时操作系统,用于嵌入式系统,特别是内存资源受限的系统

💿 QNX

一款商用的RTOS,以其强健性和可靠性著称,常用于汽车、医疗设备和其他关键系统

💿 VxWorks

Wind River Systems开发的一款RTOS,用于航空、国防、航天等领域

💿 ThreadX

由Microsoft拥有的RTOS,适用于嵌入式设备,提供高效的实时性能

💿 eCos

一个开源的嵌入式操作系统,支持多种微控制器,适用于对实时性有要求的小型嵌入式系统

💿 Zephyr RTOS

一个开源RTOS,特别适用于物联网(IoT)设备,支持多种微控制器和传感器

💿 NuttX

另一个开源RTOS,支持多种架构,适用于从简单到复杂的嵌入式系统

💿 RIOT (Rigorous Initiation Oriented Testing)

一款开源RTOS,专注于低功耗设备和物联网应用

💿 Contiki

一个开源的RTOS,主要用于无线传感器网络

💿 国内RTOS

  • 道系统(Delta OS)
  • 翼辉(Sylix OS)
  • 天脉系统(ACore OS)
  • 科东软件(Intewell OS)
  • 赛睿德(RT-Thread)

多处理机操作系统

多处理机操作系统(Multiprocessor Operating System)是专为管理多处理机系统设计的操作系统。这类操作系统需要处理多个中央处理单元(CPU)的协调工作,以提升系统的性能、可靠性和吞吐量。根据处理机之间的交互方式和资源管理策略的不同,多处理机操作系统可以有不同的类型和架构。以下是几种常见的多处理机操作系统类型和相关系统:

💿 对称多处理系统(SMP, Symmetric Multi-Processing):

  • 在SMP系统中,所有处理器的地位平等,共享同一块内存。操作系统可以将任务分配给任何一个处理器执行。
  • 示例:大多数现代桌面和服务器操作系统,如Windows Server、Linux、macOS,支持SMP架构。

💿 非对称多处理系统(ASMP, Asymmetric Multi-Processing):

  • 在ASMP系统中,处理器之间存在主从关系,主处理器负责调度任务给从处理器。
  • 示例:一些嵌入式系统或特定领域的专用系统可能会采用这种架构。

💿 分布式共享内存系统(DSM, Distributed Shared Memory):

  • DSM系统允许多个节点通过网络共享内存空间,即使这些节点可能没有物理上共享的内存。
  • 示例:某些高性能计算集群可能采用DSM技术。

💿 消息传递多处理机系统(Message-Passing Multiprocessors):

  • 在这类系统中,处理器之间不共享内存,而是通过消息传递来进行通信。
  • 示例:高性能计算集群、超级计算机中常用的消息传递接口MPI。

💿 集群操作系统(Cluster Operating Systems):

  • 集群操作系统管理多个节点,这些节点通过网络连接,可以作为一个整体来管理任务。
  • 示例:Linux集群管理系统,如Heartbeat、DRBD。

💿 主从式操作系统(Master-Slave OS):

  • 主从式操作系统中,有一个主处理器负责协调所有从处理器的工作。
  • 示例:一些早期的多处理机系统,如Cyber-170,采用的就是这种架构。

💿 独立监督式操作系统(Independent Supervisor OS):

  • 每个处理机都有自己的管理程序,各自管理自己的资源。
  • 示例:IBM的370系统就是一个例子。

💿 浮动监督式操作系统(Floating Supervisor OS):

  • 所有处理机都可以访问整个系统的资源,通常用于紧密耦合的对称多处理机系统。
  • 示例:IBM 3081上的MVS/VM操作系统。

💿 多核操作系统:

  • 现代多核处理器上的操作系统,如Linux和Windows,支持多核架构,并且能够优化多核环境下的任务调度。
  • 示例:Linux内核支持多核调度,Windows Server也支持多核架构。

进程

进程的概念

进程可以视为一个程序执行的实体,它包含了一个或多个线程,以及相关的系统资源,如内存、文件句柄等。每个进程都有一个唯一的标识符(PID),并且有自己的私有地址空间,这意味着不同进程之间不能直接访问对方的数据,除非通过进程间通信(IPC)机制。

进程的组成

  • 程序代码:这是进程执行的指令集合。
  • 数据段:存放程序的数据和全局变量。
  • 堆:动态分配的内存区域,通常用于存放运行时动态分配的对象。
  • 栈:存放函数调用时的局部变量、函数参数等临时数据。
  • 进程控制块(PCB, Process Control Block):操作系统用来存储有关进程的信息的数据结构,包括进程ID、状态、优先级、内存映射、打开的文件等。

进程的状态

  • 就绪状态(Ready):进程已经准备好运行,但是还没有获得CPU时间片。
  • 执行状态(Running):进程正在使用CPU执行。
  • 阻塞状态(Blocked):进程因等待某个事件(如I/O操作完成)而无法继续执行。
  • 终止状态(Terminated/Zombie):进程已退出,但父进程尚未对其进行清理。

进程的调度

操作系统通过一定的算法来决定何时以及如何将CPU分配给各个进程。

  • 先来先服务(FCFS, First Come First Serve)
  • 短作业优先(SJF, Shortest Job First)
  • 优先级调度(Priority Scheduling)
  • 轮转法(RR, Round Robin)
  • 多级反馈队列(Multilevel Feedback Queue)

进程间的通信

  • 管道(Pipe):一种简单的进程间通信方法,允许数据从一个进程流向另一个进程。
  • 消息队列(Message Queues):允许进程之间发送和接收消息。
  • 共享内存(Shared Memory):多个进程可以访问同一块内存区域,用于数据共享。
  • 套接字(Sockets):用于网络通信,也可以用于同一机器上的进程通信。
  • 信号(Signals):一种异步通信机制,用于通知接收进程发生了特定的情况。

进程管理

  • 创建新进程
  • 终止进程
  • 获取进程状态
  • 设置进程优先级
  • 控制进程间通信

线程

线程的概念

线程是操作系统能够进行运算调度的最小单位,它被包含在一个进程之内,是进程中的实际运作单位。一个进程至少包含一个线程,也可以包含多个线程。每个线程都有一个唯一的标识符(TID),并且有自己的程序计数器、寄存器集合和栈。

线程的优点

  • 开销小:创建和销毁线程比创建和销毁进程的开销要小得多。
  • 通信方便:由于线程共享同一进程的地址空间,因此它们可以直接访问同一内存中的数据,简化了进程间通信。
  • 并发性:多线程可以实现真正的并行计算,特别是在多核处理器环境下。

线程的状态

  • 新建状态(New):线程对象已经被创建,但尚未启动。
  • 就绪状态(Runnable):线程已经准备好了,等待CPU时间片来执行。
  • 运行状态(Running):线程正在使用CPU执行。
  • 阻塞状态(Blocked):线程因等待某种条件(如等待输入输出完成)而暂时停止执行。
  • 死亡状态(Dead/Terminated):线程已经执行完毕或因异常而终止。

线程的生命周期

  • 创建:通过创建线程对象,初始化线程。
  • 启动:调用线程的启动方法,使线程进入就绪状态。
  • 执行:线程开始执行其任务。
  • 阻塞:线程因某种原因暂停执行,等待条件满足后恢复执行。
  • 结束:线程执行完毕或因异常而终止。

线程的调度

操作系统使用调度算法来决定何时以及如何将CPU分配给各个线程。

  • 先来先服务(FCFS, First Come First Serve)
  • 轮转法(RR, Round Robin)
  • 优先级调度(Priority Scheduling)

线程间的通信

由于线程共享同一进程的地址空间,它们可以通过直接访问共享内存来相互通信。然而,为了防止数据竞争和死锁,需要采取适当的同步措施。

线程间的同步

线程间同步是为了确保共享资源的正确访问,防止竞态条件(Race Condition)和死锁(Deadlock)等问题。

  • 互斥锁(Mutex):用于保护临界区(Critical Section),确保一次只有一个线程可以访问共享资源。
  • 信号量(Semaphore):用于控制多个线程对资源的访问次数。
  • 条件变量(Condition Variable):用于线程间的等待和通知机制。
  • 原子操作(Atomic Operations):提供不可分割的操作,用于更新共享数据。

线程的管理

  • Java:通过Thread类和Runnable接口创建和管理线程。
  • C/C++:使用POSIX线程库(pthread)或其他第三方库(如Boost.Thread)。
  • Python:使用threading模块创建和管理线程。

死锁

死锁是多线程或多进程编程中常见的一个问题,它发生在两个或多个进程(或线程)互相等待对方持有的资源而不释放自己持有的资源的情况下,导致所有相关进程都无法继续执行下去。死锁的发生会导致程序停滞不前,直到系统干预或者重启程序。

死锁的必要条件

⭐⭐ 死锁的发生必须同时满足以下四个条件:

  • 互斥条件(Mutual Exclusion):至少有一个资源必须被独占,即一次只能被一个进程使用。
  • 保持和等待条件(Hold and Wait):一个进程已经持有一个资源,但又尝试获取额外的资源,而这些资源已被其他进程持有。
  • 无抢占条件(No Preemption):资源请求者不能强行从资源占有者手中抢夺资源,资源只能由占有者主动释放。
  • 循环等待条件(Circular Wait):若干进程之间形成了一种循环等待链,每个进程都在等待下一个进程所持有的资源。

死锁的示例

假设一个简单的死锁情况,有两个进程P1和P2,它们都需要两种资源R1和R2才能完成任务:
P1获得了资源R1,然后尝试获得资源R2。
P2获得了资源R2,然后尝试获得资源R1。
此时,P1等待R2,P2等待R1,两者都无法继续执行,形成了死锁。

死锁的检测

⭐⭐ 为了避免死锁的发生,可以通过以下几种方式来检测或预防死锁:

  • 银行家算法(Banker’s Algorithm):这是一种经典的算法,用于检测和避免死锁。银行家算法通过模拟资源分配,判断系统是否处于安全状态。
  • 资源分配图(Resource Allocation Graph):使用图形表示资源和进程之间的关系,通过检查图中是否存在环路来确定是否有死锁。
  • 超时和重试:当请求资源时设置超时时间,超过一定时间未获取资源则放弃请求,从而避免无限等待。
  • 顺序加锁:对于需要同时锁定多个资源的情况,按照固定的顺序加锁,这样可以避免循环等待。

死锁的预防

⭐⭐ 除了检测之外,还可以采取一些措施来预防死锁的发生:

  • 破坏互斥条件:尽可能让资源能够被共享使用,而不是独占。
  • 破坏保持和等待条件:进程在请求新的资源之前,必须释放已占有的资源。
  • 破坏无抢占条件:允许系统强制抢占某些资源,从而打破死锁。
  • 破坏循环等待条件:对资源请求进行排序,确保不会形成循环等待。

死锁的避免

⭐⭐ 除了预防之外,还可以通过算法来避免死锁:

  • 银行家算法:在每次分配资源之前,先检查系统是否处于安全状态。只有当系统处于安全状态时才分配资源。
  • 资源预留:在请求资源之前预留所需的资源,确保一次性获得所需的所有资源。

死锁的解除

⭐⭐ 一旦检测到死锁,可以通过以下几种方式来解除:

  • 撤销进程:终止一个或多个死锁进程,释放资源。
  • 回滚进程:将进程状态回滚到一个之前的安全点,再次尝试获取资源。
  • 优先级继承:如果一个低优先级进程持有另一个高优先级进程所需要的资源,那么低优先级进程将继承高优先级进程的优先级。

注意事项

  • 尽量减少锁的使用:尽可能使用无锁编程技术,如原子操作、CAS操作等。
  • 锁粒度的选择:合理选择锁的粒度,过大可能导致争用,过小可能导致过多的开销。
  • 锁的顺序:如果有多个锁需要获取,应按照固定的顺序获取,以避免循环等待。
  • 使用高级同步工具:利用高级的同步工具如Semaphore、Condition、Future等,它们提供了更丰富的功能来帮助避免死锁。

内存管理

内存管理是操作系统中的一个重要组成部分,它负责管理和分配计算机的内存资源,确保程序能够有效地使用内存,并避免内存冲突和泄漏等问题。内存管理不仅影响系统的性能,还直接影响到程序的稳定性和安全性。

内存管理的基本概念

⭐⭐ 物理内存(Physical Memory):

计算机硬件中的RAM,是直接可以被CPU访问的实际存储器。

⭐⭐ 虚拟内存(Virtual Memory):

通过地址映射技术,操作系统为每个进程提供了一个抽象的地址空间,这个地址空间的大小通常大于物理内存的大小。虚拟内存可以包括物理内存的一部分和硬盘上的交换分区(Swap Space)。

内存管理的主要目标

  • 内存分配(Memory Allocation):为进程分配足够的内存空间。
  • 内存保护(Memory Protection):防止一个进程访问不属于它的内存区域。
  • 内存共享(Memory Sharing):允许多个进程共享相同的内存区域,例如共享库。
  • 内存回收(Garbage Collection):自动回收不再使用的内存。

内存管理的技术

地址映射技术

  • 连续分配(Contiguous Allocation):每个进程在内存中占据一块连续的空间。这种方法简单但容易导致内存碎片。
  • 分页(Paging):将内存划分为固定大小的页面,每个页面可以独立地映射到虚拟地址空间中的页框。这种方法可以有效减少内存碎片,提高内存利用率。
  • 分段(Segmentation):将内存划分为逻辑段,每段对应进程中的一个逻辑部分(如代码段、数据段)。这种方法便于实现内存保护和共享。
  • 段页式(Segmentation with Paging):结合了分页和分段的优点,每个段内部再分成页,既实现了逻辑上的分段又减少了内存碎片。

内存分配算法

  • 首次适应算法(First Fit):从头开始搜索空闲列表,找到第一个足够大的空闲块。
  • 最佳适应算法(Best Fit):遍历空闲列表,找到最接近所需大小的空闲块。
  • 最差适应算法(Worst Fit):遍历空闲列表,找到最大的空闲块。

内存置换算法

  • 最近最少使用(LRU, Least Recently Used):置换最近最少使用的页面。
  • 先进先出(FIFO, First In First Out):置换最早进入内存的页面。
  • 最优置换算法(Optimal Replacement):理论上最好的置换算法,但它需要未来访问信息,因此在实际中难以实现。

内存管理的实现

操作系统层面

  • 内存映射(Memory Mapping):操作系统维护一张虚拟地址到物理地址的映射表,使得进程可以在虚拟地址空间中操作内存。
  • 页面调度(Page Scheduling):管理页面在物理内存和交换分区之间的迁移。
  • 内存保护机制:通过对内存区域设置权限(读、写、执行),防止非法访问。

编程语言层面

  • 手动管理:开发者需要显式地分配和释放内存,如C/C++中的malloc()和free()。
  • 自动管理:一些高级语言(如Java、Python)提供了垃圾回收机制,自动回收不再使用的内存。

内存管理的挑战

  • 内存碎片:长期使用后,内存中可能会出现大量的小块空闲空间,使得无法分配大块的连续内存。
  • 性能瓶颈:频繁的内存分配和回收会影响程序的性能。
  • 内存泄漏:忘记释放不再使用的内存,导致可用内存逐渐减少。

内存管理的最佳实践

  • 避免内存碎片:使用分页或分段技术来减少碎片。
  • 及时释放内存:在不再需要内存时立即释放,避免内存泄漏。
  • 合理分配内存:根据实际情况选择合适的内存分配算法。
  • 使用内存池:对于频繁分配和释放的小对象,可以使用内存池技术来提高性能。
  • 内存泄漏检测:定期检查程序中的内存泄漏问题,并及时修复。

局部性原理

局部性原理(Principle of Locality)是计算机科学中的一个重要概念,它描述了程序访问内存的行为特征。根据局部性原理,程序倾向于重复访问最近访问过的内存位置或附近的内存位置。这一原理被广泛应用于优化计算机系统的性能,特别是在缓存设计和虚拟内存管理方面。

局部性原理的分类

  • 时间局部性(Temporal Locality):
    • 如果一个项目被引用,则在不久的将来很可能再次被引用。
    • 例如,程序中的循环结构常常会反复访问相同的数据,这就是时间局部性的体现。
  • 空间局部性(Spatial Locality):
    • 如果一个项目被引用,则在不久的将来很可能访问其附近的其他项目。
    • 例如,在数组遍历过程中,程序往往会连续访问数组中的元素,这体现了空间局部性。

局部性原理的应用

缓存设计

  • CPU缓存(Cache):CPU缓存是位于CPU内部或非常靠近CPU的高速存储器,用于存储最近经常访问的数据或指令。通过利用时间局部性,CPU缓存可以显著减少访问主内存的次数,从而提高性能。
  • 磁盘缓存:在磁盘读写过程中,操作系统通常会缓存最近读取或写入的数据块,利用空间局部性来减少磁盘访问的次数。
  • Web缓存:在互联网中,Web缓存服务器会存储最近请求的网页内容,利用时间局部性来减少对外部服务器的请求。

虚拟内存管理

  • 分页机制(Paging):在分页机制下,操作系统将内存划分为固定大小的页面。通过预测程序的访问模式,操作系统可以提前将可能需要访问的页面加载到物理内存中,从而提高性能。
  • 页面置换算法(Page Replacement Algorithms):在物理内存不足时,操作系统需要决定哪些页面可以从物理内存中替换出去。基于局部性原理,操作系统会选择那些最近未被访问过的页面进行置换。

数据结构和算法

  • 数组遍历:在遍历数组时,数据通常是连续存储的,因此可以充分利用空间局部性来提高访问速度。
  • 哈希表:哈希表通过哈希函数将键映射到特定的位置,这有助于利用空间局部性来快速查找数据。

局部性原理的优化技术

  • 预取(Prefetching):系统预测将来可能需要的数据,并提前将其加载到缓存中。预取技术广泛应用于CPU缓存、磁盘缓存等领域。
  • 缓存一致性(Cache Coherence):在多处理器系统中,保证各缓存之间数据的一致性,避免数据冲突。
  • 缓存替换策略(Cache Replacement Policies):如LRU(最近最少使用)、LFU(最不经常使用)等算法,用于决定何时替换缓存中的数据。

局部性原理的局限性

  • 冷启动问题(Cold Start Problem):初次启动时,缓存可能为空,此时局部性原理的优势无法发挥。
  • 伪局部性(False Locality):如果程序的访问模式不符合局部性原理,例如随机访问模式,那么基于局部性的优化可能会失效。
  • 数据稀疏性(Data Sparsity):在某些应用中,数据分布非常稀疏,导致空间局部性较弱,缓存效果不佳。

学习资源

  • 视频
    • 《清华操作系统原理》:https://www.bilibili.com/video/BV1uW411f72n
  • 书籍
    • 《编码》
    • 《30天自制操作系统》
    • 《现代操作系统》(难度较大,不推荐新手看)
    • 《深入理解计算机系统》(难度较大,不推荐新手看)
    • 《 自己动手写操作系统》(国产好书,网上可以下载)
  • 大学课件
    • 浙大操作系统:https://github.com/QSCTech/zju-icicles