如何搞定操作系统面试?看这份完整版总结
首先先说明这篇操作系统篇是整合了网络优秀博主博客和自己看视频的重点总结出来的,望惠存。(不断更新中)
一、概述
1⃣️基本特征
1. 并发
关于区分并发和并行看我上篇博文,比较通俗易懂。
并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
并行需要硬件支持,如多流水线、多核处理器或者分布式计算系统。(多线程技术主要是利用时间片划分让cpu分时处理多个线程,也就是能同时处理多个任务,而流水线技术是通过流水化任务处理提
高cpu的利用率。)
操作系统通过引入进程和线程,使得程序能够并发运行。
2. 共享
共享是指系统中的资源可以被多个并发进程共同使用。
有两种共享方式:互斥共享和同时共享。
(1)互斥共享
计算机中的某个资源在一段时间内只能允许一个进程访问,别的进程没有使用权
互斥共享的资源称为临界资源(独占资源):在一段时间内只允许一个进程访问的资源,计算机中大多数物理设备及某些软件中的栈、变量和表格都属于临界资源,它们被要求互斥共享
举个例子:比如QQ和微信视频。同一段时间内摄像头只能分配给其中一个进程
(2)同时共享
计算机中的某个资源在在一段时间内可以同时允许多个进程访问
同时共享通常要求一个请求分为几个时间片段间隔的完成,即交替进行,“分时共享”
这里的同时指在宏观上是同时的,在微观上是交替进行访问的,只是cpu处理速度很快,我们感觉不到,在宏观上感觉是在同时进行
举个例子:比如QQ在发送文件A,微信在发送文件B,宏观上两个进程A和B都在访问磁盘,在我们看来是同时进行的,但是在微观上两个进程A和B是交替进行访问磁盘的,只是时间太短,cpu处理速
度太快,我们感觉不到。
3. 虚拟
虚拟技术把一个物理实体转换为多个逻辑实体。
主要有两种虚拟技术:时分复用技术和空分复用技术。
多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一小个时间片并快速切换。
虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理
内存的页时,执行页面置换算法,将该页置换到内存中。
4. 异步
异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。
多道程序设计:是指在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制之下,相互穿插的运行。 两个或两个以上程序在计算机系统中同处于开始到结束之间的状态称为多道
程序设计。多道程序技术运行的特征:多道、宏观上并行、微观上串行。
虚拟处理器(CPU):通过多道程序设计技术,采用让多道程序并发执行的方法,分时来使用一个CPU,实际物理上只有一个CPU,但是用户感觉到有多个CPU
操作系统的虚拟技术科归纳为:
- 时分复用技术:如处理器的分时共享
- 空间复用技术:如虚拟存储器,将物理空间虚拟为页,如果页不在虚拟内存内也可以加载进来
--------------------------------------------------------------------------------------------------------------
2⃣️操作系统组件
CPU调度器、物理内存管理、虚拟内存管理、文件系统管理、终端处理与设备驱动
--------------------------------------------------------------------------------------------------------------
3⃣️大内核和微内核
1. 大内核
大内核是将操作系统功能作为一个紧密结合的整体放到内核。
由于各模块共享信息,因此有很高的性能,主要通过函数调用实现各模块功能。
2. 微内核
由于操作系统不断复杂,因此将一部分操作系统功能移出内核,从而降低内核的复杂性。移出的部分根据分层的原则划分成若干服务,相互独立。松耦合方式实现操作系统扩展,采用类似消息传递机
制的模式。
在微内核结构下,操作系统被划分成小的、定义良好的模块,只有微内核(一些重要的模块进程调用等)这一个模块运行在内核态,其余模块运行在用户态。尽可能把内核功能移到用户空间。
因为需要频繁地在用户态和核心态之间进行切换,所以会有一定的性能损失。目前还很少使用微内核模式,主要还是比较受限于性能。
3. VMM
类似于external core(存于学术界,比较快,因为是基于OS的),但目标不同,主要是为了将VMM使用于分布式计算机,或者云计算等数据中心,这样让大家都能在不同操作系统下使用计算资源。
--------------------------------------------------------------------------------------------------------------
4⃣️操作系统的启动
1. 大内核
内存中BIOS只是占一小部分,BIOS基础IO处理系统会根据段寄存器以及IP指令寄存器确定起始执行地址,然后完成加电自检(POST,检查设备问题),这些都是由BIOS将bootloader(原来在硬盘上,硬盘的第一个扇区512B,以后所有B都表示字节)放到内存上,bootloader功能将OS放到内存中去,也就是说bootloader很小,只是一个类似驱动的作用,将OS调到内存中,也就是BIOS调bootloader,bootloader调OS。
面向外设:中断和IO
面向应用程序:系统调用(应用程序向OS发送指令寻求支持)、异常(应用程序遇到意想不到的问题不得不由操作系统完成),
以下是三者的区别,中断和异常都是OS不得不去处理,系统调用则是一种主动的。
--------------------------------------------------------------------------------------------------------------
5⃣️计算机体系结构+地址空间+连续内存分配
MMU主要作用是通过逻辑地址或者短号等指引到物理地址。
逻辑地址主要通过编译器将符号转换成逻辑地址,操作系统实现逻辑地址到物理地址的映射。上面不是说是MMU控制么?看下图可知,段表等由OS管理
需要将程序加载到内存,这时需要连续的逻辑地址供分配,但是由于连续内存分配导致的随便问题,非连续内存分配应运而生。
分页和分段的区别:段的长度是可变的,页的大小不可变,不会随着数据大小而发生变化。
--------------------------------------------------------------------------------------------------------------
6⃣️经常容易混淆的单位总结
字节也叫Byte,是计算机数据的基本存储单位。在电脑里一个中文字是占两个字节的。
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
--------------------------------------------------------------------------------------------------------------
7⃣️分段与分页先导
虚拟内存采用的是分页技术,也就是将地址空间划分成固定大小的页,每一页再与内存进行映射。
下图为一个编译器在编译过程中建立的多个表,有 4 个表是动态增长的,如果使用分页系统的一维地址空间,动态增长的特点会导致覆盖问题的出现。分段的做法是把每个表分成段,一个段构成一个
独立的地址空间。每个段的长度可以不同,并且可以动态增长。
段页式
程序的地址空间划分成多个拥有独立地址空间的段,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能。
分页与分段的比较
-
对程序员的透明性:分页透明,但是分段需要程序员显示划分每个段。
-
地址空间的维度:分页是一维地址空间,分段是二维的。
-
大小是否可以改变:页的大小不可变,段的大小可以动态改变。
-
出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间(合理利用碎片空间);分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
--------------------------------------------------------------------------------------------------------------
8⃣️页寻址逻辑到物理地址
这里的S表示每一个页帧的大小,就是图中的大格子(注意是大格子,蓝色的线),乘以帧号可以知道大概在图中f的上端点,O表示偏移量,也就是不够一帧的那部分大小,从而完成寻址。
也就是通过p页号来确定物理地址对应的帧号f,再通过O(offset)确定物理地址的具体位置。
如果TLB里面有找不到的Key,则需要去内存的页表中寻找并加入到TLB中,而这个过程由硬件实现还是操作系统软件实现主要看操作系统,不同操作系统不同。
--------------------------------------------------------------------------------------------------------------
9⃣️页面置换算法
clock可以有效逼近LRU用硬件记录访问历史,FIFO没有考虑访问历史
🔟进程与线程
线程的特点:并发、共享(进程之间是独立的)
线程共享资源,切换时间短是因为进程需要切换页表但是线程并不需要,线程不需要处理文件等资源信息,直接访问内存就可以拿到所以会很快,说到内核就是和操作系统有关。
IPC 进程间通信