操作系统面试题总结(2022最新版)

article/2025/10/26 17:46:24

关于作者
🐶 程序猿周周
⌨️ 短视频小厂BUG攻城狮
🤺 如果文章对你有帮助,记得关注、点赞、收藏,一键三连哦,你的支持将成为我最大的动力

本文是《后端面试小册子》系列的第 4️⃣ 篇文章,该系列将整理和梳理笔者作为 Java 后端程序猿在日常工作以及面试中遇到的实际问题,通过这些问题的系统学习,也帮助笔者顺利拿到阿里、字节、华为、快手等多个大厂 Offer,也祝愿大家能够早日斩获自己心仪的 Offer。

标题地址
MySQL数据库面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/122910606
Redis面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/122934938
计算机网络面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/122973684
操作系统面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/122994599
Linux面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/122994862
Spring面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123016872
Java基础面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123080189
Java集合面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123171501
Java并发面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123266624
Java虚拟机面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123412605
Java异常面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123462676
设计模式面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123490442
Dubbo面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123538243
Netty面试题总结(2022版)https://blog.csdn.net/adminpd/article/details/123564362

文章目录

  • 一、内核
      • 1、什么是操作系统的内核?
      • 2、内核态和用户态的区别?
  • 二、进程与线程
      • 1、什么是僵尸进程以及如何避免?
      • 2、什么是孤儿进程?
      • 3、进程和线程的区别?
      • 4、什么是进程和线程的亲缘性?
      • 5、什么是协程?
      • 6、产生死锁的条件以及如何避免?
        • 四大必要条件
        • 死锁处理
      • 7、进程有哪些调度算法?
      • 8、Java 线程的调度方式?
      • 9、进程间有哪些通信方式?
      • 10、线程间的通信方式?
      • 11、说一下 fork 函数?
      • 12、如何理解一次调用两次返回?
      • 13、IO 模型?
      • 14、select、poll、epoll的原理与区别?
  • 三、内存
      • 1、物理地址和逻辑地址的区别?
      • 2、什么是虚拟内存?
      • 3、说一下局部性原理?
      • 4、内存有哪些管理机制?
      • 5、有哪些换页算法?

一、内核

1、什么是操作系统的内核?

2、内核态和用户态的区别?

  • 内核态:运行操作系统程序,几乎可以访问计算机的任何(硬件)资源
  • 用户态:运行用户应用程序

从用户态切换到内核态的常见方法:

  • 系统调用
  • 异常
  • 硬件中断

二、进程与线程

进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。通俗点讲,进程是一段程序的执行过程,是个动态概念。

1、什么是僵尸进程以及如何避免?

僵尸进程 是子进程先于父进程退出后,子进程的 PCB 需要其父进程释放,但是父进程并没有释放子进程的 PCB,这样的子进程就称为僵尸进程。僵尸进程实际上是一个已经死掉但并未释放 PBC 的进程

清楚了僵尸进程的定义,我们再来了解一下它的产生。

  • 僵尸进程的产生

一个进程在调用 exit 命令结束自己的生命周期时,它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie) 的数据结构(系统调用 exit 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在 Linux 进程的状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。这个僵尸进程需要它的父进程来为它收尸,如果他的父进程没有处理这个僵尸进程的措施,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。

  • 僵尸进程的危害

如果有大量的僵尸进程驻在系统之中,必然消耗大量的系统资源。但是系统资源是有限的,因此当僵尸进程达到一定数目时,系统因缺乏资源而导致奔溃。所以在实际编程中,避免和防范僵尸进程的产生显得尤为重要。

  • 如何避免僵尸进程

1)父进程通过wait和waitpid等函数等待子进程结束;

2)使用signal函数为SIGCHLD安装handler;

3)父进程不关心子进程的结束,则交给内核处理;

4)fork两次,回收子进程,并将孙进程交给1号进程(initi进程)。

ref

2、什么是孤儿进程?

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被 init 进程(pid=1)所收养,并由init进程对它们完成状态收集工作。

子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。

但孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用 ID,损害运行系统。

3、进程和线程的区别?

  • 进程是资源分配的最小单位,线程是CPU调度的最小单位

  • 进程有自己的独立地址空间,线程共享地址空间

  • 多进程程序更健壮,一个进程不会对其他进程造成影响

  • 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据

  • 进程上下文切换开销大,线程开销小

有个形象的例子区分进程和线程:车间和工人或者高速路和车道。

4、什么是进程和线程的亲缘性?

进程/线程只在某个cpu核上运行,避免因切换带来的CPU的L1/L2 cache失效。

5、什么是协程?

协程是用户态的轻量级线程,是一种比线程更加轻量级的存在,协程不被操作系统内核管理,完全由程序控制。

协程的优点

1)没有线程切换开销;

2)单线程无需对共享资源加锁机制。

缺点也显而易见,就是无法利用多核资源。协程本质还是单线程,无法直接利用多核处理器,需要配合进程实现

ref

6、产生死锁的条件以及如何避免?

想知道死锁的产生,首先需要了解死锁的定义:多个进行相互等待对方资源,在得到所有资源继续运行之前,都不会释放自己已有的资源,这样造成了循环等待的现象,称为死锁。

四大必要条件

  • 资源互斥,不可共享

每个资源要么已经分配给了一个进程,要么是可用的,只有这两种状态,资源不可以被共享使用,所以所谓的互斥是指:资源不共享,如果被使用,只能被一个进程使用。

  • 占有和等待,请求并保持

已经得到资源的进程还能继续请求新的资源,所以个人觉得叫占有并请求也许更好理解。

  • 资源不可剥夺

当一个资源分配给了一个进程后,其它需要该资源的进程不能强制性获得该资源,除非该资源的当前占有者显示地释放该资源。

  • 循环等待

死锁发生时,系统中一定有由两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源。

死锁处理

  • 如何预防死锁

破坏三个条件(互斥是非共享设备特性,无法更改)。

  • 如何避免死锁

避免指的是在资源动态分配过程中防止系统进入不安全状态,如银行家算法、系统安全状态法。

  • 死锁检测和解除

资源分配图、死锁定理、死锁解除。

ref

7、进程有哪些调度算法?

调度算法是指根据系统的资源分配策略所规定的资源分配算法。

  • 先来先服务(FCFS)

  • 短作业优先(SJF)

  • 时间片轮转(RR)

  • 优先级调度

ref

8、Java 线程的调度方式?

基于优先级的时间片轮转抢占式调度。

9、进程间有哪些通信方式?

1)管道 2)信号量(计数器) 3)信号(事件)

4)消息队列 5)共享内存 6)本地套接字

10、线程间的通信方式?

1)互斥量 2)信号量 3)事件

11、说一下 fork 函数?

创建一个和当前进程映像一样的进程可以通过 fork() 系统调用。

成功调用fork( )会创建一个新的进程,它几乎与调用fork( )的进程一模一样,这两个进程都会继续运行。在子进程中,成功的fork( )调用会返回0。在父进程中fork( )返回子进程的pid。如果出现错误,fork( )返回一个负值。

最常见的fork( )用法是创建一个新的进程,然后使用exec( )载入二进制映像,替换当前进程的映像。这种情况下,派生(fork)了新的进程,而这个子进程会执行一个新的二进制可执行文件的映像。这种“派生加执行”的方式是很常见的。

在早期的Unix系统中,创建进程比较原始。当调用fork时,内核会把所有的内部数据结构复制一份,复制进程的页表项,然后把父进程的地址空间中的内容逐页的复制到子进程的地址空间中。但从内核角度来说,逐页的复制方式是十分耗时的。现代的Unix系统采取了更多的优化,例如Linux,采用了写时复制的方法,而不是对父进程空间进程整体复制。

PS:通过 pthread_create() 函数创建线程。

12、如何理解一次调用两次返回?

fork() 函数是创建一个新进程, 它的返回值分别是子进程中返回 0,父进程返回子进程的进程号 (PID)。我们就可以通过 fork()函数的返回值识别父子进程。

其实,并不是一个函数有两个返回值,而是调用 fork 函数后,在内存中一个进程被复制成两个进程,分别被 cpu 执行. 那么执行出来肯定就会有两个结果。

ref

13、IO 模型?

  • 同步和异步:消息通信机制,同步需要用户线程轮询,异步为内核通知

  • 阻塞和非阻塞:程序在等待调用结果时的状态,操作方式

14、select、poll、epoll的原理与区别?

首先这三个函数都是 IO 多路复用的实现,IO多路复用就是多路 Socket 连接复用一个 IO 线程,即单个线程可以处理多个 IO 请求。其优点是系统不必创建和维护多进程/线程,从而大大减小了系统的开销。

ref
ref

三、内存

1、物理地址和逻辑地址的区别?

虚拟地址是指由程序产生的与段相关的偏移地址;

物理地址是指加载到内存地址寄存器中的地址,内存单元的真正地址。

ref

2、什么是虚拟内存?

虚拟内存是操作系统提供的一种内存管理技术,使得程序认为拥有连续可用的内存空间,而实际被分配到不同的物理内存碎片中。

3、说一下局部性原理?

  • 时间局部性

如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。

  • 空间局部性

一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问。

4、内存有哪些管理机制?

内存管理可以简单的分为连续分配管理方式非连续分配管理方式这两种。

连续分配管理方式是指为一个用户程序分配一个连续的内存空间,比如块式管理。非连续分配管理方式允许一个程序内存分散,比如页式管理、段式管理和段页式管理

  • 块式管理: 远古时代的计算机操作系统的内存管理方式,将内存分为几个固定大小的块,每个块只包含一个进程,如果程序运行需要内存,操作系统就给它分配一块,如果程序运行只需要很小的空间,则分配的这块内存很大一部分就浪费了,这些在每个块中未被利用的空间,我们称为碎片。

  • 页式管理: 把主存分为大小相等且固定的一页一页的形式,页比较小,相对于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。

  • 段式管理: 页式管理虽然提高了内存利用率,但是其中的页没有任何实际意义,段式管理把主存分为一段一段 ,每一段的空间又比一页的空间小很多。但是段有实际意义,段式管理通过段表对应逻辑地址和物理地址。

  • 段页式管理: 段页式管理机制结合了段式管理和页式管理的优点,就是把主存分为若干段,每个段又分为若干页,也就是说段页式管理机制中段和段之间以及段的内部都是离散的。

ref

5、有哪些换页算法?

  • OPT(最佳页面置换算法)
  • FIFO(先进先出置换算法)
  • LRU(最近最久未使用页面置换算法)
  • LFU(最少使用页面置换算法)
  • CLOCK 时钟置换算法

PS:此时可能会让动手实现 LRU 算法,两种思路:

1)双链表 + Hash;

2)LinkedHashMap。

ref


http://chatgpt.dhexx.cn/article/YDiEhEwy.shtml

相关文章

MFC中MENU的使用

一、创建基于对话框的应用程序框架 1.选择菜单项文件->新建->项目,弹出“新建项目”对话框。 2.直接选择“MFC应用程序”或左侧面板中模板的Visual C下选择MFC,中间窗口中选择MFC应用程序,然后在下面编辑框中键入工程名称,并…

MFC 菜单栏一片黑,界面卡顿问题

这是在公司做的一个项目, 实现可视化调节参数内容包括频段、频点、增益和Q值等,可以美化(包括丑化)和修饰声音,使声音(或音乐)风格更加鲜明突出。软件如下图所示: 但这软件开发过程中一直存在一…

C#版封装的近400个Windows API 类

【实例简介】 Windows API 类常用方法锦集 【实例截图】 文件&#xff1a;590m.com/f/25127180-494402201-213b68&#xff08;访问密码&#xff1a;551685&#xff09; 【核心代码】/// <summary> /// 封装Windows API类&#xff0c;可直接调用&#xff0c;和调用平常…

C#实现QQ窗体的步骤和总结

C#实现QQ窗体的步骤和总结 程序结构控件布局代码分析公共变量API调用公用方法事件 知识总结IntPtrMarshal 类PointOffset PaintEventArgs 类效果演示 GraphicsMouseEventArgs 类代码案例 ContextMenu 概述演示效果程序代码 MouseEventHandler句柄user32详细介绍使用方法 DllImp…

VC++:菜单的使用总结

菜单是windows应用程序经常使用的资源之一。从今天开始&#xff0c;把有关菜单的创建及使用等各方面的基本用法总结到一起&#xff0c;算是做个笔记吧&#xff01;准备一天写一点&#xff0c;陆陆续续完成&#xff01; 一、菜单的创建&#xff1a; &#xff08;一&#xff09…

Windows 编程[18] - 更换菜单项: ModifyMenu

为什么80%的码农都做不了架构师&#xff1f;>>> 本例效果图: 本例使用的资源文件(TestRes.rc): MyMenu1 MENUEX BEGINMENUITEM "Open" ,101MENUITEM "Old" ,102MENUITEM "Help" ,103 END本例代码文件: program Project1;{$R Tes…

动态更改菜单之ModifyMenu

多语言支持&#xff0c;已经是桌面应用软件的发展趋势。用句流行的词就是“国际化”。除了语言翻译的工作外&#xff0c;比较重要的就是字符的编码问题。不过这些问题的讨论已经铺天盖地了&#xff0c;我就不想再多说细节了。我在此只记录一下我的软件“国际化”中的一个技术小…

Android 为CheckBoxPreference Preference 控件添加样式

Android 为CheckBoxPreference Preference 控件添加样式 分类&#xff1a; android 2012-11-16 17:48 8920人阅读 评论(4) 收藏 举报 [html] view plain copy print ? <CheckBoxPreference android:key"enable_adb" android:layout"…

数据存储: CheckBoxPreference

最近&#xff0c;做一个项目&#xff0c;使用 Preference 非常频繁&#xff0c;之前就很想写一些关于 android 数据存储的文章&#xff0c;这次机会来了。 先从小出着手吧&#xff0c;CheckBoxPreference 小巧可爱&#xff0c;使用简单。但是使用的时候&#xff0c;还是需要注意…

CheckBoxPreference组件

CheckBoxPreference 选中为true 取消选中为false 它的值会以boolean的形式储存在SharedPreferences中。 <?xml version"1.0" encoding"utf-8"?><PreferenceScreenxmlns:android"http://schemas.android.com/apk/res/android"><…

Android 自定义CheckBoxPreference的CheckBox复选框

在使用Android的Preference&#xff0c;有时为了让我们的界面更加美观&#xff0c;我们会自定义自己的Preference。今天就主要说一下怎样自定义CheckBoxPreference的CheckBox按钮。 系统默认CheckBoxPreference的CheckBox样式 自定义后的CheckBox样式 其实&#xff0c;关键的一…

最好用的手机端C/C++语言编程软件, 不要说没电脑就不学编程了!

今天介绍一个软件—C编译器(c4droid)&#xff0c;可以直接编辑运行C/C程序&#xff0c;代码高亮、语法检查&#xff0c;使用起来非常不错&#xff0c;下面我简单介绍一下这个软件的安装和使用&#xff1a; 安装C编译器&#xff0c;这个直接在手机应用中搜索就行&#xff0c;如…

最新版手机端C/C++语言编程的软件

今天介绍一个软件—C编译器(c4droid)&#xff0c;可以直接编辑运行C/C程序&#xff0c;代码高亮、语法检查&#xff0c;使用起来非常不错&#xff0c;下面我简单介绍一下这个软件的安装和使用&#xff1a; 安装C编译器&#xff0c;这个直接在手机应用中搜索就行&#xff0c;如…

C语言编程工具软件推荐

c语言编程软件适于编写系统软件&#xff0c;是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言&#xff0c;应用非常广泛&#xff0c;不仅仅是在软件开发上&#xff0c;而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具 中国有句古话叫做“工欲善其…

c语言编程软件有哪些 Win7下用哪种C语言编译器

C语言是一门历史很长的编程语言&#xff0c;其编译器和开发工具也多种多样&#xff0c;其开发工具包括编译器&#xff0c;现举几个开发工具供大家选择&#xff0c;当然也要根据自己的操作系统来选择适合自己的开发工具 好多刚开始接触c语言的朋友都想知道用上面软件开发c语言…

手机上可以编程看代码的软件

以后大家会在路上看到很多人拿着手机,他不是在聊天,他有可能是运维工程师、也可能是算法开发、也可能是java开发,还可能是客户端开发,也可能是前端开发... 让你编程一直在路上,这到底是程序员的福音,还是码农的枷锁。 粉丝提问: 这里介绍几款可以在手机上编程的app,分…

学习c语言编程用什么软件_用C编程

学习c语言编程用什么软件 We would start writing basic programs in C now. You need to have required software installed and configured in your system. Refer to the article of Hello World and ensure that you are able to compile and run the program. 我们现在就开…

怎样查看C语言的程序内容,什么手机软件能看c语言文件?

C语言编译器和C编译器这2个手机软件就可以&#xff0c;而且还可以直接运行C语言程序&#xff0c;使用起来非常方便&#xff0c;下面我简单介绍一下这2个软件的安装和使用&#xff0c;感兴趣的朋友可以在自己手机上尝试一下&#xff1a; C语言编译器 这是手机上一个纯粹的C语言编…

c语言编程开发app,C语言编程app

C语言编程是一款掌上C语言学习软件&#xff0c;平台为用户提供专业的C语言学习资源&#xff0c;用户可以随时在线进行刷题学习&#xff0c;还能将错题记录和题目收藏&#xff0c;方便用户进行针对训练&#xff0c;轻松备考计算机二级&#xff0c;有需要的朋友快来下载吧&#x…

C语言编译器(C语言编程软件)

桌面操作系统 对于当前主流桌面操作系统而言&#xff0c;可使用 Visual C、GCC 以及 LLVM Clang 这三大编译器。 Visual C&#xff08;简称 MSVC&#xff09;是由微软开发的&#xff0c;只能用于 Windows 操作系统&#xff1b;GCC 和 LLVM Clang 除了可用于 Windows 操作系统…