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

关于作者
🐶 程序猿周周
⌨️ 短视频小厂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、内核态和用户态的区别?

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

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

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

二、进程与线程

进程(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

  • 13
    点赞
  • 260
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 您好,以下是Java基础面试题2022最新版汇总): 1. Java中的四种访修饰符是什么?它们分别代表什么含义? 答:Java中的四种访修饰符是public、protected、default和private。它们分别代表公共的、受保护的、默认的和私有的含义。 2. Java中的八种基本数据类型是什么? 答:Java中的八种基本数据类型是byte、short、int、long、float、double、char和boolean。 3. Java中的自动装箱和拆箱是什么? 答:Java中的自动装箱和拆箱是指将基本数据类型自动转换为对应的包装类类型,以及将包装类类型自动转换为对应的基本数据类型。 4. Java中的final关键字有哪些用途? 答:Java中的final关键字有三种用途:用于修饰变量,表示该变量的值不可改变;用于修饰方法,表示该方法不可被重写;用于修饰类,表示该类不可被继承。 5. Java中的抽象类和接口有什么区别? 答:Java中的抽象类和接口都不能被实例化,但是抽象类可以包含非抽象方法,而接口只能包含抽象方法。另外,一个类只能继承一个抽象类,但是可以实现多个接口。 6. Java中的多态是什么? 答:Java中的多态是指同一个方法可以根据不同的对象调用出不同的行为。它实现的方式有两种:重载和重写。 7. Java中的异常处理机制是什么? 答:Java中的异常处理机制是指通过try-catch-finally语句块来捕获和处理程序运行时可能出现的异常情况,保证程序的稳定性和可靠性。 8. Java中的线程是什么?如何创建线程? 答:Java中的线程是指程序执行的最小单位,它可以独立运行,也可以与其他线程共享资源。创建线程的方式有两种:继承Thread类和实现Runnable接口。 9. Java中的集合框架有哪些?它们之间有什么区别? 答:Java中的集合框架包括List、Set、Map和Queue等。它们之间的区别在于:List是有序的、可重复的集合;Set是无序的、不可重复的集合;Map是键值对的集合;Queue是先进先出的队列。 10. Java中的反射是什么?有什么作用? 答:Java中的反射是指在程序运行时动态地获取类的信息,并可以在运行时操作类的属性和方法。它的作用在于:可以实现动态代理、动态生成代码、动态加载类等功能。 ### 回答2: Java是一种广泛使用的编程语言,它的应用覆盖多个领域,包括机器学习、大数据、企业级应用等。而Java开发人员也是当前市场上非常火热的职业之一。为了进入一家Java开发企业或者获取Java开发岗位,需要通过Java基础面试。 下面我将介绍Java基础面试题,并提供一些答案和解释: 1. 什么是Java? Java是一种面向对象的编程语言,被广泛应用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。 2. 什么是面向对象编程? 面向对象编程是一种编程范型,它将程序分解为对象,每个对象都有自己的数据和方法,对象之间可以相互交互。面向对象编程通常具有封装、继承和多态等特性。 3. Java应用程序的基本结构是什么? Java应用程序的基本结构包括类定义,变量定义,方法定义和语句执行。 4. 什么是Java虚拟机? Java虚拟机是Java平台的核心组件之一,它提供了一个运行Java程序的环境。Java虚拟机可以在不同的操作系统上运行Java程序,实现了跨平台运行的目的。 5. 什么是Java语言的基本数据类型? Java语言的基本数据类型包括byte、short、int、long、float、double、boolean和char。 6. 如何声明一个变量? 在Java中,声明一个变量需要指定变量的类型和名称。例如,int count = 10; 7. 什么是包? 包是在Java中管理类和接口的一种方式。包可以将相关的类和接口组织在一起,以便更好地管理代码。 8. 什么是Java中的异常? 异常是在程序执行期间出现的错误,它包含了错误信息、错误类型和错误的上下文。 9. 什么是Java中的多线程? 多线程是Java中一种并发处理的方法,它允许程序同时执行多个任务。Java中的线程可以通过继承Thread类或实现Runnable接口来创建。 10. Java中的继承关系是什么? 继承是Java中一种对象之间的关系,它允许子类继承父类的属性和方法。子类可以通过继承父类来扩展自己的功能。 以上是常见的Java基础面试题,希望能够对Java开发者提供帮助。在面试过程中,还需要我们展示自己的编程能力和实际应用经验。只有掌握了扎实的Java基础、熟悉常见的应用场景、具备实际经验并且具备坚实的编程能力,才能获得Java开发岗位。 ### 回答3: Java作为目前最热门的编程语言之一,在面试中也是一个重点考察的领域。下面对于Java基础面试题进行汇总和解答。 1. Java常见的数据类型有哪些? 答:Java常见的数据类型有基本数据类型和引用数据类型两种。基本数据类型包括byte、short、int、long、float、double、boolean、char;引用数据类型包括类、数组、接口。 2. int和Integer有什么区别? 答:int是Java中的一种基本数据类型,使用时直接声明并赋值即可;而Integer是int的包装类型,是一个对象,需要通过new来进行初始化,也可以使用自动装箱和拆箱进行转换。 3. String和StringBuilder的区别? 答:String是一个不可变的类,一旦创建就不能修改,修改需要重新创建对象;StringBuilder是一个可变的类,可以通过append、insert等方法修改字符串,节省内存和时间。 4. 抽象类和接口的区别? 答:抽象类和接口都是用于描述行为的概念,但是抽象类更偏向于在类层次结构中描述一种抽象的类,它可以拥有抽象方法和具体实现方法,可以有构造函数,但不能被实例化;而接口更偏向于描述一种能力,只能包含抽象方法、常量和默认方法,不能有构造函数,需要实现接口才能使用。 5. 静态和非静态的区别? 答:静态属性或方法属于类,而非静态属性或方法属于实例,也就是说同一个类属性或方法,静态的只有一份,非静态每次实例化时都有自己的一份;静态变量在类的加载时初始化,公用一份内存,一旦被修改,则所有的对象都会共享该值;非静态变量在每次实例化时初始化,属于独立变量。 6. final关键字的作用? 答:final关键字可以修饰类、方法和变量,表示不可修改、不可继承或不可重写。final修饰的变量是一个常量,一旦初始化后就不能修改;final修饰的方法不能被子类重写;final修饰的类不能被继承。 7. try-catch-finally语句的应用? 答:try-catch-finally语句用于捕获程序中的异常,在try块中尝试执行一段可能会出现异常的代码,如果出现异常则会转到catch块中处理异常,最后无论是否出现异常都会执行finally块中的语句。finally块一般用于释放资源或进行清理操作,如关闭数据库、文件等。 8. 在Java中如何实现多线程? 答:Java中实现多线程有两种方式:继承Thread类和实现Runnable接口。继承Thread类需要重写run方法,而实现Runnable接口需要实现run方法。另外,还可以使用线程池、同步锁、信号量、线程等待等方式实现多线程。 9. 快速判断一个字符串是否是数字? 答:可以使用正则表达式或Java自带的API进行判断。正则表达式可以使用\d+匹配数字,Java自带的API可以使用try-catch捕获NumberFormatException异常来判断。 10. Java中的反射是什么? 答:Java中的反射是指程序在运行时可以动态获取和操控类的信息和对象的属性或方法,包括类的名称、属性和方法。可以通过反射来获取类的所有信息,包括私有的成员变量和方法,也可以在运行时创建对象、调用方法等。但是由于反射操作需要消耗一定的资源,因此不适合在频繁执行的代码中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿周周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值