操作系统

操作系统是对计算机资源进行管理的软件
Xmind下载

概述

  • 操作系统的基本特征:并发、共享、虚拟、异步

  • 操作系统是对计算机资源进行管理的软件(处理机管理、存储器管理、文件管理、设备管理)

  • 分布式操作系统是以实现并行任务分配、并行进程通信、分布控制机构以及实现分散资源管理等功能为目的的系统程序。

  • 网络操作系统是以资源共享和信息交换为目的的操作系统。

  • 分布式操作系统是以计算机网络为基础构成的一个独立的整体,其更突出协同性,它对用户来说是透明的。

  • 分布式操作系统相比网络操作系统本质不同在于:分布式操作系统中若干计算机相互协同完成同一任务

  • 单处理机系统中,处理机与设备、处理机与通道、设备与设备都可以并行执行,但进程与进程不能并行执行

  • 操作系统与用户通信接口不包括缓存管理指令(系统中的缓存全部由操作系统管理,对用户透明,因此不提供管理系统缓存的系统调用)

库函数与系统调用

1.库函数是语言或应用程序的一部分,可以运行在用户空间中。

2.系统调用是操作系统的一部分,运行在内核空间。

3.未使用系统调用的库函数,其执行效率比系统调用高(设计上下文切换、状态转换)

  • 实时系统的进程调度,通常采用抢占式优先级算法

  • linux是多任务、多用户的操作系统,因此允许多个用户同时登陆(多用户)、并且允许多个用户端通过一个账号登陆(多任务)

  • UNIX是多任务、多用户操作系统,支持多种处理器架构,属于分时操作系统

  • 内核:时钟管理、中断处理、进程管理、设备管理

  • 微内核结构设计不会让系统更高效;能够有效支持多处理级运行,非常适合于分布式系统环境

  • 模块化OS结构原则:分解和模块化

  • 多道程序系统的四个特征:并发、共享、虚拟、异步

微内核

微内核需要频繁在核心态用户态间切换,开销较大

特点:内核足够小;给予C/S模式;“机智与策略分离”原理;面向对象技术

功能:进程间通信;低级IO;低级进程管理和调度;中断和陷入处理

Windows是宏内核操作系统

添加系统服务时不用修改内核

中断

  • 用户程序通过执行陷入指令(访管指令或trap指令)来发起系统调用,请求操作系统提供服务

  • 中断向量地址是中断服务例行程序的入口地址的地址

  • CPU处于核心态时,可以执行除了访管指令外的所有指令

  • 访管指令在用户态使用,将程序运行由用户态转换为核心态的指令

  • 用户程序在用户态下使用特权指令引起的中断为访管中断

  • 内部异常检测通常由CPU内部逻辑实现

  • 内部异常通常是CPU执行指令内部的实践,如程序非法操作码、地址越界、算术溢出、虚存系统缺页以及专门的陷入指令

  • 内部异常不能被屏蔽,响应发生在指令执行的过程中

  • 产生内部异常后,对于非法指令、除数为0等异常,无法通过异常处理程序恢复故障的,必须终止进程的执行

  • 处理外部中断时,操作系统(中断服务程序)保存通用寄存器的内容(硬件保护PC值,并找到该中断信号对应的中断向量),保护中断屏蔽字,保护PSW,提供中断服务

  • 子程序调用只需要保存PC值

  • 时钟中断主要工作是处理和时间有关的信息(系统时间、进程时间片、使用CPU时间、各种定时器)及决定是否执行调度程序

  • 用户态转换为核心态的唯一途径:中断或异常(访管指令通过产生一个中断事件切换状态)

  • 缺页产生后,在用户态发生缺页中断,然后进入核心态执行缺页中断服务程序

  • 异常或是中断的产生于现在CPU为用户态还是核心态无关,只看中断是由指令执行时产生还是外部产生

  • 从内存取数和把运算结果放入内存的指令在用户态执行

  • 输入/输出指令需要使用IO设备,涉及资源使用,有可能影响其他进程及危害⚠️计算机,所以不能在用户态执行

  • 系统调用:用户程序通过执行陷入指令来发起系统调用,请求操作系统提供服务;操作系统内核程序对系统调用做出相应处理;处理完成后,操作系统内核程序把CPU使用权还给用户程序

管道

管道是一种特殊的文件,本质上是一种固定大小的缓冲区,且只存在于内存中。一个管道可以实现双向的数据传输,而同一时刻最多有一个方向的传输,不能两个方向同时进行。当管道满时,进程在写管道会被阻塞;当管道空时,进程在读管道会被阻塞

分层

  • 第0层为硬件、第N层为用户接口

  • 每一层利用低一层提供的接口为高一层提供服务

模块(可加载内核模块)

  • 内核提供核心服务,其他服务通过模块链入服务

操作系统引导

  • 操作系统的生成与配置需要获取计算机硬件系统的特定配置
  1. 完全定制(系统管理员修改操作系统源代码副本,重新编译操作系统)

  2. 系统描述创建表,并从预先已编译的库中选择模块。将这些模块链接起来生成操作系统

  3. 构造完全由表驱动的系统,在执行时动态选择相应的代码模块。系统生成只是创建适当的表

  • 系统引导:加载内核以启动计算机的过程(通过一个简单的引导程序(ROM)从磁盘掉入更复杂的引导程序,后者再加载内核到内存)

  • 计算机启动过程:CPU加电;跳转到BIOS;登记BIOS中断例程入口地址;硬件自检;进行操作系统引导

虚拟机

哎呀,图片不见了

单个计算机的硬件抽象为几个不同的执行部件,通过CPU调度与虚拟内存技术,使进程认为自己拥有独立的处理器与内存

实现方法:提供虚拟磁盘,为用户提供与底层机器完全一样的副本。用户在自己的虚拟机中运行机器上拥有的任何操作系统ISO或软件

虚拟机只能运行在用户态,虚拟机内部也有用户态与内核态

可以用硬件实现也可以用软件实现

进程管理

  • PCB是进程存在的唯一标志

  • 进程映像:程序段、相关数据段、PCB(静态概念)

  • 线程是程序执行流的最小单元,是系统独立调度和分派的基本单元(处理机的分配单元);进程是除CPU资源以外的系统资源的分配单元(线程不占有系统资源)

  • 进程间通信(IPC)需要进程同步和互斥,以保证数据一致性;线程间通过直接读写数据段(全局变量)来通信

  • 引入线程可以提升程序并发执行的程度,可进一步提高系统效率。

  • 线程不可以脱离进程独立运行

1. c语言中全局赋值变量存放在正文段

2. 未赋值局部变量存放在栈段

3. 函数调用实参传递值存放在栈段

4. 用malloc()要求动态分配的存储区在堆段

5. 常量值存放在正文段

6. 进程优先级存放在PCB

  • 并发进程失去封闭性指:并发进程共享变量,其执行结果与速度有关(不同速度下执行结果不同)

  • 程序代码经过多次创建可对应不同的进程,而同一个系统的进程(线程)可以由系统调用的方法被不同进程(线程)多次使用(而不会为每次调用创建新的系统线程)

  • 父子进程可以共享一部分资源,但不能共享虚拟地址空间

  • 进程间通信一定会共享某些资源:共享存储器系统,共享存储器资源;消息传递系统,共享消息文件;管道通信,共享管道文件

  • 共享内存系统需要通信进程建立共享内存区域(通常驻留在创建共享内存段的进程地址空间中,其他希望使用这个共享内存段进行通信的进程应该将其加入自己的地址空间)

  • 管道是半双工工作,将数据以字节流的形式写入管道。管道(缓冲区)满时,写进程被阻塞;管道空时,读进程被阻塞

  • 中期调度:将暂时不运行的进程调至外存等待(挂起态),降低多道程序程度

不能进行进程调度与切换的情况

  1. 处理中断(中断处理属于系统工作的一部分,逻辑上不属于某一个进程)

  2. 进程在操作系统内核程序临界区(加锁)

  3. 其他需要完全屏蔽中断的原子操作

  • FCFS对长作业有利,适合CPU繁忙型作业

  • SJF对长作业不利,会导致饥饿

  • 分时系统时间片固定,因此用户数越多,响应时间越长

  • 高响应比优先调度不适用于交互式操作系统,高响应比调度需要知道作业预计运行时间,但是作业在交互式情况下,预计运行时间是不确定的,因此计算不出响应比

  • 对于多道程序来说,内存中最多存放n道作业,即处于就绪态、运行态、等待态的作业个数之和最多为n(处于运行态的作业,其程序代码段、数据段都在内存中,在内存视角中与其他内存中作业无异)

  • 阻塞队列中进程的个数最多为n个

  • 唤醒原语是将进程从阻塞态转变为就绪态,需要一个与被唤醒进程合作或被其他相关进程调用实现的

信号量

硬件实现中使用TSL指令实现进程互斥的伪代码如下:

1
2
3
4
5
6
7
8
9
do{//  该实现下,等待进入临界区的进程不会主动放弃CPU,不满足"让权等待"原则

while(TSL(&lock));//忙等待

critical section //临界区

lock = false;

}while(true)
  • 信号量的同步(原子性)是由硬件支持,PV操作也有临界区

wait() 、signal()操作没有完全取消忙等,只是将忙等由整个临界区(无法控制、可能很长,或者总是被占用)转移到了PV操作的临界区上(该临界区经过合理编码,不会超过10条指令,因此忙等很少发生,临界区几乎不被占用)

  • PV操作是一种低级进程通信原语

  • PV操作时需要根据用户需要自行确定信号量初始值

管程

  • 管程是进程同步工具,解决信号量机制大量同步操作分散的问题

  • 管程是被进程调用的,管程是语法范围,无法创建和撤销

  • 管程把对共享资源的操作封装起来

  • 每次仅允许一个进程进入管程

  • 管程使用条件变量condition定义为阻塞原因,不同阻塞原因对于相应条件变量

  • 管程中的signal操作的作用和信号量机制中的V操作不完全相同,signal操作唤醒一个因x条件而阻塞的进程;wait操作会阻塞该进程(x对应的条件不满足时调用)

  • 条件变量没有值,仅实现排队等待功能;信号量有值,反映剩余资源数

  • 管程使用共享数据结构记录剩余资源数

死锁

死锁定理(在资源分配图中检测系统状态是否为死锁状态):

将资源分配图中既不阻塞又不独立的进程逐个删去。如果能够消去图中所有的边,则不存在死锁

资源分配方法

  1. 静态分配:执行前获得所有资源

  2. 按序分配:进程$R_i$提出申请分配资源后,其他进程只能申请编号大于$i$的资源

  3. 银行家算法

  • 当系统处于不安全状态时,不会立即进入死锁状态。只有所有进程均因申请资源没有得到满足而进入阻塞态,系统才进入死锁状态

  • 在死锁检测的进程-资源图中,如果申请边的申请得到满足,则删去申请边,添加从资源到进程的分配边

  • 银行家算法进行安全🔐序列检查时,不需要的参数是满足系统安全的最少资源数

🔒的本质在内存中的一个整形数,不同数值表示不同状态

锁的分类

I. 重量级锁:得到锁就加锁,得不到锁立即进入阻塞状态

II. 自旋锁:在获取锁失败的时候不会使得线程阻塞而是一直自旋尝试获取锁。当线程等待自旋锁的时候,CPU不能做其他事情,而是一直处于轮询忙等的状态。(常适用在多CPU场景下,避免不必要的切换进程上下文开销)

III. 自适应自旋锁:根据线程最近获得锁的状态来调整循环次数的自旋锁

IV. 轻量级锁:进入方法时不加锁,只做一个标志(有人在执行),CAS机制

V. 偏向锁:没必要加锁,大部分时候只有一个线程在执行该方法

VI. 悲观锁:认为不加锁就会出事,因此无论是否并发竞争资源,都会锁住资源,并等待资源释放下一个线程才能获取到锁。例如:重量级锁、自旋锁、自适应自旋锁

VII. 乐观锁:不加锁,当出现冲突时再想办法解决。当线程开始竞争资源时,不是立马给资源上锁,而是进行一些前后值比对,以此来操作资源。例如:CAS机制

VIII. 互斥锁(Barkey锁(对进程编号)、Perterson锁):常用于多处理器系统,等待期间不用切换进程上下文,只有等到时间片用完才下处理级(违反“让权等待”)

IX. 共享锁:其他任何线程都无法获取互斥锁,但是可以获取共享锁

条件变量

  1. 等待队列

  2. 条件变量没有值,只有队列

  3. 对条件变量操作:wait/signal

  4. signal操作时如果一个条件变量上没有等待进程,则signal操作无效

  5. 常和锁共同使用(锁实现互斥、配合条件变量实现同步)

线程

线程的状态与转换与进程的状态基本一致

线程的组织与控制(TCB)

保存程序计数器PC其他寄存器与线程的堆栈指针

对于不支持内核级线程的操作系统,调度程序处理的对象是进程(进程内的线程由线程库管理);支持内核级线程的操作系统,调度程序处理对象是内核级线程

用户级线程、内核级线程

  1. 用户级线程由线程库管理用户线程

  2. 用户级线程的调度:代价低,不需要切换完整的上下文;一个线程阻塞整个进程阻塞

  3. 内核级线程的调度:代价高,需要切换到内核态,切换完整上下文;一个线程阻塞。其他线程仍可以运行

闲逛进程

  1. 没有其他就绪进程时,执行闲逛进程
  2. 优先级最低
  3. 可以是0地址指令,占一个完整的指令周期(指令周期末尾例行检查中断)
  4. 能耗低

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。

协程

协程是微线程,在子程序内部执行,可在子程序内部中断,转而执行别的子程序,在适当的时候再返回来接着执行。

特点

  1. 协程调用跟切换比线程效率高:协程执行效率极高。协程不需要多线程的锁机制,多个协程从属于一个线程,不存在同时写变量冲突,可以不加锁的访问全局变量,所以上下文的切换非常快。
  2. 协程占用内存少:执行协程只需要极少的栈内存(大概是4~5KB),而默认情况下,线程栈的大小为1MB。
  3. 切换开销更少:协程直接操作栈基本没有内核切换的开销,所以切换开销比线程少。

进程上下文

上下文切换

  • 进程上下文通常用PCB表示,包括CPU寄存器的值、进程状态等

  • 切换CPU到另一个进程需要保存当前进程状态和恢复另一个进程的状态

切换进程

  1. 需要保存地址空间(页表寄存器)

  2. TLB全部失效

  3. Cache全部失效

  4. 新进程运行初期缺页率可能高

切换线程

需要保存程序计数器、寄存器、堆栈

进程间通信

匿名管道

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

命名管道

命名管道提供了一个路径名与之关联,以命名管道的文件形式存在于文件系统中,这样,即使与命名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过有名管道相互通信

命名管道的名字存在于文件系统中,内容存放在内存中。遵循先进先出原则

信号

  • 信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。(异步通信)
  • 如果该进程当前并未处于执行状态,则该信号就有内核保存起来,知道该进程回复执行并传递给它为止。
  • 如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消是才被传递给进程。
信号 描述
SIGHUP 当用户退出终端时,由该终端开启的所有进程都退接收到这个信号,默认动作为终止进程。
SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl+C)时发出,用于通知前台进程组终止进程。
SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl+\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略
SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出。
SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

消息队列

  • 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
  • 与管道(匿名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。
  • 另外与管道不同的是,消息队列在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达
  • 消息队列的通信数据遵循先进先出的原则
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。

共享内存

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。同时需要使用信号量来控制多个进程对共享内存空间的访问

信号量

信号量主要用来解决进程和线程间并发执行时的同步问题。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

socket

套接字:IP+PORT。可以实现不同主机间的通信

哎呀,图片不见了

线程间通信

锁机制

包括互斥锁、条件变量、读写锁互斥锁提供了以排他方式防止数据结构被并发修改的方法。读写锁允许多个线程同时读共享数据,而对写操作是互斥的。条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

信号量机制

包括无名线程信号量和命名线程信号量

信号机制

类似进程间的信号处理线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。

内存管理

  • 存储管理是为了方便用户以及提高内存利用率

  • 页表寄存器存放的是顶级页表的起始物理地址

  • 页式存储方式只能采用动态重定位

  • 空间、时间局部性良好的数据结构和技术适用于虚拟存储系统(数据常在一页中)

  • 虚拟存储器中,程序正在执行时,由操作系统完成地址映射;硬件完成Cache映射

  • 页表应该包含作业页号、状态位、存取方式(执行、读/写)、外存页号、内存页号、修改位等

  • 进程在地址变换的过程中,可能因为地址越界而被撤销、也可能因为缺页而被阻塞

  • 处理缺页中断时,会更新TLB表与页表

  • 内存泄露:当以前分配的一片内存不再需要使用或无法访问时,但是并没有释放它,那么对于该进程来说,会因此导致总可用内存的减少,这时就出现了内存泄漏。

  • 内存越界访问:简单地说,进程访问了不属于该进程的内存空间

C语言编译

  • 过程中,形成逻辑地址的阶段是链接(将各个目标模块的逻辑地址重定位,形成完整的逻辑地址)

  • 编译阶段形成各个目标模块的独立的逻辑地址(从0开始)

  • 将逻辑地址转换为物理地址的阶段是装载阶段

  • 使用交换技术时,若一个进程处于IO操作,则不能交换出主存(处于创建、临界区、死锁时都可以)

  • 一个进程中段表只能有一个,页表可以有多个(每个分段对应一个页表)

  • 内存保护完全由硬件完成(重定位寄存器、界地址寄存器)

  • 操作系统通过内存保护实现多进程在主存中彼此互不干扰的环境下运行

  • 分页系统中的页面是为操作系统感知的(由操作系统管理)

  • 整个系统中只有一个重定位寄存器,在切换进程时重制寄存器的内容

  • 使用最佳适应算法、最差适应算法管理动态分区内存时,在每次分配与回收内存后,都会对空闲分区链进行重新排序,按空闲内存大小由小到大排序

  • 操作系统采用分页式存储管理方式时,每个进程拥有一张页表,且进程的页表驻留在内存中(进程使用多级页表时,一开始只将一级页表掉入内存)

  • 多级页表中,要使用几级页表,需要看虚拟地址中虚拟页号的位数

  • 多级页表可以减少页表所占连续内存空间,但增加页表项所占字节数,减慢地址变换速度(多次访存)

  • 在分段存储管理系统中,用共享段表描述所有被共享的段。若进程$P_1,P_2$共享段S,则在物理内存中仅保留一份段S的内容;段S在$P_1,P_2$中具有相同的段号;$P_1,P_2$都不使用段S时才回收段S段内存空间。

  • 虚拟存储只能基于非连续分配技术

  • 虚拟存储的容量≤内存容量+外存容量

  • 虚拟存储的容量≤计算机的地址位数能容纳的最大容量(虚拟存储容量受上式两个条件的制约)

  • 处理缺页错误时,操作系统执行置换页、分配内容等。但❌不会处理越界错误(地址变换前期由硬件检测)

  • LRU算法实现耗费高的原因:需要对所有页进行排序

  • 使用覆盖、交换可以实现虚拟存储

  • 覆盖技术用于同一个进程、交换技术用于不同进程

  • 产生内存抖动的主要原因是页面置换算法不合理

  • 在多级页表中,快表存放的是完整的页面号,而非某一级的页面号,因此快表命中即可到达物理地址

  • 当进行缺页处理需要置换页时,旧页的物理地址给新页用来写入数据(即物理地址不变)

  • 最高级页表项不能超过一页的大小

页面分配策略

  • 固定分配局部置换:每个进程分配固定数量的物理块,运行期间不会改变,发生缺页时,调出该进程分配的页帧

  • 可变分配全局置换:操作系统自身维护一个空闲物理块队列,进程发生缺页时,系统从空闲物理块队列中取出一个物理块分配给该进程,但进程不会自动归还物理块

  • 可变分配局部置换:发生缺页时,只能从该进程已分配的页帧中选择调出,若进程频繁缺页,系统会增加若干物理块;若进程缺页率低,系统适当减少分配的物理块

CLOCK算法

哎呀,图片不见了

调入一页则将指针向后移动一块,若命中则不移动指针

注意:若循环链表存在当前访问页时(访问页在某物理块中),直接将其访问位改为1,指针p不移动(命中后指针不移动);

否则,若当前p指针指向页面的访问位为0,则淘汰该页,调入新页,将其访问位改为 1,指针p移到下一个物理块:若当前p指针指向页面的访问位为1,则将其访问位改为 0,并移动口指针到下一个物理块。

改进型CLOCK算法(使用位u、修改位m)

  1. 从当前位置开始,扫描帧缓冲区,不修改使用位,寻找(u=0,m=0)的帧

  2. 重新扫描,寻找(u=0,m=1)的帧,将不符合的帧的使用位u改为0.

  3. 重复1、2步

内存共享

内存共享通过内存映射实现,将多个进程的虚拟地址空间映射到同一片物理地址(可以是“页”映射,也可以是“段”映射)

内存映射文件

将文件页映射到进程页表,进程按内存访问方式读写文件;还可以实现文件共享图像

文件管理

  • 操作系统采用两级内部表记录文件信息,即:每个进程表和整个系统表。
  • 每个进程表跟踪它打开的所有文件,保存进程对文件的使用记录。如:当前文件指针,文件访问权限
  • 单个进程表的每个条目相应的指向整个系统的打开表。
  • 系统表包含与进程无关的信息,包括每个打开文件的FCB的副本及其它信息
  • 文件控制块(FCB)由逻辑文件系统操作,维护文件的相关信息(一个FCB就是一个文件目录项)
  • 文件目录即为文件控制块的有序集合
  • 哎呀,图片不见了
  • 创建一个新文件后,系统将分配一个FCB并存放在文件的目录中
  • FCB必须连续存放
  • 索引节点存放在磁盘中,由文件目录项中的指针指向
  • 索引节点是一块存储文件原信息的磁盘空间为了,为inode。
  • 普通文件由目录块里的一个FCB加上多个数据块组成
  • 目录文件由目录块里的一个FCB加上多个其他多个目录块组成
  • 一个索引节点只能被一个文件(无论是目录文件,还是普通文件)所用,不能同时被其他文件所用。

执行一条open指令的工作过程:

open指令先根据文件路径找到相应的目录文件(对于目录文件的查找与其他文件查找方式相同),根据目录文件的数据找到文件的目录项。为了增加检索文件时的效率,文件目录中的目录项只记录文件名以及一个指向索引结点的指针,找到该文件后再根据指针找到索引结点,读出该文件的物理地址。文件被打开后,磁盘索引结点(目录)被复制到内存索引结点。对索引结点添加count字段后支持文件的硬链接。

  • 文件系统采用多级目录结构的目的:解决命名冲突

  • 逻辑记录是对文件进行存取操作的基本单位

  • 在物理存储器中,文件数据(文件区)与文件控制信息(目录区)分离存储

  • 文件是逻辑记录的一个序列,逻辑记录可以是字节、行或更为复杂的数据项

  • 索引节点的总数表示系统中可拥有文件的最大数量

软链接、硬链接

哎呀,图片不见了 哎呀,图片不见了
  • linux下创建目录后,文件链接数2.因为目录中有上一级目录与当前目录,在该目录中每新加一个文件就会增加目录的链接数

  • 建立符号链接时,引用计数值直接复制;建立硬链接时,引用计数值+1(引用计数值存放在索引节点中,即不在文件目录中)

  • 硬链接通过索引结点进行连接,一个文件在物理存储器上有一个索引结点号。存在多个文件名指向同一个索引结点。共享文件的不同进程各自维护自己的文件描述符(记录进程的读写指针位置)。

  • 软链接可以在目录与文件链接时使用、及其网络文件

  • 多个进程共享一个文件F,则在系统打开表中仅有一个表项包含F的属性(硬链接直接使用指针与索引节点相连;软链接会新建一个链接文件)

  • 访问控制机制必须由系统实现,而且安全性较差,灵活性较强

  • 对一个文件的访问,常由用户访问权限和文件属性共同限制🚫

  • 常使用备份方法保护文件

  • 存取控制矩阵用于多用户间的存取权限保护

  • 将用户访问权限抽象为矩阵,行代表用户;列代表权限

  • FAT(文件配置表)表项与全部磁盘块一一对应,索引分配将整个文件的盘块号集中构成索引块

  • 链接分配不适合直接存取的外存分配方式

  • 为支持CD-ROM中视频文件的快速播放,播放性能最好的文件数据块组织形式为连续结构

  • 文件系统为每个文件创建一张索引表,存放文件数据块的磁盘存放位置

  • 在FAT中第i项存放第i项的下一项的项号

  • 光盘、U盘、磁盘既可以随机访问又可以顺序

  • 索引顺序文件既可以顺序访问又可以随机访问

虚拟文件系统

哎呀,图片不见了

采用面向对象技术(多态技术)同时支持多种类型的文件系统

  1. 提供清晰的VFS接口,将文件系统的通用操作与实现分开,屏蔽底层具体文件系统的实现差异

  2. VFS要求下层文件系统必须实现某些规定的函数功能,一个新的文件系统想要在操作系统上被使用,就必须满足该操作系统的VFS要求

  3. 调用open后,VFS将具体文件系统传来的不同的FCB统一转换为vnode(vnode只存在于主存)

  4. 函数功能指针:记录对于的文件系统提供的函数

  5. 唯一的表示网络上的文件

VFS四个对象

A. 超级块:一个超级块对应一个文件系统

B. 索引结点inode:保存元数据(文件大小、设备标识符、指向该内容的磁盘区块指针等)

C. 目录项:描述文件的逻辑属性,只存在内存中。目录也是一种文件

D. 文件对象:进程通过文件描述符操作文件

数据有元数据+数据本身

inode也有两种:VFS的inode(内存中)、具体文件系统的inode磁盘中。需要将磁盘inode调进填充内存中的inode,才能使用磁盘inode

一个文件对应一个inode,inode号唯一

文件系统挂载

挂载:将新的文件系统关联到当前根文件的文件系统

挂载点:要挂载文件系统的访问入口;挂载点必须事先存在;挂载点下的原有文件被暂时隐藏

  1. 在VFS中注册新挂载的文件系统,内存中的挂载表包含每个文件系统的相关信息,包括文件系统类型、容量大小等

  2. 新挂载的文件系统,要向VFS提供一个函数地址列表(函数功能指针)

  3. 将新文件系统加到挂载点,即将新文件系统挂载到某个父目录下

IO管理

  • 共享设备必须是可寻址可随机访问的设备

  • 分享共享设备不会导致进程死锁

  • 实现的功能有:实现外围设备的分配和回收;实现虚拟设备;实现对磁盘的驱动调度

  • 直接存取存储器(磁盘)既不像RAM那样随机访问任何一个存储单元,又不像顺序存取存储器那样完全顺序存取,而是介于两者之间,存取信息时通常先寻找存储器的某个小区域(磁道),再在小区域内顺序查找。

设备控制器

  • 为了便于上层软件编制,设备控制器通常要提供控制寄存器(存放CPU来的控制信号)、状态寄存器(设备来的设备状态信息)和控制命令

  • 设备控制器中实现设备控制的是IO逻辑

  • 通道控制设备控制器、设备控制器控制设备工作

  • 设备控制器需要请求通道为其服务。因此,控制器控制表COCT中定有一个表项存放指向相应通道控制表CHCT的指针

  • 一个通道为多个设备控制器服务。因此,CHCT中有一个指针指向一张记录CHCT提供服务的设备控制器的表(CHCT与COCT是一对多的关系)

  • 通道技术是硬件技术

  • 通道指令保存在主存中,是一系列通道指令

  • IO设备与存储设备使用DMA方式进行数据交换,不经过CPU来完成

  • 堆栈指针寄存器不属于DMA控制器,内存地址寄存器属于(用来存放DMA作业时的源地址与目标地址)

  • 将系统中的每台设备按照某种原则编号,这些编号作为区分硬件和识别设备的代号,该编号称为设备的绝对号

  • 将系统调用的参数翻译成设备操作命令的工作由设备无关的操作系统软件实现

  • IO层次组织排列为:用户级IO软件、设备无关软件(系统调用处理程序)、设备驱动程序、中断处理程序

  • 用户下达read指令;设备无关软件对read指令进行解析;设备驱动程序针对设备解析为不同的指令;中断服务程序中断CPU正在运行的进程,执行解析后的read命令;最后命令到达硬件设备,硬件设备控制器按照相应命令操控硬件,完成相应功能

系统将数据从磁盘读入内存包括:

  1. 初始化DMA控制器并启动磁盘

  2. 从磁盘传输一块数据到内存缓冲区

  3. DMA控制器发出中断请求

  4. 执行DMA结束中断处理程序

  • 设备独立性:用户编程时使用的设备与实际设备无关

  • 磁盘属于共享设备

  • SPOOLing技术将独占设备变成共享设备,但是只是逻辑上改变。实际设备仍是独占设备

  • SPOOLing系统由预输入程序、预输出程序、井管理程序组成

  • 使用SPOOLing技术时,用户打印结果首先被送到磁盘的固定区域(输入井中)

  • SPOOLing技术可以当输出设备忙时,减少进程等待时间,加快作业完成速度

  • 图形用户界面使用鼠标、多任务操作系统下磁带驱动器、包含用户文件的磁盘驱动器、使用存储器映射IO,直接和总线相连的图形卡都需要使用缓冲技术(IO速度不相匹配就需要使用缓冲)

磁盘初始化

  • 执行顺序:ROM引导程序、磁盘引导程序、分区引导程序、操作系统初始化程序

  • 物理格式化(低级格式化):对每个磁道划分扇区,安排扇区在磁道中的排列顺序,并对已损坏的磁道和扇区做“坏”标记

  • 分区:将磁盘分为C盘、D盘等相互独立的分区

  • 进行逻辑格式化(高级格式化):对扇区进行逻辑编号、建立逻辑盘的引导记录、文件分配表、文件目录表和数据区等,还包括建立文件系统根目录

  • 硬盘的操作系统引导扇区产生在对硬盘进行高级格式化时

谢谢你请我吃糖果
0%