当前位置: 首页 > news >正文

操作系统面试题学习

参考来源:沉默王二、小林coding

什么是操作系统?

操作系统是计算机系统中管理硬件和软件资源的中间层系统,屏蔽了硬件的复杂性,并且为用户提供了便捷的交互方式,比如说 Windows、Linux、MacOS 等

操作系统核心有四大功能:文件、cpu、内存、IO管理

文件管理:提供文件增删改的功能,并维护文件的存储结构

cpu管理:也就是进程管理,用于创建和终止进程

内存管理:为进程分配资源,并存储应用信息

IO管理:管理连接设备以及网络IO与os的交互

什么是用户态和内核态?

用户态和内核态的划分主要源于内存的划分,操作系统的内存分为内核空间和用户空间,

内核空间就是操作系统核心代码运行时所在的区域,拥有对系统资源的完全访问权限。

用户空间就是应用程序所使用的空间,用户空间的进程不能直接访问硬件或内核,只能通过系统调用或通信。

所以总的来说,当程序使用用户空间时,我们常说该程序在用户态执行,而当程序使内核空间时,程序则在内核态执行。

用户态和内核态怎么切换的?

当应用程序执行系统调用时,CPU 将从用户态切换到内核态,进入内核空间执行相应的内核代码,然后再切换回用户态。

系统调用是应用程序请求操作系统内核提供服务的接口,如文件操作(如 open、read、write)、进程控制(如 fork)等

并发和并行的区别?

并发:在一段时间内,多个任务都在处理,但是某一时刻只有一个任务真正在运行,本质上是操作系统在进行时间片轮转的方式调度进程,给人一种好像都在同时运行的感觉。

并行:同一时刻有多个cpu任务在执行,需要多核处理器才能完成,是真正意义上的同时运行。

说说进程、线程、协程

进程是操作系统中进行资源分配的基本单位,它拥有自己的独立内存空间和系统资源。每个进程都有独立的堆和栈,不与其他进程共享。进程间通信需要通过特定的机制,如管道、消息队列、信号量等。但上下文切换的开销大,因为需要保存和恢复整个进程的状态。

线程是CPU调度的基本单位。线程共享进程的内存空间,包括堆和全局变量。线程之间通信更加高效,因为它们可以直接读写共享内存。线程的上下文切换开销较小,因为只需要保存和恢复线程的上下文,而不是整个进程的状态。然而由于多个线程共享内存空间,因此存在数据竞争和线程安全的问题,需要通过同步和互斥机制来解决。

最后是协程。协程是一种用户态的轻量级线程,其调度完全由用户程序控制,而不需要内核的参与。协程拥有自己的寄存器上下文和栈,但与其他协程共享堆内存。协程的切换开销非常小,因为只需要保存和恢复协程的上下文而无需进行内核级的上下文切换。这使得协程在处理大量并发任务时具有非常高的效率。然而协程需要程序员显式地进行调度和管理,其编程模型更为复杂。

进程分配哪些资源?有了进程为什么要有线程?

进程主要分配内存空间,进程控制块(包括进程id,进程状态等),文件描述符表、处理器资源、信号量等。

线程主要是解决多个任务并发运行并能共享资源。假如一个视频播放进程里要获取资源并解压资源,如果没有线程那只能等视频全部解压才能看,但又了多线程,我们就可以并发执行这几个任务,并且能互相通信,从而实现边下边播。

什么是进程上下文切换?

进程上下文切换是操作系统在多任务处理环境中,将 CPU 从一个进程切换到另一个进程的过程。通过让多个进程共享 CPU 资源,使系统能够并发执行多个任务。

通常cpu通过时间片轮转完成进程上下文切换。

线程与进程切换有什么区别,为什么线程快?

进程切换:进程切换涉及到更多的内容,包括整个进程的地址空间、全局变量、文件描述符等。因此进程切换的开销通常比线程切换大。

线程切换:线程切换只涉及到线程的堆栈、寄存器和程序计数器等,不涉及进程级别的资源,因此线程切换的开销较小,避免了进程切换时需要切换内存映射表等大量资源的开销,从而节省了时间和系统资源

进程有哪些状态?

创建状态(new):进程正在被创建时的状态;

运行状态(Runing):该时刻进程占用CPU;

就绪状态(Ready):可运行,由于其他进程处于运行状态而暂时停止运行;

阻塞状态(Blocked):该进程正在等待某⼀事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时即使给它 CPU 控制权,它也无法运法;

结束状态(Exit):进程正在从系统中消失时的状态;

什么是僵尸进程和孤儿进程?

僵尸进程是已完成且处于终止状态,但在进程表中却仍然存在的进程。

僵尸进程一般发生有父子关系的进程中,一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait()获取了子进程信息后才会释放。如果子进程退出而父进程并没有调用 wait() ,那么子进程的进程描述符仍然保存在系统中,所以僵尸进程是会对系统造成危害的,我们应该即时释放资源。

一个父进程退出而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程 (进程 ID 为 1 的进程) 所收养,并由 init 进程对它们完成状态收集工作。因为孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。

进程间通信方式有哪些?**

  • 管道:管道就是内核中的一串缓存,从管道的一端写入数据,另一端读取。分为匿名管道和命名管道,匿名管道通常用于父子进程之间,而命名管道任意进程都可以用。
  • 消息队列:消息队列是保存在内核中的消息链表,但每次数据的写入和读取都需要经过用户态与内核态之间的拷贝过程。
  • 共享内存:允许两个或多个进程共享一个给定的内存区,一个进程写入的东西,其他进程马上就能看到,但当多进程竞争同一个共享资源时,会造成数据错乱的问题。
  • 信号:通知进程某件事发生了,比如SIGINT表示程序终止信号,SIGKILL,强制杀死该进程
  • 信号量:本质上是一个计数器,用来控制对共享资源的访问数量,确保任何时刻只能有一个进程访问共享资源,JUC的semaphore类就实现了类似功能
  • socket:套接字,提供网络通信的端点,可以让不同机器上运行的进程之间进行双向通信,基于的是计算机网络体系。

进程调度算法知道多少?

1、先来先服务:每次从就绪队列选择最先进入队列的进程运行,但是当一个长时间的作业运行了,后面的短时间作业等待会很长,不利于短作业。

2、最短作业优先:优先选择运行时间最短的进程来运行,但类似的,这反而又不利于长左业了。

3、时间片轮转调度:每个进程都是公平的,依次调度运行。尽管进程上下文切换有一定开销,但它依然是主流的进程调度算法。

4、优先级调度:给每个进程分配一个优先级,哪个优先级最高调度哪个,不过低优先级的进程可能会永远不执行。

5、高响应比优先调度:根据等待时间和要求服务时间算出优先级,等待长的,服务时间短的优先调度,是比较好的权衡了短作业与长作业。

6、多级反馈队列调度:时间片轮转和优先级调度的综合和发展,不同队列根据时间片分类,优先执行时间片短的队列,如果线程在短时间片队列中没执行完任务会被移动到长时间片队列,还是有较好的响应时间的。

线程间同步方式(通信方式)

信号量:本质上是一个计数器,用来控制对共享资源的访问数量,确保任何时刻只能有一个进程访问共享资源,JUC的semaphore类就实现了类似功能

互斥锁(Mutex):,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥锁加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,会唤醒他们让他们竞争获取锁。

死锁、如何避免、活锁饥饿锁

死锁:在两个或者多个并发线程中,如果每个线程持有某种资源,而又等待其它线程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组线程产生了死锁。

(条件:资源只能被一个线程占用,多个线程互相持有对方想要的资源(其实是两个:持有资源+对方想要)、它们不能强制释放获取资源)

避免:可以按照顺序申请资源,就是资源有顺序,只有拥有小顺序资源才能申请大的。或者我们可以强制终止进程。

活锁:活锁线程组里的线程状态可以改变,但是整个活锁组的线程无法推进。活锁可以用两个人过一条很窄的小桥来比喻:为了让对方先过,两个人都往旁边让,但两个人总是让到同一边。这样,虽然两个人的状态一直在变化,但却都无法往前推进。

饥饿锁:某个线程一直等不到它所需要的资源,从而无法向前推进,就像一个人因为饥饿无法成长。

物理内存和虚拟内存有什么区别?

物理内存指的是计算机中实际存在的硬件内存。物理内存是计算机用于存储运行中程序和数据的实际内存资源,操作系统和应用程序最终都必须使用物理内存来执行。

虚拟内存的核心思想是通过硬件和操作系统的配合,为每个进程提供一个独立的、完整的虚拟地址空间,解决物理内存不足的问题。它与实际的物理内存地址不同,必须经过地址转换才能映射到物理内存。操作系统通过 页表(Page Table) 将虚拟地址映射到物理地址。当程序访问某个虚拟地址时,CPU 会通过页表找到对应的物理地址。

内存分段了解吗?

程序是由若⼲个逻辑分段组成的,如可由代码段、数据段、栈段、堆段组成。不同的段是有不同的属性的,所以就⽤分段的形式把这些段分离出来。

分段机制下的虚拟地址由两部分组成,段号和段内偏移量。然后通过查段表来计算实际的物理地址。

内存分页了解吗?

分页是把整个虚拟和物理内存空间切成⼀段段固定的大小。这样⼀个连续并且尺⼨固定的内存空间,我们叫页(Page)。在 Linux 下,每⼀页的大小为 4KB 。

访问分页系统中内存数据需要两次的内存访问 :一次是从内存中访问页表,从中找到指定的物理页号,加上页内偏移得到实际物理地址,第二次就是根据第一次得到的物理地址访问内存取出数据。

多级页表知道吗?

多级页表是一种内存管理技术,用于在虚拟内存系统中高效地管理和转换虚拟地址到物理地址。它通过分层结构减少页表所需的内存开销,以解决单级页表在大地址空间中的效率问题。

举个例子,一级页表有10000条,那我们要找的话花时间会很长,而使用多级页表,那我们可能只需要查100条就能查到了,能大幅减少查询时间。

快表?

快表主要利用了局部性原理:在cpu中装如最常访问的页表项的缓存,从而提升查询效率

时间局部性(Temporal Locality):“最近用过的,大概率还会再用

空间局部性(Spatial Locality):“用到一个,附近的也大概率会用到”

中断

中断会导致处理器暂停当前正在执行的任务,并转向执行一个特定的处理程序(中断处理程序)。然后在处理完这些特殊情况后,处理器会返回到被打断的任务继续执行。

典型的中断包括I/O设备中断(如键盘输入、鼠标事件)和硬件错误中断等。操作系统通常会为每种类型的中断分配一个中断处理程序,用于处理相应的事件。

页面置换算法

先进先出置换算法

基本思路是,优先淘汰最早进入内存的页面。FIFO 算法维护一个队列,新来的页面加入队尾,当发生页面置换时,队头的页面(即最早进入内存的页面)被移出。

最近最久未使⽤的置换算法

基本思路是,淘汰最近没有使用的页面。LRU 算法根据页面的访问历史来进行置换,最长时间未被访问的页面将被置换出去。

最不常⽤置换算法

根据页面被访问的频率进行置换,访问次数最少的页面最先被置换。实现较为复杂,需要记录每个页面的访问频率。

http://www.dtcms.com/a/589111.html

相关文章:

  • Java 大视界 -- Java 大数据在智能教育虚拟学习环境构建与用户体验优化中的应用
  • .NET Core 如何使用 Quartz?
  • excel下拉选项设置
  • 深入解析:利用EBS直接API实现增量快照与精细化数据管理(AWS)
  • 专门做石材地花设计的网站有哪些网站是免费学做网页的
  • [Godot] Google Play审核反馈:如何应对“您的游戏需要进行更多测试才能发布正式版”?
  • Rust 练习册 :深入探索可变长度数量编码
  • dify二次开发部署服务器
  • webrtc降噪-NoiseEstimator类源码分析与算法原理
  • 4.3 Boost 库工具类 optional 的使用
  • 帮人做网站要怎么赚钱吗吉林平安建设网站
  • 文广网站建设sq网站推广
  • Nop平台拆分出核心部分nop-kernel
  • 结构型设计模式1
  • 普中51单片机学习笔记-中断
  • 二十六、STM32的ADC(DMA+ADC)
  • 网站开发的著作权和版权网站品牌推广
  • 【Docker】docker compose
  • 4.1.8 【2022 统考真题】
  • 深圳网站设计官网番禺人才网上
  • Tailwind CSS的Flex布局
  • 深入解析 LeetCode 1:两数之和
  • 重庆网站制作福州嘉兴网络科技有限公司
  • OpenCV(二十二):图像的翻转与旋转
  • 权限维持:操作系统后门技术分析与防护
  • 网闸与防火墙:构建纵深防御的“门卫”与“断桥”
  • 室内设计找工作网站wordpress app源码
  • 河北seo网站优化公司光辉网站建设
  • android 网络访问拦截器使用后的bug处理
  • mysql视图和存储过程