操作系统的存储管理
为了方便计算机用户,操作系统提供信息存储的统一逻辑视图。操作系统对存储设备的物理属性进行了抽象,并定义了逻辑存储单元,即文件(file)。操作系统映射文件到物理媒介,并通过存储设备来访问文件。
文件是创建者定义的相关信息组合。通常,文件内容为程序(源程序和目标程序)和数据。数据文件可以是数值的、字符的、字符数值的或二进制的等。文件可以没有格式(例如文本文件),或有严格格式(例如固定的域)。显然,文件这一概念是极为广泛的。
操作系统管理大容量存储介质,如磁盘和磁带,并控制它们,以实现文件这一抽象概念。再者,为了方便使用,文件可组织成目录。最后,当多个用户访问文件时,需要控制哪个用户如何访问文件(例如,读、写、附加)。
操作系统负责文件管理的以下活动:
大多数现代计算机系统采用硬盘作为主要在线存储介质,来存储程序和数据。大多数程序,如编译程序、汇编程序、字处理器、编辑器和格式化程序等,存储在硬盘上,执行时才调入内存。它们在执行时将硬盘作为处理的起源和终点。因此,硬盘的妥善管理对计算机系统尤为重要。
操作系统负责有关硬盘管理的以下活动:
由于外存使用频繁,因此使用应该高效。计算机运行的最终速度与硬盘子系统的速度和管理该子系统的算法有很大关系。
虽然有的存储相比外存速度更慢、价格更低(或许容量更大),但是也有许多用处,如备份磁盘的数据、存储很少使用的数据、保存长期的档案等。典型的三级存储(tertiary storage)设备包括:磁带驱动器及其磁带、CD/DVD 驱动器及光盘等。这些介质(磁带和光盘)分为一次写多次读(Write-OnceRead-Many-times,WORM)和读-写(Read-Write, RW)。
三级存储对系统性能并不关键,但也应管理好。有的操作系统直接管理,还有的留给应用程序来管理。操作系统的功能可以包括:安装和卸载设备媒介,为进程互斥使用而分配和释放设备,以及将数据从二级存储移动到三级存储。
另外,可编程的内部寄存器(如索引寄存器)为内存提供高速缓存。程序员(或编译程序)通过寄存器分配与寄存器替换的算法,决定哪些信息应存在寄存器中而哪些应存在内存中。
还有的高速缓存完全通过硬件实现。例如,大多数系统都有一个指令的高速缓存,用以保存下个需要执行的指令。如没有这一高速缓存,CPU 要用多个时钟周期才能从内存中获得指令。基于类似原因,大多数系统在存储层次结构中有一个或多个高速缓存。本教程并不关心只用硬件的髙速缓存,这是因为它们不受操作系统控制。
由于高速缓存的大小有限,因此高速缓存管理(cache management)的设计就很重要。慎重选择高速缓存大小与置换策略,可以极大提高性能。表 1 比较了大型工作站与小型服务器的存储性能。关于软件控制的各种高速缓存的置换算法,也将在后续章节加以讨论。
内存可以看作外存的高速缓存,这是因为外存数据应先复制到内存以便使用,而且数据应位于内存中才可保存到外存。永久驻留在外存上的文件系统的数据,会位于存储层次的多个层次上。在最高层上,操作系统可在内存中保存一个文件系统数据的高速缓存。
另外,固态盘也可作为高速存储,并可通过文件系统接口来访问。大容量的外存为磁盘。磁盘存储又通常可以用磁带或移动磁盘来备份数据,以防止因磁盘损坏造成的数据丢失。有的系统将位于磁盘上的旧文件数据自动备份到三级存储,如磁带塔,以便降低存储费用。
存储层次间的信息移动可以是显式的,也可以是隐式的,这取决于硬件设计和操作系统的控制软件。例如,高速缓存到CPU或寄存器的数据传递,通常通过硬件完成,无需操作系统干预。相反,磁盘到内存的数据传递通常通过操作系统控制。
在层次存储结构中,同一数据可能出现在存储系统的不同层次上。例如,位于文件 B 的整数 A 需要加 1,而文件 B 位于磁盘。加 1 操作这样进行:先进行 I/O 操作以将 A 所在的块调入内存。之后,A 被复制到高速缓存和内部寄存器。这样,A 的副本出现在多个地方:磁盘上、内存中、高速缓存中、内部寄存器中(见图 2)。
图 2 整数 A 从磁盘到寄存器的迁移
一旦在内部寄存器中执行加法后,A 的值在不同存储系统中就会不同。只有在 A 的新值从内部寄存器写到磁盘时,A 的值才会一样。
对于每次只有一个进程执行的计算环境,这种安排没有问题,这是因为所访问的整数 A 是位于层次结构的最高层的副本。但是,对于多任务环境,CPU 会在多个进程之间来回切换,所以需要十分谨慎以便确保在多个进程访问 A 时,每个进程都能得到最近更新的 A 值。
图 3 对称多处理的体系结构
对于多处理器环境,情况就变得更为复杂,这时每个 CPU 不仅有自己的内部寄存器,而且还有本地的高速缓存(见图 3)。对于这种环境,A 的拷贝可能出现在多个缓存上。由于多个 CPU 可以并行执行,应确保位于一个高速缓存的 A 值的更新,应马上反映到所有其他 A 所在的高速缓存。这称为高速缓存一致性(cache coherence),这通常是硬件问题(在操作系统底下处理)。
对于分布式环境,这种情况变得异常复杂。在这种情况下,同一文件的多个副本(或复制)会出现在不同场所的多个不同计算机上。由于各个副本可能会被并发访问和更新,所以应该确保当一处的副本被更新时,所有其他副本应尽可能快地得以更新。
文件系统管理
文件管理是操作系统最明显的组件之一。计算机可在多种类型的物理介质上存储信息,最常用的有硬盘、光盘和磁带等。每种介质都有各自的特点与物理组织。每个介质都由一个设备来控制,如磁盘驱动器或磁带驱动器等。它们都有自己的特点,包括访问速度、容量、数据传输率和访问方法(顺序或随机)等。文件是创建者定义的相关信息组合。通常,文件内容为程序(源程序和目标程序)和数据。数据文件可以是数值的、字符的、字符数值的或二进制的等。文件可以没有格式(例如文本文件),或有严格格式(例如固定的域)。显然,文件这一概念是极为广泛的。
操作系统管理大容量存储介质,如磁盘和磁带,并控制它们,以实现文件这一抽象概念。再者,为了方便使用,文件可组织成目录。最后,当多个用户访问文件时,需要控制哪个用户如何访问文件(例如,读、写、附加)。
操作系统负责文件管理的以下活动:
- 创建和删除文件。
- 创建和删除目录,以便组织文件。
- 提供文件和目录的操作原语。
- 映射文件到外存。
- 备份文件到稳定(非易失的)存储介质。
大容量存储器管理
由于内存太小不能容纳所有数据和程序,再加上掉电会失去数据,所以计算机系统应该提供外存以备份内存。大多数现代计算机系统采用硬盘作为主要在线存储介质,来存储程序和数据。大多数程序,如编译程序、汇编程序、字处理器、编辑器和格式化程序等,存储在硬盘上,执行时才调入内存。它们在执行时将硬盘作为处理的起源和终点。因此,硬盘的妥善管理对计算机系统尤为重要。
操作系统负责有关硬盘管理的以下活动:
- 空闲空间管理;
- 存储空间分配;
- 硬盘调度;
由于外存使用频繁,因此使用应该高效。计算机运行的最终速度与硬盘子系统的速度和管理该子系统的算法有很大关系。
虽然有的存储相比外存速度更慢、价格更低(或许容量更大),但是也有许多用处,如备份磁盘的数据、存储很少使用的数据、保存长期的档案等。典型的三级存储(tertiary storage)设备包括:磁带驱动器及其磁带、CD/DVD 驱动器及光盘等。这些介质(磁带和光盘)分为一次写多次读(Write-OnceRead-Many-times,WORM)和读-写(Read-Write, RW)。
三级存储对系统性能并不关键,但也应管理好。有的操作系统直接管理,还有的留给应用程序来管理。操作系统的功能可以包括:安装和卸载设备媒介,为进程互斥使用而分配和释放设备,以及将数据从二级存储移动到三级存储。
二级和三级存储的管理技术将在后续章节加以讨论。
高速缓存
高速缓存(caching)有时也简称为缓存,是计算机系统的一条重要原理。它的工作原理是:信息通常保存在一个存储系统中(如内存),使用时,它会被临时复制到更快存储系统,即高速缓存;当需要特定信息时,首先检查它是否处于高速缓存,如果是,可以直接使用高速缓存的信息,如果否,就使用位于源地的信息,同时将其复制到高速缓存以便下次再用。另外,可编程的内部寄存器(如索引寄存器)为内存提供高速缓存。程序员(或编译程序)通过寄存器分配与寄存器替换的算法,决定哪些信息应存在寄存器中而哪些应存在内存中。
还有的高速缓存完全通过硬件实现。例如,大多数系统都有一个指令的高速缓存,用以保存下个需要执行的指令。如没有这一高速缓存,CPU 要用多个时钟周期才能从内存中获得指令。基于类似原因,大多数系统在存储层次结构中有一个或多个高速缓存。本教程并不关心只用硬件的髙速缓存,这是因为它们不受操作系统控制。
由于高速缓存的大小有限,因此高速缓存管理(cache management)的设计就很重要。慎重选择高速缓存大小与置换策略,可以极大提高性能。表 1 比较了大型工作站与小型服务器的存储性能。关于软件控制的各种高速缓存的置换算法,也将在后续章节加以讨论。
级别 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
名称 | 寄存器 | 高速缓存 | 内存 | 固态盘 | 硬盘 |
典型尺寸 | <1KB | < 16MB | <64GB | <1TB | <10TB |
实现技术 | 具有多个端口CMOS的定制内存 | 片上或片外 CMOS SRAM | CMOS SRAM | 闪存 | 硬盘 |
访问时间(ns) | 0.25~0.5 | 0.5 ~ 25 | 80 ~ 250 | 25 000 ~ 50000 | 5 000 000 |
带宽(MB/sec) | 20 000 ~ 100 000 | 5 000 ~10 000 | 1 000 ~ 5 000 | 500 | 20 ~150 |
由谁管理 | 编译器 | 硬件 | 操作系统 | 操作系统 | 操作系统 |
由谁备份 | 高速缓存 | 内存 | 硬盘 | 硬盘 | 硬盘或磁带 |
内存可以看作外存的高速缓存,这是因为外存数据应先复制到内存以便使用,而且数据应位于内存中才可保存到外存。永久驻留在外存上的文件系统的数据,会位于存储层次的多个层次上。在最高层上,操作系统可在内存中保存一个文件系统数据的高速缓存。
另外,固态盘也可作为高速存储,并可通过文件系统接口来访问。大容量的外存为磁盘。磁盘存储又通常可以用磁带或移动磁盘来备份数据,以防止因磁盘损坏造成的数据丢失。有的系统将位于磁盘上的旧文件数据自动备份到三级存储,如磁带塔,以便降低存储费用。
存储层次间的信息移动可以是显式的,也可以是隐式的,这取决于硬件设计和操作系统的控制软件。例如,高速缓存到CPU或寄存器的数据传递,通常通过硬件完成,无需操作系统干预。相反,磁盘到内存的数据传递通常通过操作系统控制。
在层次存储结构中,同一数据可能出现在存储系统的不同层次上。例如,位于文件 B 的整数 A 需要加 1,而文件 B 位于磁盘。加 1 操作这样进行:先进行 I/O 操作以将 A 所在的块调入内存。之后,A 被复制到高速缓存和内部寄存器。这样,A 的副本出现在多个地方:磁盘上、内存中、高速缓存中、内部寄存器中(见图 2)。
图 2 整数 A 从磁盘到寄存器的迁移
一旦在内部寄存器中执行加法后,A 的值在不同存储系统中就会不同。只有在 A 的新值从内部寄存器写到磁盘时,A 的值才会一样。
对于每次只有一个进程执行的计算环境,这种安排没有问题,这是因为所访问的整数 A 是位于层次结构的最高层的副本。但是,对于多任务环境,CPU 会在多个进程之间来回切换,所以需要十分谨慎以便确保在多个进程访问 A 时,每个进程都能得到最近更新的 A 值。
图 3 对称多处理的体系结构
对于多处理器环境,情况就变得更为复杂,这时每个 CPU 不仅有自己的内部寄存器,而且还有本地的高速缓存(见图 3)。对于这种环境,A 的拷贝可能出现在多个缓存上。由于多个 CPU 可以并行执行,应确保位于一个高速缓存的 A 值的更新,应马上反映到所有其他 A 所在的高速缓存。这称为高速缓存一致性(cache coherence),这通常是硬件问题(在操作系统底下处理)。
对于分布式环境,这种情况变得异常复杂。在这种情况下,同一文件的多个副本(或复制)会出现在不同场所的多个不同计算机上。由于各个副本可能会被并发访问和更新,所以应该确保当一处的副本被更新时,所有其他副本应尽可能快地得以更新。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算