操作系统就是一个资源管理器。计算机系统中的CPU,内存空间,文件存储空间以及I/O设备都是操作系统必要去管理的资源。
进程管理
一个程序什么都不能做除非CPU执行其中的指令。一个执行中的程序称为进程。像编译器这样的程序是一个进程,在个人电脑上有用户运行的文字处理软件是一个进程。同样地,移动设备上的社交应用也是一个进程。进程也可以提供系统调用而让进程创造出子进程并发运行。
一个进程需要一定的资源 - 包括CPU运行时间,内存,文件和I/O设备去 -- 才能完成任务。这些资源一般在进程运行的时候就分配了。此外,除了各种物理和逻辑在创建进程时获得的各种物理和逻辑的资源,各种初始化数据(输入)也可以被传递。比如说,假设我们运行一个在屏幕上展示网页的浏览器,进程会被给予一个URL作为输入并且执行适当的执行,获取系统调用并且在屏幕上展示想要的信息。当进程结束时,操作系统将回收任何可重复使用的资源。
这里需要强调的是,程序本身不是一个进程。一个程序是一个被动实体,例如存储在磁盘上的文件的内容,而进程是活动实体。单线程的进程有一个program counter程序计数器来专门指定需要执行的下一条指令。这样一个进程必须是顺序执行的。CPU执行一条接一条的指令,直到进程结束。此外,任何时候,一条指令只能最多代表一个进程。因此虽然在同一个程序中可能会关联两个进程,但他们仍然被认为是两个独立的执行序列。一个多线程的进程有许多程序计数器,每个都指向给定线程的下一条指令。
一个进程是系统中一个工作单元。一个系统就是进程的集合,其中哦一些是操作系统的进程,剩下的是用户进程。所有这些进程都可以并发的执行-在单核CPU内核上多路复用-或在多核CPU上并发多路复用。
操作系统负责与进程管理有关的以下行为:
- 对于用户进程和系统进程的创建和删除
- 在CPU上调度进程和线程
- 暂停和恢复进程
- 提供进程同步机制
- 提供进程间通讯机制
内存管理
主存储器(内存)是一个现代计算机系统的核心。主内存是一个大字节数组,范围规模从数十万到数十亿。每个字节都有自己的地址。主内存负责快速的获取CPU和I/O设备间的共享数据。在指令获取周期中,CPU从主内存中读取指令;在数据获取周期中,CPU从主内存中读取数据或写入数据至主内存中。就像之前文章中提到过的,主内存是CPU能够直接寻址和读取的唯一的大型存储设备。举例来说,如果CPU要处理从磁盘上的数据,那么这些数据必须首先通过CPU生成的I/O调用传输至内存。这样,内存中的CPU指令才能去处理这些数据。
对于一个要被执行的程序,它必须映射到内存的绝对地址并且装载进内存。随着程序的执行,通过这些绝对地址在内存中读取程序指令和数据。最后,程序结束,原来的内存空间被声明可用,然后下一个程序又可以被加载和运行。
为了改善CPU的利用率和计算机对用户的回应速度,通用计算机必须在内存中常驻几个程序,这也创造了对内存管理的需要。有许多不同的内存管理方案被使用。这些方案反映了不同的方法,并且其给定算法的有效性取决于实际情况。在对特定系统选择内存管理方案时,我们必须考虑许多因素,尤其是系统的硬件设计。每个算法都有自己的硬件支持条件。
操作系统负责与内存管理有关的以下行为:
- 跟踪哪一部分的内存正在被使用且被哪个进程使用
- 根据需要分配和释放内存空间
- 决定哪些进程(进程的一部分)和数据移入和移出内存
文件系统管理
为了让计算机系统便利于用户,操作系统提供了一种信息存储的统一逻辑视图。操作系统从它的存储设备中抽象出物理属性然后定义为一个逻辑存储单元 - 文件file。操作系统在存储设备把files映射为一个个物理媒介。
文件管理系统是操作系统最可见的组件之一。计算机可以存取不同种类的物理媒介的信息。二级存储是最常见的,但三级存储也是可能的。每个媒介都有它自己的特性和物理组成。大多数由一个设备控制,比如说一个磁盘驱动器,它有自己独一无二的特性。这些属性包括读取速度,容量,数据传输速度以及读取方法(顺序或随机)。
一个文件是相关信息的集合,而这些是由它的创建者定义的。一般来说,files代表程序和数据。数据files可以是数字、字母、字母数字或二进制字符。Files也可以是自由格式的(例如,文本文件),也可以是固定格式的(例如,固定字段,例如mp3音乐文件)。显然,FIle的概念是极其通用的。
操作系统通过管理海量存储介绍及其控制设备来完成对file的抽象。此外,files根据通常组成一个个目录,使得他们更容易使用。最后,当有多个用户读取files时,我们可能需要不同用户的读写权限。
操作系统负责与文件管理有关的以下行为:
- 创建和删除文件
- 创建和删除由文件组成的目录
- 提供用于处理文件和目录的原子操作
- 将文件映射到大容量存储中
- 在稳定(非易失性)存储介质上备份文件
大容量存储管理
正如我们已经看到的,计算机系统必须提供二级存储来备份主内存。大多数现代计算机系统都使用HDD和NVM设备作为程序和数据的主要在线存储介质。大多数程序-包括编译器,Web浏览器,文字处理器和游戏-都存储在这些设备上,直到加载到内存中。程序将设备用作其处理的源和目的地。因此,对二级存储的适当管理对一个计算机系统是十分重要的。
操作系统负责与二级存储管理有关的以下行为:
- 装载和卸载
- 空闲空间的管理
- 存储分配
- 磁盘调度
- 分区保护
由于二级存储经常被广泛使用,因此必须高效率的使用它。计算机的整体运行速度可能取决于二级存储子系统的速度及该子系统中的操作算法。
同时,有许多比二级存储速度慢成本低的存储器被使用到,通常有更大吃的存储容量。对于磁盘数据的备份,很少使用的数据存储和长期存档的数据都是其中的一些使用案例。磁带机及其磁带以及CD DVD和Blu-ray驱动器和磁盘是典型的第三级存储设备。
三级存储虽然对系统性能不关键,但也是必须被管理的。一些操作系统有专门的任务来管理,而一些操作系统把对三级存储的管理留给应用程序负责。操作系统的一些功能能够提供对设备媒介的装载和卸载,分配和释放以供进程专用并且把数据从二级存储中迁移到三级存储。
高速缓存cache管理
缓存是计算机系统的重要原理。运作方式如下:
- 信息通常保存在某些存储系统(例如主存储器)中。
- 使用后,它会被复制到一个更快的存储系统(即缓存)中,临时的。
- 当我们需要特定信息时,我们首先检查是否在缓存中。如果是这样,我们将直接从缓存中使用信息。
- 如果不是,我们将使用使用源头的信息,将副本放入缓存中并假设我们很快会再次需要它。
此外,内部可编程寄存器提供为主存储器了高速缓存。程序员(或编译器)在里面实现寄存器分配和寄存器替换算法,以确定要处理的信息哪些保留在寄存器中,哪些保留在主存储器中。
其他高速缓存则完全在硬件中实现。例如,大多数系统具有高速指令缓存以保存预期接下来会执行的指令。如果没有这个缓存,CPU将不得不等待几个周期从主存储器中提取指令。由于类似的原因,大多数系统在内存层次结构中具有一个或多个高速数据缓存。它们不受操作系统控制。
因为高速缓存大小的限制,所以高速缓存管理是一个重要的设计问题。精心挑选高速缓存的大小和替换策略算法可以提升性能。如下图:
![e0a66e4a6533b81462d55ace4164e4e9.png](https://i-blog.csdnimg.cn/blog_migrate/3b9bd559b4de871ead524bddbbe7d5de.jpeg)
不同存储层级间的信息移动,要么是显性的,要么是隐形的,这取决于硬件设计和操作系统的软件控制。举例来说,从cache到CPU和寄存器的数据传输通常是硬件功能呢个,不需要操作系统的介入。相反,从磁盘到内存的数据传输通常由操作系统控制。
在一个层级存储结构中,相同的数据会在不同层级的存储器中出现。举例来说,假定一个整数A,它位于文件B中, 需要加1,文件B位于磁盘上。加法操作首先会执行一次I/O操作把A从磁盘上复制到内存中,然后A会被复制到高速缓存中,再然后被复制到一个整数寄存器。因此这个A的备份同时出现在好几个地方:磁盘,内存,缓存以及寄存器,如下图:
![1666922b4025a1af04b043cec03ba83e.png](https://i-blog.csdnimg.cn/blog_migrate/af9ca87b14924ce12b7def6337aa34ce.jpeg)
一旦加法操作在内部寄存器中完成后,A的值在不同的存储器中值此时是各不一样的。直到A的值被重新写入磁盘后,此时的值才是唯一的。
在一个一次只有一个进程执行的计算环境中,这样的行为是没有问题的,因为对于整数A的读取的总是存储层次结构中最高级别的副本。然而在多任务环境中,CPU在不同的进程间不停的切换,必须格外小心以确保在有好几个进程想要读取A的情况下,每个进程A都将获取到最新更新的A的值。
在多处理器的环境下这种情况会变得更复杂。处理要维护内部寄存器,每个CPU还包含了一个本地的高速缓存。在这样的环境中,对A的拷贝必须同时留存于上述的这几个缓存中。由于CPU能并发的执行,我们必须确保对一旦A的在一个缓存中发生了更新,其他几个缓存也要立刻发生相应的变化。这种情况叫做缓存一致性cache coherency,这通常是一个硬件问题也就是说是在低于操作系统级别下处理解决。
在分布式环境中,情况变得更加复杂。在这种环境中,同一文件的多个副本(或副本)可以保留在不同的计算机。由于可以同时访问和更新各种副本,某些分布式系统可确保在一个地方更新副本时,所有其他副本都将尽快更新。
I/O系统管理
操作系统的目的之一是隐藏用户提供的特定硬件设备的特性。例如,在UNIX中,I / O设备的特性被操作系统隐藏在了I / O子系统。I/O子系统主要包含下面几个组件:
- 内存管理组件,包括缓冲,缓存和spooling(Simultaneous Peripheral Operations On Line,直译意思是“联机情况下同时进行的外围设备操作”)
- 通用的设备驱动程序接口
- 特定硬件设备的驱动程序
只有设备驱动知道分派给的特定设备的特性。