操作系统八股文

这篇具有很好参考价值的文章主要介绍了操作系统八股文。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.操作系统概述

1.1 系统调用、用户态和核心态

根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:

  1. 用户态(user mode) : 用户态运行的进程可以直接读取用户程序的数据。
  2. 系统态(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 进程和线程创建和撤销的过程中发生了什么事情? (问的不多,我被问到过一次)

进程的创建

  1. 分配空间:操作系统为进程分配一块内存空间,用于存储代码、数据和执行状态。
  2. 加载程序:将进程的程序代码和数据从磁盘加载到内存中,使得进程可以开始执行。
  3. 初始化进程控制块(PCB):操作系统为进程创建一个进程控制块(PCB),用于记录进程的各种状态和信息,例如进程ID、进程优先级、进程状态等等。
  4. 设置进程优先级:操作系统根据进程的类型和要求设置进程的优先级,以便决定进程在系统中的执行顺序。
  5. 将进程添加到就绪队列:操作系统将进程添加到就绪队列中,以便在系统调度器的调度下,进程可以被分配CPU资源开始执行。

进程的撤销

  1. 终止进程:当进程完成执行,或者由于某些原因需要被强制终止时,操作系统将终止进程的执行。
  2. 释放资源:操作系统释放进程所占用的资源,包括内存、打开的文件、网络连接等等。
  3. 更新进程状态:操作系统更新进程的状态,例如将进程的状态从“运行中”变为“已终止”。
  4. 回收进程控制块:操作系统回收进程控制块(PCB),释放进程占用的内存。

线程的创建

  1. 初始化线程控制块(TCB):操作系统为线程创建一个线程控制块(TCB),用于记录线程的状态和信息,例如线程ID、线程优先级、线程状态等等。
  2. 分配栈空间:每个线程都需要一个独立的栈空间,用于存储线程执行的上下文信息。
  3. 设置线程优先级:操作系统根据线程的类型和要求设置线程的优先级,以便决定线程在系统中的执行顺序。
  4. 将线程添加到就绪队列:操作系统将线程添加到就绪队列中,以便在系统调度器的调度下,线程可以被分配CPU资源开始执行。

线程的撤销

  1. 中止线程执行:操作系统通过向线程发送一个中止信号来中止线程的执行,线程在接收到中止信号后会停止执行。
  2. 释放资源:线程所占用的资源包括栈空间、寄存器内容等等,需要被释放,以便其他线程可以使用。
  3. 更新线程状态:操作系统会将线程的状态从“运行中”或“就绪”状态修改为“终止”状态。
  4. 回收线程控制块:操作系统会回收线程控制块(TCB),释放线程占用的内存空间。
  5. 处理线程的退出代码:线程在退出时可以返回一个退出代码,操作系统会将这个退出代码传递给父线程或主线程,以便进行进一步的处理。
2.4 进程的五种状态

进程全部可分为五种状态分别是:创建状态、就绪状态、运行状态、阻塞状态、终止状态。 在运行期间主要是三种状态:就绪、运行、阻塞状态。

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++面试八股文:了解sizeof操作符吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面: 面试官:了解 sizeof 操作符吗? 二师兄:略微了解(不就是求大小的嘛。。) 面试官:请讲以下如何使用 sizeof ? 二师兄: sizeof 主要是求变量或者类型的大小。直接使用 sizeof(type) 或 sizeof(var) 即可。 面试官:嗯。 s

    2024年02月08日
    浏览(36)
  • 【面试八股文之Linux系统编程】

            ls:列出当前目录下的文件和目录。 ·       cd [目录]:切换到指定的目录。         pwd:现实当前工作目录的路径。         touch[文件名]:如果文件不存在,新建文件。         mkdir[目录名]:创建新的目录;         rm[文件名]:删除指定的文件或目录。   cp [源文

    2024年04月17日
    浏览(41)
  • 前端面试八股文汇总

    在HTML页面中的所有元素都可以看成是一个盒子 盒子的组成:内容content、内边距padding、边框border、外边距margin 盒模型的类型: 标准盒模型 margin + border + padding + content IE盒模型 margin + content(border + padding) 控制盒模型的模式:box-sizing:content-box(默认值,标准盒模型)、border-b

    2024年02月04日
    浏览(46)
  • ThreadLocal八股文

    目录 1. 为什么要⽤ ThreadLocal? 2. ThreadLocal 的原理是什么? 3. 为什么⽤ ThreadLocal 做 key? 4. Entry 的 key 为什么设计成弱引⽤? 5. ThreadLocal 真的会导致内存泄露? 6. 如何解决内存泄露问题? 7. ThreadLocal 是如何定位数据的? 8. ThreadLocal 是如何扩容的? 9. ⽗⼦线程如何共享数据?

    2024年02月05日
    浏览(48)
  • 八股文之springboot

    主要简化了使用spring的难度,简省看繁重的配置,提供了各种启动器,开发者能快速上手。 容易上手,提升开发效率 ,为 Spring 开发提供一个更快、更广泛的入门体验。 开箱即用,远离繁琐的配置。 提供了一系列 大型项目通用的非业务性功能 ,例如:内嵌服务器、安全管

    2024年02月01日
    浏览(36)
  • 【面试】前端面试八股文

    前端思维导图 优点 大可爱html+css+js+node 全面可下载 千峰html+css 简洁漂亮 千峰js 简洁漂亮 (1)标签引用 (2)文件引用 解释型语言:JS不需要被编译为机器码而是直接执行,开发轻松 动态型语言:JS变量与任何值类型都不关联,都可以重新分配类型值 弱类型语言:变量数据

    2024年02月02日
    浏览(53)
  • 深度学习八股文

    Bert旨在通过联合左侧和右侧的上下文,从未标记文本中预训练出一个深度双向表示模型。因此,BERT可以通过增加一个额外的输出层来进行微调,就可以达到为广泛的任务创建State-of-the-arts 模型的效果,比如QA、语言推理任务。Bert的构成:由12层Transformer Encoder构成。bert的基本

    2024年04月08日
    浏览(40)
  • 前端常见面试八股文

    1、H5新增标签有哪些? 一、语义化标签 header、footer、nav、aside、section、article 语义化的意义? 1、更适合搜索引擎的爬虫爬取有效的信息,利于SEO。 2、对开发团队很友好,增加了标签的可读性,结构更加的清晰,便于团队的开发和维护。 二、多媒体标签 视频标签:video 属性

    2023年04月08日
    浏览(82)
  • elasticsearch面试八股文

    es的存储和更新机制 Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,其存储架构和更新机制如下: 存储架构: 索引(Index) :ES的数据组织单元是索引,每个索引可以包含多个类型(Types),类似于数据库中的表。索引是由一个或多个分片(Shard)组成的,用于将数据

    2024年02月16日
    浏览(44)
  • Java八股文

    相似点 接口和抽象类都不能被实例化 实现接口或者抽象类的子类都必须实现这些抽象方法 不同点 抽象类可以包含普通方法和代码块, 接口里只能包含抽象方法, 静态方法和默认方法 抽象类可以有构造方法, 而接口没有 抽象类中的成员变量可以是各种类型, 接口中的成员变量

    2023年04月23日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包