我们每天都在使用操作系统。Windows、Linux、安卓、iOS,都是非常经典的操作系统。有了它们,我们才能够更好地使用电脑、手机这样的硬件终端设备。
那么,操作系统的本质是什么?到底具有哪些功能和特性?我们常说的进程、线程、内核、中断、GUI、CLI…… 又是什么意思?
从本质来看,操作系统其实就是一套软件。它也是代码写出来的,像我们现在普遍使用的 Windows10,主要就是 C / C++ 写的。
在整个计算机架构中,它距离硬件最近,是最重要、最基础的软件。它负责控制和管理整个计算机系统的资源,并进行合理组织、调度和分配。
对于用户(user)和上层应用软件(application)来说,操作系统把很多底层的细节都封装隐藏起来了,通过标准接口以供调用,大大简化了上层应用软件的开发。
与此同时,它又提供了很多辅助性的工具和功能,让用户可以更好地掌控计算机的运行状态。
换句话说,操作系统就是一个超级大管家。它什么都管,为用户服务,向用户负责。
进程(Process)和线程(Thread),是操作系统里非常重要的两个概念。
进程是资源分配的基本单位。进程的创建、终止、调度、同步以及进程间的通信,都是由操作系统负责的。应用程序的运行,包括操作系统本身核心功能的运行,都是以进程的形式存在。
每个进程都包括程序的代码、数据、状态,以及操作系统为该程序分配的资源(如内存空间、文件句柄、网络端口等)。操作系统通过进程管理,来确保各个进程能够高效、安全地共享 CPU 时间。
我们使用“Ctrl+Alt+Del”快捷键调出 Windows 的任务管理器,就可以看到很多的进程:
一个进程中可以有多个线程,共享相同的内存空间和资源,可以更容易地进行通信和数据共享。
例如你启动了一个浏览器程序,那么,操作系统就会开启一个相应的进程。这个进程里面,又会有多个线程,如 HTTP 请求线程、事件响应线程、渲染线程等。
如果你关闭这个浏览器程序,从任务管理器可以看到,这个进程和对应的线程都没有了。当然,你也可以在任务管理器里,直接右键关闭某个进程,程序也就强制退出了。Linux 里干掉一个进程,用的命令就是“kill(杀掉)”。
线程是操作系统发展到后期才引入的。它进一步提供了程序执行的并发性,提高了系统的效率。
进程和线程,都可以包括执行态、就绪态、阻塞态等状态。对进程和线程进行管理,本质上是为了实现对 CPU 资源的分配调度。
需要注意的是,一个程序可以对应一个或多个进程。而一个进程同样可以对应一个或多个程序(虽然比较罕见)。
以前我们多次提到过冯・诺依曼架构。程序要从硬盘到内存,才能够被运算器(CPU)处理。每个程序都有足够的内存空间,才能够确保正常运行。
除了内存分配之外,操作系统还要负责进行内存保护(确保每道程序都只在自己的内存区中运行,进程间不会互相干扰)、地址映射(将程序装入内存运行时,需要将逻辑地址转化成内存单元所限定的物理地址)、内存扩充(借助于虚拟存储技术,从逻辑上去扩充内存容量)等工作。
这是操作系统的重要任务之一。它管理和控制外部设备(如打印机、硬盘驱动器、键盘、鼠标等)的使用。
具体来说,它可以完成用户进程提出的 I/O(输入 / 输出)请求,为用户进程分配其所需的 I/O 设备,提高 CPU 和 I/O 设备的利用率,提高 I/O 速度等。高效的 I/O 调度,可以避免 I/O 设备拖累系统的运行。
操作系统提供了一套机制来组织、存储、检索和保护文件,包括文件的创建、删除、读写操作以及目录结构的维护。我们也可以将其理解为操作系统对存储设备和资源的管理和调用。
操作系统提供了完善的安全机制,确保用户数据的安全性和完整性,包括用户身份验证、访问控制和加密等。
操作系统是用户使用计算机的一个工具。我们想要让计算机工作,就需要一个好的交互界面,以便下达命令、查询结果和状态。
操作系统提供图形用户界面(GUI,Graphical User Interface)或命令行界面(CLI,Command Line Interface),让用户能够方便地与计算机交互。这是计算机在社会全面普及的一个前提条件。
很多人都用过“cmd”调出来的命令行界面,那种叫做联机命令接口,也叫交互式命令接口。
以前,我们还学过写批处理文件(.bat 文件),给出好几个命令,让计算机逐一执行。这种叫做脱机命令接口。
值得一提的是,除了(联机、脱机)命令接口之外,操作系统还提供了程序接口。
程序接口由一组系统调用(system call)组成,允许应用程序间接调用资源。
现在有很多应用程序通过高级语言提供的库函数,间接地进行系统调用。我们可以把这些库函数视为对系统调用的进一步封装。
需要注意,凡是与共享资源有关的操作(如存储分配、I/O 操作、文件管理等),都必须通过系统调用的方式,向操作系统内核提出服务请求,由操作系统内核代为完成。这样可以保证系统的稳定性和安全性。
除了上面说的六大功能之外,操作系统还有四个特性,分别是:并发、共享、异步和虚拟。
并发是指两个或多个事件在同一时间间隔内发生。操作系统具有并发特性,是指其具有处理和调度多个程序同时执行的能力。
并发和并行(parallellism)是有区别的。并行是两个或多个事件在同一时刻内发生。举例来说,一边吃苹果一边看电视,是并行。在 1 分钟之内,吃掉苹果、香蕉和橘子,就是并发。
很显然,并发从宏观上看是同时发生的,但从微观上看是分时交替发生的(和通信里面的“时分复用”有点像)。并发考验的是资源调度的能力,而并行需要硬件的支持,例如采用多核处理器。
共享,是指系统中的资源可以被多个并发进程共同使用。它分为两种方式,互斥共享和同时共享。
互斥共享,顾名思义,就是不能同时用。仅当某一进程访问完并释放该资源后,才允许另一进程对该资源进行访问。这类资源称为临界资源或独占资源。计算机系统中的大多数物理设备,都属于临界资源。
大家应该也能看出来,共享的底层逻辑也和通信里的“复用”很像,要么是分时间进行共享(时分复用),要么是分物理资源空间进行共享(空分复用),主要看资源本身的属性。
异步的前提是并发性,如果没有并发性,所有任务只能 one by one 串行执行,那么,整个系统的效率就会很低。
最后是虚拟。这个我们在云计算里经常会提到。把一个物理实体,变成若干个逻辑实体,就是虚拟。
虚拟的本质,还是资源的复用。只不过通过软件来实现了,用户感受到的,是多个逻辑实体。
内核直接与硬件进行交互,并为其他系统软件和应用程序提供服务。前面提到的操作系统核心功能,除了交互界面之外,大部分都和内核紧密相关。
计算机里的 CPU,工作状态可以分为内核态(也叫管态)和用户态(也叫目态)。运行内核程序时,是内核态。运行应用程序时,是用户态。
应用程序只能使用“非特权指令”,如:加法指令、减法指令等。操作系统内核作为“管理者”,有时会让 CPU 执行一些 high level 的“特权指令”,如:内存清零指令。这些指令影响重大,只允许操作系统内核来使用。
操作系统处于内核态时,可以执行特权指令。如果处于用户态,则只能执行非特权指令。
一般情况下,开机后,用户启动某个应用程序,操作系统内核程序会在合适的时候主动让出 CPU,转为用户态。这时,如果发生了中断,操作系统内核会强行夺回 CPU 控制权,让 CPU 从用户态变成内核态。
内中断也叫异常,是指来自 CPU 内部的事件,与当前执行的指令有关。如程序的非法操作码、地址越界、运算溢出等。异常不能被屏蔽,一旦出现,就应该立即处理。
内中断的三种典型类型包括:陷入(trap,由陷入指令引发)、故障(fault,由错误条件引发,内核程序可以修复)、终止(abort,由致命错误引发,内核程序无法修复)。
外中断是狭义的中断,信号来自 CPU 外部的事件,与当前执行的指令无关。很典型的是时钟中断以及 I/O 中断,或人为干预。
只有最基本的系统服务在内核空间运行,其它服务移出内核,放在用户空间运行,是微内核。
相比大内核,微内核更灵活,架构更清晰,代码没有那么庞大,维护起来也容易一些。
操作系统负责交互界面的,叫做外壳(Shell)。前面介绍过,包括命令解释器和图形用户界面等。
除了内核和外壳以外,操作系统还包括许多其它工具和服务,例如备份工具、恢复工具、防火墙、网络服务等。
计算机硬件不断升级,用户需求不断增加,系统功能不断迭代,最终导致整个操作系统的架构变得越来越复杂,代码体积也越来越庞大。
以前的操作系统只有几 MB,一个软盘就能装得下。现在的操作系统,动辄几个 GB,甚至几十 GB,DVD 光盘都装不下。
针对不同的设备终端类型,以及不同的应用场景,操作系统也出现了细化分的趋势,演变出很多类别。
通常来说,操作系统大致可以分为桌面操作系统、服务器操作系统、移动终端操作系统、嵌入式操作系统、物联网操作系统等类别。
关于这些操作系统的具体故事,大家可以参考小枣君之前的文章,今天就不再赘述了:
广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,IT之家所有文章均包含本声明。