在学习操作系统之前你需要知道的:
前言
市面上有大量不同的操作系统,通常来说,他们都有一些共同的目标。
- 第一个就是抽象硬件。
- 通常来说,你会买一个计算机,里面包含了CPU,内存,但是这是一种非常低层级的资源。幸好我们有一些应用程序实现了高层级的接口和抽象,例如进程,文件系统。这些高层级的接口和抽象(Abstraction)方便了应用的开发,也提供了更好的移植性。
- 操作系统的另一个重要的任务是:在多个应用程序之间共用硬件资源。
- 你可以在一个操作系统同时运行文本编辑器,程序编译器,多个数据库等等。操作系统能非常神奇的在不相互干扰的前提下,同时运行这些程序。这里通常被称为multiplex。
- 隔离性
- 因为在操作系统中可能同时运行很多程序,即使程序出现了故障,多个程序之间互不干扰就变得非常重要。所以这里需要隔离性(Isolation),不同的活动之间不能相互干扰。
- 我们希望能在需要的时候实现共享(Sharing)。
- 但是另一方面,不同的活动之间有时又想要相互影响,比如说数据交互,协同完成任务等。举个例子,我通过文本编辑器创建了一个文件,并且我希望我的编译器能读取文件,我绝对想要数据能共享。所以,我们希望能在需要的时候实现共享(Sharing)。
- 但是在很多场景下,用户并不想要共享;所以在共享的同时,我们也希望在没有必要的时候不共享。
- 比如你登录到了一个公共的计算机,例如Athena,你不会想要其他人来读取你的文件。这里的“不共享”我们称为Security或者Permission System或者是Access Control System。
- 高性能(Performance)
- 另一个人们认为操作系统应该具有的价值是:如果你在硬件上花费了大量的金钱,你会期望你的应用程序拥有硬件应该提供的完整性能,但是很多时候你只负责应用程序编程,你会期望操作系统也必须保证自身提供的服务不会阻止应用程序获得高性能。所以操作系统需要至少不阻止应用程序获得高性能,甚至需要帮助应用程序获得高性能(Performance)。
- 最后,对于大部分操作系统,必须要支持大量不同类型的应用程序
- 或许这是一个笔记本,正在运行文本编辑器,正在运行游戏,或许你的操作系统需要支持数据库服务器和云计算。通常来说,设计并构造一个操作系统代价是非常大的,所以人们总是希望在相同的操作系统上,例如Linux,运行大量的任务。我认为大部分人都已经跑过Linux,并使用了我刚刚描述的所有的场景。所以,同一个操作系统需要能够支持大量不同的用户场景。
为了使得操作系统达到这些目标,就需要我们从本质原理来理解:WHAT IS OPERATING SYSTEM?以及HOW IT WORKS?
什么是操作系统?
操作系统是一种系统软件,管理计算机硬件与软件资源,并提供用户接口,使应用程序能够运行。它的主要目标是:
- 提供用户界面(CLI 或 GUI)
- 管理计算机资源(CPU、内存、磁盘、I/O 设备等)
- 控制程序执行(任务调度、进程管理等)
- 提供安全性和访问控制
- 提高计算机的效率(多任务处理、优化资源利用等)
同时有以下几个鉴定一个操作系统是否优秀的标准:
- 方便——OS作为用户/计算机之间的接口
- 有效——OS作为资源管理器使得管理资源更加有效
- 扩展能力——OS应具有易扩展性
操作系统的演化阶段
1. 无操作系统阶段(1940s - 1950s)
在计算机早期,操作系统并不存在,所有程序都由人手动控制:
- 批处理系统的雏形:用户直接使用打孔卡片输入程序,计算机执行后输出结果。
- 无交互性:计算机只能执行单个程序,运行完毕后人工换入下一个任务。
代表计算机:ENIAC(1946年)、IBM 701(1952年)
2. 批处理操作系统(1950s - 1960s)
为提高计算机的利用率,**批处理系统(Batch Processing System)**被引入:
- 基本思想:将多个任务提交到系统,批量执行,无需人工干预。
- 主要特征
- 任务按照顺序执行,不能交互。
- CPU 长时间等待 I/O 设备,资源利用率不高。
代表系统:
- IBM 7094 使用 GM-NAA I/O(第一个批处理操作系统)。
- 1960 年代,IBM 推出 OS/360,这是一个广泛使用的批处理系统。
3. 分时操作系统(1960s - 1970s)
随着计算机硬件的进步,交互式操作系统成为可能:
- 基本思想:采用时间片轮转(Time-Sharing),多个用户可以共享计算机,每个任务轮流使用 CPU。
- 主要特征
- 允许多个用户同时操作计算机。
- 每个进程被分配一个时间片,计算机看起来像是同时运行多个任务。
代表系统:
- CTSS(Compatible Time-Sharing System,1961):第一个分时操作系统。
- MULTICS(Multiplexed Information and Computing Service,1965):支持多用户分时操作,为 UNIX 发展奠定基础。
- UNIX(1969):由 Ken Thompson 和 Dennis Ritchie 开发,是现代操作系统的基础。
4. 微内核与多任务操作系统(1970s - 1980s)
随着计算机能力增强,支持多任务的操作系统逐渐普及:
- 基本思想
- 微内核架构(Microkernel):仅提供最基本的功能,如进程调度、内存管理,其他服务(如文件系统、设备驱动)运行在用户空间。
- 多任务(Multitasking):多个进程可以同时运行,提升效率。
代表系统:
- UNIX(1970s - 1980s):流行于科研和企业。
- MS-DOS(1981):IBM PC 采用的单用户单任务操作系统。
- Xenix(微软的 UNIX 版本)。
- MacOS(1984):苹果推出 GUI(图形用户界面)。
5. GUI 操作系统的兴起(1980s - 1990s)
图形用户界面(GUI)成为主流,计算机变得更加易用:
- 基本思想:使用窗口、按钮、图标等可视化元素替代命令行,提高交互性。
- 主要特征
- 鼠标、图形界面让普通用户更容易操作。
- 多任务、多进程管理更加成熟。
代表系统:
- Windows 1.0 - Windows 95(1985 - 1995):微软推出 Windows 3.1、Windows 95,引入 GUI。
- MacOS(1984):苹果的 GUI 系统。
- Linux(1991):Linus Torvalds 开发的开源 UNIX 类系统。
6. 网络与分布式操作系统(1990s - 2000s)
随着互联网的兴起,操作系统增加了网络功能:
代表系统:
- Windows NT(1993):微软推出的服务器操作系统。
- Linux 逐渐崛起,成为服务器操作系统的主流。
- MacOS X(2001):基于 UNIX 重新设计。
- 分布式操作系统(如 Google Fuchsia)开始探索多设备协同。
7. 移动与云计算时代(2000s - 2020s)
随着智能手机和云计算的发展,操作系统进入新的阶段:
- 移动端操作系统:
- Android(2008):基于 Linux 内核,全球最流行的移动操作系统。
- iOS(2007):苹果 iPhone 采用,生态封闭但体验优秀。
- 云计算操作系统:
- Kubernetes(2014):支持容器管理。
- AWS、Google Cloud 提供云端 OS 解决方案。
- Chrome OS(2009):基于 Linux,主打云端应用。
8. 人工智能与物联网操作系统(2020s - 未来)
操作系统开始支持 AI 和 IoT(物联网):
- AI 操作系统:支持 AI 计算,如 Google TensorFlow AI 计算机集群。
- 物联网 OS
- 嵌入式 OS(如 FreeRTOS、Zephyr),适用于智能设备。
- 鸿蒙 OS(HarmonyOS),华为推出的分布式系统。
操作系统演化的关键趋势
- 从批处理到交互式:早期计算机只能单任务运行,而现在支持多任务并发。
- 从命令行到 GUI:Windows 和 MacOS 让计算机更加直观易用。
- 从单机到网络:操作系统支持分布式计算,云计算、容器化兴起。
- 从桌面到移动:智能手机操作系统(Android/iOS)成为主流。
- 从传统计算到 AI 计算:AI 操作系统支持深度学习、神经网络。
操作系统如何运作的?
操作系统的功能可分为几个核心部分:
1. 进程管理
进程是程序在执行时的实例。操作系统需要管理进程的创建、调度、执行和终止。主要涉及:
- 进程控制(Process Control):创建、终止进程。
- 进程调度(Process Scheduling):决定哪个进程运行。
- 进程通信(IPC,Inter-Process Communication):进程间的数据交换方式,如管道(Pipe)、共享内存(Shared Memory)、消息队列(Message Queue)等。
- 同步与互斥:避免多个进程同时访问共享资源导致数据冲突(如使用信号量、互斥锁等)。
2. 内存管理
内存是计算机运行的关键资源,操作系统需要管理:
- 内存分配和回收:动态分配内存,防止内存泄漏。
- 虚拟内存(Virtual Memory):使用硬盘空间作为扩展内存,实现进程的隔离,提高多任务处理能力。
- 页面置换算法(如 FIFO、LRU、Clock)用于管理内存页面的调度。
3. 文件系统管理
操作系统提供文件系统来存储和组织数据,主要功能包括:
- 文件管理:创建、删除、读写文件。
- 目录管理:管理文件的层次结构,如 NTFS、EXT4、FAT32 等文件系统。
- 权限管理:如 UNIX/Linux 的
rwx
权限(读、写、执行)。
4. 设备管理
操作系统负责管理计算机的外设(如键盘、鼠标、打印机等),主要包括:
- 驱动程序(Device Driver):负责与特定硬件交互。
- 缓冲与缓存(Buffer & Cache):提高设备访问速度。
- 中断处理:设备请求 CPU 服务时,会通过中断通知操作系统。
5. 调度与资源管理
操作系统的一个关键任务是管理各种可用资源(内存空间、I/O设备、处理器),并调度各种活动进程来使用这些资源。任何资源分配和调度策略都须考虑3个因素:
- 公平性:强调资源占用空间的竞争公平性。
- 有差别的响应性:根据不同服务要求的作业类别,进行有差别的相应决策。
- 有效性:保证在综合考虑吞吐量和响应时间的情况下,做到有效管理。
6. 安全与权限管理
- 用户认证:如密码、指纹、人脸识别等。
- 访问控制:不同用户或进程访问不同资源的权限。
- 防范恶意软件:如杀毒软件、入侵检测系统(IDS)等。
MIT6.S081中的描述
以上是偏理论性的关于操作系统作用的概述,
而我们学习MIT6.S081之后,我们可以如下理解。
用矩形来表示一个计算机,其内部结构分布如下:
硬件
这个计算机有一些硬件资源,我会将它放在矩形的下层,硬件资源包括了CPU,内存,磁盘,网卡。所以硬件资源在最低一层。
应用程序
在这个架构的最上层,我们会运行各种各样的应用程序,或许有一个文本编辑器(VI),或许有一个C编译器(CC),这些就是正在运行的所有程序。这里程序都运行在同一个空间中,这个空间通常会被称为用户空间(Userspace)。
Knrnel(内核)
区别于用户空间程序,有一个特殊的程序总是会在运行,它称为Kernel(内核)。(注意,以下很大一部分篇章都是对于Kernel的描述,从而引申到其与操作系统其他结构的关系,可作为整理思路阅读,后续会有总结性文字)
Kernel是计算机资源的守护者。当你打开计算机时,Kernel总是第一个被启动。Kernel程序只有一个,它维护数据来管理每一个用户空间进程。
Kernel同时还维护了大量的数据结构来帮助它管理各种各样的硬件资源,以供用户空间的程序使用。
Kernel同时还有大量内置的服务,例如,Kernel通常会有文件系统实现类似文件名,文件内容,目录的东西,并理解如何将文件存储在磁盘中。所以用户空间的程序会与Kernel中的文件系统交互,文件系统再与磁盘交互。
在这门课程中,我们主要关注点在Kernel、连接Kernal和用户空间程序的接口、Kernel内软件的架构。所以,我们会关心Kernel中的服务,其中一个服务是文件系统,另一个就是进程管理系统。每一个用户空间程序都被称为一个进程,它们有自己的内存和共享的CPU时间。同时,Kernel会管理内存的分配。不同的进程需要不同数量的内存,Kernel会复用内存、划分内存,并为所有的进程分配内存。
**文件系统通常有一些逻辑分区。**目前而言,我们可以认为文件系统的作用是管理文件内容并找出文件具体在磁盘中的哪个位置。文件系统还维护了一个独立的命名空间,其中每个文件都有文件名,并且命名空间中有一个层级的目录,每个目录包含了一些文件。所有这些都被文件系统所管理。
这里还有一些安全的考虑,我们可以称之为Access Control(访问控制)。当一个进程想要使用某些资源时,比如读取磁盘中的数据,使用某些内存,Kernel中的Access Control机制会决定是否允许这样的操作。对于一个分时共享的计算机,例如Athena系统,这里可能会变得很复杂。因为在Athena系统中,每一个进程可能属于不同的用户,因此会有不同Access规则来约定哪些资源可以被访问。
在一个真实的完备的操作系统中,会有很多很多其他的服务,比如在不同进程之间通信的进程间通信服务,比如一大票与网络关联的软件(TCP/IP协议栈),比如支持声卡的软件,比如支持数百种不同磁盘,不同网卡的驱动。所以在一个完备的系统中,Kernel会包含大量的内容,数百万行代码。
这就是对于Kernel的一个快速浏览。
我们同时也对应用程序是如何与Kernel交互,它们之间的接口长什么样感兴趣。这里通常成为Kernel的API,它决定了应用程序如何访问Kernel。
通常来说,这里是通过所谓的系统调用(System Call)来完成。系统调用与程序中的函数调用看起来是一样的,但区别是**系统调用会实际运行到系统内核中,并执行内核中对于系统调用的实现。(而不是像函数调用那样有形参与实参之分)**在这门课程的后面,我会详细介绍系统调用。现在,我只会介绍一些系统调用在应用程序中是长什么样的。
第一个例子是,如果应用程序需要打开一个文件,它会调用名为open的系统调用,并且把文件名作为参数传给open。假设现在要打开一个名为“out”的文件,那么会将文件名“out”作为参数传入。同时我们还希望写入数据,那么还会有一个额外的参数,在这里这个参数的值是1,表明我想要写文件。
这里看起来像是个函数调用,但是open是一个系统调用,它会跳到Kernel,Kernel可以获取到open的参数,执行一些实现了open的Kernel代码,或许会与磁盘有一些交互,最后返回一个文件描述符对象。上图中的fd全称就是file descriptor(文件描述符对象)。之后,应用程序可以使用这个文件描述符作为handle,来表示相应打开的文件。
如果你想要向文件写入数据,相应的系统调用是write。你需要向write传递一个由open返回的文件描述符作为参数。你还需要向write传递一个指向要写入数据的指针(数据通常是char型序列),在C语言中,可以简单传递一个双引号表示的字符串(下图中的\n表示是换行)。第三个参数是你想要写入字符的数量。
第二个参数的指针,实际上是内存中的地址。所以这里实际上告诉内核,将内存中这个地址起始的6个字节数据写入到fd对应的文件中。
另一个你可能会用到的,更有意思的系统调用是fork。fork是一个这样的系统调用,它创建了一个与调用进程一模一样的新的进程,并返回新进程的process ID也就是pid。这里实际上会复杂的多,我们后面会有更多的介绍。
所以对吧?这些系统调用看起来就跟普通的函数调用一样。系统调用不同的地方是,它最终会跳到系统内核中。
操作系统基本架构
通过上述的学习,我们总结一下操作系统的基本架构。(该部分仅仅是对OS各个部分的简述,无原理,浏览理解即可。)
操作系统的架构通常由以下几个部分组成:
(1)内核(Kernel)
- 定义:内核是操作系统的核心部分,负责直接管理计算机硬件并提供基础服务。
- 主要功能
- 进程管理(Process Management):调度 CPU 运行进程。
- 内存管理(Memory Management):分配 RAM 并管理虚拟内存。
- 设备管理(Device Management):控制硬件设备(磁盘、网络、显示器等)。
- 文件管理(File System Management):组织数据存储和访问方式。
- 系统调用接口(System Call Interface):提供应用程序访问操作系统的方式。
(2)用户空间(User Space)
- 运行普通应用程序(如浏览器、文本编辑器)。
- 通过 系统调用(System Call) 向内核请求服务。
(3)驱动程序(Device Drivers)
- 充当硬件和操作系统之间的桥梁,确保操作系统能够正确识别和控制硬件设备。
(4)系统调用(System Calls)
- 应用程序通过
API(Application Programming Interface)
调用操作系统服务,例如:
open()
/ read()
/ write()
访问文件系统。fork()
/ exec()
创建新进程。malloc()
/ free()
分配和释放内存。
操作系统的运行流程
当计算机启动后,操作系统会执行以下流程:(该部分仅仅是对OS运行流程的简述,同时过于繁琐,如若嫌麻烦可跳过~)
(1)系统启动(Booting)
计算机加电后,启动固件(如 BIOS 或 UEFI)执行:
- 电源自检(POST):检查硬件是否正常。
- 加载引导程序(Bootloader)
- 典型的 Bootloader 如 GRUB(Linux)、Windows Boot Manager。
(2)加载内核
- 内核加载到内存后,初始化系统资源:
- 设置进程管理、内存管理、文件系统、设备驱动等。
- 启动
init
进程(Linux)、wininit.exe
(Windows)。
(3)运行应用程序
- 创建进程:当用户打开应用程序时,操作系统分配进程 ID(PID)。
- 调度进程:CPU 通过进程调度算法(如 FIFO、Round Robin)决定执行顺序。
- 内存管理
- 使用 虚拟内存(Virtual Memory)确保每个程序都能正常运行。
- 通过 分页(Paging) 或 分段(Segmentation) 管理内存。
(4)I/O 操作
- 操作系统管理所有
输入/输出(I/O)
设备,如键盘、鼠标、硬盘、显示器:
- 中断机制(Interrupts):外部设备通过中断信号通知 CPU 进行数据处理。
- 缓冲区管理:减少 I/O 操作对 CPU 的影响,提高性能。
(5)文件系统管理
- 文件系统(如 NTFS、ext4、FAT32)用于存储和管理文件:
- 目录结构:组织文件存放方式。
- 文件权限:控制用户访问权限(如
chmod
命令)。
(6)多任务调度
- 现代操作系统支持
多任务(Multitasking)
,允许多个程序同时运行:
- 时间片轮转(Time-Slicing):每个进程轮流占用 CPU。
- 进程间通信(IPC):进程之间可以通过管道(Pipes)、消息队列(Message Queues)等方式进行交互。
硬盘、显示器:
- 中断机制(Interrupts):外部设备通过中断信号通知 CPU 进行数据处理。
- 缓冲区管理:减少 I/O 操作对 CPU 的影响,提高性能。
(5)文件系统管理
- 文件系统(如 NTFS、ext4、FAT32)用于存储和管理文件:
- 目录结构:组织文件存放方式。
- 文件权限:控制用户访问权限(如
chmod
命令)。
(6)多任务调度
- 现代操作系统支持
多任务(Multitasking)
,允许多个程序同时运行:
- 时间片轮转(Time-Slicing):每个进程轮流占用 CPU。
- 进程间通信(IPC):进程之间可以通过管道(Pipes)、消息队列(Message Queues)等方式进行交互。
相信看完上述的知识,你对操作系统的理解已经有了一定的水平,毕竟,我将它的内核和大部分的核心知识都概述了一遍。然而,你需要知道的是,我讲述的仅仅是操作系统这一个概念,也就是说这只不过是原理性知识,像Linux、Windos等等操作系统,它们又会有各自的独立知识体系和构造,所以对于操作系统这门学科和技术,还任重道远者呢!