8月9号学习操作系统感悟

崩溃问题

线程崩溃了,进程会怎么样

一般来说,如果线程是因为非法访问内存引起的崩溃,那么进程肯定会随之而崩溃,因为在进程中各个线程的地址空间是共享的,因此某个线程的非法访问会导致内存的不确定性,进而影响到其他线程,这种操作十分危险,操作系统就让进程整个崩溃。

操作系统如何让进程崩溃?

答案是发送kill指令。它的执行过程如下:

  1. CPU执行正常的进程指令
  2. 调用kill系统向系统进程发送信号
  3. 进程收到操作系统发的信号,CPU暂停当前进程的运行,将控制权交给操作系统
  4. 调用kill的系统向进程发送SIGSEGV信号
  5. 操作系统根据情况执行相应的信号处理函数,一般执行完信号处理程序逻辑后会让进程退出
  6. 小插曲,JVM不会崩溃是因为它拦截了SIGSEGV信号,它有自己的信号处理函数。

三大调度算法

进程调度算法

调度算法分为抢占式和非抢占式算法:

  1. 抢占式为可以打断正在运行的进程,将CPU资源让给其他线程。
  2. 非抢占式为只要一个进程正在运行,那么就只能等待它完成或者自我阻塞。
先来先服务算法(非抢占式)

人如其名,每个进程都进入队列,进程按出队顺序使用CPU,每个进程使用完或者自我阻塞才会交给下一个进程。这样做看似很公平,假使有一个需要立即响应的短作业,那么它也必须等待前面的长作业完成才能使用CPU,这样做影响使用体验。

最短作业优先调度算法(非抢占式)

与FIFO不同的是,所有进程进的是一个优先队列而非普通队列,运行时间越短的进程越靠前,越容易拿到CPU资源。这样设计能提高系统的吞吐量,但是会造成长作业饥饿现象。

高响应比优先调度算法

线程优先级 = (等待时间 + 要求服务的时间) / 要求服务的时间 。综合考虑了上面两种算法的优缺点,但是本身基本不可能实现,因为只有进程结束才能确定“要求服务的时间”,因此这种算法只能算一种梦想算法。

时间片轮转调度算法

每个进程被分配一个时间片,只有持有时间片的进程才能使用CPU资源。
如果一个进程时间片用完仍未结束,那么该进程将从CPU中释放出来,并将CPU交给另一个进程使用;如果改进程在时间片使用完之前结束或阻塞,则CPU立即切换。
时间片一般设为20 - 50 ms,合理的时间片设置有利于减少上下文频繁切换的开销和短作业的响应时间。

内存页面置换算法

什么是缺页中断?

定义:当CPU访问的页面不在物理内存中,便会产生一个缺页中断,请求操作系统将所缺页调入(换到)到物理内存中。
缺页中断的一般执行流程:

  1. 在CPU里访问一条Load M指令,然后CPU会去找M所对应的页表项。
  2. 如果该页表项的状态位是有效的,那么CPU就可以直接访问物理内存了,如果状态位是无效的,那么CPU就会发送缺页中断。
  3. 操作系统收到缺页中断,执行缺页中断函数,先会查找该界面在磁盘中的页面的位置。
  4. 找到磁盘中对应的页面后,需要把该页面换入到物理内存中,但是在换入之前,需要在物理内存中找空闲页,如果找到空闲页,就把页面换到物理内存中。
  5. 页面从磁盘换入到物理内存中后,把页表项中的状态位修改为有效的。
  6. 最后,CPU重新执行导致缺页异常的指令。

因此,当第四步执行查找空闲页时,如果没找到空闲页或空闲页不足时就需要执行页面置换算法,选择一个物理页,如果该页是被修改过的,则将它换出到磁盘,然后把该置换出去的页表项的状态改为无效的,最后把该页面装入到这个物理页中。

因为博主感觉这些个算法有点难懂,所以只打算记录一下面试常考的LRU算法,希望不要被问到怎么实现什么的吧23333

最近最久未使用(LRU)置换算法

思想:当发送缺页时,选择最长时间没有被访问的页面进行置换,也就是说,该算法是假定已经很久没有使用过的页面很有可能在未来较长时间仍然不会被使用。
虽然LRU在理论上来说是可以实现的,但是代价很高。如果要实现LRU,需要在内存中维护一个所有页面的链表,最近最多使用的页面在表头,最近最少使用的在表尾。
但是,每次访问内存时都需要更新整个链表,在链表中找到一个页面,将其放在表头。
所以,LRU 虽然看上去不错,但是由于开销比较大,实际应用中比较少使用(WTF?)。

posted @ 2022-08-09 18:30  Niwde  阅读(39)  评论(0)    收藏  举报