OS笔记
os
cpu执行两种性质的程序
- 内核态程序(管态)
- 用户态程序
内核态执行的特权指令包含:
- I/O指令
- 中断指令
- 存取内存中寄存器指令
- 程序状态字寄存器变更指令
和硬件关联的指令(最底层)包含:
- 时钟管理
- 中断处理
- 设备驱动
运行比较频繁的指令(最底层的上层)包含:
- 进程管理
- 内存管理
- 设备管理
以上两层次的指令组成了操作系统的内核,并且这部分指令是运行在内核态。
一般来讲的内核包含四部分:
-
时钟管理
时钟管理的第一功能是计时,操作系统通过时钟管理,向用户提供标准的系统时间;进程切换,分时系统都是基于改功能实现的.
-
中断机制
引入系统中断是为了提高cpu的利用率,在逐渐发展的过程中形成了多种类型,现在已经形成了多种类型,成为操作系统各项操作的基础.例如,键盘鼠标的信息输入,进程管理和调度,系统功能的调用,设备驱动,文件管理,都依赖于该指令.对于现代的操作系统,都是靠中断来实现功能的.
在中断机制中,只有一小部分是属于内核操作.负责保护和恢复中断现场的信息,转移控制权到相关的处理程序.这样可以减少中断的处理时间.
-
原语
操作系统的原子操作的指令或者程序定义为原语.其中,设备驱动/cpu切换/进程通信等功能中的部分操作都可以定义为操作原语,是内核中的一部分.
-
系统控制的数据结构以及处理
系统控制的数据结构有很多,比如PCB,消息队列,缓冲区,空闲登记表,内存分配表,各类链表,设备控制块等.为了实现有效的管理,常见一下三种基本操作:
-
进程管理
进程状态管理,进程调度和分配,创建和撤销进程控制块
-
内存管理
内存的分派和回收,内存信息保护,代码对换程序等
-
设备管理
缓冲区管理,设备的分配和回收
-
系统中断和异常
要实现用户态和内核态之间的相互切换,正常情况下只能通过中断进行.还有一种可能是在程序异常的时候,会直接进入内核态.而且这些切换是物理硬件实现的.
如何实现两种状态的切换?
可以使用一个特殊的寄存器的一位来表示CPU所处的工作状态,0表示内核态,1表示用户态.
如何提高系统资源的利用率?
在程序不使用该资源的时候,能够及时的释放该资源,供其他程序使用.这个释放的动作实际上就是中断来实现的.
中断也成为是外中断,实际上是指来自CPU指令意外的事件的发生,如设备发生IO结束的中断信号.时钟中断,表示一个固定的时间到了.
中断的范围?
异常也称为内中断/例外/陷入,指CPU执行执行指令的内部的事件.例如,程序的非法操作码,地址越界,算术溢出,内存系统的缺页以及专门的陷入指令等引起的事件.
进程调度的基本准则
cpu利用率
处理机的利用率
系统吞吐量
单位时间内完成的作业数量
周转时间
从作业提交到作业完成所经历的时间,其中包含作业等待、在就绪列表中排队、在cpu上运行、进行输入输出操作等所花费时间的总和。
周转时间= 作业完成时间-作业提交时间
平均周转时间是多个作业周转时间的平均值:
N个作业时间和/N
等待时间
进程处于等待时间的和,等待时间越长,用户满意度越低。调度算法实际上不影响作业执行或者输入输出的操作时间,值影响作业在就绪队列中所等待的时间。因此,衡量一个调度算法的好坏,只需要考虑等待时间即可。
响应时间
用户从提交任务请求到系统首次产生响应所用的时间。既然是首次产生相应时间,所以在交互式系统中不能说明调度算法的好坏。在日常工作中,一般使用相应时间作为评判标准。
典型调度算法
算法 | 使用场景 | 理论 | 优点 | 缺点 |
---|---|---|---|---|
先来先服务 | 任务/进程 | 从后备作业队列中选择一个最早进来的,将他们调入内存中,分派必要的资源,创建进程并放入就绪队列中。 在进程调度中,每次中就绪队列中选中一个最先进入该队列的进程,将处理机分配他们 |
1.算法简单 2.对长作业有利 3.有利于cpu繁忙型作业 |
1.效率低 2.对短作业不利 3.对I/O方繁忙型作业不利 |
短作业优先 | 进程 | 在后备队列中的每一个进程都有一个预估运行时间,该调度算就是从队列中选着一个或多个时间最短的,将处理及发分配它,直到完成或者发生某事件而阻塞时,才释放cpu | 1.对长作业不利,可能发生饥饿显现 2.不能保证紧迫性任务会被及时处理 3.依赖预估时间,预估时间不一定准。 |
|
优先级调度算法 | 进程/任务 | 每个作业或任务都有一个优先级,按照优先级来选着 | 1.能够解决及时处理紧急任务 |
|
高响应比 | 作业 | 响应比=(等待时间+要求服务时间)/要求服务时间 | 1.预警执行时间越短,响应比就越大,越早就执行 2.克服了饥饿现象 |
|
时间轮片 | 执行时间长的任务将会被切换好多次 | |||
多级反馈队列 | 优先级高的,时间片少;进程从高优先级的队列中再次被切换的时候的,将移到次优先级队列的尾部;如果队列中正在执行的进程被插入了一个比自己优先级大的,将移动到队首。 |
本文来自博客园,作者:Eular,转载请注明原文链接:https://www.cnblogs.com/euler-blog/p/18608952
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通