计算机硬件资源有限,当多个程序需要共享这些资源时,谁来负责协调?这正是操作系统诞生的核心原因。下面,我们将从三个关键角色来深入理解操作系统存在的必要性。
资源分配器
当CPU上只运行一个程序时,确实不需要操作系统介入。

然而,一旦有第二个程序需要运行,问题立刻浮现:两个程序开始竞争资源。计算机硬件是有限的:处理器核数、内存容量、磁盘空间等。在单核CPU上运行两个程序,在任一时刻CPU究竟该执行哪一个?

这显然不应由程序1或程序2来决定,必须有一个独立的程序来负责此事——它就是操作系统。操作系统的核心目的之一,就是为所有运行中的程序合理地分配资源。从这个角度看,操作系统就是一个高效、公平的资源分配器。
CPU资源无法被物理分割,只能采用“分时复用”策略,即让程序轮流使用。这好比游乐场里唯一的过山车,大家只能排队轮流体验。操作系统同样采用此策略,将CPU时间片分配给各个进程。在操作系统看来,是“进程A运行一会儿,然后暂停,切换给进程B运行一会儿”,只不过这种切换速度极快,让用户感觉所有程序在并行运行。决定这种切换顺序的规则,就是进程调度。

内存、磁盘等存储资源则不同,它们可以方便地进行物理或逻辑划分,因此可以采用“分块”策略,让不同程序各用一块,互不干扰。这就像停车场,多个车位可以同时容纳多辆车。同理,内存可以被划分给不同的进程,使它们能够同时驻留在内存中。为了高效利用有限的内存资源,操作系统费尽心思,虚拟内存技术便是一项杰作,它能让更多进程常驻内存。当然,实现虚拟内存也带来了挑战,这需要软硬件协同解决。
资源隔离与秩序维护者
程序A的运行不应干扰程序B。这意味着,即使程序A因漏洞崩溃,也不应波及其他程序乃至操作系统本身。

同样,程序A绝不能随意访问程序B的内存空间,保障用户的数据隐私(如聊天记录)至关重要。这些都需要操作系统提供严格的资源隔离机制。
另一方面,复杂任务往往需要多个程序协同完成。因此,程序间除了隔离,也必须具备通信能力,例如进程间通信(IPC)。此时,操作系统需要提供必要的同步与互斥机制(如信号量、锁),确保对共享资源的访问及程序的执行顺序符合预期,防止混乱。
所以,从这个维度看,操作系统又是资源的隔离者与系统秩序的维护者。
细节屏蔽者(抽象层)
操作系统的作用与TCP/IP协议栈有异曲同工之妙。如果没有TCP/IP协议栈,进行网络编程将异常复杂:你需要手动封装TCP报文头、维护连接状态、实现三次握手、保证可靠传输、处理拥塞控制……这还不包括IP层及数据链路层的细节。如果这一切都需程序员亲自处理,恐怕没多少人愿意涉足网络开发,且大多数开发者对这些底层细节本身也不感兴趣。
TCP/IP协议栈通过Socket接口,向上层程序员屏蔽了网络的复杂性,开发者只需调用send/recv等简单函数即可收发数据,极大简化了开发。你可以将内核中处理网络协议的部分,视为计算机网络的“操作系统”。
操作系统扮演着类似的角色。真正执行计算任务的是硬件,但直接对硬件编程通常极其繁琐,尤其涉及I/O操作时。程序员在读写文件时,大多不想关心数据具体存储在磁盘的哪个盘面、柱面或扇区,也不想研究用什么机器指令控制磁盘马达、如何平衡读写速度与磁盘寿命。我们只需要简单的read/write函数就能操作“文件”这一抽象概念(实际上,在磁盘层面并不存在“文件”的概念,只有扇区)。

此时,操作系统的重要性就凸显出来了。它向上层应用程序屏蔽了底层硬件的复杂细节,使程序员能够专注于自身业务逻辑的开发,而无需深陷硬件控制的泥潭。
因此,从这个角度看,操作系统更是一个细节的屏蔽者,它提供的最核心价值之一便是:抽象。
|