处理器处于核心态时,程序可以执行特权指令和非特权指令,使用所有资源
处理器处于用户态时,只能执行非特权指令,比如“清空内存”这种特权指令不能在用户态执行
某标志位可以识别处理器处于什么状态,主要作用是实现程序状态的保护和恢复
用户进程空间中开辟出的内存区域
每个进程被创建时捆绑一个,是内存中属于os空间的区域
中断是实现“用户态”->“核心态”的唯一途径
而“核心态”->“用户态”是通过执行一个特权指令,将PSW的标志位置为用户态
cpu与外部设备的并行工作的硬件基础是中断和通道
分为:
指令中断,系统调用时的访管指令
硬件中断,如缺页
软件中断,整数除0
引入多道程序技术之后,内存中同时放入多道程序,各个程序的代码、运算数据存放的位置不同。os要怎么才能找到各程序的存放位置?
系统为每个运行的程序配置了一个数据结构,成为进程控制块(PCB),用来描述进程的各种信息
PCB是进程存在的唯一标志
也叫进程映像
一般情况下,把进程实体就简称为进程
就绪态:已具备运行条件,但由于没有空闲cpu,而,暂时不能运行
阻塞态:又叫等待态,因等待某一事件而暂时不能运行,如等待os分配打印机、等待读磁盘操作的结果。
还有两种状态:
新建态:进程正在被创建,os为进程分配资源、初始化PCB
“终止态”:进程正在从系统中撤销,os会回收进程拥有资源、撤销PCB
再新增两种状态:“挂起就绪态”“挂起阻塞态”
什么是挂起?为什么要有“挂起”状态?
为了让某些进程暂时不参与低级调度,释放它占有的资源,以减小1系统负荷为目的而引入挂起态
运行态->阻塞态是进程自身做出的主动行为
阻塞态->就绪态不是进程自身控制的,是一种被动行为
所以,不能由阻塞态->运行态,也不能由就绪态->阻塞态,因为进入阻塞态是进程主动请求的,必然需要进程在运行时才能发出这种请求
用原语实现进程控制
原语的特点是执行期间不允许中断,只能一气呵成。这种不可被中断的操作叫原子操作
原语采用“关中断指令”和“开中断指令”
关/开中断指令的权限非常大,必然只允许在核心态下执行特权指令
线程是处理机调度的基本单位
用户级线程由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责,用户级线程中,线程切换可以在用户态下即可完成,无需os干预
在用户看来,是有多个线程,但是在os内核看来,并没有意识到线程的存在
内核级线程的管理工作由os内核完成,线程调度、切换等工作等都由内核负责,因此内核级线程的切换需要在核心态下才能完成
按一定的规则从外存上处于后备队列的作业中挑选一个(或多个)作业,给他们分配内存等必要资源,并建立相应进程(建立PCB),使他们获得竞争处理机的权利
对进程状态的影响:无->创建态->就绪态
每个作业只会被调入一次,调出一次
引入虚拟存储技术之后,可将暂时不能运行的进程调至外存等待,等它重新具备了运行条件且内存有空闲时,再重新调入内存。
这么做是为了提高内存利用率和系统吞吐量
暂时调到外存等待的进程状态为挂起状态,注意:PCB并不会一起调到外存,而是会常驻内存。PCB会记录进程数据在外存中的存放位置,进程状态等信息,os通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到挂起队列中
中级调度,就是要决定将哪个处于挂起状态的进程重新调入内存,一个进程很可能会被多次调入调出内存,因此中级调度发生的频率要高于高级调度
对进程状态的影响:挂起态->就绪态
其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它
进程调度是os中最基本的一种调度,在一般的os中都必须配置进程调度
频率很高,一般几时毫秒一次
对进程状态的影响:就绪态->执行态
它包括4个部分:
主要从“公平”的角度考虑
按作业/进程到达的先后顺序服务
用于作业调度时,考虑的是哪个作业先到达后备队列
用于进程调度时,考虑的是哪个进程先到达就绪队列
非抢占式
优点:公平、算法实现简单
饥饿:某进程/作业长期得不到服务
不会饥饿
可用于作业调度,也可用于进程调度(SPF)
缺点:对短作业有利,对长作业利,可能会导致饥饿
在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务
可用于作业/进程调度
当前运行的作业/进程主动放弃处理机时,才需要调度,才需要计算响应比
不会
优点:公平、响应快,适用于分时操作系统
缺点:由于高频率的进程切换,因此有一定开销;不区分任务的紧急程度
随着计算机的发展,特别是实时操作系统的出现,越来越多的应用场景需要根据任务紧急程度来决定处理顺序