1.操作系统概述
1.1 系统调用、用户态和核心态
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
- 用户态(user mode) : 用户态运行的进程可以直接读取用户程序的数据。
- 系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
这些系统调用按功能大致可分为如下几类:
- 设备管理。完成设备的请求或释放,以及设备启动等功能。
- 文件管理。完成文件的读、写、创建及删除等功能。
- 进程控制。完成进程的创建、撤销、阻塞及唤醒等功能。
- 进程通信。完成进程之间的消息传递或信号传递等功能。
- 内存管理。完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。
1.3 那么如何从用户态切换到内核态呢? (仅需知道是这哪三种就可以了,其实一般只会问到举几个系统调用)
系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
2.进程管理
2.1 线程、进程、协程的区别
线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
协程是一种用户态的轻量级线程,协程的调度完全由用户控制。一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。与其让操作系统调度,不如我自己来,这就是协程
总结:协程最主要的作用是在单线程的条件下实现并发的效果,但实际上还是串行的(像yield一样)一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。
2.2 PCB是什么?(我字节同一个岗的连着两面被问到PCB)
为了使参与并发执行的每个程序,包含数据都能独立地运行,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(PCB,Process Control Block)。进程与PCB是一一对应的,用户进程不能修改。
2.3 进程和线程创建和撤销的过程中发生了什么事情? (问的不多,我被问到过一次)
进程的创建
- 分配空间:操作系统为进程分配一块内存空间,用于存储代码、数据和执行状态。
- 加载程序:将进程的程序代码和数据从磁盘加载到内存中,使得进程可以开始执行。
- 初始化进程控制块(PCB):操作系统为进程创建一个进程控制块(PCB),用于记录进程的各种状态和信息,例如进程ID、进程优先级、进程状态等等。
- 设置进程优先级:操作系统根据进程的类型和要求设置进程的优先级,以便决定进程在系统中的执行顺序。
- 将进程添加到就绪队列:操作系统将进程添加到就绪队列中,以便在系统调度器的调度下,进程可以被分配CPU资源开始执行。
进程的撤销
- 终止进程:当进程完成执行,或者由于某些原因需要被强制终止时,操作系统将终止进程的执行。
- 释放资源:操作系统释放进程所占用的资源,包括内存、打开的文件、网络连接等等。
- 更新进程状态:操作系统更新进程的状态,例如将进程的状态从“运行中”变为“已终止”。
- 回收进程控制块:操作系统回收进程控制块(PCB),释放进程占用的内存。
线程的创建
- 初始化线程控制块(TCB):操作系统为线程创建一个线程控制块(TCB),用于记录线程的状态和信息,例如线程ID、线程优先级、线程状态等等。
- 分配栈空间:每个线程都需要一个独立的栈空间,用于存储线程执行的上下文信息。
- 设置线程优先级:操作系统根据线程的类型和要求设置线程的优先级,以便决定线程在系统中的执行顺序。
- 将线程添加到就绪队列:操作系统将线程添加到就绪队列中,以便在系统调度器的调度下,线程可以被分配CPU资源开始执行。
线程的撤销
- 中止线程执行:操作系统通过向线程发送一个中止信号来中止线程的执行,线程在接收到中止信号后会停止执行。
- 释放资源:线程所占用的资源包括栈空间、寄存器内容等等,需要被释放,以便其他线程可以使用。
- 更新线程状态:操作系统会将线程的状态从“运行中”或“就绪”状态修改为“终止”状态。
- 回收线程控制块:操作系统会回收线程控制块(TCB),释放线程占用的内存空间。
- 处理线程的退出代码:线程在退出时可以返回一个退出代码,操作系统会将这个退出代码传递给父线程或主线程,以便进行进一步的处理。
2.4 进程的五种状态
进程全部可分为五种状态分别是:创建状态、就绪状态、运行状态、阻塞状态、终止状态。 在运行期间主要是三种状态:就绪、运行、阻塞状态。文章来源:https://www.toymoban.com/news/detail-406148.html
2.5 进程调度算法(高频考点)
- 先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 短作业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
- 时间片轮转调度算法:时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称 RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
- 多级反馈队列调度算法:前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。
- 优先级调度 :为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
https://www.cnblogs.com/xiaolincoding/p/13631224.html文章来源地址https://www.toymoban.com/news/detail-406148.html
2.6 进程同步的方式
- 互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
- 信号量(Semaphore) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
- 事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
2.7 进程间通信的方式(重要!)
- 管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
- 有名管道(Named Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
- 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 信号量(Sema
到了这里,关于操作系统八股文的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!