我之前也已经在牛客写了好几篇互联网相关的求职经验、高频知识点汇总的文章了,简要介绍一下,有需要的同学可以点进去先收藏,之后用到时可以看一看。如果有帮助的话,希望大家给个赞,给个收藏!有疑问的也可以在评论区留言讨论,能帮的上大家的都会尽力回复的!
总章,按时间段记录了我整个互联网求职的过程我是如何从零基础拿到第一份实习的(各个时间段的实操经验分享) 刷题经验,里面包含按类划分的高频题号,并且每类题下都有我汇总收藏的优质博客:高频知识总结 | 算法题如何刷?我的高效刷题方法 面经总结,包含我的实习和秋招的面试真题:高频知识总结 | 我的实习和秋招互联网高频面试题分享 我的银行科技岗求职经历分享,从前期准备到笔面考试内容都有:我和牛客的故事—银行科技岗经验分享(干货满满+经验帖汇总) 前言
这篇【操作系统】是我在学习时自己整理的,大部分都是按我个人的理解来写的答案。
当时我在学习八股文时有一个痛点,就是在复习时也是搜罗了很多很多的总结资料,但有些资料不能说他不好,但放的知识太多,太全面了,比如文件管理一般面试中碰到的概率很小很小,所以跟这部分内容相关的我就只了解了磁盘读写的速度、缓存读写速度、内存读写速度等的各种差异和对比,别的就没再多了解了。
所以这篇文章已经经过我的筛选,把最重要、最常问的知识点给整了出来,你至少需要先把这些全都掌握再去看别的进阶、更全面的知识!
并且我还在必要的知识点下还留了各种补充链接,可以直接点进去看!非常适合一个知识点接着一个知识点的来攻克!所以刷到这里,先点点关注和收藏,之后我看时间还会把我总结的计算机网、数据库的知识都排一下版发出来。
废话不多说,直接开始铺干货。
1. 操作系统概述 1.1 系统调用 / 用户态和内核态
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
1.2 说了用户态和系统态之后,那么什么是系统调用呢?
这些系统调用按功能大致可分为如下几类:
1.3 那么如何从用户态切换到内核态呢?(仅需知道是这哪三种就可以了,其实一般只会问到举几个系统调用的例子)
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。
1.4 其他必会知识 2. 进程管理 2.1 线程、进程、协程的区别
答:
进程和线程的区别的话
2.2 PCB是什么?(我字节同一个岗的连着两面被问到PCB) PCB 的作用 2.3 进程和线程创建和撤销的过程中发生了什么事情?(问的不多,我被问到过一次)
进程允许创建和控制另一个进程,前者称为父进程,后者称为子进程,子进程又可以创建孙进程,如此下去进而形成一个进程的家族树,这样子进程就可以从父进程那里继承所有的资源,当子进程撤销时,便将从父进程处获得的所有资源归还,此外,撤销父进程,则必须撤销所有的子进程。(撤销的过程实际上就是对这棵家族树进行后序遍历的过程)
在应用中创建一个子进程的过程如下:
当进程完成后,系统会回收占用的资源,撤销进程,而引发进程撤销的情况有:进程正常结束或者异常结束,外界的干预(比如我们在任务管理器中强制停止某个进程的运行)。
2.4 进程的五种状态
面试在答的时候这么答:有创建状态、就绪状态、运行状态、阻塞状态、结束状态。
2.5 进程调度算法(面试高频知识点)
这个看cyc大佬总结的,按批处理系统和交互式系统去记忆比较容易记住。点这里:cycBook
2.6 进程同步的方式
临界区
首先对临界资源的访问那段代码被称为临界区,为了互斥的访问临界区,每个进程在进入临界区时,都需要先进行检查,也就是查看锁。
同步与互斥
同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后顺序。
互斥:多个进程在同一时刻只有一个进程能进入临界区。
信号量
信号量是一个整型变量,可以对其执行 P 和 V 操作。
P:如果信号量大于零,就对其进行减 1 操作;如果信号量等于 0,进程进入 waiting 状态,等待信号量大于零。
V:对信号量执行加 1 操作,并唤醒正在 waiting 的进程
如果信号量只能取 0 或者 1,那么就变成了互斥量,其实也可以理解成加锁解锁操作,0 表示已经加锁,1 表示解锁。
管程
使用信号量机制实现的生产者消费者问题需要客户端代码做很多控制,而管程把控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。
管程引入了 条件变量 以及相关的操作:wait() 和 signal() 来实现同步操作。对 条件变量 执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。
2.7 进程间通信的方式(重要!)
建议把BiliBili王道考研的这一节课给看了
进程通信和进程同步很容易混淆,其实可以把进程通信当成一种手段,进程同步是一种目的,为了实现进程同步,可传输一些进程同步所需要的信息。
消息队列
共享内存
信号量
2.8 生产者消费者模型(要会写伪代码)
生产者和消费者模型,期间就需要线程之间进行通信来实现互斥和同步。
需求是这样的:
做法:
伪代码如下
mutex = 1; empty = N; full = 0; void Producer() { P(empty); // 生产者生产一个产品,消耗一个缓冲区 P(mutex); .... // 临界区 V(mutex); V(full); // 产品数量加1 } void Consumer() { P(full); // 消费者消耗一个产品,释放一个缓冲区 P(mutex); // 临界区上锁 .... V(mutex); // 临界区锁释放 V(empty); // 增加一个缓冲区 } void P(S){ S--; if(S < 0) block(); // 如果小于0,代表资源没了 } void V(S){ S++; if(S <= 0) wakeUp(); // 如果小于等于0,代表有进程仍然在等待,通知他们ok了 }
2. 死锁 2.1 讲讲死锁发生的条件是什么? 互斥条件:是资源分配是互斥的,资源要么处于被分配给一个进程的状态,要么就是可用状态。 等待和占有条件:进程在请求资源得不到满足的时候,进入阻塞等待状态,且不释放已占有的资源。 不剥夺条件:已经分配给一个进程的资源不能强制性地被抢占,只能等待占有他的进程释放。 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程释放所占有的资源。 2.2 如何避免死锁的发生? 银行家算法:银行加算法的详细博客点击这里
2.3 如果发生死锁了怎么办? 资源剥夺法: 鸵鸟算法,直接不管! 2.4 你能举出一个死锁的例子吗?
要举就直接举刚才的生产者消费者模型,可以知识复用。
对临界区的上锁如果放在了检测缓冲区是否已经满之前,就有可能发生死锁。比如生产者此时要产生一个产品,如果先对临界区上锁,然后检测缓冲区已满,这时就进入等待消费者消耗产品的状态,而消费者想消费产品时,必须先检测临界区是否上锁,此时临界区已经被生产者占有,这样就形成了死锁。
3. 内存管理(重中之重) 3.1 内存管理到底是干什么的? 3.2 内存管理分页的基础知识(有很多概念非常容易混淆,所以统一放在这了,面试并不会问)
3.3 讲讲内存管理的几种机制
分块管理
是连续管理的一种,把内存分为几个大小相等且固定的块,每个进程占用其中一个,如果进程很小的话,会浪费大量的空间。已经淘汰。
分页管理
把内存分为若干个很小的页面,相对比分块的划分力度更大一些。提高内存利用率。减少碎片,页式管理通过页表对应逻辑地址和物理地址。
分段管理
把内存分为几个大小不定的有实际意义的段,比如 main 函数段,局部变量段,通过管理段表来把逻辑地址转为物理地址。
段页式管理
结合了段式管理和页面管理的优点,把主存先分为若干个段,每个段又分为若干个页,也就是说段页式管理的段与段以及段的内部都是离散的。
3.4 分页和分段有什么区别呢? 不同点: 3.5 讲讲分页管理的快表和多级页表(按照why how的方式来回答,即为什么出现快表,是如何解决痛点的) 3.5.1. 快表 3.5.2 多级页表 3.6 讲讲虚拟地址和物理地址?为什么要有虚拟地址空间?
我们在写程序的时候打交道的都是虚拟地址,比如 C 语言的指针,这个虚拟地址由操作系统决定,而物理地址指的是真实内存地址寄存器的地址。现代处理器通常使用虚拟寻址,用 MMU 把虚拟地址翻译成物理地址才能访问到真正的物理地址。
那么为什么要有虚拟地址呢?
通过虚拟地址就会得到如下优势(记不住也无所谓这一段)
3.7 讲讲虚拟内存?
按照 why and how 来回答!
其实虚拟内存的基础是局部性原理,也正是因为有局部性原理,程序运行时才可以做到只装入部分到内存就可以运行。
3.8 虚拟内存的三种实现技术
请求分页式存储管理
建立在分页管理的基础之上,为了支持虚拟内存实现了请求调页和页面置换功能。其具体流程是这样的:
首先作业运行时,仅装入当前要执行的部分页面即可。
假如在运行的过程中,发现要请求的页面不在内存中,那么处理器通知操作系统按照对应的页面置换算法把相应的页面调入到内存中。
如果发现在把页面调入内存时,内存已满,同时也可以把不用的页面置换出去,以便腾出空间装入新的页面。
请求分段式存储管理
和分页是一样的,把页换成段即可。
请求段页式存储管理
总结
需要一定量的内存和外存,在刚开始运行的时候,只把部分要执行的页面加载到内存,就可以运行了。
缺页中断,如果指令或数据不在内存,则处理器通知操作系统把页面段调入到内存。
虚拟地址空间,都需要把虚拟地址转换为物理地址。
这和内存管理的机制有什么不同呢?
请求分页式存储管理建立在分页管理之上,他们的根本区别是用不用把程序所需的全部地址空间 load 到内存里。请求分页式不需要全部 load 到内存中,而分页式管理需要,前者能够提供虚拟内存,后者不可以! 3.9 讲讲页面置换算法
答:当使用请求分页存储来管理内存时,发生缺页中断,就是要访问的页面不在内存中,这时就需要操作系统把其调入主存后再进行访问。
而在发生缺页中断时,内存中没有空闲的页面,就必须在内存中根据一定的策略挪出一些不用的页面,可以把页面置换算法看成是淘汰机制。
我之前也已经在牛客写了好几篇互联网相关的求职经验、高频知识点汇总的文章了,简要介绍一下,有需要的同学可以点进去先收藏,之后用到时可以看一看。如果有帮助的话,希望大家给个赞,给个收藏!有疑问的也可以在评论区留言讨论,能帮的上大家的都会尽力回复的!
总章,按时间段记录了我整个互联网求职的过程我是如何从零基础拿到第一份实习的(各个时间段的实操经验分享) 刷题经验,里面包含按类划分的高频题号,并且每类题下都有我汇总收藏的优质博客:高频知识总结 | 算法题如何刷?我的高效刷题方法 面经总结,包含我的实习和秋招的面试真题:高频知识总结 | 我的实习和秋招互联网高频面试题分享 我的银行科技岗求职经历分享,从前期准备到笔面考试内容都有:我和牛客的故事—银行科技岗经验分享(干货满满+经验帖汇总)