操作系统(自我总结)

编程入门 行业动态 更新时间:2024-10-28 20:21:39

一.什么是操作系统

1.操作系统的概念。

操作系统(Operating Ststem, OS):是控制和管理整个计算机系统的硬件和软件资源,并合理地组织计算机工作流程,并为用户提供一个良好的工作环境和友好的接口。是计算机系统中最基本的系统软件

2.操作系统的历史。

1.按照器件工艺划分的计算机发展过程:

  1. 电子管时代,无操作系统。
  2. 晶体管时代,批处理系统。
  3. 集成电路时代,多道程序设计。
  4. 大规模和超规模集成电路时代,分时系统。

2.操作系统的发展过程:

  1. 手工操作阶段。
  2. 批处理阶段。包括单道批处理系统多道批处理系统

  3. 分时操作系统。

  4. 实时操作系统。

  5. 通用操作系统。

3.操作系统的类型以及各自的特点。

类型:

  1. 批处理操作系统。
  2. 分时操作系统。
  3. 实时操作系统。
  4. 个人计算机操作系统。
  5. 网络操作系统。
  6. 分布式操作系统。

批处理操作系统的特点:1.用户脱机使用计算机。2.成批处理。3.多道程序运行。

分时系统的特点:1.交互性。2.多用户同时性。2.独立性。

实时操作系统的特点:提供及时响应和高可靠性。

网络操作系统的特点:1.计算机网络是一个互联的计算机系统的群体。2.每台计算机独立工作,在网络协议控制下协同工作。3.系统互联要通过通信设施(硬件和软件)实现。4.系统通过通信设施执行信息交换、资源共享、互操作和协调工作。

4.操作系统的功能和特征。

功能:

  1. 处理机管理。
  2. 存储管理。主要是内存的分配、保护、扩充。
  3. 设备管理。
  4. 信息管理(文件系统管理)。
  5. 用户接口。

特征:

  1. 并发:两个或多个事件在同一时间间隔内发生。这些事件在宏观上是同时发生的,在微观上是交替发生的。注意:(并行:两个或多个事件在同一时刻同时发生)
  2. 共享:资源共享,内存中多个并发执行的进程共同使用系统中的资源。
  3. 虚拟:把一个物理上的实体变为若干个逻辑上的对应物。主要采用空分复用技术时分复用技术。
  4. 异步:多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

并发和共享是操作系统最基本的2个特征。

5.操作系统的运行机制和体系结构。

1.概念:

  1. 指令:特权指令(不准许用户程序执行)和非特权指令。
  2. 陷入指令=trap指令=访管指令。
  3. cpu
  4. 程序:内核程序和用户程序。

2.指令的中断和异常:

        中断:计算机运行过程中,处理机收到紧急事件处理信号,这时需要暂停正在运行的程序,转去处理相应的紧急事件,处理完毕后又返回原被暂停的程序继续运行。

  1. 当中断发生时,CPU立即进入核心态。
  2. 当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理。
  3. 对于不同的中断信号,会进行不同的处理。
  4. 有了中断,才能实现多道程序并发执行。
  5. “用户态→核心态”是通过中断实现的,并且中断是唯一途径。“核心态→用户态”的切换是通过执行一个特权指令,将程序状态字( PSW)的标志位设置为 “用户态”。

        中断的分类

         系统调用的过程:

3.操作系统的体系结构。

 4.操作系统启动和引导。

二.进程管理。

 1.程序的概念与进程的概念。

  1. 程序:描述计算机所要完成的具有独立功能的,并在时间上按严格次序前后相继的计算机操作序列集合,是一个静态的概念。
  2. 程序的执行顺序执行并发执行
  3. 顺序执行的特点:1.顺序性。2.封闭性。3.可在现性。
  4. 程序执行环境的特点:1.独立性。2.随机性。3.资源共享性。
  5. 并发执行:一组在逻辑上互相独立的程序或者程序段在执行过程中,其执行时间在客观上重叠,即一个程序段的执行尚未开始,另一个程序段的执行已经开始。

        进程:并发执行的程序在执行过程中分配和管理资源的基本单位。

        进程和程序的区别:

  1. 进程是个动态概念,程序是一个静态概念。
  2. 进程具有并发特征,程序没有。
  3. 不同的进程可以包含同一个程序(该程序对应的数据集不同)。
  4. 进程的并发性收到系统的制约。                        

        进程的组成PCB,有关程序段,数据结构集。

 

         进程的特征:

 2.进程的状态与转换。

        进程的状态:初始态、执行态、阻塞态(等待态)、就绪态、终止态。

        状态的转换:

 3.进程控制与切换。

       原语:系统态下执行的某些具有特定功能的程序段。

       进程的创建:1.由系统程序模块同意创建。2.有父进程创建。过程如下(创建原语): 

  1. 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的)。若PCB申请失败则创建失败。
  2. 为进程分配资源,为新进程的程序和数据、以及用户栈分配必要的内存空间(在PCB 中体现)。注意:这里如果资源不足(比如内存空间),并不是创建失败,而是处于”等待状态“,或称为“阻塞状态”,等待的是内存这个资源。
  3. 初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
  4. 如果进程就绪队列能够接纳新进程,就将新进程插入到就绪队列,等待被调度运行。

         进程的撤销:

        1.正常结束:进程已完成所要求的功能而正常终止

        2.异常结束:进程由于某些错误而导致终止。如存储区越界、保护错、非法指令、特权指令错、I/O故障等。

        3.祖先进程要求撤销某个子进程。

        撤销原语:

  1. 根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
  2. 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
  3. 若该进程还有子进程,则应将其所有子进程终止。
  4. 释放该进程所拥有的全部资源。
  5. 将该PCB从所在队列(链表)中删除。

        进程的阻塞:正在执行的进程,由于期待的某些事件未发生,系统则自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。
        阻塞原语:

  1. 找到将要被阻塞进程的标识号对应的PCB。
  2. 若该进程为运行状态,则保护其现场,将其状态转为阻塞状态,停止运行。
  3. 把该PCB插入到相应事件的等待队列中去。

        进程的唤醒:当被阻塞进程所期待的事件出现时,等待该事件的进程将被唤醒。1.由系统进程唤醒。2.由事件发生进程唤醒。
        唤醒原语:

  1. 在该事件的等待队列中找到相应进程的PCB。
  2. 将其从等待队列中移出,并置其状态为就绪状态。
  3. 把该PCB插入就绪队列中,等待调度程序调度。

        进程切换:处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化。
        进程切换的过程如下

  1. 保存处理机上下文,包括程序计数器和其他寄存器。
  2. 更新PCB信息。
  3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
  4. 选择另一个进程执行,并更新其PCB。
  5. 更新内存管理的数据结构。
  6. 恢复处理机上下文。

4.进程的通信。

        进程通信:就是进程之间的信息交换,分成低级通信高级通信两类。

        进程通信方式: 

  1. 共享存储区。
  2. 消息传递。
  3. 管道通信。

       共享存储区:

         消息缓冲机制:发送进程在发送消息时,先在自己的内存中设置一个发送区,把想发送的消息填入其中,然后再用发送过程将其发送出去。接收进程在接受消息之前,在自己内存空间设置相应的接受区,然后用接受过程接受消息。应满足如下条件:

  1. 发送进程把消息写入缓冲区和把缓冲区挂入消息队列时,禁止其他进程对缓冲区消息队列的访问。
  2. 缓冲区中无消息存在时,接收进程不能接受任何信息。

        消息传递:发送信息的进程将消息头写好,接受信息进程根据消息头读取信息或寻找信封。

         管道通信:为建立管道的进程及其子孙提供一条以比特流方式传递消息的通信管道。 

1.管道只能采用半双工通信,某一时间段内只能实现单向的传输。如果要实现双向同时通信,则需要设置两个管道。
2.各进程要互斥地访问管道。
3.数据以字符流的形式写入管道,当管道写满时,写进程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取后,管道变空,此时读进程的read()系统调用将被阻塞。
4.如果没写满,就不允许读。如果没读空,就不允许写。
5.数据一旦被读出,就从管道中被抛弃,这就意味着读进程最多只能有一个,否则可能会有读错数据的情况。

5.进程同步与进程互斥。

        1.进程同步与进程互斥的概念。

        进程同步:同步亦称直接制约关系。把异步环境下的一组并发进程,应直接制约而相互发送消息而进行相互合作、互相等待,使得各个进程按照一定的速度执行的过程称为进程同步

        进程互斥:互斥亦称间接制约关系。指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源。

        临界资源:把一个时间段内只允许一个进程使用的资源称为临界资源。

        临界区(临界部分):不允许多个并发进程交叉执行的一段程序。

        临界资源使用原则:

  1. 空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区;
  2. 忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待;
  3. 有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
  4. 让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待。

        2.实现同步互斥的软硬件方法。

同步互斥 软件方法: 
  1. 单标志法。
  2. 双标志先检查法。

  3. 双标志后检查法
  4. Peterson算法。

同步互斥硬件方法:

  1. 中断屏蔽方法。

  2. TestAndSet指令。

  3. Swap指令。

        1.单标志法。

        算法思想:每个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。   单标志法存在的主要问题是:违背“空闲让进”原则。P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。

        2.双标志先检查法

        算法思想:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0] =ture”意味着0号进程 P0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[li]设为true,之后开始访问临界区。双标志先检查法的主要问题是:违反“忙则等待”原则。P0和P1同时访问临界区。

         3.双标志后检查法。

         4.Peterson算法。

        双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区。Gary L.Peterson想到了一种方法,如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”,主动让对方先使用临界区。未遵循让权等待的原则。 

         5.中断屏蔽方法。

         6.TestAndSet指令。  

         7.Swap指令。

        3.互斥锁。

        解决临界区临界资源冲突的最简单的方式就是通过互斥锁。一个进程在进入临界区的时候加锁,出临界区时解锁。

acquire (){
	while(!available);//忙等待
	available = false;//获得锁
}
release() {
	available = true;//释放锁
}

缺点:

  1. 在锁没有就绪时,CPU处于忙等状态。浪费CPU资源。不太适合单处理机。违反让权等待。

优点

  1. 互斥锁通常用于多处理机上,进程在一个处理机上等待,不会影响另一个进程的运行。等待消耗比进程切换的代价更低。

        4.信号量机制。

        1.信号量机制的概念。

        信号量:其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量)。

        信号量机制:用一个信号量来表示系统中某种资源的数量,用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。

        一对原语: wait(S)原语和 signal(S)原语(P,V原语)。可以把原语理解为我们自己写的函数,函数名分别为 wait和 signal,括号里的信号量s其实就是函数调用时传入的一个参数。

         整型信号量:用一个整数型的变量作为信号量,用来表示系统中某种资源的数量。  

        记录型信号量:记录型数据结构表示的信号量。 遵循了让权等待原则

        2.信号量实现进程互斥,同步,前驱关系。

1.信号量机制实现进程互斥

  1. 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)。
  2. 设置互斥信号量mutex,初值为1。
  3. 在临界区之前执行P(mutex)。
  4. 在临界区之后执行V(mutex)。

P、V操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。

 2.信号量机制实现进程同步

  1. 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)。
  2. 设置同步信号量s,初始为0。
  3. 在“前操作”之后执行v(S)。
  4. 在“后操作”之前执行P(S)。

3.信号量机制实现前驱关系

进程P1中有句代码S1,P2中有句代码S2 …P… P6中有句代码S6。这些代码要求按如下前驱图所示的顺序来执行:
其实每一对前驱关系都是一个进程同步问题(需要保证一前一后的操作),因此,

  1. 要为每一对前驱关系各设置一个同步变量。
  2. 在“前操作”之后对相应的同步变量执行V操作。
  3. 在“后操作”之前对相应的同步变量执行Р操作。

3.经典进程同步互斥问题 。

        1.生产者——消费者问题。

         1.问题描述:系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者进程每次从缓冲区中取出一个产品并使用。

  • 生产者、消费者共享一个初始为空、大小为n的缓冲区
  • 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待。
  • 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待。
  • 缓冲区是临界资源,各进程必须互斥地访问。

         2.实现思路:

        2.多生产者——多消费者问题。

1.问题描述
桌子上有一只盘子,每次只能向其中放入一个水果。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等着吃盘子中的橘子,女儿专等着吃盘子中的苹果。只有盘子空时,爸爸或妈妈才可向盘子中放一个水果。仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。用PV操作实现上述过程。

  2.实现思路:

问题:可不可以不使用问题信号量?

结论:即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。如果盘子(缓冲区)数量为2,可能会出现两个进程同时访问缓冲区的情况,有可能导致两个进程写入缓冲区的数据相互覆盖的情况。

        3.吸烟者问题。

1.问题描述:
假设一个系统有三个抽烟者进程一个供应者进程。每个抽烟者不停地卷烟并抽掉它,但是要卷起并抽掉一支烟,抽烟者需要有三种材料:烟草、纸和胶水。三个抽烟者中,第一个拥有烟草、第二个拥有纸、第三个拥有胶水。供应者进程无限地提供三种材料,供应者每次将两种材料放桌子上,拥有剩下那种材料的抽烟者卷一根烟并抽掉它,并给供应者进程一个信号告诉完成了,供应者就会放另外两种材料再桌上,这个过程一直重复(让三个抽烟者轮流地抽烟)。

  2.实现思路:

        4.读者——写者问题。

        1.问题描述:有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:

①允许多个读者可以同时对文件执行读操作;

②只允许一个写者往文件中写信息;

③任一写者在完成写操作之前不允许其他读者或写者工作;

④写者执行写操作前,应让已有的读者和写者全部退出。       

   2.实现思路:

 优化:

5.哲学家吃饭。

1.问题描述
一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

2.实现思路:

 6.管程与死锁。

        信号量机制存在的问题 : 编写程序困难、易出错。 因此人们想设计一种机制,让程序员写程序时不需要再关注复杂的PV操作,让写代码更轻松。1973年,Brinch Hansen首次在程序设计语言(Pascal)中引入了“管程”成分――一种高级同步机制。                                                                       

1.管程的定义和基本特征。 

管程相当于对临界区资源进行抽象而编写的一个类。一种特殊的软件模块。有这些部分组成:

  • 1.局部于管程的共享数据结构; (一个类)
  • 2.对该数据结构进行操作的一组过程; (类中的方法)
  • 3.对局部于管程的共享数据设置初始值的语句; (类中的变量)
  • 4.管程的名字。 (类名)

管程的基本特征:

  1. 局部于管程的数据只能被局部于管程的过程所访问; (类中变量有自己的作用范围)。
  2. 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  3. 每次仅允许一个进程在管程内执行某个内部过程。

2.死锁的定义和基本特征。

        定义在并发环境下各进程因竞争资源而造成的一种互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象,就是“死锁“。发生死锁后若无外力干涉,这些进程都将无法向前推进。

        死锁,饥饿,死循环的区别: 

        死锁产生的必要条件:其中任一条件不成立,死锁就不会发生。

  1. 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。像内存、扬声器这样可以同时让多个进程使用的资源是不会导致死锁的(因为进程不用阻塞等待这种资源)。

  2. 不可剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。

  3. 请求 和 保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放

  4. 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。

注意 : 发生死锁时一定有循环等待 , 但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)。如果同类资源数大于1,则即使有循环等待,也未必发生死锁。但如果系统中每类资源都只有一个,那循环等待就是死锁的充分必要条件了。

        什么时候会发生死锁:

  1. 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(CPU)的竞争是不会引起死锁。
  2. 进程推进顺序非法。请求和释放资源的顺序不当,也同样会导致死锁。
  3. 信号量的使用不当也会造成死锁。如生产者-消费者问题中,如果实现互斥的P操作在实现同步的P操作之前,就有可能导致死锁。(可以把互斥信号量、同步信号量也看做是一种抽象的系统资源)

3.死锁的处理策略。 

死锁的处理策略类型:

  1. 预防死锁破坏死锁产生的四个必要条件中的一个或几个。
  2. 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
  3. 死锁的检测和解除允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁

1.预防死锁:  

2.避免死锁:

        安全序列:如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。

        如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,则可能会发生死锁。(不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)。

安全性算法:

安全性算法步骤:检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。不断重复上述过程,看最终是否能让所有进程都加入安全序列。

 银行家算法:

银行家算法步骤:

  • 检查此次申请是否超过了之前声明的最大需求数。
  • ②检查此时系统剩余的可用资源是否还能满足这次请求。
  • 试探着分配,更改各数据结构。
  • 用安全性算法检查此次分配是否会导致系统进入不安全状态。

3.死锁的检测和解除:

        1.死锁的检测:为了能对系统是否已发生了死锁进行检测,必须: 

  • ①用某种数据结构来保存资源的请求和分配信息;
  • ②提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

如果系统中剩余的可用资源数足够满足进程的需求,那么这个进程暂时是不会阻塞的,可以顺利地执行下去。如果这个进程执行结束了把资源归还系统,就可能使某些正在等待资源的进程被激活,并顺利地执行下去。相应的,这些被激活的进程执行完了之后又会归还一些资源,这样可能又会激活另外一些阻塞的进程。(先执行完一个进程,释放资源后在执行完其他进程,以此类推)如果按上述过程分析,最终能消除所有边,就称这个图是可完全简化的。此时一定没有发生死锁(相当于能找到一个安全序列)。如果最终不能消除所有边,那么此时就是发生了死锁。

        死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁。

        2.死锁的解除:

        并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程。

        解除死锁的主要方法有:

  1. 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿
  2. 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止还得从头再来。
  3. 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

        如何选择对哪些进程动手?

  1. 进程优先级 (优先级低的)
  2. 已执行多长时间 (执行时间短的)
  3. 还要多久能完成 (时间长的进行处理)
  4. 进程己经使用了多少资源 (资源多的)
  5. 进程是交互式的还是批处理式的 (进行批处理的)

三.线程及处理机调度。

 1.线程的概念。     

        why:引入线程是为减小程序并发执行时所付出的时空开销,提高操作系统的并发性能。引入线程后,进程只作为系统资源的分配基本单位,而线程则作为处理机调度分配的基本单位

        线程:是进程中的一个实体,是操作系统中进行运算调度的最小单位,由线程ID,程序计数器程序计数器程序计数器程序计数器程序计数器,寄存器集合和堆栈组成。一个进程中可以并发多个线程,每条线程并行执行不同的任务。

2.线程的分类(实现方式)与执行。

        1.线程的分类

        1.用户级线程。

  1. 用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)
  2. 用户级线程中,线程切换可以在用户态下即可完成,无需操作系统干预。
  3. 在用户看来,是有多个线程。但是在操作系统内核看来,并意识不到线程的存在。(用户级线程对用户不透明,对操作系统透明)
  4. 可以这样理解,“用户级线程”就是“从用户视角看能看到的线程”。

        2.内核级线程。

  1. 内核级线程的管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必需在核心态下才能完成。
  2. 可以这样理解,“内核级线程”就是“从操作系统内核视角看能看到的线程”。

        2.线程的状态

  1. 派生。线程在进程中派生出来,即可有进程派生,也可由线程派生。派生后放入就绪队列。
  2. 阻塞。如果线程在执行过程中需要等待某个事件,则被阻塞。
  3. 激活。如果阻塞线程等待的事件发送,则该线程被激活,进入就绪队列。
  4. 调度。选择一个就绪线程就如执行状态。
  5. 结束。线程执行结束,寄存器上下文以及堆栈内容被释放。

 3.处理机调度。

        处理机调度:从就绪队列中按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程的并发执行

        调度分为四个层次:高级调度(作业调度),中级调度(交换调度),初级调度(进程调度),线程调度。(多道批处理系统

  1. 高级调度(作业调度)。按一定的原则从外存输入井的大量作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应的进程(建立PCB),以使它(们)获得竞争处理机的权利。高级调度是辅存(外存)与内存之间的调度。每个作业只调入一次,调出一次。作业调入时会建立相应的PCB,作业调出时才撤销PCB。高级调度主要是指调入的问题,因为只有调入的时机需要操作系统来确定,调出的时机必然是作业运行结束才调出。
  2. 中级调度(交换调度)。将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存。暂时调到外存等待的进程状态为挂起状态。
  3. 初级调度(进程调度)。主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。 

        分时系统和实时系统中一般不存在作业调度。

        三种层次对比: 

         进程的七状态模型:

        1.作业调度(高级调度)。

                作业调度的功能: 

  1. 记录系统中各个作业的状况,包括执行阶段的有关情况。
  2. 从后备队列中挑选出一部分作业执行。
  3. 为被选中的作业做好执行前的准备工作。
  4. 为作业结束时做好善后工作。

                衡量作业调度算法的标准(批处理系统):1.作业平均周转时间。2..作业平均带权周转时间。

                衡量作业调度算法的标准(分时和实时系统):增加平均响应时间。

        2.进程调度(初级调度)的时机,切换过程和方式。

                进程调度的时机:                进程调度的功能

  1. 记录系统中所有进程的情况。
  2. 选择占有处理机的进程。
  3. 进行进程的上下文切换。 

                进程调度的方式:

  1. 非剥夺调度方式,又称非抢占方式。只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
  2. 剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。

4.调度算法的评价指标。

  1. CPU利用率: CPU"忙碌"的时间占总时间的比例。
  2. 系统吞吐量:单位时间内完成作业的数量。
  3. 周转时间:是指从作业被提交给系统开始,到作业完成为止的时间间隔。
  4. 等待时间:指进程/作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。(完成时间-到达时间-运行时间
  5. 响应时间:指从用户提交请求到首次产生响应所用的时间。

5.调度算法。

  1. 先来先服务 调度算法。

  2. 最短作业优先 调度算法。

  3. 最高响应比优先 调度算法。

  4. 时间片轮转 调度算法。

  5. 优先级调度 算法。

  6. 多级反馈队列 调度算法。

1.先来先服务(FCFS,First Come First Serve)

                        

 2.最短作业优先(SJF,Shortest Job First)

 3.最高响应比优先(HRRN,Highest Response Ratio Next)

 4.时间片轮转调度(RR,Round-Robin)

  • 如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大。
  • 如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
  • 设计时间片要让切换进程的开销占比不超过1%。

5.优先级调度算法

 6.多级反馈队列调度算法(Round-Robin with multiple feedback)

 

 理解:

 6.实时调度(?)。

        由于在实时系统中都存在着若干个实施进程或任务,它们用来反应或控制某个(些)外部事件,往往带有某种程度的紧迫性,因而对实时系统中的调度提出了某些特殊要求,前面所介绍的多种调度算法,并不能很好的满足实时系统对调度的要求,为此,需要引入一种新的调度,即实时调度。

实时系统中依据处理外部事件的时限要求可分为:

  • 硬实时任务
    必须满足任务的时限要求。
  • 软实时任务
    允许系统对任务的时限要求有一定的延迟。

实时操作系统的特点:

  • 1.优先等待时间。(决定性特性)
  • 2.有限响应时间。
  • 3.用户控制。
  • 4.可靠性高。
  • 5.系统出错处理能力强。

        1.实时操作系统的能力。

  • 1、很快的进程或线程切换速度。
  • 2、快速的外部中断响应能力。
  • 3、基于优先级的随时抢占式调度策略。

        2.实时调度算法的分类。

四.内存管理。

        1.内存基本概念与管理功能。

        内存:是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。

        相对地址又称逻辑地址,绝对地址又称物理地址。编译时产生的指令只关心“相对地址”,实际放入内存中时再想办法根据起始位置得到“绝对地址”。 

2.内存管理的功能。

  1. 内存的分配和回收
  2. 操作系统需要提供某种技术从逻辑上对内存空间进行扩充
  3. 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址的转换(三种装入方式)。
  4. 操作系统需要提供内存保护功能。保证各进程在各自存储空间内运行,互不干扰。

3.内存保护的两种方法。    

  • 方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。 
  • 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。

    4.内存空间进行扩充的方法。

     1.覆盖技术

  • 覆盖技术: 将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。内存中分为一个“固定区”和若干个“覆盖区”。常驻内存的段放在“固定区”中,调入后就不再调出(除非运行结束),不常用的段放在“覆盖区”需要用到时调入内存,用不到时调出内存。

    必须由程序员声明覆盖结构,操作系统完成自动覆盖。缺点:对用户不透明,增加了用户编程负担。覆盖技术只用于早期的操作系统中,现在已成为历史。

        2.交换(对换)技术

  • 交换(对换)技术: 内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)。中级调度(内存调度)就是为这个服务的。

     注意:PCB会常驻内存,不会被换出外存。

  • 3.虚拟内存

     虚拟内存的定义和特征:                                                                                                           1.基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以让程序开始执行。

             2. 在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。

             3.若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

             4.在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是虚拟内存。

        4.虚拟内存的实现 

 1.请求分页管理方式。

        1.页表机制。

        与基本分页管理相比,请求分页管理中,为了实现“请求调页”

  1. 操作系统需要知道每个页面是否已经调入内存。
  2. 如果还没调入,那么也需要知道该页面在外存中存放的位置。
  3. 当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面。
  4. 有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

因此页表会增加四个字段来上面的信息。

        2.缺页中断机制。

        假设此时要访问逻辑地址 = (页号,页内偏移量)= (0,1024)。在请求分页系统中,每当要访问的页面不在内存时,便产生一个缺页中断,然后由操作系统的缺页中断处理程序处理中断。此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。1.如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入该块,并修改页表中相应的页表项。2.如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面在内存期间被修改过,则要将其写回外存。未修改过的页面不用写回外存。

  1. 缺页中断是因为当前执行的指令想要访问的目标页面未调入内存而产生的,因此属于内中断
  2. 一条指令在执行期间,可能产生多次缺页中断。(如: copy AtoB,即将逻辑地址A中的数据复制到逻辑地址B,而A、B属于不同的页面,则有可能产生两次中断)

         3.地址变换机制。

补充知识点
只有“写指令”才需要修改“修改位”。并且,一般来说只需修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表。这样可以减少访存次数。

②和普通的中断处理一样,缺页中断处理依然需要保留CPU现场

③需要用某种“页面置换算法”来决定一个换出页面(下节内容)

④换入/换出页面都需要启动慢速的I/o操作,可见,如果换入/换出太频繁,会有很大的开销。

⑤页面调入内存后,需要修改慢表,同时也需要将表项复制到快表中。

2.页面置换算法。

        1.最佳置换算法。

        最佳置换算法(OPT,Optimal):每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低的缺页率最佳置换算法是无法实现的。

         2.先进先出置换算法。

        先进先出置换算法(FIFO):每次选择淘汰的页面是最早进入内存的页面。

        实现方法:把调入内存的页面根据调入的先后顺序排成一个队列,需要换出页面时选择队头页面即可。队列的最大长度取决于系统为进程分配了多少个内存块。

        Belady异常―一当为进程分配的物理块数增大时,缺页次数不减反增的异常现象。

        只有FIFO算法会产生Belady异常。另外,FIFO算法虽然实现简单,但是该算法与进程实际运行时的规律不适应,因为先进入的页面也有可能最经常被访问。因此,算法性能差。

         3.最近最久未使用算法。

        最近最久未使用置换算法(LRU,least recently used):每次淘汰的页面是最近 最久未使用的页面。

        实现方法:赋予每个页面对应的页表项中,用访问字段记录该页面自上次被访问以来所经历的时间t。当需要淘汰一个页面时,选择现有页面中t值最大的,即最近最久未使用的页面。

        4.时钟置换算法。 

        时钟置换算法是一种性能和开销较均衡的算法,又称CLOCK算法,或最近未用算法(NRU,NotRecently Used)。

        简单的CLOCK 算法实现方法:

        为每个页面设置一个访问位,再将内存中的页面都通过链接指针链接成一个循环队列。当某页被访问时,其访问位置为1。当需要淘汰一个页面时,只需检查页的访问位。如果是0,就选择该页换出;如果是1,则将它置为0,暂不换出,继续检查下一个页面,若第一轮扫描中所有页面都是1,则将这些页面的访问位依次置为0后,再进行第二轮扫描(第二轮扫描中一定会有访问位为0的页面,因此简单的CLOCK算法选择一个淘汰页面最多会经过两轮扫描)

         改进型的时钟置换算法实现方法:

算法规则: 将所有可能被置换的页面排成一个循环队列
第一轮:从当前位置开始扫描到第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
第二轮:若第一轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。本轮将所有扫描过的帧访问位设为0
第三轮:若第二轮扫描失败,则重新扫描,查找第一个(0,0)的帧用于替换。本轮扫描不修改任何标志位
第四轮:若第三轮扫描失败,则重新扫描,查找第一个(0,1)的帧用于替换。
由于第二轮已将所有帧的访问位设为0,因此经过第三轮、第四轮扫描一定会有一个帧被选中,因此改进型CLOCK置换算法选择一个淘汰页面最多会进行四轮扫描

 3.请求分段存储方式。

         在请求分段系统中,程序运行之前,只需先调入若干个分段(不必调入所有的分段),便可启动运行。当所访问的段不在内存中时,可请求OS将所缺的段调入内存。

        1.段表机制。

         2.缺段中断机构。

  1. 在请求分段系统中,每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入OS后由缺段中断处理程序将所需的段调入内存
  2. 缺段中断同样需要在一条指令的执行期间,产生和处理中断,以及在一条指令执行期间,可能产生数次缺段中断。但不会出现一条指令被分割在两个分段中或一组信息被分割在两个分段中的情况。

        3.地址变换机构。

         4.分段的共享与保护。

        1.共享段表 :所有共享段均在共享段表中对应的一个表项。

2.共享段的分配与回收:

(1)共享段的分配

  • 当第一个使用共享段的进程提出请求时,由系统为该共享段分配一物理区,并调入该共享段,同时修改相应的段表(该段的内存地址)和共享段表,把 count 置为 1。当其它进程需要调用此段时,不需再调入,只需修改相应的段表和共享段表,再执行 count :=count+1 操作。
  • 对其他调用该共享段的进程:在调用进程的段表中增加一表项,填入该共享段的物理地址;在共享段表的对应表项中填入调用进程的相关信息,并执行count=count+1

(2)共享段的回收

        当进程不再需要共享段时,撤消共享段的表项,执行count=count-1。仅当count=0时,由系统回收共享段的物理内存。

3.分段保护:

  1. 越界检查:段号与段表长度、段内地址与段长;若越界,则发出越界中断信号。
  2. 存取控制检查:在段表中设置存取控制字段,用于规定对该段的访问方式。存取控制字段只读、只执行、读/写。
  3. 环保护机构:低编号的环具有高优先权

        4.请求段页式管理方案。

         1.段表及页表机制。

        页表的结构与请求分页存储管理中的页表相似,段表则在段页式存储管理中的段表基础上增加了一些新的字段,这些新增的字段包括中断位(状态位)、修改位和外存始址等。

        2.中断处理机制。

  1. 内存空间的分配是以页为单位。当某个进程在运行过程中发现所需页不在内存时,就先判断该页所在段的页表是否在内存。若页表已在内存,则只产生缺页中断将缺页由外存调入内存;
  2. 若缺页所在段的页表不在内存则表明该段不在内存,这时先产生缺段中断由缺段中断处理程序为该段在内存中建立一张页表,将该页表的内存始址存入段表相应的段表项中,然后再产生缺页中断,将缺页由外存调入内存。
  3. 由于内存的分配是以页为单位进行的,产生中断一定是因为进程所访问的页不在内存,所以没有必要将包含该页的整个段调入内存,即在处理缺段中断时不必为整个段申请内存空间,于是在请求段页式存储管理中,缺段处理仅为所缺的段在内存中建立一张页表。
  4. 这种处理方式与请求分段存储管理中的缺段中断处理方式显然不同。

        3.地址转换 。

5.页面分配策略。

1.基本概念。 

  1. 驻留集:请求分页存储管理中给进程分配的物理块的集合。 
  2. 固定分配:操作系统为每个进程分配一组固定数目的物理块,在进程运行期间大小不变。即,驻留集大小不变
  3. 可变分配:先为每个进程分配一定数目的物理块,在进程运行期间,可根据情况做适当的增加或减少。即,驻留集大小可变
  4. 局部置换:发生缺页时只能选自己进程的物理块进行置换。
  5. 全局置换:可以将操作系统保留的空闲物理块分配给缺页进程,也可以将别的进程持有的物理块置换到外存,再分配给缺页进程

 2.分配方式。

  1. 固定分配局部置换:系统为每个进程分配一定数量的物理块,在整个运行期间都不改变。若进程在运行中发生缺页,则只能从该进程在内存中的页面中选出一页换出,然后再调入需要的页面。缺点:很难在刚开始就确定应为每个进程分配多少个物理块才算合理。(采用这种策略的系统可以根据进程大小、优先级、或是根据程序员给出的参数来确定为一个进程分配的内存块数)
  2. 可变分配全局置换:刚开始为每个进程分配一定数量的物理块。操作系统会保持一个空闲物理块队列。当某进程发生缺页时从空闲物理块中取出一块分配给该进程;若已无空闲物理块,则可选择一个未锁定的页面换出外存,再将该物理块分配给缺页的进程。(只要某进程发生缺页都将获的物理块,仅当空闲物理块用完时,系统才选择一个未锁定的页面调出。被选择调出的页可能是进程中任意一个进程的页,因此被选中的这个进程物理块会减少,缺页率会增加)。
  3. 可变分配局部置换:刚开始为每个进程分配一定数量的物理块,当某进程发生缺页时,只允许从该进程自己的物理块中选出一个换出外存。如果进程在运行中频繁地缺页系统会为该进程多分配几个物理块,直至该进程缺页率趋势适当,反之,如果进程在运行中缺页率特别低,则可适当减少分配给该进程的物理块。

        可变分配全局置换:缺页就给分配新物理块
        可变分配局部置换:要根据发生缺页的频率来动态地增加或减少进程的物理块

 3.调入页面的策略。

 1.何时调入页面。

1.预调页策略:根据局部性原理(主要是空间局部性),一次调入若干个相邻的页面可能比一次调入一个页面更高效。但如果提前调入的页面中大多数都没被访问过,则又是低效的。因此可以预测不久之后可能访问到的页面,将它们预先调入内存,但目前预测成功率只有50%左右。故这种策略主要用于进程的首次调入,由程序员指出应该先调入哪些部分。它是运行前调入。

2.请求调页策略:进程在运行期间发现缺页时才将所缺页面调入内存。由这种策略调入的页面一定会被访问到,但由于每次只能调入一页,而每次调页都要磁盘l/o操作,因此I/o开销较大。它是运行时调入。

2.从何处调入页面。 

  1. 系统拥有足够的对换区空间:页面的调入、调出都是在内存与对换区之间进行,这样可以保证页面的调入、调出速度很快。在进程运行前,需将进程相关的数据从文件区复制到对换区
  2. 系统缺少足够的对换区空间:凡是不会被修改的数据都直接从文件区调入,由于这些页面不会被修改,因此换出时不必写回磁盘,下次需要时再从文件区调入即可。对于可能被修改的部分,换出时需写回磁盘对换区,下次需要时再从对换区调入。
  3. UNIX方式:运行之前进程有关的数据全部放在文件区,故未使用过的页面,都可从文件区调入。若被使用过的页面需要换出,则写回对换区下次需要时从对换区调入。

 4.抖动(颠簸)现象,工作集。

        产生抖动的主要原因:是进程频繁访问的页面数目高于可用的物理块数(分配给进程的物理块不够)。 

        工作集:指在某段时间间隔里,进程实际访问页面的集合。

 5.解决抖动的方法(?)。

        5.连续分配(内存空间的分配和回收)。

  • 连续分配:指为用户进程分配的必须是一个连续的内存空间。   

        1. 单一连续分配。

        在单一连续分配方式中,内存被分为系统区和用户区系统区通常位于内存的低地址部分,用于存放操作系统相关数据用户区用于存放用户进程相关数据。内存中只能有一道用户程序,用户程序独占整个用户区空间

        2.固定分区分配。

3.动态分区分配。

         动态分区分配又称为可变分区分配。这种分配方式不会预先划分内存分区,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因此系统分区的大小和数目是可变的。

1.系统要用什么样的数据结构记录内存的使用情况?

2.多个空闲分区都能满足需求时,应该选择哪个分区进行分配?        使用动态分区算法。3.如何进行分区的分配与回收操作? 如何分配 ------------> 使用动态分区算法之后,修改数据结构即可。                             如何回收------------->把相邻的空闲区域合并为一个。

 总结:

         内部碎片,分配给某进程的内存区域中,如果有些部分没有用上

         外部碎片,是指内存中的某些空闲分区由于太小而难以利用。

 4.动态分区分配算法。

1.首次适应算法。

         每次都从低地址开始查找,找到第一个能满足大小的空闲分区

        如何实现:空闲分区地址递增顺序排列。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。

2.最佳适应算法。

        由于动态分区分配是一种连续分配方式,为各进程分配的空间必须是连续的一整片区域。因此为了保证当“大进程”到来时能有连续的大片空间,可以尽可能多地留下大片的空闲区,即,优先使用更小的空闲区

        如何实现:空闲分区容量递增顺序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区分配后再重新对空闲分区排序。

 3.最大适应算法。

        最坏适应算法(Largest Fit):为了解决最佳适应算法的问题――即留下太多难以利用的小碎片,可以在每次分配时优先使用最大的连续空闲区,这样分配后剩余的空闲区就不会太小,更方便使用。

        如何实现:空闲分区按容量递减顺序链接。每次分配内存时顺序查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。分配后再重新对空闲分区排序。

4.临近适应算法。

        每次都从链头开始查找的。这可能会导致低地址部分出现很多小的空闲分区,而每次分配查找时,都要经过这些分区,因此也增加了查找的开销。如果每次都从上次查找结束的位置开始检索,就能解决上述问题。

        如何实现:空闲分区以地址递增的顺序排列(可排成一个循环链表)。每次分配内存时从上次查找结束的位置开始查找空闲分区链(或空闲分区表),找到大小能满足要求的第一个空闲分区。分配后再重新对空闲分区排序。

对比:

5.非连续分配。

  • 非连续分配:为用户进程分配的可以是一些分散的内存空间。

        1.基本分页存储管理。

        把内存分为一个个相等的小分区,再按照分区大小把进程拆分成一个个小部分。

  1. 将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个“页框”,或称“页帧”、“内存块”、“物理块”。每个页框有一个编号,即“页框号”(或者“内存块号”、“页帧号”、“物理块号”)页框号从0开始。
  2. 将用户进程的地址空间也分为与页框大小相等的一个个区域,称为“页”或“页面”。每个页面也有一个编号,即“页号”,页号也是从0开始。
  3. 操作系统以页框为单位为各个进程分配内存空间。进程的每个页面分别放入一个页框中。也就是说,进程的页面与内存的页框有一一对应的关系。 
  4. 各个页面不必连续存放,也不必按先后顺序来,可以放到不相邻的各个页框中。

        1.页表及其计算。

        由多个页表项组成,即页表中每一行的就是一个页表项。

         块号的计算:

         页号的计算:

        2.如何实现地址的转换。

 步骤:

  1. 要算出逻辑地址对应的页号
  2. 要知道该页号对应页面在内存中的起始地址
  3. 要算出逻辑地址在页面内的“偏移量”。
  4. 物理地址 = 页面始址+页内偏移量。

计算:

  1. 页号=逻辑地址/页面长度(取除法的整数部分)
  2. 页内偏移量 = 逻辑地址%页面长度(取除法的余数部分)
  3. 页面在内存中的起始位置:操作系统需要用某种数据结构(页表)记录进程各个页面的起始位置。

二进制:

         3.基本地址变换机构。

                可以借助进程的页表将逻辑地址转换为物理地址。通常会在系统中设置一个页表寄存器(PTR)存放页表在内存中的起始地址F和页表长度M进程未执行时,页表的始址和页表长度放在进程控制块(PCB)中,当进程被调度时,操作系统内核会把它们放到页表寄存器中。

        4.具有快表的地址变换机构。 

        局部性原理:

  1. 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
  2. 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的)

        快表:又称联想寄存器(TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干页表项,以加速地址变换的过程。与此对应,内存中的页表常称为慢表。

        5.两级页表

两级页表的出现主要是为了解决单级页表的问题。那么单级页表有什么问题  呢?

  • 问题一:页表必须连续存放,因此当页表很大时,需要占用很多个连续的页框。
  • 问题二:没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问某几个特定的页面。N级页表访问一个逻辑地址需要N+1次访问内存。

 2.基本分段存储管理。

        分段

        进程的地址空间:按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级语言中,程序员使用段名来编程),每段从0开始编址。

        内存分配规则 : 为单位进行分配,每个段在内存中占据连续空间,但各段之间可以不相邻。

        分段系统的逻辑地址结构段号(段名)和段内地址段内偏移量)所组成。

        段号的位数决定了每个进程最多可以分几个段。

        段内地址位数决定了每个段的最大长度是多少。

        段表:

         段内寻址:

 3.基本段页式存储管理。

        1.分页,分段的优缺点:

         2.段页式管理的逻辑结构(先分段,再分页)

        段号的位数决定了每个进程最多可以分几个段

        页号位数决定了每个段最大有多少页

        3.段内寻址:

五.文件系统。

 1.文件系统基本概念。

        文件――就是一组有意义的信息/数据集合。

        文件的属性:

  1. 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件。
  2. 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称。
  3. 类型:指明文件的类型。
  4. 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见)
  5. 大小:指明文件大小创建时间、上次修改时间文件所有者信息。
  6. 保护信息:对文件进行保护的访问控制信息。

        文件分为有结构文件无结构文件

        操作系统向上(用户和应用程序)提供的功能

2.文件的逻辑结构。

  1. 顺序文件。文件中的记录一个接一个地顺序排列(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储(相当于数组)或链式存储(相当于链表)。 存储方式:
  2. 索引文件。建立一张索引表来快速找到第i个记录。本身是定长记录的顺序文件。可以用不同的数据项建立多个索引表。

  3. 索引顺序文件。索引文件的缺点:每个记录对应一个索引表项,因此索引表可能会很大。比如:文件的每个记录平均只占8字节,而每个索引表项占32个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引表项。为了进一步提高检索效率,可以为顺序文件建立多级索引表。

3.文件目录结构。

 目录本身就是一种有结构文件由一条条记录组成。每条记录对应一个在该放在该目录下的文件。

文件控制块(FCB):目录文件中的一条记录就是一个“文件控制块(FCB)”。FCB中包含了文件的基本信息(文件名、物理地址、逻辑结构、物理结构等),存取控制信息(是否可读/可写、禁止访问的用户名单等),使用信息(如文件的建立时间、修改时间等)。

目录结构:

  1. 单级目录结构。
  2. 二级目录结构。
  3. 多级目录结构(树形目录结构)。树形结构不便于实现文件的共享。为此,提出了“无环图目录结构”。

  4. 无环图目录结构。

     可以用不同的文件名指向同一个文件,甚至可以指向同一个目录(共享同一目录下的所有内容)。

    需要为每个共享结点设置一个共享计数器,用于记录此时有多少个地方在共享该结点。用户提出删除结点的请求时,只是删除该用户的FCB、并使共享计数器减1,并不会直接删除共享结点。只有共享计数器减为0时,才删除结点。

    注意:共享文件不同于复制文件。在共享文件中,由于各用户指向的是同一个文件,因此只要其中一个用户修改了文件数据,那么所有用户都可以看到文件数据的变化。

索引结点(对FCB的改进)。

        当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。

        存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。

4.文件的物理结构(文件分配方式)

 用户通过逻辑地址来操作自己的文件,操作系统要负责实现从逻辑地址到物理地址的映射。

 1.连续分配。

        连续分配方式要求每个文件在磁盘上占有一组连续的块,用户给出要访问的逻辑块号,操作系统检查用户提供的逻辑块号是否合法(逻辑块号≥长度 = 不合法),合法则找到该文件对应的目录项(FCB)。物理块号 = 起始块号+逻辑块号

        优点:支持顺序访问和直接访问(即随机访问);连续分配的文件在顺序访问时速度最快。

        缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片。

2.链接分配。 

        链接分配采取离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接和显式链接两种。

        隐式链接:除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。

         显式链接:把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)。一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。

         隐式链接

  • 优点:很方便文件拓展,不会有碎片问题,外存利用率高。
  • 缺点:只支持顺序访问,不支持随机访问,查找效率低,指向下一个盘块的指针也需要耗费少量的存储空间。

        显式链接

  • 优点:很方便文件拓展,不会有碎片问题,外存利用率高,并且支持随机访问。相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
  • 缺点:文件分配表的需要占用一定的存储空间。

3.索引分配。

        索引分配:允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表――建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。

        从逻辑块号到物理块号的转变:用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)。从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可知道i号逻辑块在外存中的存放位置。可见,索引分配方式可以支持随机访问。文件拓展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可)。但是索引表需要占用一定的存储空间。

        如果一个文件的索引表太大,一个磁盘块放不下,那么如何解决呢?

①链接方案:如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。

②多层索引:建立多层索引(原理类似于多级页表)。使第一层索引块指向第二层的索引块。还可根据文件大小的要求再建立第三层、第四层索引块。

③混合索引:多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。

 总结比较。

5. 对空闲磁盘块的管理(文件存储空间管理)。

文件卷:存储空间的划分:将物理磁盘划分为一个个文件卷(逻辑卷、逻辑盘)。所谓的文件卷就相当于电脑上的C盘,D盘等。

1.空闲表法:为一个磁盘创建一个表,来存储空闲磁盘块的位置。

2. 空闲链表法:空闲链表发分为空闲盘块链空闲盘区链

         空闲盘块链:

  • 操作系统保存着链头、链尾指针。
  • 如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。
  • 如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
  • 适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作。

         空闲盘区链:操作系统保存着链头、链尾指针。

  • 如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。
  • 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。
  • 离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高

3.位示图法:        位示图:每个二进制位对应一个盘块

        在本例中,“0”代表盘块空闲,“1”代表盘块已分配。位示图一般用连续的“字”来表示,如本例中一个字的字长是16位,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)或(字号,位号)=(i j) 的二进制位对应的盘块号 b= ni + j。b号盘块对应的字号i = b/n,位号j = b%n。

如何分配:

若文件需要K个块,

顺序扫描位示图,找到K个相邻或不相邻的“0”;

②根据字号、位号算出对应的盘块号,将相应盘块分配给文件;

③将相应位设置为“1”。

如何回收:

①根据回收的盘块号计算出对应的字号、位号;

②将相应二进制位设为“0”。

4.成组链接法:

        空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNIX系统中采用了成组链接法对磁盘空闲块进行管理。
        文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。如图所示。

超级块中存储的内容:

如何分配?
Eg :需要100个空闲块
①检查第一个分组的块数是否足够。②分配第一个分组中的100个空闲块。但是由于300号块内存放了再下一组的信息,因此300号块的数据需要复制到超级块中。

如何回收?
Eg :假设每个分组最多为100个空闲块,此时第一个分组已有99个块,还要再回收一块。将该回收的块号放进超级块中。

Eg : 假设每个分组最多为100个空闲块,此时第一个分组已有100个块,还要再回收一块。需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。

 6.文件的基本操作和访问方式。

1.基本操作。 

1.创建文件
进行Create系统调用时,需要提供的几个主要参数:

  1. 所需的外存空间大小(如:一个盘块,即1KB)
  2. 文件存放路径(“D:/Demo”)
  3. 文件名(这个地方默认为“新建文本文档.txt”)

操作系统在处理Create系统调用时,主要做了两件事:

  1. 在外存中找到文件所需的空间(结合上小节学习的空闲链表法、位示图、成组链接法等管理策略,找到空闲空间)
  2. 根据文件存放路径的信息找到该目录对应的目录文件(此处就是 D:/Demo目录),在目录中创建该文件对应的目录项。目录项中包含了文件名、文件在外存中的存放位置等信息。

2.删除文件
进行Delete系统调用时,需要提供的几个主要参数:

  1. 文件存放路径(“D:/Demo”)
  2. 文件名(“test.txt”)

操作系统在处理Delete系统调用时,主要做了几件事:

  1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项
  2. 根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(回收磁盘块时,根据空闲表法、空闲链表法、位图法等管理策略的不同,需要做不同的处理)
  3. 3.从目录表中删除文件对应的目录项

3.打开文件
在很多操作系统中,在对文件进行操作之前,要求用户先使用open系统调用“打开文件”,需要提供的几个主要参数:

  1. 文件存放路径(“D:/Demo”)
  2. 文件名( “test.txt”)
  3. 要对文件的操作类型(如:r只读;rw读写等)

操作系统在处理open系统调用时,主要做了几件事:

  1. 根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的的目录项,并检查该用户是否有指定的操作权限
  2. 将目录项复制到内存中的“打开文件表”中。并将对应表目的编号返回给用户。之后用户使用打开文件表的编号来指明要操作的文件。

需要注意的是,有两张打开文件表,一个是进程自带的,另一个是系统的(只有一张)。

4.关闭文件

进程使用完文件后,要“关闭文件”。操作系统在处理Close系统调用时,主要做了几件事:

  1. 进程打开文件表相应表项删除。
  2. 回收分配给该文件的内存空间等资源。
  3. 系统打开文件表的打开计数器count 减1,若count =0,则删除对应表项。

5.读文件
进程使用read系统调用完成写操作。

  1. 需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),
  2. 还需要指明要读入多少数据(如:读入1KB)、
  3. 指明读入的数据要放在内存中的什么位置

操作系统在处理read 系统调用时,会从读指针指向的外存中,将用户指定大小的数据读入用户指定的内存区域中。

6.写文件
进程使用write系统调用完成写操作,

  1. 需要指明是哪个文件(在支持“打开文件”操作的系统中,只需要提供文件在打开文件表中的索引号即可),
  2. 还需要指明要写出多少数据(如:写出1KB)、
  3. 写回外存的数据放在内存中的什么位置

操作系统在处理write系统调用时,会从用户指定的内存区域中,将指定大小的数据写回写指针指向的外存。

2.文件的访问方式。

访问的分类:

  • 顺序访问方式:从前到后依次地存取文件的各个信息项。
  • 随机访问方式:无需存取各个信息项。
  • 按关键字存取法:根据给定的关键字或记录名进行。

顺序访问方式:从文件起始位置开始顺序访问;从文件中间某处开始顺序访问。

随机访问方式:按记录编号随机访问;按关键字(key)随机访问。

按关键字存取法的几种搜索算法:

1.线性搜索法。

2.散列法。

3.二分搜索法。

7.文件共享。

1.基于索引节点的共享方式(硬链接)。

2.基于符号链的共享方式(软链接)。

当User3访问“ccc”时,操作系统判断文件“ccc”属于Link类型文件,于是会根据其中记录的路径层层查找目录,最终找到User1的目录表中的“aaa”表项,于是就找到了文件1的索引结点。类似于快捷方式。

8.文件的保护(文件的存取控制)和层次结构。

1.口令保护(方式)。
        为文件设置一个“口令”(如: abc112233),用户请求访问该文件时必须提供“口令”。

口令一般存放在文件对应的FCB或索引结点中。用户访问文件前需要先输入“口令”,操作系统会将用户提供的口令与FCB中存储的口令进行对比,如果正确,则允许该用户访问文件。

优点:保存口令的空间开销不多,验证口令的时间开销也很小。

缺点:正确的“口令”存放在系统内部,不够安全。

 2.加密保护(加密方式)。

        使用某个“密码”对文件进行加密,在访问文件时需要提供正确的“密码”才能对文件进行正确的解密。

优点:保密性强,不需要在系统中存储“密码”。

缺点:编码/译码,或者说加密/解密要花费一定时间。

3.访问控制。

        在每个文件的FCB(或索引结点)中增加一个访问控制列表(Access-Control List, ACL),该表中记录了各个用户可以对该文件执行哪些操作。如图所示:        

        精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。如:分为系统管理员、文件主、文件主的伙伴、其他用户几个分组。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。 

 4.总结:

5.文件的层次结构: 

 六.设备管理。

1.磁盘存储管理。

1.磁盘结构。

  • 磁盘的表面由一些磁性物质组成,可以用这些磁性物质来记录二进制数据。
  • 磁盘的盘面被划分成一个个磁道。这样的一个“圈”就是一个磁道。
  • 一个磁道又被划分成一个个扇区,每个扇区就是一个“磁盘块”。各个扇区存放的数据量相同(如1KB)。
  • 所有盘面中相对位置相同的磁道组成柱面

磁盘分类:

2.磁盘调度算法。

 1.一次磁盘读/写操作需要的时间。

1.寻找时间(寻道时间)Ts:在读/写数据前,将磁头移动到指定磁道所花的时间。

  • ①启动磁头臂是需要时间的。假设耗时为s;
  • ②移动磁头也是需要时间的。假设磁头匀速移动,每跨越一个磁道耗时为m,总共需要跨越n条磁道。则: 寻道时间 Ts = s + m*n

2.延迟时间T:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r(单位:转/秒,或转/分),则平均所需的延迟时间 T=(1/2)*(1/r)= 1/2r。1/r就是转一圈需要的时间。找到目标扇区平均需要转半圈,因此再乘以1/2。

3.传输时间Tt:从磁盘读出或向磁盘写入数据所经历的时间。假设磁盘转速为r,此次读/写的字节数为b,每个磁道上的字节数为N。则:传输时间 Tt = (1/r)*(b/N) = b/(rN)

每个磁道要可存N字节的数据,因此b字节的数据需要b/N个磁道才能存储。而读/写一个磁道所需的时间刚好又是转一圈所需要的时间1/r。

总的平均存取时间 T=Ts+ 1/2r + b/(rN)。操作系统也无法优化延迟时间和传输时间。但是操作系统的磁盘调度算法会直接影响寻道时间。

2.磁盘调度算法种类。

1.先来先服务算法。

  • 根据进程请求访问磁盘的先后顺序进行调度。

  2.最短寻找时间优先(SSTF)。

  • 优先处理与当前磁头最近的磁道。可以保证每次的寻道时间最短,但是并不能保证总的寻道时间最短。(其实就是贪心算法的思想,只是选择眼前最优,但是总体未必最优)

 3.扫描算法(SCAN)。

  • 只有磁头移动到最外侧磁道的时候才能往内移动移动到最内侧磁道的时候才能往外移动。这就是扫描算法(SCAN)的思想。由于磁头移动的方式很像电梯,因此也叫电梯算法。为了防止SSTF饥饿问题。

4. LOOK调度算法。

  • 扫描算法(SCAN)中,只有到达最边上的磁道时才能改变磁头移动方向,事实上,处理了184号磁道的访问请求之后就不需要再往右移动磁头了。 LOOK调度算法就是为了解决这个问题,如果在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。(边移动边观察,因此叫LOOK)。

5.循环扫描算法(C—SCAN) 。

  • SCAN算法对于各个位置磁道的响应频率不平均,而C-SCAN算法就是为了解决这个问题。规定只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。

 6.C-LOOK调度算法。

  • C-SCAN 算法的主要缺点是只有到达最边上的磁道时才能改变磁头移动方向,并且磁头返回时不一定需要返回到最边缘的磁道上。C-LOOK算法就是为了解决这个问题。如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

3.减少延迟时间的方法。

1.交替编号。

        若采用交替编号的策略,即让逻辑上相邻的扇区在物理上有一定的间隔,可以使读取连续的逻辑扇区所需要的延迟时间更小。如图所示。

2.磁盘地址结构的设计。

思考:为什么磁盘的物理地址是(柱面号,盘面号,扇区号),而不是(盘面号,柱面号,扇区号)?

答:读取地址连续的磁盘块时,采用(柱面号,盘面号,扇区号)的地址结构可以减少磁头移动消耗的时间

3.错位命名。

4. 磁盘的管理。

1.磁盘初始化。

  • Step 1:进行低级格式化(物理格式化),将磁盘的各个磁道划分为扇区。一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)
  • Step 2:将磁盘分区,每个分区由若干柱面(磁道)组成(即分为我们熟悉的C盘、D盘、E盘)
  • step 3:进行逻辑格式化,创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)

2.引导块。

  • 计算机开机时需要进行一系列初始化的工作,这些初始化工作是通过执行初始化程序(自举程序)完成的。

  • 初始化程序可以放在ROM(只读存储器)中。ROM中的数据在出厂时就写入了,并且以后不能再修改

        初始化程序程序(自举程序)放在ROM中存在什么问题?万一需要更新自举程序,将会很不方便,因为ROM中的数据无法更改。如何解决呢?

  • ROM中只存放很小的“自举装入程序”。开机时计算机先运行“自举装入程序”,通过执行该程序就可找到引导块,并将完整的“自举程序”读入内存,完成初始化。
  • 完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置。
  • 拥有启动分区的磁盘称为启动磁盘或系统磁盘(c:盘)。

3.坏块的管理。

        坏了、无法正常使用的扇区就是“坏块”。这属于硬件故障,操作系统是无法修复的。应该将坏块标记出来,以免错误地使用到它。

  • 对于简单的磁盘,可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查,标明哪些扇区是坏扇区,比如:在FAT表上标明。(在这种方式中,坏块对操作系统不透明)
  • 对于复杂的磁盘,磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表。在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化。保留一些“备用扇区”,用于替换坏块。这种方案称为扇区备用。且这种处理方式中,坏块对操作系统透明。

2.I/O设备。

1.I/O设备的概念和分类。

        I/O设备就是可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部分。

I/O设备按使用特性可以分为以下类型:

  1. 人机交互类设备。用于与计算机用户之间交互的设备,如打印机、显示器、鼠标和键盘等。
  2. 存储设备。用于存储程序和数据的设备,如磁盘、磁带和光盘等。
  3. 网络通信设备。用于与远程设备通信的设备,如各种网络接口、调制解调器等。

传输速率分类:

  1. 低速设备。传输速率仅为每秒几字节到数百字节的一类设备,如键盘、鼠标等。
  2. 中速设备。传输速率为每秒数千字节至数万字节的一类设备,如打印机等。
  3. 高速设备。传输速率在数千字节至千兆字节的一类设备,如磁带机、磁盘机等

信息交换的单位分类:

  1. 块设备。由于信息的存取总是以数据块为单位的,所以存储信息的设备称为块设备。传输速率高、可寻址。
  2. 字符设备。用于数据输入、输出的设备为字符设备,因为其传输的基本单位是字符。传输速率低、不可寻址。

2.I/O控制器。

  • CPU无法直接控制l/O设备的机械部件,因此I/O设备还要有一个电子部件作为CPU和I/O设备机械部件之间的“中介”,用于实现CPU对设备的控制。
  • 这个电子部件就是I/O控制器,又称设备控制器。CPU可控制I/o控制器,又由I/O控制器来控制设备的机械部件。

 组成:

寄存器编址方式:

3.I/O控制方式。 

1.程序直接控制方式。

  • 完成一次读/写操作的流程图(以读操作为例)

 2.中断驱动方式。

3.DMA方式。

DMA控制器:

 4.通道控制方式。

 为了解决DMA方式连续存储的问题。

5.四种方式总结。

 4.I/O软件层次结构。

1.用户层软件。 

  • 用户层软件实现了与用户交互的接口用户可直接使用该层提供的、与I/o操作相关的库函数对设备进行操作。
  • 用户层软件将用户请求翻译成格式化的I/o请求并通过“系统调用”请求操作系统内核的服务

2.设备独立性软件.

        又称设备无关性软件。与设备的硬件特性无关的功能几乎都在这一层实现。

主要功能:

  1. 向上层提供统一的调用接口(如read/write系统调用)。
  2. 设备的保护。(原理类似与文件保护。设备被看做是一种特殊的文件,不同用户对各个文件的访问权限是不一样的,同理,对设备的访问权限也不一样。)
  3. 差错处理(设备独立性软件需要对一些设备的错误进行处理)。
  4. 设备的分配与回收。
  5. 数据缓冲区管理(可以通过缓冲技术屏蔽设备之间数据交换单位大小和传输速度的差异)
  6. 建立逻辑设备名到物理设备名的映射关系;根据设备类型选择调用相应的驱动程序

用户或用户层软件发出I/o操作相关系统调用的系统调用时,需要指明此次要操作的I/o设备的逻辑设备名(eg:去学校打印店打印时,需要选择打印机1/打印机2/打印机3,其实这些都是逻辑设备名)
设备独立性软件需要通过“逻辑设备表(LUT,Logical UnitTable)”来确定逻辑设备对应的物理设备,并找到该设备对应的设备驱动程序。如图所示:

操作系统系统可以采用两种方式管理逻辑设备表(LUT) :

  1. 整个系统只设置一张LUT,这就意味着所有用户不能使用相同的逻辑设备名,因此这种方式只适用于单用户操作系统
  2. 为每个用户设置一张LUT,各个用户使用的逻辑设备名可以重复,适用于多用户操作系统。系统会在用户登录时为其建立一个用户管理进程,而LUT就存放在用户管理进程的PCB中。

3.设备驱动程序。

思考:为何不同的设备需要不同的设备驱动程序?

答:不同设备的内部硬件特性不同,这些特性只有厂家才知道,因此厂家须提供与设备相对应的驱动程序,CPU执行驱动程序的指令序列,来完成设置设备寄存器,检查设备状态等工作。

4.中断处理程序。

         当I/o任务完成时,I/o控制器会发送一个中断信号,系统会根据中断信号类型找到相应的中断处理程序并执行。

 总结:

3. 设备分配及处理技术。

 I/O调度:用某种算法确定一个好的顺序来处理各个I/o请求。如:磁盘调度(先来先服务算法、最短寻道优先算法、SCAN算法、C-SCAN算法、LOOK算法、C-LOOK算法)。当多个磁盘I/o请求到来时,用某种调度算法确定满足I/o请求的顺序。同理,打印机等设备也可以用先来先服务算法、优先级算法、短作业优先等算法来确定IV/o调度顺序。

 设备保护:操作系统需要实现文件保护功能,不同的用户对各个文件有不同的访问权限(如:只读、读和写等)。在UNIx系统中,设备被看做是一种特殊的文件,每个设备也会有对应的FCB。当用户请求访问某个设备时,系统根据FCB中记录的信息来判断该用户是否有相应的访问权限,以此实现“设备保护”的功能。(参考“文件保护”小节)

1.设备分配的数据结构。

1.设备控制表DCT。系统为每个设备设置一张设备控制表,用于记录该设备的情况

  • 设备类型:type、设备标识符:deviceid、设备状态:等待/不等待 忙/闲、指向控制器表的指针、重复执行次数或时间、设备队列的队首指针。

 2.控制器控制表。系统为每一个控制器都设置了一张用于记录本控制器情况的控制器控制表 。

  • 控制器标识符-controllerid、控制器状态-忙/闲、与控制器连接的通道表指针、控制器队列的队首指针、控制器队列的队尾指针

 3.通道控制表。系统为每个通道配有一张通道表,用于记录该通道的情况 。

  •  通道标识符-channelid、通道状态-忙/闲、与通道连接的控制器表的首址,通道队列的队首指针、通道队列的队尾指针。

 4.系统设备表。这是系统范围的数据结构,其中记录了系统中全部设备的情况。每个设备占一个表目。 

  • 设备类型、设备标识符、设备控制表及设备驱动程序的入口等项。

2.设备分配时应考虑的因素。

1.设备的固有属性。

  1. 独享设备。采取独占分配策略。
  2.  共享设备。可以通过某种调度方式,分配给多个进程使用。
  3.  虚拟设备。 指通过采用虚拟技术,使一台物理设备可变成多台。

逻辑上的共享设备。可以分配给多个进程使用。


2.设备分配算法。

  1. 先来先服务。当多个进程对同一设备提出I/0请求时,该算法根据进程提出请求的先后次序,排成一个设备请求队列,总是将设备分配给队首进程。
  2. 优先级高者优先。在这种算法中,总是优先权高的进程优先获得资源。对于优先权相同的进程,按照先来先服务的原则排队。

3.设备分配中的安全性。

  1. 安全分配方式。当进程请求资源时,便进入阻塞状态,直到I/0操作完成才被唤醒。进程的并发度低,资源的利用率低
  2. 不安全分配方式。当进程请求资源时,仍继续运行,需要时又发出第2个I/0请求,第3个I/0请求等,按照安全性算法进行计算,仅当状态安全时,才分配。这种方式稍复杂,但进程的并发度高。

3.假脱机技术(SPOOLing技术)。

1.脱机技术。

  • 手工操作阶段:主机直接从l/o设备获得数据,由于设备速度慢,主机速度很快。人机速度矛盾明显,主机要浪费很多时间来等待设备。因此在批处理阶段引入了脱机输入/输出技术(用磁带完成).

 2.假脱机技术。

“假脱机技术”,又称“SPOOLing 技术”,用软件的方式模拟脱机技术。SPOQLing系统的组成如下:

  1. “输入井”模拟脱机输入时的磁带,用于收容I/o设备输入的数据。
  2. “输出井”模拟脱机输出时的磁带,用于收容用户进程输出的数据。
  3. “输入进程”模拟脱机输入时的外围控制机。
  4. “输出进程”模拟脱机输出时的外围控制机。

要实现SPOOLing 技术,必须要有多道程序技术的支持。系统会建立“输入进程”和“输出进程”。

4.设备的分配方式和步骤。

  • 静态分配:进程运行前为其分配全部所需资源,运行结束后归还资源。破坏了“请求和保持”条件,不会发生死锁。
  • 动态分配:进程运行过程中动态申请设备资源。

1.设备分配的步骤:

  • ①根据进程请求的物理设备名查找SDT(注:物理设备名是进程请求分配设备时提供的参数)
  • ②根据SDT找到DCT若设备忙碌则将进程PCB挂到设备等待队列中,不忙碌则将设备分配给进程。
  • ③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
  • ④根据COCT找到CHCT若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程。

注∶只有设备、控制器、通道三者都分配成功时,这次设备分配才算成功,之后便可后动/O设备进行数据传送。

缺点:

  • ①用户编程时必须使用“物理设备名”,底层细节对用户不透明,不方便编程。
  • ②若换了一个物理设备,则程序无法运行。
  • ③若进程请求的物理设备正在忙碌,则即使系统中还有同类型的设备,进程也必须阻塞等待改进方法:建立逻辑设备名与物理设备名的映射机制,用户编程时只需提供逻辑设备名

改进:

  • ①根据进程请求的逻辑设备名查找SDT(注:用户编程时提供的逻辑设备名其实就是“设备类型”)
  • 查找SDT,找到用户进程指定类型的、并且空闲的设备,将其分配给该进程。操作系统在逻辑设备表(LUT)中新增一个表项
  • ③根据DCT找到COCT,若控制器忙碌则将进程PCB挂到控制器等待队列中,不忙碌则将控制器分配给进程。
  • ④根据COCT找到CHCT,若通道忙碌则将进程PCB挂到通道等待队列中,不忙碌则将通道分配给进程

2.逻辑设备表:

4.缓冲管理。

缓冲区:是一个存储区域,可以由专门的硬件寄存器组成,也可利用内存作为缓冲区。使用硬件作为缓冲区的成本较高,容量也较小,一般仅用在对速度要求非常高的场合(如存储器管理中所用的联想寄存器,由于对页表的访问频率极高,因此使用速度很快的联想寄存器来存放页表项的副本)。一般情况下,更多的是利用内存作为缓冲区,“设备独立性软件”的缓冲区管理就是要组织管理好这些缓冲区。

1.缓冲区作用。

2.单缓冲。 

        假设某用户进程请求某种块设备读入若干块的数据。若采用单缓冲的策略操作系统会在主存中为其分配一个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。如图所示
        注意:当缓冲区数据非空时,不能往缓冲区冲入数据,只能从缓冲区把数据传出;当缓冲区为空时,可以往缓冲区冲入数据,但必须把缓冲区充满以后,才能从缓冲区把数据传出。

处理一块数据的平均时间:

3.双缓冲。

         若采用双缓冲的策略,操作系统会在主存中为其分配两个缓冲区(若题目中没有特别说明,一个缓冲区的大小就是一个块)。

  • 假设T>C+M: 

  • 假设T<C+M:

 采用双缓冲策略,处理一个数据块的平均耗时为Max (T,C+M)

4.循环缓冲区。

        将多个大小相等的缓冲区链接成一个循环队列。注:以下图示中,橙色表示已充满数据的缓冲区,绿色表示空缓冲区。

5.缓冲池。

         缓冲池由系统中共用的缓冲区组成。这些缓冲区按使用状况可以分为:空缓冲队列、装满输入数据的缓冲队列(输入队列)、装满输出数据的缓冲队列(输出队列)。

七.操作系统前沿技术。

1.嵌入式操作系统。

 1.概念、特点、分类。

        嵌入式操作系统:是支持嵌入式应用的实时操作系统运行在嵌入式硬件平台上,对系统软硬件资源进行统一协调控制的操作系统软件。

        特点:

  1. 高实时性。
  2. 可裁剪性。
  3. 高可靠性。
  4. 统一的接口。
  5. 网络功能强大。

        分类:

  1. 商用嵌入式操作系统。
  2. 专用嵌入式操作系统。
  3. 开放嵌入式操作系统。

更多推荐

操作系统(自我总结)

本文发布于:2023-10-16 10:50:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1497363.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作系统   自我

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!