操作系统做了什么?
如一段程序
#include <stdio.h>
using namespace std;
int main(int argc,char *argv[]){
put("Hello World");
return 0;
}
用户如何告诉操作系统执行Hello World程序?
操作系统:找到helloworld程序的相关信息,检查其类型是否是可执行文件,并通过程序首部信息,确定代码和数据在可执行文件中的位置并计算出对应的磁盘块地址
创建一个新的进程,并将helloworld执行文件映射到该进程结构,表示由该进程执行helloworld程序
为helloworld程序设置CPU上下文环境并跳到程序开始处
什么是操作系统?
是计算机硬件和应用之间的一层软件
方便我们高效的使用硬件,管理资源
怎样管理资源?
1. 跟踪记录资源的使用状况
如:哪些资源是空闲,分配给谁使用,允许使用多长时间
2. 确定资源分配策略 – 算法
静态分配策略
动态分配策略
3. 实施资源的分配和回收
4. 提高资源的利用率
5. 保护资源的使用
6. 协调多个进程对资源请求的冲突
操作系统的特性:
并发 , 共享 , 虚拟 ,随机
1. 并发
指处理多个同时性活动的能力
并发会引发很多的问题:
如:活动的切换 , 保护 , 相互依赖的活动间的同步
在计算机系统中同时存在多个程序运行,但CPU上
宏观:这些程序同时在执行
微观:任何时刻只有一个程序在真正的执行,即这些程序在cpu上是轮流执行的
并行:指不同程序同时在多个硬件部件上执行
2. 共享
操作系统与多个用户的程序共同使用计算机系统中的区别
<1 互斥共享
<2 同时共享
3. 虚拟
一个物理实体映射为若干个对应的逻辑实体 — 分时或分空间
虚拟可提高资源的利用率
CPU —- 每个进程的“虚处理机”
存储器 —- 每个进程都有独立的虚拟地址空间(代码+数据+堆栈) 逻辑上共用一块物理内存
显示设备 —- 多窗口或虚拟中断
4. 随机
操作系统必须随时对不可预测的次序发生的事件进行响应并处理
进程的运行速度不可预知:多个进程并发执行,无法预知每个进程推进的快慢
难以重现系统在某个时刻的状态(包括重现运行中的错误)
操作系统的分类
- 批处理操作系统
分为单道批处理和多道批处理 - 分时操作系统
时间片
操作系统将CPU的时间划分成若干个片段,称为时间片
操作系统以时间片为单位,轮流为每个终端用户服务,每次服务一个时间片
其特点是利用人的错觉,使用户感觉不到计算机为他人服务 - 实时操作系统
是指计算机能及时响应外部事件的请求 ,在规定的严格时间内完成对该事件的处理,并控制所有实时设备 - 个人计算机操作系统
- 网络操作系统
- 分布式操作系统
是一个统一的操作系统,允许若干个计算机可相互协作共同完成一项任务 - 嵌入式操作系统
操作系统运行环境和运行机制
操作系统运行环境
1. CPU状态
CPU由运算器,控制器,一系列的寄存器以及高速缓存构成
两类寄存器:
<1 用户可见寄存器: 高级语言编译器通过优化算法分配并使用,减少程序访问内存次数
<2 控制和状态寄存器: 用于控制处理器的操作,通常由操作系统代码使用
常见的控制和状态寄存器:
程序计数器(PC):记录将要取出指令的地址
指令寄存器(IR):记录最近取出的指令
程序状态字(PSW):记录处理器的运行状态如条件码,模式,控制位等信息
处理器(cpu)的状态(模式MODE)
现代处理器将CPU状态设计划分为两种,三种或四种
在 程序状态字寄存器PSW 中专门设置一位,根据运行程序对资源和指令的使用权限而设置不同的CPU状态
操作系统需要两种CPU状态:
1. 内核态: 运行操作系统程序
2. 用户态 : 运行用户程序
特权指令: 只能由操作系统使用,用户程序不能使用的指令
启动I/O ,内存清零 , 修改程序状态字 , 设置时钟 , 允许/禁止中断 ,停机
非特权指令: 用户程序可以使用的指令
控制转移 , 算术运算 , 取数指令房管指令
CPU状态之间的转换:
用户态 —-> 内核态
唯一途径:中断/异常/陷入机制
陷入指令(访管指令):提供给用户程序的接口,用于调用操作系统的功能
内核态 —-> 用户态
设置程序状态字PSW
2. 中断/异常机制
主要作用:
及时处理设备发来的中断请求
可使OS捕获用户程序提出的服务请求
防止用户程序执行过程中的破坏性活动
等等…..
中断/异常是指CPU对系统发生的某个事件作出的一种反应。事件的发生改变了CPU的控制流
CPU暂停正在执行的任务,保留现场后自动转去执行相应事件的处理程序,处理完成后返回断点继续执行被打断的程序
可看出有几个特点:
是随机发生的
是自动处理的
是可恢复的
为什么引用中断和异常?
中断的引入:
为了支持CPU和设备之间的并行操作
当CPU启动设备进行输入/输出后,设备便可以独立进行工作,CPU转去处理与此次输入/输出不想关的事情,当设备完成输入/输出后,通过向CPU发中断报告此次输入/输出的结果,让CPU决定如何处理以后的事情
异常的引用:
表示CPU执行指令时本身出现的问题
如算术溢出,除零,取数时的奇偶错,访存地址时越界或执行了“陷入指令”等,这时硬件改变了CPU当前的执行流程,转到相应的错误处理程序或执行系统调用
中断和异常统称为事件
事件:
1. 中断(外中断): I/O中断 , 时钟中断 , 硬件故障
2. 异常(内中断) : 系统调用 , 页故障/页错误 , 保护性异常 ,断点指令,其他程序性异常(如算术溢出)
中断:外部事件,正在运行的程序所不期望的
异常:有正在执行的指令引发
中断/异常的响应(硬件)
捕获中断源发出的中断/异常请求,以一定方式响应,将处理器控制权交给特定的处理程序
中断/异常的处理程序(软件)
识别中断/异常的类型,并做相应的处理
中断响应:
发现中断,接收中断的过程,由中断硬件部件完成
处理器控制部件中设有中断寄存器
中断在CPU中的执行过程:
中断向量:
一个内存单元,存放中断处理程序的入口地址和程序运行时所需的处理剂状态字
中断响应示意图:
系统运行时若响应中断,中断硬件部件将CPU控制权转给中断处理程序:
保存相关寄存器信息
分析中断/异常的具体原因
执行对应的处理功能
恢复现场,返回被事件打断的程序
小结:
CPU根据中断码查看中断向量表,获得与该中断相关的处理程序的入口地址,并将PC设置为该地址,新的指令周期开始,CPU控制转移到中断处理程序(硬件)
中断处理程序开始工作:
在系统栈中保存现场信息
检查I/O设备的状态信息,操作I/O设备或者在设备和内存之间传送数据等等(软件)
中断处理结束后,CPU检测到中断返回指令,从系统栈中恢复被中断程序的上下文环境,CPU状态恢复成原来的状态,PSW和PC恢复成中断前的值,CPU开始一个新的指令周期(硬件)
系统调用
系统调用:用户在编程时可以调用的操作系统功能
系统调用时操作系统提供给编程人员的唯一接口
使CPU状态从用户态陷入内核态
系统调用机制的设计:
1. 中断/异常机制 支持系统调用服务的实现
2. 选择一条特殊指令:陷入指令(访管指令) 引发异常,完成用户态到内核态的切换
3. 系统调用号和参数 每个系统调用都事先给定一个编号(功能号)
4. 系统调用表 存放系统调用服务例程的入口地址
系统调用的执行过程:
当CPU执行到特殊的陷入指令时:
中断/异常机制:硬件保护现场,通过查中断向量表将控制权转给系统调用总入口程序
系统调用总入口程序:保存现场,将参数保存在
进程/线程模型
多道程序设计:
允许多个程序同时进入内存并运行,其目的是为了提高系统效率
并发环境:
一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且次序不是事先确定的
进程的定义:
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位
进程是程序的一次执行过程 是正在运行程序的抽象 将一个CPU变幻成对个虚拟的CPU
系统资源以进程为单位分配内存
进程控制块(PCB):
PCB:操作系统用于管理进程的一个专门的数据结构
记录进程的各种属性,描述进程的动态变化过程
PCB是系统感知进程存在的唯一标志 进程与PCB是一 一对应的
PCB存放:
1. 进程描述信息:
进程标识符
进程名
用户标识符
进程组关系
2. 进程控制信息
当前状态
优先级
代码执行入口地址
程序的磁盘地址
运行统计信息
进程间同步和通信
进程的队列指针
进程的消息队列指针
3. CPU现场信息
寄存器值
指向该进程页表的指针
进程的三种基本状态
就绪态 , 运行态 , 等待态
1. 运行态
占有CPU,并在CPU上运行
2. 就绪态
已经具备运行条件,但由于没有空闲CPU,暂时不能执行
3. 等待态
因等待某一件事,而暂时不能运行
就绪 —> 运行
调度程序选择一个新的进程运行
运行 —> 就绪
运行进程用完了时间片
一个高优先级进程进入就绪状态,抢占正在运行的进程
运行 —> 等待
当一个进程等待某个事件发生时
进程的其他状态:
1. 创建态
已完成创建一进程的必要的工作
但尚未同意执行该进程
2. 终止态
终止执行后,进程进入该状态
可完成一些数据统计工作
资源回收
3. 挂起态
用于调节负载
进程不占内存空间,其进程映像交换到磁盘上
七状态示意图:
进程队列:
操作系统为每一类进程建立一个或多个队列
队列元素为PCB
伴随进程状态的改变,其PCB从一个队列进入另一个队列
1. 进程的创建
给进程分配一个唯一标示以及进程控制块
为进程分配地址空间
初始化进程控制块(设置默认值)
设置相应的队列指针
2. 进程的撤销
收回进程所占用的资源(关闭打开的文件,断开网络连接,回收分配的内存)
撤销该进程的PCB
3. 进程阻塞
处于运行状态的进程,在其运行过程中期待某一件事件发生,如:等待键盘输入,等待磁盘数据传输完成,等待其它进程发送消息,当被等待的时间未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态
进程和程序的区别
进程更能准确刻画开发,而程序不能
程序是静态的,进程是动态的
进程有生命周期,有诞生有消亡,是短暂的。而程序是相对长久的
一个程序可对应多个进程
进程具有创建其他进程的功能
进程映像
对进程执行活动全过程的静态描述
由进程地址空间内存,硬件寄存器内容与该进程相关的内核数据结构,内核栈组成
上下文切换
将CPU硬件状态从一个进程换到另一个进程的过程称为上下文切换
进程运行时,其硬件状态保存在CPU上的寄存器中
进程不运行时,这些寄存器的值保存在进程控制块PCB中,当操作系统要运行一个新的进程时,将PCB中的相关值送到对应寄存器中
线程
为什么在进程中再派生线程?
2. 开销的考虑
创建一个新线程花费时间少(撤销亦如此)
两个线程切换花费时间少
线程之间相互通信无须调用内核
3. 性能的考虑
多个线程,有的计算,有的i/o
线程的基本概念
进程的两个基本属性:
资源的拥有者 CPU调度单位
而线程继承了CPU调度单位这一属性
线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程
在同一进程增加了多个执行序列(线程)
线程和进程的区别:
CPU+RAM+各种资源(比如显卡,光驱,键盘,GPS, 等等外设)构成我们的电脑,但是电脑的运行,实际就是CPU和相关寄存器以及RAM之间的事情。一个最最基础的事实:CPU太快,太快,太快了,寄存器仅仅能够追的上他的脚步,RAM和别的挂在各总线上的设备完全是望其项背。那当多个任务要执行的时候怎么办呢?轮流着来?或者谁优先级高谁来?不管怎么样的策略,一句话就是在CPU看来就是轮流着来。一个必须知道的事实:执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。串联起来的事实:前面讲过在CPU看来所有的任务都是一个一个的轮流执行的,具体的轮流方法就是:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。。。。========= 重要的东西出现了========进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文线程是什么呢?进程的颗粒度太大,每次都要有上下的调入,保存,调出。如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。那么这里具体的执行就可能变成:程序A得到CPU =》CPU加载上下文,开始执行程序A的a小段,然后执行A的b小段,然后再执行A的c小段,最后CPU保存A的上下文。这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段。到此全文结束,再一个总结:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同
线程的属性
有标识符ID
有状态及状态转换
不运行时需要保存上下文环境
有自己的栈和栈指针
共享所在进程的地址空间和其他资源
可以创建,撤销另一个线程
程序开始是以一个单线程进程方式运行的
线程的实现:
1. 用户级线程
在用户空间建立线程库:提供一组管理线程的过程
内核管理的还是进程,不知道线程的存在
线程切换不需要内核态特权
优点:
线程切换快
调度算法是应用程序特定的
用户线程可运行在任何操作系统上
缺点:
内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上
大多是系统调用时阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞
2. 核心级线程
内核管理所有线程管理并向应用程序提供API接口
内核维护进程和线程的上下文
进程的切换需要内核的支持
以线程为基础进行调用
如:Windows
3. 混合-两者结合方式
线程创建在用户空间完成
线程调度等在核心态完成
进程的特点:
并发性:任何进程都可以和其他进程一起向前推进
动态性:进程是正在执行程序的实例 , 进程是动态产生,动态消亡 ,进程在其生命周期内,在三种基本状态之间转换
独立性:进程是资源分配的一个独立单位
交互性:进程在执行过程中可能与其他进程产生直接或间接的关系
异步性:每个进程都以其相对独立,不可预知的速度向前推进
进程映像:程序+数据+栈+PCB