操作系统之文件

[TOC]

内存部分

虚拟内存

虚拟内存的概念

内存管理中进程有如下特征:

  1. 一次性:作业必须一次性全部装入内存后才能开始运行
  2. 驻留性:作业被装入内存后驻留在内存中,任何部分都不会被唤出直至作业结束
局部性原理

高速缓存是计算机科学中唯一重要的思想。事实上告诉缓存技术极大的影响了计算机系统的设计

-- Bill Joy「SUN 公司 CEO」

时间局部性: 如果程序某条指令一旦执行,不久之后可能会再次被执行;如果某个数据被访问过,不久以后它可能再次被访问

空间局部性:一旦程序访问某个储存单元,不久之后其附近的单元也将被访问。

基于局部性原理,程序装入内存时,可以先装入一部分内存,其余部分留在外存。在程序运行过程中,当访问信息不存在时,操作系统将需要信息调入内存;另一方面操作系统将暂时不适用的内容放到外存之中。这样系统好像为用户提供了一个大的多的储存器,称为虚拟储存器

之所以称为虚拟储存器,是因为这种储存器并不存在,只是由于系统提供了部分装入请求和置换功能后,给用户感觉是一个比实际物理内存大的多的存储器。

页面置换算法

最佳置换算法「OPT」

最佳置换算法选择被淘汰页面是以后用不使用的,或者在最长时间未被访问的页面,这样可以保证最低的缺页率。

该算法是理想算法 ,「无法实现」

先进先出算法「FIFO」

优先淘汰最早进入内存的页面,亦即在内存中驻留最久的页面。

算法实现较简单,但是可能出现页故障数随物理块数增大不降反增的状况「Belady」异常

最近最久未使用算法「LRU」

选择最近最长时间未访问过的页面予以淘汰,他认为最近一段时间未访问的页面在将来一段时间也不会被访问。

时钟置换算法「CLOCK」「NRU」

某次装入内存时,其使用位被置位 1 ,当再次被访问到时,其再被置为 1

当需要替换页时,从缓冲区头部开始扫描,遇到 1 置 0 ;遇到 0 就选择该页置换;依次循环

改进 CLOCK 算法

将使用位再细分为 访问与修改两种状态,修改优先级大于访问

文件部分

磁盘的结构

磁盘由表面涂有磁性物质的金属或塑料构成圆形盘片,通过一个名为磁头的导线圈从磁盘中读取数据。在读写操作期间, 磁头固定,磁片高速旋转。

磁盘调度算法

先来先服务 「FCFS」

FCFS根据请求磁盘的先后顺序调度,该算法较为简单

最短寻道时间优先「SSTF」

优先调度当前磁头所在磁道最近的磁道

平均寻道时间较低,但是较为不公平。如果新的磁道总是比一个等待的磁道近,等待的磁道会一直等待下去出现饥饿现象

电梯算法

当前移动方向上选择当前磁头最近请求作为下一次服务方向。即总是面向一个方向运行,直到该方向没有请求位置,改变运行方向。

程序编译与链接

编译系统

以下是一个 hello.c 程序

1
2
3
4
5
6
#include <stdio.h>

int main(){
printf("hello, world\n");
return 0;
}

unix 上, 编译器把源文件转换为目标文件

gcc -o hello hello.c

img

  • 预处理阶段:预处理以 # 开头的预处理命令
  • 编译阶段:翻译成汇编文件
  • 汇编阶段:将汇编文件翻译成可重定向的目标文件
  • 连接阶段:将可重定向目标文件和 printf.o 等单独编译好的文件进行合并,得到可执行的目标文件

静态链接

静态链接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件为输出,链接器主要完成以下任务:

  • 符号解析:每个符号对应一个函数,一个全局变量或静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来
  • 重定位:链接器通过吧每个符号定义与一个内存位置关联起来,修改对这些符号的引用,使他们指向这个内存位置

img

目标文件

  • 可执行目标文件:直接在内存中执行
  • 可重定向目标文件:可以其他重定向文件在链接阶段合并,传建一个可执行目标文件
  • 共享目标文件:特殊的可重定向文件,在运行时被动态加载进内存并链接

动态链接

静态库有以下两个问题:

  • 当静态库更新时,整个程序重新链接
  • 对于 printf 这种标准库函数,每个程序都要都代码,极大浪费资源

共享库是为了解决静态库的问题而设计的,在linux中用.so文件来表示,windows 中被称为dll 它们具有以下特点

  • 在给定的文件系统中一个库只有一个文件,所有引用库的可执行目标都共享这个文件,他不会被复制到他的可执行文件中
  • 内存中共享的副本可以被不同正在运行的进程共享

img