手记

猿考研之操作系统篇一(体系,线程,进程)

操作系统(Operating System,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。

  • 直观的例子:打开Windows操作系统的“任务管理器”(快捷键:Ctrl+Alt+Del)

系统资源的Boss

  • 处理机(CPU)管理
  • 存储器管理
  • 文件管理
  • 设备管理
  • 活物与死物的接口
    • 命令接口:允许用户直接使用
      • 交互式 = 联机
      • 批处理shell = 脱机
    • 程序接口:允许用户通过程序间接使用
      • 由一组系统调用组成(程序接口=系统调用
    • GUl:现代操作系统中最流行的图形用户接口
  • 进程是一个程序的执行过程。执行前需要将该程序放到内存中,才能被CPU处理。
  • 没有任何软件支持的计算机成为裸机。
  • 通常把覆盖了软件的机器成为扩充机器,又称之为虚拟机。

四法王

并发和共享互为存在条件,也是最基本的两个

并发
  • 指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替发生的。
  • 魔王并行:指两个或多个事件在同一时刻同时发生。
  • 一个单核处理机(CPU)同一时刻只能执行一个程序,因此操作系统会负责协调多个程序交替执行(这些程序微观上是交替执行的,但宏观上看起来就像在同时执行)
  • 事实上,操作系统就是伴随着“多道程序技术”而出现的。因此,操作系统和程序并发是一起诞生的
共享
  • 共享即资源共享,是指系统中的资源可供内存中多个并发执行的进程共同使用。
  • 互斥共享方式
    • 系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源
  • 同时共享方式
    • 系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问
    • 所谓的“同时”往往是宏观上的,而在微观上,这些进程可能是交替地对该资源进行访问的(即分时共享)
  • 并发性指计算机系统中同时存在着多个运行着的程序。
  • 共享性是指系统中的资源可供内存中多个并发执行的进程共同使用。
虚拟(基于并发)
  • 虚拟是指把一个物理上的实体变为若干个逻辑上的对应物。物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。
  • 空分复用技术(如虚拟存储器技术)
  • 时分复用技术(如虚拟处理器)
    • 微观上处理机在各个微小的时间段内交替着为各个进程服务
异步(基于并发)
  • 异步是指,在多道程序环境下,允许多个程序并发执行,但由于资源有限,进程的执行不是一贯到底的,而是走走停停,以不可预知的速度向前推进,这就是进程的异步性。

OS发展分类

  • 手工操作阶段
    • 缺点:用户独占全机、人机速度矛盾导致资源利用率极低
  • 批处理阶段
    • 单道批处理系统
      • 引入脱机输入/输出技术(用磁带完成),并监督程序负责控制作业的输入、输出
      • 优点:缓解了一定程度的人机速度矛盾,资源利用率有所提升。
      • 缺点:内存中仅能有一道程序运行,只有该程序运行结束之后才能调入下一道程序。CPU有大量的时间是在空闲等待l/0完成。资源利用率依然很低。
    • 多道批处理系统(操作系统开始出现)
      • 每次往内存中输入多道程序,并发执行
      • 中断技术被发明
      • 优点:多道程序并发执行,共享计算机资源。资源利用率大幅提升,CPU和其他资源保持“忙碌”状态,系统吞吐量增大。
      • 缺点:用户响应时间长,没有人机交互功能(用户提交自己的作业之后就只能等待计算机处理完成,中间不能控制自己的作业执行)
  • 分时操作系统
    • 计算机以时间片为单位轮流为各个用户/作业服务,各个用户可通过终端与计算机进行交互。
    • 优点:用户请求可以被即时响应,解决了人机交互问题。允许多个用户同时使用一台计算机,并且用户对计算机的操作相互独立,感受不到别人的存在。
    • 缺点:不能优先处理一些紧急任务。操作系统对各个用户/作业都是完全公平的,循环地为每个用户/作业服务一个时间片,不区分任务的紧急性。
  • 实时操作系统
    • 实时系统必须在绝对严格的规定时间内完成处理,如自动驾驶,卫星控制系统
    • 实时系统能接受偶尔违反时间规定,如12306订票系统
    • 优点:能够优先响应一些紧急任务,某些紧急任务不需时间片排队。
    • 在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完事件。实时操作系统的主要特点是及时性和可靠性
  • 网络操作系统
  • 分布式操作系统
  • 个人计算机操作系统

魔鬼的步伐与内涵

  • 指令
    • “指令”就是处理器(CPU)能识别、执行的最基本命令
    • 特权指令:如内存清零指令
      • 不允许用户程序使用
      • 非特权指令:如普通的运算指令
  • 状态
    • 用程序状态字寄存器(PSW)中的某标志位来标识当前处理器处于什么状态。如0为用户态,1为核心态
    • 用户态(目态):此时CPU只能执行非特权指令
    • 核心态(管态):特权指令、非特权指令都可执行
  • 程序
    • 操作系统的内核程序是系统的管理者,既可以执行特权指令,也可以执行非特内核程序权指令,运行在核心态。
      • 内核是计算机上配置的底层软件,是操作系统最基本、最核心的部分。
    • 应用程序为了保证系统能安全运行,普通应用程序只能执行非特权指令,运行在用户态
  • 内核

操作系统的体系结构问题与企业的管理问题很相似。
内核就是企业的管理层,负责一些重要的工作。只有管理层才能执行特权指令,普通员工只能执行非特权指令用户态、核心态之间的切换相当于普通员工和管理层之间的工作交接

大内核:企业初创时体量不大,管理层的人会负责大部分的事情。优点是效率高;缺点是组织结构混乱,难以维护。
微内核:随着企业体量越来越大,管理层只负责最核心的一些工作。优点是组织结构清晰,方便维护;缺点是效率低。

节奏与鼓点

为了解决串行,人们发明了操作系统(作为计算机的管理者),引入中断机制,实现了多道程序并发执行
本质:发生中断就意味着需要操作系统介入,开展管理工作

  • Step1 用户态:CPU收到计时部件发出的中断信号,切换为核心态对中断进行处理
  • Step2 核心态:操作系统内核负责对中断信号进行处理
  • Step3 进程1的时间片已用完,换进程2运行
  • Step4 用户态:进程2发出系统调用(内中断信号),请求输出(特权指令)。CPU切换为核心态,对中断进行处理
  • Step5 核心态:操作系统内核负责对中断信号进行处理

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

发生了中断,就意味着需要操作系统介入,开展管理工作。由于操作系统的管理工作(比如进程切换、分配I/o设备等)需要使用特权指令,因此CPU要从用户态转为核心态。中断可以使CPU从**用户态切换为核心态,使操作系统获得计算机的控制权。**有了中断,才能实现多道程序并发执行。

中断分类一

中断分类二

外中断的处理过程
  • Step 1:执行完每个指令之后,CPU都要检查当前是否有外部中断信号
  • Step 2:如果检测到外部中断信号,则需要保护被中断进程的CPU环境(如程序状态字PSW、程序计数器PC、各种通用寄存器)
  • Step3:根据中断信号类型转入相应的中断处理程序
  • Step4:恢复原进程的CPU环境并退出中断,返回原进程继续往下执行

进程与线程

  • 程序:就是一个指令序列
  • 早期的计算机(只支持单道程序)
    • 内存:程序的代码放在程序段内,程序运行过程处理的数据(全局变量,局部变量,宏定义)放在数据段内(如变量)
  • 引入多程序后
    • 内存中多道程序
    • 为了方便操作系统管理,完成各程序并发执行,引入了进程、进程实体的概念
    • 系统为每个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放位置)
      • 操作系统通过PCB来管理进程,因此PCB中应该包含操作系统对其进行管理所需的各种信息。

进程:程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程,例如,所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。
注意:PCB是进程存在的唯一标志


从不同的角度,进程可以有不同的定义,比较传统典型的定义有(强调“动态性”):

  • 1.进程是程序的一次执行过程
  • 2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动
  • 3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。

进程的组织
  • 方式
    • 链接方式
    • 按照进程状态将PCB分为多个队列
    • 操作系统持有指向各个队列的指针
  • 索引方式
    • 根据进程状态的不同,建立几张索引表
    • 操作系统持有指向各个索引表的指针
独一无二的你

总结

喜怒哀乐我都爱你

进程是程序的一次执行。在这个执行过程中,有时进程正在被CPU处理,有时又需要等待CPU服务,可见,进程的状态是会有各种变化。为了方便对各个进程的管理,操作系统需要将进程合理地划分为几种状态。

  • 进程运行结束(或者由于bug导致进程无法继续执行下去,比如数组越界错误),需要撤销进程。操作系统需要完成撤销进程相关的工作。完成将分配给进程的资源回收撤销进程PCB等工作,So
你变了我也陪着你

进程控制

进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。
简化理解:反正进程控制就是要实现进程状态转换

过程

  • 如果某一个进程把它的PCB(小块)从一个队列放到了另一个队列,因为PCB里面的状态没有修改为新的状态,出现错误,所谓为了解决这个问题。
  • 原语实现进程控制。原语的特点是执行期间不允许中断,只能一气呵成。
  • 这种不可被中断的操作即原子操作
  • 原语采用“关中断指令”和“开中断指令”实现
  • 关/开中断指令的权限非常大,必然是只允许在核心态下执行的特权指令
  • 进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:
    • 1.更新PCB中的信息(如修改进程状态标志、将运行环境保存到PCB、从PCB恢复运行环境)
      • a.所有的进程控制原语一定都会修改进程状态标志
      • b.剥夺当前运行进程的CPU使用权必然需要保存其运行环境
      • c.某进程开始运行前必然要恢复期运行环境
    • 2.将PCB插入合适的队列
    • 3.分配/回收资源



进程通信:喂,110嘛?

进程之间的信息交换
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立

  • 为了保证安全,一个进程不能直接访问另一个进程的地址空间
  • 但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。
共享存储

两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现)。
操作系统只负责提供共享空间和同步互斥工具(如P、V操作)

  • 基于数据结构的共享
    • 只能存放一种固定的数据结构,比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
  • 基于存储区的共享
    • 在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
消息传递

进程间的数据交换以格式化的消息(Message)为单位。进程通过操作系统提供的“发送消息/接收消息”两个原语进行数据交换。

  • 直接通信方式
    • 消息直接挂到接收进程的消息缓冲队列上
  • 间接通信方式
    • 消息要先发送到中间实体(信箱)中,因此也称“信箱通信方式”。Eg:计网中的电子邮件系统化
管道通信

“管道”是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区,一般和内存页面是一样的,比如Linux一个管道是4kb

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

线程,多线程:给你的小纸条~

进程是程序的一次执行。但这些功能显然不可能是由一个程序顺序处理就能实现的。
有的进程可能需要“同时”做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了“线程”,来增加并发度

  • 传统的进程是程序执行流的最小单位,然后线程是程序执行流的最小单位,是一个基本的CPU执行单位
  • 引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
  • 引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。
  • 属性
    • 线程是处理机调度的单位
    • 多CPU计算机中,各个线程可占用不同的CPU
    • 每个线程都有一个线程ID、线程控制块(TCB)
    • 线程也有就绪、阻塞、运行三种基本状态
    • 线程几乎不拥有系统资源
    • 同一进程的不同线程间共享进程的资源
    • 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
    • 同一进程中的线程切换,不会引起进程切换
    • 不同进程中的线程切换,会引起进程切换
    • 切换同进程内的线程,系统开销很小
好的变化

实现方式

用户级线程(User-Level Thread,ULT)

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

内核级线程(Kernel-Level Thread,KLT,又称“内核支持的线程”)

  • 内核级线程的管理工作操作系统内核完成。

  • 线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。

  • 可以这样理解,“内核级线程”就是“从操作系统内核视角看能看到的线程”

  • 在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n个用户级线程映射到m个内核级线程上(n>=m)

  • 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位

  • 例如:左边这个模型中,该进程由两个内核级线程,三个用户级线程,在用户看来,这个进程中有三个线程。但即使该进程在一个4核处理机的计算机上运行,也最多只能被分配到两个核,最多只能有两个用户线程并行执行。

多线程模型

在同时支持用户级线程和内核级线程的系统中,由几个用户级线程映射到几个内核级线程的问题引出了“多线程模型”问题。

  • 多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。

  • 优点:用户级线程的切换在用户空间即可完成,不需要切换到核心态,线程管理的系统开销小,效率高

  • 缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理机上并行运行

  • 一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有与用户级线程同数量的内核级线程。

  • 优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多核处理机上并行执行。

  • 缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。

  • 多对多模型:n用户及线程映射到m个内核级线程(n>=m)。每个用户进程对应m个内核级线程。
  • 克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。

6人推荐
随时随地看视频
慕课网APP