当前位置: 首页 > news >正文

计算机操作系统

第一章:操作系统概论

1. 计算机的组成

 一个完整的计算机系统由两大部分组成:计算机硬件和计算机软件。

 其中计算机硬件是指计算机的机器部分,即人们所看见的物理设备和器件的总和。

 计算机软件是指由计算机硬件执行以完成一定的程序及其数据。计算机软件包括系统软件和应用软件,操作系统、数据库管理系统等都是系统软件,而应用软件是为了各种应用目的而编制的程序。 

 

2. 什么是操作系统?

没有配置软件的计算机称为裸机,而操作系统是裸机上的第一层软件,是对硬件功能的首次扩充。

操作系统是控制和管理计算机系统内各种硬件和软件资源、有效地组织多道程序运行的系统软件(或程序集合),是用户与计算机之间的接口。

  • 操作系统是什么? ---  是核心系统软件。
  • 操作系统管什么? ---  控制和管理系统内的各种资源。
  • 操作系统有何用? ---  扩充硬件功能,方便用户使用。

3. 操作系统的主要功能。

  • 处理机管理 --- 在多道程序环境下,处理机的分配和运行是以进程为基本单位的,因此对处理机的管理可以归结为对进程的管理。 进程管理实现 进程控制、进程同步、进程通信和进程调度。
  • 存储器管理 --- 存储器管理的首要目的是对内存进行分配、保护和扩充。 存储器实现内存分配、内存保护、地址变换和内存扩充。
  • 设备管理   ---  设备管理的首要任务是对系统内的设备进行管理,为用户分配设备,使得设备和处理机并行工作,方便用户管理设备。
  • 文件管理   ---  文件管理的首要任务就是有效地支持文件的存储、检索和修改等操作,解决文件的共享、保密和保护等问题。文件管理应实现: 文件存储空间的管理、目录管理、文件操作管理、文件保护。
  • 用户接口   ---  为方便用户使用操作系统,操作系统还提供了用户接口。通过操作系统提供两种类型的用户接口:命令接口(提供一组命令供用户直接或间接的控制自己的作业)和程序接口。

  正如我们用的windows操作系统:

  • 通过任务管理器可以管理计算机中正在运行的进程,即处理机管理。
  • 通过任务管理器中的资源监视器我们也可以查看操作系统对内存的管理,即内存管理。
  • windows中的设备管理器可以方便我们管理计算机的设备,即设备管理。
  • 文件管理用的是最多的,各种pdf、word、txt等等文件的管理,其实都是操作系统的功劳。
  • 用户接口就是我们可以看到的桌面等等,方便我们对操作系统的使用。

4. 操作系统的主要特征

  • 共行性 --- 指两个或多个事件在同一时间间隔内发生。 对于多道程序环境,共行性是并行性,即指宏观上多道程序在同时运行; 对于单处理机系统,共行即为并发,是指每一时刻执行一道程序,故微观上这些程序是交替执行的。
  • 资源共享 --- 资源共享是指系统中的软件和硬件资源不再为某个程序所独占,而是由多个并发执行的程序共同使用。

  即操作系统中,并发和共享是操作系统的最基本的特征。 两者是相互依赖的。即如果资源不能共享,那么程序的执行不可能并发; 如果程序不并发,那么资源的共享也就没有了意义。

 

5. 操作系统的地位

是裸机之上的第一层软件,是建立其他所有软件的基础。

 

6. 操作系统的主要类型

  (1) 批处理操作系统

  首先要了解作业的概念 --- 作业是用户在一次解题或一个事物处理过程中要求计算机系统所作工作的集合,包括用户程序、所需的数据及命令。

  批处理即每次操作系统处理每次处理的是若干合在一起的作业,即一批。

  批处理操作系统又分为单道批处理操作系统和多道批处理操作系统。

  单道批处理操作系统是指: 用户将批处理操作交给系统管理员,然后系统管理员将作业合成一批后传送到外存,然后批处理操作系统根据规则选择其中的一道作业调入内存进行处理, 如果中间出现问题或者这道作业完成之后,必须由管理员处理问题或传入新的作业给内存。如此反复,直到结束为止。

  优点: 大大减少了人工操作的时间,提高了机器的利用率。   缺点:作业发出I/O请求后,CPU必须等待I/O的完成,因为I/O设备的低俗性,导致CPU的利用率很低。

  为了改善CPU的利用率,引入了多道批处理操作系统。

  多道批处理操作系统是指:作业交给系统管理员之后,在内存中可以有多道作业,并且作业可以随时被接受进入系统,并存放在外存中形成后备作业队列,然后由操作系统按照一定的原则从后备作业队列中调入一道或者多道作业进入内存运行。

  其主要特征是: a 用户脱离使用计算机。即用户把作业提交之后就不管了。b 成批处理。 即操作员把用户提交的作业分批进行处理。由操作系统或监督程序扶额作业间的自动调度运行。 c 多道程序运行。 即按多道程序设计的调度规则,从一批后备作业中选取多道作业调入内存并组织他们运行。

  批处理操作系统的问题:  无交互性,即用户一旦把作业交给系统后就失去了对系统的控制。

 

  (2) 分时操作系统

    采用了分时技术的操作系统即为分时操作系统。

    分时技术 --- 指把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各终端作业使用。 由于计算机的速度很快,这样各终端作业就会觉得自己在独自使用这台计算机了。  

    分时操作系统又分为:简单分时操作系统和多道程序的分时操作系统。 简单操作系统中,内存里只有一道作业,其余作业都在外存上。 而多道程序设计的分时操作系统内存中可以装入多道作业。 

    分时操作系统的特征:

  •  多路性 --- 同时有多个用户使用一台计算机。 宏观上是多个用户同时使用,微观上是多个用户轮流使用。
  •    交互性 --- 用户采用人机对话的形式直接控制程序运行。
  •    独占性 --- 每个用户各占一个终端,彼此的操作不干扰。 用户感觉不到别人在用这台计算机,好像只有自己再用。
  •    及时性 --- 用户的请求能在很短的时间内获得响应。

  

  (3)实时操作系统

    它可以即时的响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有的实时设备和实时任务协调一致的工作。它的响应时间要比分时操作系统高的多。其特点是响应及时和可靠性高。

  

   (4) 网络操作系统

    网络操作系统是基于计算机网络的,是在各种计算机操作系统上按照网络体系结构协议标准开发的软件,包括网络管理、通信、安全、资源共享和各种网络应用。 

    其主要特点是与网络的硬件结合来完成网络的通信任务。

 

  (5) 分布式操作系统

    

7. 什么使多道程序设计技术?

  是指把多个程序同时存放在内存中,使他们同时处于运行状态。 这些作业共享处理机时间、外部设备和其他资源。

  多道程序设计技术的主要特点是:多道、宏观上并行、微观上串行。 宏观上并行是指同时进入系统中的多道程序都处于运行状态中。微观上串行是指在单处理机环境中,内存中的多道程序轮流占用CPU。

 

8. 操作系统与人的接口

  操作系统提供的用户接口有命令接口、程序接口(API)和图形接口(GUI)。

  (1)命令接口 --- 是用户利用操作系统命令组织和控制作业的执行或管理计算机系统,用户在命令输入界面上输入命令,由系统在后台运行,并将结果反映在aii前台界面或特定的文件中。

  (2)程序接口 --- 也成为系统调用。

  (3)图形接口 --- 图形用户接口采用了图形化的操作界面,用非常容易识别的各种图标来将系统各项功能、各种应用程序和文件,直观、逼真的表示出来。 组成图形接口的基本元素有窗口、图标和菜单等。。

 

 

 

第二章: 进程管理

 

应当明白:在同一时间,一个cpu内核只能真正的运行一个进程或线程。 现在的计算机一班都是多核,所以可以真正的运行一个进程的多个线程。 我们打开任务管理器时发现有近百个进程和近千个线程,这是因为cpu不断的、快速的切换运行进程和线程的结果,从而造成了并行的假象。

1. 进程的定义

  • 进程是程序在处理器上的一次执行过程
  • 进程是可以和别的计算并行执行的计算
  • 进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。

2. 说明进程和程序的区别和联系

  • 进程是动态的,程序是静态的。程序是一组有序的指令集合,是静态的概念;而进程是程序及其数据在计算机上的一次执行,是一个动态的集合。
  • 离开了程序,进程就失去了存在的意义;但是同一程序可以在计算机的每次执行上产生不同的进程。
  • 一个程序可以有多个进程在执行。一个进程也可以执行多个程序。
  • 程序可以长期保存,但是进程只能存在一定的时间 。程序是永久存在的,而进程有从创建到消亡的一个生命周期。

3. 进程的特点:

  • 动态性: 进程是程序的一次执行过程,因而是动态的。 还表现在它因创建而产生、由调度而执行、因得不到资源而暂停执行、最后由撤销而消亡。
  • 并发性:引入进程的目的就是为了使程序能与其他程序并发执行,以提高资源利用率。
  • 独立性: 进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。
  • 异步性:进程以各自独立的、不可预知的速度向前推进。
  • 结构性:为了描述进程的运行变化过程,以便于系统对进程进行管理和控制,每个进程都需要有一个进程控制块(PCB)对其进行描述,即进程=PCB+程序段+数据段

4. 进程执行的动态性就决定了它具有多种状态

  • 运行状态(执行状态): 当一个进程正在CPU执行时,称此进程处于运行状态。
  • 就绪状态: 一个进程具有运行条件,但由于无CPU而暂时不能执行的状态。
  • 阻塞状态(等待状态、挂起状态、睡眠状态等):指进程因等待某种事件的发生(如等待I/O完成)而暂时不能运行的状态(即使CPU空闲,该进程也不可运行,这样才能和就绪状态区分)。

  

5. 进程的几种状态之间的转换

  • 就绪态->运行态: 一个进程被进程调度程序选中。
  • 运行态->阻塞态:等待某个条件发生。
  • 运行态->就绪态:两个条件之一:a. 时间片用完 b 在剥夺式调度中有更高优先级的进程抢夺时间片。
  • 阻塞台->就绪台:进程等待的某个条件已经发生而被唤醒。

  注意:(1) 进程状态的转换并非都是可逆的,如进程既不可能从阻塞台到运行态,也不可能从就绪态到阻塞态。

           (2) 进程状态的唯一性: 一个具体的进程在任何一个特定的时刻必须且只能处于一种状态。

 

6. 进程的组成结构

  • 进程控制块(PCB): 每一个进程均有一个PCB,它既可以标识进程的存在,又能刻画执行瞬间的特征的数据结构。当用户进程被创建时,系统为它申请和构造一个相应的PCB。
  • 程序段: 是进程中能被进程调度程序调度到CPU上执行的程序段代码,它能实现相应的特定功能。
  • 数据段: 一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果数据

  

7. PCB一般包含什么? 它们的作用是什么?

  • 进程标识符: 每个进程都必须有唯一的标识符,以区别与系统内部的其他进程。 在进程创建时,由系统为进程分配唯一的进程标识符
  • 进程当前状态:说明进程的当前状态,以作为进程调度程序分配CPU的依据。
  • 进程队列指针:用于记录PCB队列中下一个PCB的地址。 为了查找方便,系统中的PCB可能组织成多个队列,如就绪队列和阻塞队列等。
  • 程序和数据地址:指出进程的程序和数据所在的内(外)存地址。
  • 进程优先级:优先级用于描述进程使用CPU的紧迫程度,是进程调度的一个依据。 优先级高的进程可以优先获得CPU。
  • CPU现场保护区: 当进程因为某种原因释放了CPU时,要将此时的CPU现场信息(如指令计数器、状态寄存器、通用寄存器)保存在该区域中,以便进程重新得到CPU时能恢复原来的CPU现场信息而继续执行。
  • 通信信息:记录进程在执行过程中与其他进程所发生的信息交换情况。
  • 家族关系:说明本进程的父进程、子进程等家族关系信息(如本进程的子进程与父进程的标识符)。
  • 占有资源清单: 列出进程所需资源及当前已经获得的资源。

 

8. 进程控制

  进程控制的任务就是系统使用一些具有特定功能的程序来创建、删除进程,实现进程各状态的转换,从而达到多进程高效并发执行和协调、实现资源共享。

  无论是用户进程还是系统进程,其基本的操作都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成的。故不论是什么进程,他们都是在操作系统内核的支持下运行的,是与内核密切相关的。

  知识补充:打开我的任务管理器,可以看到如下所示:

      

  (1)插槽数为1,表示现在有一个cpu(可以通过msconfig中设置cpu个数),内核为2, 即真实的核心是2,逻辑处理器为4,实际上这里有超线程的概念,即虽然我只有两个人,但是我可以做4个人的事情, 这就用到了超线程技术,之所以为逻辑,就是逻辑是指“逻辑上”,而不是真实的,又如css像素是逻辑像素一样,pt才是物理像素。

  (2)内核为2,相当与把两个cpu集成到一个cpu上,所以内核为2. 逻辑处理器为4,相当与有4个cpu。 注:cpu的英文名称即Central Processing Unit。

  在操作系统中,一般把进程控制用到的程序段叫做原语。 原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

 

8.1 进程创建

  即创建一个新的进程,是通过原语实现的,进程创建原语的主要工作如下:

  a 向系统申请一个空闲PCB,指定给该进程一个唯一的进程标识符PID

  b 为新进程分配资源。 根据新进程提出的资源需求分配资源,如为新进程分配内存空间以存放新程序及数据。

  c 初始化新进程的PCB,在新进程的PCB中填入进程名、家族信息、程序和数据地址、进程优先级、资源清单和进程状态等信息。 一般新进程的状态为就绪态。

  d 将新进程的PCB插入进程队列

  如下所示,是打开详细信息的结果:

     

  可以看到,chrome是一个程序,但是这个程序下面可以有多个进程,每个进程都有一个唯一的标识符PID,且分配了相应的名称,进程的状态这里都是正在运行(即运行态),还有占用的内存(即分配的资源),且我们可以通过右键来设置其优先级来保证进程。

  一个进程可以创建一个新进程,而被创建的进程就成为子进程,创建进程的进程称为父进程。 子进程又可以创建进程,所以构成了进程间的家族关系,为了描述这种关系,我们就引入了子进程前驱图。

  注意:进程前驱图,实际上就是进程树(在任务管理器的详细信息中可以看到)。如我们先打开cmd,这是cmd进程就会被创建,然后输入notepad,然后就可以发现在详细信息里两者都有进程了,然后如果我们点击cmd,选择结束进程树,那么notepad进程也会被结束掉。 但是如果我们选择结束任务时,就只会结束cmd,而notepad进程会被保持。

  

  

8.2 进程删除

  进程删除也成为进程撤销。 进程撤销分为两种撤销策略:一种是只撤销指定的进程;另一种是撤销指定进程及其子孙进程。

  撤销的原语如下:

  • 从系统的PCB表中找到被撤销进程的PCB。
  • 检查被撤销进程的状态是否执行状态,若是,则立即停止该进程的执行,设置从新调度标志, 以便在该进程撤销后将处理机分配给其他进程。
  • 检查其是否有子孙进程,如果有,就撤销子孙进程。
  • 回收所有的资源和PCB。

 

8.3 进程阻塞

  处于执行状态的进程,再其运行过程中期待某一事件的发生,如果被等待的事件没有发生,那么就会由系统自动执行阻塞原语,使得执行状态为阻塞状态。 

  阻塞的原语如下:

  • 停止当前进程的执行。 进程阻塞时,由于该进程正处于执行状态,故应该停止该进程的执行。
  • 保存该进程的CPU现场信息。 为了进程以后能够重新调度运行,应该将进程的现场信息送入PCB现场保护区中存起来。
  • 将进程状态改为阻塞,,并插入到相应事件的等待队列中。

 

8.4 进程唤醒

  对处于阻塞状态的进程(其PCB构成的一个等待队列),当该进程期待的事件出现时,由发现者进程调用唤醒语句将阻塞的进程唤醒,使其进入就绪状态。

  进程唤醒的原语如下:

  • 将被唤醒的进程从相应的等待队列中移出。
  • 将进程状态改为就绪,并将该进程插入就绪队列。
  • 在某些系统中,如果被唤醒进程比当前运行进程的优先级高,可能要设置调度标志。

 

9. 进程通信

  进程通信是指进程之间的信息交换。进程高级通信方式可以分为共享存储器系统、消息传递系统和管道通信系统。

  (1)共享存储器系统

   在共享存储器系统中,进程通过共享内存中的存储区来实现通信。

  (2)消息传递系统

  在消息传递系统中,进程间的数据交换以消息为单位。可以分为直接通信方式间接通信方式

  • 直接通信方式: 发送进程直接把消息发送给接收进程,并将它挂在接收进程中的消息缓冲队列上,接受进程从消息缓冲队列中取得消息。
  • 间接通信方式: 发送进程把消息发送到某个中间实体上,接收进程从中间实体上取得消息,这种中间体一般称为信箱,这种通信方式称为信箱通信方式

  (3)管道通信方式

  管道是用于链接读进程和写进程以实现他们之间通信的共享文件,向管道提供输入的发送进程(即写进程)以字符流形式将大量的数据送入管道,而接收管道输出的接收进程(即读进程)可以直接从管道中接收数据。

 

10. 线程

   首先我们知道引入进程的目的是为了使多道程序并发执行,以改善资源利用率及提高系统的吞吐量;

而在操作系统中再引入线程,则是为了减少程序并发执行时所付出的时空开销,是操作系统有更好的并发性。

  注意理解下面的概念:

  • 线程是进程内的一个执行单元,是比进程更小的执行单位。
  • 在创建进程时,同时也为该进程创建了第一个线程,用以运行程序(注意:一个进程至少包含一个线程,当然可以包含多个线程
  • 线程是进程的一个可调度实体,且它是进程中相对独立的一个控制流序列。就类似与进程是系统内的一个可调度实体
  • 线程与进程不同的是线程本身不能单独运行,它只能包含在程序中,只能在一个程序中执行。
  • 线程有时也成为轻量级进程(LWP),是一个基本的CPU执行单元。它包含了一个线程ID、一个程序技术器、一个寄存器组和一个堆栈。
  • 同一个进程中的线程可以共享该进程中的所有的资源。
  • 同一个进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一个进程中的线程时,将会发生进程的切换。
  • 注意:线程的主要运行状态有运行态、等待态、就绪态。没有挂起状态,因为挂起这个状态时进程级概念。

  

11. 线程和进程的比较

  • 拥有的资源。每一个进程都有一个独立的地址空间,它拥有若干代码段数据段,此外还拥有若干打开文件、主存和至少一个线程。这些资源随着进程的创建而产生,一旦进程终止,这些资源就会被收回。但是线程拥有的资源很少,所以创建一个进程比创建一个线程的开销要大得多。
  • 调度。进程调度时,进程上下文的系统开销会很大,因为进程的资源很多。而线程调度时,上下文的开销就非常小,因为线程会共享同一进程中的资源,所以在调度时只需要把线程仅有的一小部分资源交换即可,从而提高了系统的效率。也就是说线程切换比进程切换快得多。 但是一个进程中的线程向另一个进程中的线程切换时,将会引起进程上下文的切换。
  • 并发性。 引入了多线程后,不仅仅在进程之间可以并发,在同一个进程中的线程之间也可以并发,从而提高了资源的利用率和系统的吞吐量
  • 安全性。 我们知道同一进程中的所有线程都会共享这个进程中的资源,所以一旦其中一个线程修改了资源,那么其他的线程就会因为数据错误而产生问题。 但是进程却不是,因为进程不存在资源的共享,所以系统不允许一个进程有意无意的破坏另一个进程。从而可以知道进程比线程安全。

 

12. 线程的实现

  操作系统中可以提供多种方式实现对线程的支持。下面这两种方法是常用的,有的系统用了其中一种,有的用了其中的两种。

  (1) 内核支持线程

  这种线程和进程一样,也是在内核的支持下运行的,即无论是用户进程中的线程,还是系统进程中的线程,他们的各种操作都依赖内核。内核支持线程的调度和切换和进程的十分相似。  

说明:打开资源管理器 -> 详细信息,看到如下界面:

一般,如果是Administrator就是用户进程,如果是SYSTEM就是系统进程,其他不清楚。

  (2) 用户级线程

   这类线程仅存在于用户空间中。对于这种线程的创建、撤销、线程之间的同步与通信功能,都无须利用系统调用来实现,对于用户级线程的切换,通常发生在一个应用程序的诸多线程之间,这是也同样无需内核的支持。

 

  两者的区别主要如下:

  • 内核支持线程是操作系统内核可感知的,而用户级线程是操作系统内核不可感知的。
  • 用户级线程的创建不需要操作系统内核的支持,是在语言(如Java)这一级处理的; 而内核支持线程的创建、撤销和调度都需要操作系统内核提供支持,而且与进程的创建、撤销和调度大体上是一直的
  • 重要: 用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。
  • 在只有用户级的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序(如java?)控制线程的轮换运行; 在由内核支持线程的系统内,CPU调度则以线程为单位,由操作系统的线程调度程序负责线程的调度。
  • 用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

 

 

13. 互斥和同步的基本概念

13.1 临界资源

  虽然计算机系统中的多个进程可以共享系统中的各种资源,然而其中许多的资源一次只能为一个进程所使用。 我们把一次仅允许一个进程使用的资源成为临界资源。许多物理设备就是临界资源,如打印机、绘图机等等。 

  在每个进程中,访问临界资源的那段程序成为临界区(即可以访问临界资源的代码、区域)。为了保证临界资源的正确使用,我们把临界资源的访问过程分为四个部分:

  1. 进入区: 能否进入临界区访问临界资源,首先需要在临界区判断是否有正在访问临界区的标志, 如果有,说明不可进入临界区;如果没有,说明可以进入,那就要再设置正在访问临界区的标志 防止其他的进程访问。
  2. 临界区: 再临界区我们可以访问临界资源。
  3. 退出区:访问结束,将正在访问临界区的标志清除。
  4. 剩余区:代码中的其余部分。

13.2 互斥

  当一个进程进入临界区使用临界资源时,另一个进程必须等待,当使用临界资源的进程退出区的时候,另一个进程才可以进入临界区。  我们称进程之间的这种相互制约关系即为 互斥。

  为防止两个进程同时进入临界区,可以采用软件方法或同步机构来协调,方法为:

  • 空闲让进。若临界区没有进程时,则允许一个请求进入临界区。
  • 忙则等待。若已经有进程在临界区,则其他进程在外面等待。
  • 有限等待。要求访问临界资源的进程,应该保证其在有限的时间内进入临界区。
  • 让权等待。当进程不能进入临界区时,应该释放处理机。

13.3 同步

  举例: 一个计算进程和一个打印进程共享一个单缓冲区。当计算进程计算完了结果之后,并放入单缓冲区,那么打印进程才能在单缓冲区读取结果并打印; 只有打印进程在读取了单缓冲区的结构之后,计算进程才能进行下一次的计算。计算进程和打印进程就是用这种发信号的方式实现同步的。于是:

所谓进程同步就是指多个相互合作的进程,在一些关键点上可能需要互相等待或互相交换信息,这种制约关系成为进程同步。

  

 14. 信号量及P、V操作

  信号量是一个确定的二元组(S, Q),其中S是一个具有非负初值的整型变量,Q是一个初始状态为空的队列。

  整型变量S表示系统中某类资源的数目,当其值大于0时,表示系统中当前可用资源的数目; 当其值小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目。 除信号量的初值以外,信号量的初值只能由P(wait操作)操作和V(signal操作)操作改变。

 

15. 管程

  管程定义了一个数据结构和能为 并发进程 所执行的一组操作, 这组操作能使进程同步和改变管程中的数据。 管程由三部分组成:局部于管程的共享变量说明、对该数据结构进行操作的一组过程以及对局部于管程的数据设置初始值的语句。

  

16. 调度概念、分类

  调度时一个基本的操作系统功能。 几乎所有的计算机资源在使用前都需要调度。当然,cpu是首要的计算机资源之一,因此cpu调度时操作系统设计的核心问题。

  多道程序的设计目标是: 保持总有进程可供执行。 

  一个作业从提交开始直到完成,往往需要经历三级调度。

  (1) 作业调度

   作业调度又称宏观调度、高级调度或长程调度,其主要任务时按照一定的规则从外存中处于后备状态的作业中挑选一个(或多个)作业进入内存,为他们建立进程,这些进程被送入就绪队列。作业调度的执行频率很低,通常为几分钟一次。

  (2) 进程调度

  进程调度又称为微观调度、低级调度或短程调度,其主要任务是按照某种策略或方法选取一个处于就绪状态中的进程,将处理机分配给它。 进程调度的执行频率很高,通常为几十毫秒一次。

  (3)交换调度

   交换调度又称为中级调度中程调度。其主要任务是按照给定的规则,将处于外存对换区中的重新具有运行条件的就绪程序调入内存, 或将处于内存就绪状态的或内存阻塞状态的进程交换到外存对换区中。 它主要涉及的是内存管理。

   注:作业调度和进程调度的区别:

  • 作业调度为进程调度做准备,进程调度使得进程活动起来
  • 作业调度次数少,进程调度频率高
  • 有的系统不设作业调度,但进程调度必不可少

  

17. 调度的基本准则

(1)cpu利用率

cpu是计算机最重要、最昂贵的资源之一,其利用率是评价调度算法的重要指标。 在实际系统中,应在40%到60%之间。

(2)系统吞吐量

表示单位时间内CPU完成作业的数量。 (吞吐量:吞-就是把作业吸收掉, 吐-完成了一个就交付任务。 所以说吞吐量就是单位时间内CPU完成作业的数量

(3)周转时间

从一个特定的作业出发,最重要的准则就是完成这个作业需要话费多少时间,通常用周转时间来衡量。

作业的周转时间是指从作业提交到作业完成之间的间隔时间。即Ti = 作业i的等待时间+作业i的运行时间-作业i的提交时间

(4)响应时间

在交互式系统中,周转时间不可能是最好的评价标准,一般采用响应时间作为衡量调度算法的重要准则之一。 响应时间是指从用户提交请求到首次产生响应所用的时间。

 

18. 进程的调度方式

  • 抢占方式(剥夺方式) -- 即某个进程正在运行,然后有一进程更为紧迫地需要使用处理机时,就立即停止当前正在执行的进程。
  • 非抢占方式(非剥夺方式)--- 即某个进程正在运行,然后有一个进程很紧迫地需要使用处理机,但是必须执行完当前的进程才能执行这个紧急的进程。

 

19. 典型的调度算法

进程调度的核心问题就是采用什么样的算法将处理机分配给进程

 

19.1  先来先服务(FCFS)调度算法

  这是一种最简单、最容易理解的算法。即将进程进入就绪队列的先后次序来分配处理机。 这种算法采用非剥夺方式,即一旦某个进程占用了处理机之后,直到其运行结束再释放处理机。

  缺点:因为如果有一个运行时间长的进程先占用了处理机,那么很多玩到的事件消耗很短的进程就会等待很长时间。 所以很少用。

先来先服务调度算法的特点是算法简单、但效率很低;有利于长作业、但对短作业不利;有利于CPU繁忙性作业,不利于I/O繁忙性作业。

 

19.2  短作业优先调度算法(SJF)

   它用于进程调度时称为称为短进程优先调度算法,该调度算法既可以用于作业调度也可以用于进程调度。 

  在进程调度中,短进程有限算法每次从就绪队列中选择估计运行时间最短的进程,将处理机分配给它,使之投入运行,该进程一直运行下去,知道完成或因为某种原因而阻塞时才释放处理机。

  在做相关的题时,我们往往会使用甘特图来表示,这种图的横坐标是时间,纵坐标是进程。

  可以证明在所有的作业同时到达时,SJF算法是最佳的算法,因为他为制定的进程组给出了最小的平均等待时间。

  但是该调度算法对长作业不利,因为根据此算法规则,长作业就会被放在就绪队列中的最后面去执行了。  另外,由于不好说到底哪个执行的时间会更快一点,所以还是有问题的。

 

19.3 优先级调度算法

  优先级调度算法也可以称为优先权调度算法,该算法既可以用于作业调度,也可以用于进程调度,该算法中的优先级用于描述作业运行的紧迫程度。

  • 在作业调度中,优先级调度算法会每次从后备作业队列中选择优先级最高的一个或几个作业,将他们调入内存,分配必要的资源,创建简称并放入就绪队列。
  • 在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。

  根据进程调度方式的不同,又可以将该调度算法分为抢占式优先级调度算法和非抢占式优先级调度算法。  (和之前介绍的抢占式和费抢占式的概念相同)

  进程的优先级用于表示进程的重要性和运行的优先性。一般用优先数来衡量优先级。

  根据进程创建后(作业调度一旦完成,这时相应的进程就已经创建,只是有的是就绪状态,有的是执行状态...), 优先级是否可以改变,我们将之分为:

  • 静态优先级 即优先级在创建了进程之后就不再改变
  • 动态优先级 即之前在创建进程时确定一个优先级,然后在进程运行过程中再根据进程占用cpu时间的长短、就绪进程等待cpu运行时间的长短等动态改变优先级。

 

19.4 时间片轮转调度算法

  时间片轮转调度算法主要适用于分时系统中的进程调度。

  思想:将所有的就绪进程按照到达的时间排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,并按照规定的时间,例如100ms,该时间称为时间片,当该进程用完了这一时间片时(即使进程未完成其运行),系统就将它送至就绪队列的末尾,再把处理机分配给就绪队列的队首进程,如次反复即可,直至完成。

  注意:在这个过程中,时间片的长短影响很大。如果时间片足够大,那么在一个时间片,所有的进程就可以执行完了,这就成了FCFS调度算法; 如果时间片太小,那么处理机将在进程之间频繁的切换,处理机真正用于处理用户进程的时间将会减少。

  时间片的长短通常由以下因素确定:系统的响应时间、就绪队列中的进程个数、系统的处理能力。

 

 

 

20. 死锁的概念

  死锁是指多个进程因竞争系统资源或相互通信而处于永久堵塞状态,若无外力作用,这些进程都无法向前推进。 

   如在系统中的资源有一台打印机和一台输入设备,进程P1正在占用输入设备,并在还没有执行结束的时候就请求打印机,但是打印机正在执行P2进程,并且P2在还没有执行完就申请输入设备; 但是每个进程都不会在还没得到资源的情况下释放当前的处理机,所以双方就一直竞争。。。。形成死锁。。。

  关键:每个进程在没有得到请求的资源前是不会释放已经占有的资源的。

21. 死锁的产生原因

  • 系统的资源不足 --- 例如上面的例子,如果打印机和输入设备各有两台供进程P1和P2使用,那么这时系统就可以满足各自的要求了,不会抢夺资源,不会产生死锁。于是:产生死锁的根本原因是可供多个进程共享的系统资源不足。
  • 进程推进的顺序不当 --- 如他们在提出请求之前就分别已经完成了对资源的使用,那么久不会产生死锁了。 即要求提出的早了。

22.死锁产生的条件

  • 互斥条件 --- 即一段时间内某资源只被一个进程所有,别的进不来。即一个进程占有资源,只要不释放就不会被夺走。
  • 不剥夺条件 --- 即进程所获得的资源在未使用完毕之前,不能被其他的进程强行夺走(优先级高也不行),即只能由获得资源的进程自己来释放。
  • 部分分配条件(请求和保持条件) (重点)--- 即进程每次请求他所需要的一部分资源,在等待新资源的时候, 进程继续占有已分配的资源
  • 环路等待条件 --- 存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求。 

  

23. 死锁的处理

  (1) 预防死锁 --- 通过限制某些条件,去破坏产生死锁的四个必要条件中的一个或者几个来防止死锁的发生。

  (2) 避免死锁 --- 在资源的动态分配过程中,用某种方法防止系统进入不安全的状态,从而避免死锁。

   (3)   检测及解除死锁 --- 通过系统的检测机构,及时发现死锁,然后采取某种措施,解决死锁。

 

24. 死锁的预防

1)互斥条件 --- 为了破坏互斥条件,实际上就是应该允许多个进程同时进行访问。 但是不太容易实现甚至不能实现,如打印机,他就不允许在运行期间交替的打印等等。

2)不剥夺条件 ---  即一个已经获得了某些资源的进程,若新的资源请求不能得到满足,那么就必须释放他已经获得了的资源,以后需要获得资源时再申请即可。这意味着,一个进程在已经获得资源的过程中其资源可以被剥夺。这个策略的问题是实现起来比较复杂,并且释放已经获得的资源可能会造成前面一段时间工作的实效,重复申请和释放资源会增加系统的开销,降低系统吞吐量。

3)请求和保持条件 --- 为了破坏请求和保持条件,可以采用静态资源分配法。 即要求进程在其运行之前一次就要申请到所需要的全部资源,在他的资源没有得到满足之前,不将其投入运行。一旦投入运行之后,这些资源就一直归他所有。也不再提出其他资源要求,这样就可以保证系统不会发生死锁。  注意:这种方法简单安全,但是降低了资源利用率。如有的资源只在运行结束之后才有用,在正常运行中并没有用,但我们还得预先统一申请,结果使得系统资源不能充分利用。

4)循环等待条件 --- 为了破坏循环等待条件可以采用有序资源分配法。思想是:将系统中的所有资源按照类型赋予一个编号,要求每一个进程均按照严格递增的顺序来申请资源,同类资源一次申请完。也就说只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请资源编号排在Ri后面的那些资源(i为资源编号),不能申请资源编号低于Ri的资源。 这样就不会形成环路的请求了。但是这样的做法问题是编号一旦编定不容易修改,从而限制了新设备的增加

 

 

25. 死锁的避免

(1)系统安全状态

(2)银行家算法

  具有代表性的死锁避免算法是银行家算法

 

 

 

扇区

  

 

  

 

 

磁盘调度算法:

  磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,常用的磁盘调度算法有以下四种:

1. 先来先服务算法(FCFS),
2. 最短寻道时间优先算法(SSTF),
3.扫描算法(SCAN)(和电梯的运行非常类似,又称为 电梯算法
4. 循环扫描算法(CSCAN)
 
1. 先来先服务算法
FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的 调度算法。该算法的优点是具有公平性。如果只有少量进程需要访问,且大部分请求都是访问簇聚的文件扇区,则有望达到较好的性能;但如果有大量进程竞争使用磁盘,那么这种算法在性能上往往接近于随机调度。所以,实际磁盘调度中考虑一些更为复杂的调度算法
  
1、算法思想:按访问请求到达的先后次序服务。
2、优点: 简单公平
3、缺点: 效率不高,相邻两次请求可能会造成最内到最外的柱面寻道,使 磁头反复移动,增加了服务时间,对机械也不利。
4、例子:
假设磁盘访问序列:98,183,37,122,14,124,65,67。读写头起始位置:53。求:磁头服务序列和磁头移动总距离(道数)。
由题意和先来先服务算法的思想,得到下图所示的磁头移动轨迹。由此:
磁头服务序列为:98,183,37,122,14,124,65,67
磁头移动总距离=(98-53)+(183-98)+|37-183|+(122-37)+|14-122|+(124-14)+|65-124|+(67-65)=640(磁道)
 
2. 最短寻道时间优先算法
SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。
1、算法思想:优先选择距当前磁头最近的访问请求进行服务,主要考虑寻道优先。
2、优点:改善了磁盘平均服务时间。
3、缺点:造成某些访问请求长期等待得不到服务。
 
 
 
3. 扫描算法(电梯算法
  
SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。由于磁头移动规律与电梯运行相似,故又称为电梯调度算法。SCAN算法对最近扫描过的区域不公平,因此,它在访问局部性方面不如FCFS算法和SSTF算法好。 
算法思想:当设备无访问请求时,磁头不动;当有访问请求时,磁头按一个方向移动,在移[2]   动过程中对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求,如果有则继续扫描;否则改变移动方向,并为经过的访问请求服务,如此反复。
优点:克服了最短寻道优先的缺点,既考虑了距离,同时又考虑了方向。

 

4. 循环扫描算法

在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。由于SCAN算法偏向于处理那些接近最里或最外的磁道的访问请求,所以使用改进型的C-SCAN算法来避免这个问题

 

几种方法的比较: 

 

 

注: 下题的请求序列中的100当是110。

 

 

 



相关文章:

  • beego orm 模型定义
  • Linux下 ln 命令详解
  • 分布式系统中的定时任务全解(二)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 曾经的曾经的多么多么的爱一个人。。。
  • 手把手教你写Kconfig---基于tiny4412开发板
  • jquery点击回到页面顶部方法
  • Python 爬虫-下载图片
  • 中文转拼音without CJK
  • Python爬虫之多进程爬取(以58同城二手市场为例)
  • webpack+react项目初体验——记录我的webpack环境配置
  • js-权威指南学习笔记19.2
  • Swift与OC混编
  • JavaWeb之文件上传、下载
  • HttpServletRequest和HttpServletResponse详解
  • AWS实战 - 利用IAM对S3做访问控制
  • download使用浅析
  • echarts花样作死的坑
  • Lucene解析 - 基本概念
  • spark本地环境的搭建到运行第一个spark程序
  • Travix是如何部署应用程序到Kubernetes上的
  • 从零开始的无人驾驶 1
  • 从输入URL到页面加载发生了什么
  • 第十八天-企业应用架构模式-基本模式
  • 二维平面内的碰撞检测【一】
  • 码农张的Bug人生 - 初来乍到
  • 那些被忽略的 JavaScript 数组方法细节
  • 批量截取pdf文件
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • # 透过事物看本质的能力怎么培养?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #13 yum、编译安装与sed命令的使用
  • #14vue3生成表单并跳转到外部地址的方式
  • $$$$GB2312-80区位编码表$$$$
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (pojstep1.1.2)2654(直叙式模拟)
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (剑指Offer)面试题34:丑数
  • (三)elasticsearch 源码之启动流程分析
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Sublime Text3配置Lua运行环境
  • (转载)hibernate缓存
  • ***检测工具之RKHunter AIDE
  • .NET Core 项目指定SDK版本
  • .net core 依赖注入的基本用发
  • .NET 读取 JSON格式的数据
  • .NET/C# 使用反射注册事件
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [AutoSar]工程中的cpuload陷阱(三)测试
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件