操作系统(Operating System)OS
基本概念及原理
什么是操作系统
操作系统的功能
- 用户角度上,操作系统是一个控制软件
- 管理应用程序
- 为应用程序提供服务(声卡)
- 杀死应用程序
- 资源管理
- 资源外设、分配资源
- 操作系统将CPU抽象成进程,将磁盘抽象成文件,将内存抽象成地址空间
操作系统层次结构
- 硬件之上
- 应用程序之下(操作系统位于应用软件之下,为应用软件提供服务支撑)
操作系统提供两个接口:外壳(shell)——Linux、windows的界面,内核(kernel)
操作系统内部组件(kernel)包括
- CPU调度器
- 物理内存管理
- 虚拟内存管理
- 文件系统管理
- 中断处理与设备驱动(与底层硬件直接相关)
OS Kernel的特征
- 并发 (并发指的是在一段时间内可以有多个程序在运行;而并行是在一个时间点上有多个程序在运行——存在多个CPU)
- 共享 (共享资源-内存/IO)
- “同时”访问
- 互斥共享
- 虚拟 利用多道程序设计技术,让每个用户觉得有一个计算机专门为他服务
- 异步 程序的执行不是一贯到底,而是走走停停,向前推进的速度不可预知;但只要运行环境相同,OS需要保证程序运行的结果也要相同
操作系统实例
- UNIX(基于C语言)
- Linux(redhat)移动端大部分都是基于linux内核
- Windows(最早是dos)
操作系统历史
操作系统介绍
中断及系统调用
系统调用(来源于应用程序):
- 应用程序主动向操作系统发出服务请求
异常(来源于不良的应用程序):
- 非法指令或者其他坏的处理状态(如:内存出错)
中断(来源于外设)
- 来自不同的硬件设备的计时器和网络的中断
区别:
- 源头:
- 中断:外设(鼠标、键盘、网卡)
- 异常:应用程序意想不到的行为
- 系统调用:应用程序请求操作提供服务
- 处理时间
- 中断:异步
- 异常:同步
- 系统调用:异步或同步
- 响应
- 持续,对用户应用程序是透明的
- 异常:杀死或者重新执行意想不到的应用程序指令
- 系统调用
内存管理
进程及线程
进程描述
进程的定义
(运行过程中的程序,会占用CPU/内存/网络)
定义:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程
进程的组成
一个进程应该包括:
* 程序的代码
* 程序处理的数据
* 程序计数器中的值,指示下一条将运行的指令
* 一组通用的寄存器的当前值,堆、栈
* 一组系统资源(如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息
进程与程序的联系
- 进程是动态执行的过程,而程序是静态的代码
- 程序是产生进程的基础
- 程序的每次运行构成不同的进程
- 进程是程序功能的体现
- 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序
进程与程序的区别:
- 进程是动态执行的过程,程序是静态的代码;程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
- 进程是暂时的,程序是永久的;进程是一个状态变化的过程,程序可永久保存
- 进程与程序的组成不同;进程的组成包括程序、数据和进程控制块(即进程状态信息)
类比:
科学家照着食谱给女儿做蛋糕:
食谱——程序(描述怎么做),原料——数据;做蛋糕的过程——进程;科学家——CPU
这时候,儿子跑进来说手被蜜蜂蛰了,他只好把蛋糕先放在一边,在食谱上做了个标记,把状态信息记录起来;
然后去找了本医疗手册,查到相关内容,按照上面的指令一步步执行;
当伤口处理完之后,又回到厨房继续做蛋糕
CPU从一个进程(做蛋糕)切换到另一个进程(医疗救护)进程的特点
- 动态性:可董涛地创建,结束进程
- 并发性:进程可以被独立调度并占有处理机运行
- 独立性:不同进程的工作不相互影响
- 保证其他进程不会破坏这个进程(通过页表保证)
- 制约性:因访问共享数据/资源或进程同步而产生制约
进程控制结构
进程控制块(PCB):系统给每个进程都分配一个PCB用来管理进程运行所用的信息集合
操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标志
- 使用进程控制块
- 进程的创建:为该进程生成一个PCB
- 进程的终止:回收它的PCB
- 进程的组织管理:通过对PCB的组织管理来实现
- PCB含有以下三大类信息:
- 进程标识信息。本进程的标识,本进程的产生者标识(父进程标识);用户标识
- 处理机状态信息保存去。保存进程的运行现场
- 进程控制信息
- 调度和状态信息
- 进程间通信信息
- 存储管理信息
- 进程所用资源
- 有关数据结构连接信息
进程状态
进程的生命期管理
- 进程创建
引起进程创建的三个主要事件:- 系统初始化时
- 用户请求创建一个新进程
- 正在运行的进程执行了创建进程的系统调用
==========就绪=========
进程运行
内核选择一个就绪的进程,让它占用处理并执行- 如何选择?
- 如何选择?
=========running==========
进程等待
在以下情况下,进程等待(阻塞)- 请求并等待系统服务,无法马上完成
- 启动某种操作,无法马上完成
- 需要的数据没有到达
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生
========waiting==========
进程唤醒
唤醒进程的原因:- 被阻塞进程需要的资源可被满足
- 被阻塞进程等待的事件到达
- 将该进程的PCB插入到就绪队列
进程只能别别的进程或操作系统唤醒
=========就绪===========
- 进程结束
在以下四种情形下,进程结束:- 正常退出(自愿的)
- 错误退出(自愿的)
- 致命错误(强制性的)
- 被其他进程所杀(强制性的)
进程状态变化模型
进程的三种基本状态(进程在生命结束前处于且仅处于三种基本状态之一)
不同系统设置的进程状态数目不同
- 运行状态(running):当一个进程正在处理机上运行时
- 就绪状态(ready): 一个进程获得了除处理机外的一切所需资源,一旦得到处理机即可运行
- 等待状态(又称阻塞状态blocked):一个进程正在等待某一事件而暂停运行时,如等待某资源,等待输入/输出完成
其他基本状态:- 创建状态(new):一个进程正在被创建,还没被转到就绪状态之前的状态
- 结束状态(exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致
可能的状态变化如下:
- NULL->New:一个新进程被产生出来执行一个程序
- New->ready:当进程被创建完成并初始化后,一些就绪准备运行时,变为就绪状态(很快)
- ready->running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行
- running->exit:当进程表示它已经完成或者因特殊原因出错,当前运行进程会由操作系统作结束处理
- running->ready:处于运行状态的进程在其运行过程中,由于分配给它的处理机时间片用完而让出处理机(由操作系统完成——时钟)
- running->blocked:当进程请求某样东西且必须等待时(比如:等待定时器的到达,要去读一个文件,写一个文件)
- blocked->ready:当进程要等待某事件到来时,它从阻塞状态变到就绪状态
进程挂起
和阻塞不一样
进程挂起:进程在挂起状态时,意味着进程没有占用内存空间,处在挂起状态的进程映像在磁盘上。
- 阻塞挂起状态:进程在外存(磁盘)并等待某事件的出现
- 就绪挂起状态:进程在外存(磁盘),但只要进入内存,即可运行
与挂起相关的状态转换
挂起:把一个进程从内存转到外存,可能有以下几种情况:
- 阻塞到阻塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源时,会进行这种转换,以提交新进程或运行就绪进程
- 就绪到就绪挂起:当有高优先级阻塞(系统认为会很快就绪的)进程和低优先就绪进程时,系统会选择挂起低优先级就绪进程
- 运行到就绪挂起:对抢先式分时系统,当有高优先级阻塞挂起进程因事件出现而进入就绪挂起时,系统可能会把运行进程转到就绪挂起状态
- 阻塞挂起到就绪挂起:当有阻塞挂起进程因相关事件出现时,系统会把阻塞挂起进程转换为就绪挂起进程
解挂/激活:把一个进程从外存转到内存;可能有以下几种情况:
- 就绪挂起到就绪:没有就绪进程或挂起就绪进程优先级高于就绪进程时,会进行这种转换
- 阻塞挂起到阻塞:当一个进程释放足够内存时,系统会把一个高优先级阻塞挂起(系统认为会很快出现所等待的事件)进程转换为阻塞进程
OS怎么通过PCB和定义的进程状态来管理PCB,帮助完成进程的调度过程?
状态队列:
- 由操作系统来维护一组队列,用来表示系统当中所有进程的当前状态
- 不同的状态分别用不同的队列来表示(就绪队列、各种类型的阻塞队列)
- 每个进程的PCB都根据它的状态加入到相应的队列,当一个进程的状态发生变化,它的PCB从一个状态队列脱离出来,加入到另外一个队列
线程
更小的能独立运行的基本单位——线程
为什么使用线程?
什么是线程?
进程当中的一条执行流程
从两个方面重新理解进程(资源+线程)
- 从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段、数据段),打开的文件等各种资源
- 从运行的角度:代码在这个资源平台上的一条执行流程(线程)
线程是进程的一个组成部分
线程的优点:
- 一个进程中可以同时存在多个线程
- 各个进程之间可以并发地执行
- 各个线程之间可以共享地址空间和文件资源
线程的优点:
- 一个线程崩溃,会导致其所属进程的所有进程崩溃
(而一个进程崩溃,不会)
不同的操作系统对线程的支持: - MS-DOS:单进程单线程
- Unix:多进程单线程
- Windows NT:多进程多线程
线程与进程的比较
- 进程是资源分配单位,线程是CPU调度单位
- 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈
- 线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系
- 线程能减少并发执行的时间和空间开销:(创建进程的时候还需要考虑其他管理,比如内存的管理,I/O的管理)
- 线程的创建时间比进程短
- 线程的终止时间比进程短
- 同一进程内的线程切换时间比进程短
- 由于同一进程的各线程间共享内存和文件资源,可直接进行不通过内核的通信
线程的实现
主要有三种线程的实现方式:
用户线程:在用户空间实现(操作系统看不见)
内核线程:在内核中实现(由操作系统管理)
轻量级进程:在内核中实现,支持用户线程
多线程编程接口举例
死锁
一组阻塞的进程持有一种资源等待获取另一个进程所占有的一个资源
hold住了资源还想去申请其他资源
系统模型
进程/资源