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

面试题整理:操作系统

文章目录

  • 操作系统
    • 操作系统基础
      • 1. 操作系统的功能?
      • 2. 什么是用户态和内核态?
    • 进程和线程
      • 1. 是什么?区别?
      • 2. ⭐线程间的同步的方式有哪些?
      • 3. PCB 是什么?包含哪些信息?
      • 4. 进程的状态有哪些?
      • 5. ⭐进程间的通信方式有哪些?
      • 6. ⭐进程的调度算法有哪些?
      • 7. 什么是僵尸进程和孤儿进程?
    • 死锁
    • 内存管理
      • 1. OS内存管理负责的内容?
      • 2. ⭐内存管理方式?
      • 3. 内存碎片?
      • 4. ⭐虚拟内存是什么?有什么用/优点?
      • 5. 分段机制是什么?
      • 6.⭐分页机制是什么?
      • 7. 分页和分段的异同点?
      • 8. 段页机制是什么?
      • 9. 什么是局部性原理?
    • 文件系统
      • 1. 文件系统做了什么?
      • 2. 软链接和硬链接的区别?
      • 3. 提高文件系统性能的方式?
      • 4. 常见的磁盘调度算法?

操作系统

操作系统基础

1. 操作系统的功能?

OS是管理计算机硬件与软件资源的程序。

操作系统有 6 大功能:

  1. 进程管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等。
  2. 存储管理:内存的分配和管理、外存(磁盘等)的分配和管理等。
  3. 文件管理:文件的读、写、创建及删除等。
  4. 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
  5. 网络管理:操作系统负责管理计算机网络的使用。网络是计算机系统中连接不同计算机的方式,操作系统需要管理计算机网络的配置、连接、通信和安全等,以提供高效可靠的网络服务。
  6. 安全管理:用户的身份认证、访问控制、文件加密等,以防止非法用户对系统资源的访问和操作。

Linux 是一套免费使用、开源的类 Unix 操作系统。 Linux 存在着许多不同的发行版本,但它们都使用了 Linux 内核

2. 什么是用户态和内核态?

用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限。

内核态运行的进程几乎可以访问计算机的任何资源包括系统的内存空间、设备、驱动程序等,不受限制,拥有非常高的权限。

**只有一个内核态不行么?**1. 安全稳定。在 CPU 的所有指令中,有一些指令是比较危险的比如内存分配、设置时钟、IO 处理等,如果所有的程序都能使用这些指令的话,会对系统的正常运行造成灾难性地影响。2.性能效率。如果计算机系统中只有一个内核态,所有程序或进程都必须共享系统资源,导致系统资源的竞争和冲突,从而影响系统性能和效率。

**如何切换的?**系统调用,用户态主动切换到内核态。中断,设备完成用户请求后发出中断信号,CPU暂停吓一跳指令转而处理中断信号处理程序。异常,用户态执行时发送异常后,切换到处理异常的内核程序中。

**系统调用:**为应用程序提供的访问操作系统底层资源(设备、文件、网络等)的函数。用户态程序发起系统调用,trap陷入,当前cpu执行的程序中断,跳转到中断处理程序,开始执行系统调用,内核处理完毕后主动触发trap,再次中断切换回用户态。

陷阱trap:程序主动进行系统调用进入内核态的机制,是程序正常执行流程的一部分,CPU 从用户态切换到内核态,执行相应的系统服务例程,完成后再返回用户态继续执行后续指令。

中断Interrupt:程序执行过程中,出现某些外部事件或硬件故障时,CPU暂停正在执行的程序,处理事件后再返回程序继续执行。异步性,随机发生,强制中断。

异常Exception:程序执行过程中出现了异常,正常执行流程被打断。系统可能会终止程序、进行错误恢复等。

信号signal:通信方式,用于在进程之间或内核与进程之间传递异步事件通知。进程可以选择对不同的信号采取不同的处理方式,如忽略信号、执行默认处理动作或自定义信号处理函数。

进程和线程

1. 是什么?区别?

进程:计算机中正在运行的一个程序实例。

线程:轻量级进程,线程是最小的执行单位,运算调度的基本单位。

  • 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。
  • 线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。
  • 线程执行开销小,但不利于资源的管理和保护;而进程正相反。

**有了进程为什么还需要线程?**进程切换开销大,线程切换成本低。多个线程可以并发处理不同任务,有效利用多处理器、多和计算机,进程一个时间仅能做一件事,如果阻塞就会挂起。统一进程内的线程共享内存和文件,相互通信方便,无需调用内核。

**为什么要用多线程?**减少开销。系统并发需要。单核时代提高单进程的CPU和IO利用率,多核时代提高进程利用多核CPU的能力。

2. ⭐线程间的同步的方式有哪些?

线程同步:当多个线程并发执行时,同步线程来避免资源使用冲突。

  • 互斥锁mutex。互斥对象只有一个,拥有互斥对象的线程才有访问公共资源的权限。
  • 读写锁read-write-lock。允许多个线程同时读取共享资源,但只有一个线程可以对共享资源进行写操作。
  • 信号量semaphore。控制同一时刻访问同一资源最大线程数。
  • 屏障barrier。等待多个线程到达某个点再一起继续执行。
  • 事件event。Wait/Notify:通过通知操作的方式来保持多线程同步。

3. PCB 是什么?包含哪些信息?

Process Control Block 即进程控制块,来管理和跟踪进程的数据结构。

进程执行时,PCB 中的信息会不断变化,操作系统会根据这些信息来管理和调度进程。

PCB的内容进程描述信息(进程名称、标识符),进程调度信息(状态、阻塞原因、优先级),进程对资源的需求情况(CPU时间、内存空间、IO设备等),进程打开的文件信息(文件描述符、文件类型、打开模式),处理机状态信息(通用寄存器、指令计数器、程序状态字、用户栈指针)……

4. 进程的状态有哪些?

  • 创建状态(new):进程正在被创建,尚未到就绪状态。
  • 就绪状态(ready):进程已处于准备运行状态,即进程获得了除了处理器之外的一切所需资源,一旦得到处理器资源(处理器分配的时间片)即可运行。
  • 运行状态(running):进程正在处理器上运行(单核 CPU 下任意时刻只有一个进程处于运行状态)。
  • 阻塞状态(waiting):又称为等待状态,进程正在等待某一事件而暂停运行如等待某资源为可用或等待 IO 操作完成。即使处理器空闲,该进程也不能运行。
  • 结束状态(terminated):进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运行。

5. ⭐进程间的通信方式有哪些?

  1. 管道/匿名管道(Pipes) :具有亲缘关系的父子进程间或者兄弟进程之间的通信。只存在于内存中的文件。
  2. 有名管道(Named Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循 先进先出(First In First Out) 。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信
  3. 信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
  4. 消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。先进先出。存放在内核中,只有在内核重启(即,操作系统重启)或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。比 FIFO 更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 信号量(Semaphores) :计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
  6. 共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
  7. 套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持 TCP/IP 的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

6. ⭐进程的调度算法有哪些?

  • 先到先服务(FCFS,First Come, First Served) : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。

  • 短作业优先(SJF,Shortest Job First) : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源。

  • 时间片轮转(RR,Round-Robin) : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。

  • 多级反馈队列(MFQ,Multi-level Feedback Queue):前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统采取的便是这种调度算法。

    设有多个就绪队列,每个队列赋予不同的优先级,优先级从高到低排列,同时,优先级越高的队列中,时间片越小。新进程进入系统后,首先进入第 1 级队列末尾,按先来先服务原则排队等待调度。当轮到该进程执行时,便分配给它一个时间片。如果在该时间片内进程完成,则撤离系统;如果未完成,则将它转入下一级队列的末尾。只有当第 1 级队列为空时,调度程序才会调度第 2 级队列中的进程;只有第 1 级到第 i - 1 级队列都为空时,才会调度第 i 级队列中的进程。

  • 优先级调度(Priority):为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以 FCFS 方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。

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

  • 僵尸进程:子进程已经终止,但是其父进程仍在运行,且父进程没有调用 wait()或 waitpid()等系统调用来获取子进程的状态信息,释放子进程占用的资源,导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。此时子进程被称为“僵尸进程”。避免僵尸进程的产生,父进程需要及时调用 wait()或 waitpid()系统调用来回收子进程。top 命令查找,zombie 值表示僵尸进程的数量,为 0 则代表没有僵尸进程。
  • 孤儿进程:一个进程的父进程已经终止或者不存在,但是该进程仍在运行。这种情况下,该进程就是孤儿进程。孤儿进程通常是由于父进程意外终止或未及时调用 wait()或 waitpid()等系统调用来回收子进程导致的。为了避免孤儿进程占用系统资源,操作系统会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。

死锁

多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。

死锁必要条件:互斥。请求保持。不可剥夺。循环等待。

死锁预防:破坏必要条件。一次性申请所有资源。按一定顺序层次分配资源。

死锁避免:银行家算法。试探性分配,判断是否是安全状态。

死锁检测:定时运行一个死锁检测程序,如果发现死锁再解除。进程资源分配图,描述进程和资源申请分配关系的有向图。无环路,没有死锁。有环路且每个资源类仅有一个资源,发生死锁。有环路,涉及资源类有多个资源,不一定死锁。

死锁解除:①结束所有进程,重启OS。②撤销涉及死锁的所有进程,接触死锁后运行。③逐个撤销涉及死锁的进程,回收资源直到死锁解除。④抢占资源,从涉及死锁中的某个或某几个线程中抢占资源,剥夺后分配给其他涉及死锁的线程,直到死锁解除。

内存管理

1. OS内存管理负责的内容?

  • 内存分配和回收。
  • 地址转换。程序的虚拟地址->内存的物理地址。
  • 内存扩充。内存不足时,利用虚拟内存或自动覆盖内存技术,逻辑上扩充内存。
  • 内存映射。将文件映射到进程的进程空间,从而可以通过内存指针读写内存的方法存取文件内容,更快。
  • 内存优化。调整内存分配策略和回收算法来优化内存使用效率。
  • 内存安全。保证进程内存互不干扰。……

2. ⭐内存管理方式?

  • 连续内存管理:为一个用户程序分配一个连续的内存空间,内存利用率一般不高。
    • **块式管理。**将内存分为固定大小的几个块,每个块仅包含一个进程。会存在内部内存碎片和外部内存碎片。
    • **linux的伙伴系统算法。**将内存按照2的幂次划分,相邻内存块为一对伙伴。内存分配时,伙伴系统先尝试找到大小最合适的内存块,如果找到的太大,就一分为二一直切分到合适大小。如果梁坤相邻内存块都被释放,就合并形成更大的内存块。解决了外部内存碎片。对于内部内存碎片的问题,Linux 采用 SLAB 进行解决。
  • 非连续内存管理:允许一个程序使用的内存分布在离散或者说不相邻的内存中,相对更加灵活一些。
    • 段式管理。程序的虚拟地址空间被分为大小不等的段,以段的形式管理物理内存。会产生外部碎片。
    • 页式管理。将程序和内存都划分为固定大小的页,程序的逻辑地址空间被划分为若干个页,内存的物理地址空间也被划分为同样大小的页框。程序在内存中以页为单位进行存储,页与页之间可以不连续。
    • **段页式管理。**把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

3. 内存碎片?

内存申请和释放会产生内存碎片,包括内部内存碎片(内存碎片)、外部内存碎片(外部碎片)。

内存碎片:已经分配给进程使用但未被使用的内存。原因:分配的内存比实际需要的大(采用固定比例分配内存)。

外部碎片:未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。

4. ⭐虚拟内存是什么?有什么用/优点?

一种内存管理技术,它将物理内存抽象为一个更大的逻辑地址空间,使得程序可以使用比实际物理内存更多的内存空间。把一部分硬盘空间模拟成内存来使用,当物理内存不足时,将暂时不用的数据从物理内存移动到硬盘上的虚拟内存空间,需要时再将数据从虚拟内存调回物理内存。

优点:

  • 进程内存隔离。每个进程都认为自己拥有了整个物理内存,进程之间隔离,一个进程中的代码无法更改另一进程的物理内存。
  • **更大的可用空间。**程序拥有超过物理内存大小的可用内存空间。
  • **提升物理内存利用率。**只需要把进程正在用的数据加载进物理内存。
  • **简化内存管理。**借助虚拟地址空间访问物理内存,不需要和物理内存直接打交道。
  • 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。
  • 提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性。

物理地址(Physical Address) 是真正的物理内存中地址,是内存地址寄存器中的地址。程序中访问的内存地址不是物理地址,而是 虚拟地址(Virtual Address)。虚拟地址空间是虚拟地址的集合,是虚拟内存的范围。

操作系统一般通过 CPU 芯片中的一个重要组件 MMU(Memory Management Unit,内存管理单元) 将虚拟地址转换为物理地址,这个过程被称为地址翻译/地址转换(Address Translation),地址转换机制包括分段机制、分页机制、段页机制。

5. 分段机制是什么?

程序的虚拟地址空间被分为大小不等的段,以段的形式管理物理内存。虚拟地址(段号,段内偏移量)。段号:标识虚拟地址属于整个虚拟地址空间中的哪一段;段内偏移量:相对于当前段起始地址的偏移量。分段管理通过 段表(Segment Table) 映射虚拟地址和物理地址。段表中每一项为(段号,对应的物理内存起始地址,段长度)。

分段机制会导致外存碎片,段与段之间有碎片。

6.⭐分页机制是什么?

物理内存被划分为连续等长的物理页,程序的虚拟地址空间被划分为连续等长的虚拟页。虚拟地址为(虚拟页号,页内偏移量),页表的表项为(虚拟页号,对应的物理页号),一个进程对应一个页表。分页机制下,虚拟页可以被映射到任意的物理页。

虚拟页号不一定能找到对应的物理页号,可能会页缺失,物理内存中没有对应的物理页或者物理页和虚拟页没有建立映射。

页缺失:指的是程序试图访问已经映射在虚拟地址空间中,但是没有被加载在物理内存中的一个分页时,MMU发出的中断。硬性页缺失:物理内存没有对应的物理页,页缺失处理器会指示CPU从已经打开的磁盘文件中读取相应内容到物理内存,MMU再建立虚拟页和物理页的映射。软性页缺失:物理内存有对应的物理页,但是没建立映射,Page Fault Handler 会指示 MMU 建立相应的虚拟页和物理页的映射关系。

多级页表:单级页表时页表开销大,引入多级页表。多级页表,每个页表与前一个页表关联,一般32位系统是二级页表,64位系统是四级页表。

**TLB转址旁路缓存,快表。**为了提高虚拟地址到物理地址的转换速度提出快表,本质是高速缓存,缓存虚拟页号到物理页号的映射。

换页机制:一种时间换空间策略,物理内存不足时,把一些物理页内容放到磁盘中去,需要时再读取回来。

**换页算法:**用来选择淘汰哪一个物理页到磁盘的规则。

  • 最佳页面置换算法。优先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面。只是理论最优,无法实现,因为无法预知。
  • 先进先出。最简单,淘汰最先进入内存的。性能不好,经常访问的页面可能会被频繁调入调出。
  • 最近最久未使用LRU。记录每个页面上次访问的时间,淘汰最久没用的。
  • 最少使用。记录页面的访问次数,选择而访问频率最低的。
  • **时钟页面置换算法。**页面组织成一个类似环形的链表结构,每个页面有个访问位,初始是0,访问了是1,遍历找0淘汰,都是1就清0从头找。近似模拟LRU。

7. 分页和分段的异同点?

相同:都是非连续内存地址管理方式。都有地址映射。

不同:

  • 页大小固定,段大小不固定取决于程序。
  • 页是物理单位,通常是2的幂次;段是逻辑单位,根据程序中的数据和代码逻辑结构划分。
  • 分段容易有外部内存碎片。分页解决了外部内存碎片,可能有内部内存碎片。
  • 分页机制对程序没有任何要求,程序只需要按照虚拟地址进行访问即可;而分段机制需要程序员将程序分为多个段,并且显式地使用段寄存器来访问不同的段。

8. 段页机制是什么?

结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。虚拟内置:段号、段内页号、页内地址。

地址翻译时,先进行段地址映射,再页地址映射。

9. 什么是局部性原理?

数据和指令的访问存在一定的空间和时间上的局部性特点。

时间局部性:一个数据项或指令在一段时间内被反复使用。利用时间局部性的:缓存。

空间局部性:一个数据项或指令在一段时间内与其相邻的数据项或指令被反复使用。利用空间局部性的:访问某个页时,预先读取相邻的页。

文件系统

1. 文件系统做了什么?

存储管理:文件数据空间分配,物理存储,彼此不冲突。

文件管理:创建、删除 、移动、命名、压缩、加密、共享。

目录管理:创建、删除、移动、命名。

文件访问控制管理:管理不同用户、进程对文件的访问权限。

2. 软链接和硬链接的区别?

硬链接:ln创建

  • 通过文件、目录的索引节点号inode建立链接,硬链接和源文件的inode节点号相同。
  • 作用:只有删除了源文件和所有对应的硬链接文件,文件才会真正删除,给文件设置硬链接可以防止重要文件被误删。
  • 限制:不能给目录、不存在的文件创建硬链接,不能跨越文件系统。|| 每个文件系统有独立的inode表,且只维护该文件系统内的inode,不同文件系统间创建硬链接会导致inode节点号冲突。

软链接:ln -s创建

  • 指向文件路径,和源文件的inode节点号不同。
  • 作用:源文件删除后,软连接还存在,指向无效的文件路径,类似快捷方式。
  • 可以给目录、不存在的文件创建软链接,可以跨越文件系统。

3. 提高文件系统性能的方式?

  1. 优化硬盘。固态硬盘代替机械硬盘。RAID技术,通过将多个磁盘组合成一个逻辑磁盘阵列,利用 RAID 0 可以提高读写性能,RAID 1 提供数据冗余和容错能力,RAID 5 在保证一定读写性能的同时提供数据冗余。
  2. 选择合适的文件系统。ext4 文件系统适用于 Linux 系统,具有较高的性能和稳定性;NTFS 文件系统适用于 Windows 系统,支持大文件和大容量存储。
  3. 运用缓存。将经常访问的文件数据和元数据缓存在内存中,当再次访问时可以直接从缓存中读取,减少磁盘 I/O 操作。
  4. 磁盘合理分区,避免磁盘过度使用。

4. 常见的磁盘调度算法?

一次磁盘读写操作的时间由磁盘寻道/寻找时间、延迟时间和传输时间决定。磁盘调度算法可以通过改变到达磁盘请求的处理顺序,减少磁盘寻道时间和延迟时间。

**先来先服务。**没有考虑磁头移动的路径和方向,平均寻道时间长,容易饥饿,后来的请求可能需要长时间等待。

最短寻道时间优先/最佳服务优先。先选择距离当前磁头位置最近的请求进行服务。容易饥饿,远离磁头的请求长时间无响应。

扫描算法/电梯算法。沿着一个方向扫描磁盘,经过的磁道有请求就处理,到达磁盘边界后改变方向。解决了饥饿,但是如果磁头从一个方向刚扫描完,请求就到了,需要等待较长时间。

边扫描边观察算法。对扫描算法进行改进,如果磁头移动方向没有别的请求,立即改变磁头移动方向。

均衡循环扫描算法。对扫描算法进行改进,如果磁头移动方向没有访问请求,可以立即返回,只需要返回到有磁道访问请求的位置。


http://www.kler.cn/a/549126.html

相关文章:

  • 洛谷 P2894 USACO08FEB Hotel 题解
  • FFmpeg源码:url_find_protocol函数分析
  • Python Cookbook-1.13 访问子字符串
  • unity学习41:动画里的曲线curve参数 和 事件 events
  • ElementUI 的组件 Switch(开关)如何让文字显示在按钮上
  • Rust编程语言入门教程(一)安装Rust
  • 【云安全】云原生- K8S Kubelet 未授权访问
  • HTTP 与 HTTPS:协议详解与对比
  • Qt5开发入门指南:从零开始掌握跨平台开发
  • 图论(四):图的中心性——度中心性介数中心性紧密中心性
  • Redis 03章——10大数据类型概述
  • Flutter Gradle 命令式插件正式移除,你迁移旧版 Gradle 配置了吗?
  • 基于deepseek api和openweather 天气API实现Function Calling技术讲解
  • Kafka日志数据深度解析:从基础查看到高级操作全攻略
  • Testin云测(兼容性测试)
  • WeMos D1+PIR+Android 的小场景制作
  • Ubuntu 22.04 Desktop企业级基础配置操作指南
  • 「软件设计模式」适配器模式(Adapter)
  • 前端面试手写--虚拟列表
  • QT基础一、学会建一个项目