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

八股(六)操作系统

目录

😺操作系统基础

操作系统主要有哪些功能?

常见的操作系统

用户态和内核态

为什么要有用户态和内核态?

用户态和内核态如何切换

系统调用

😺进程、线程

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

​​​​​PCB 是什么?

进程有哪几种状态?

常见进程通信方式

进程的调度算法

进程调度到底是谁在做?

😺死锁

产生死锁的四个必要条件

解决死锁的方法

😺内存管理

什么是内存碎片?

常见的内存管理方式

连续内存管理 -- 伙伴系统(Linux)

非连续内存管理 -- 段、页、段页

虚拟内存

单级页表有什么问题

TLB(快表)

页缺失

换页机制和页面置换算法

分页机制 vs 分段机制

局部性原理

😺文件系统

硬链接 vs 软链接

提高文件系统性能

常见的磁盘调度算法


😺操作系统基础

操作系统是管理计算机硬件与软件资源的系统软件,是计算机的核心基础。

它的主要作用是为应用程序提供统一的运行环境,屏蔽底层硬件复杂性,使程序无需直接操作硬件即可完成运行。

其中操作系统的核心是内核(Kernel),负责进程调度、内存管理等核心功能,是连接应用程序与硬件之间的桥梁。

应用程序 ↓ 操作系统(内核) ↓ CPU / 内存 / 磁盘

操作系统主要负责四大资源管理:CPU 调度、内存管理、文件系统管理以及设备管理。

Q:内核是什么?
A:操作系统的核心部分,负责管理 CPU、内存等资源。

Q:操作系统和 CPU 的区别?
A:操作系统是软件负责管理资源,CPU 是硬件负责执行指令。

操作系统主要有哪些功能?

操作系统从资源管理的角度来看,主要具有六大功能:

第一是进程和线程管理,负责进程的创建、撤销、阻塞与唤醒,以及 CPU 调度和进程通信等。

第二是存储管理,负责内存的分配与回收,以及虚拟内存管理等。

第三是文件管理,负责文件的创建、删除、读写以及目录结构管理。

第四是设备管理,负责对输入输出设备和外部存储设备的统一管理与调度。

第五是网络管理,负责计算机网络的配置、连接与通信控制。

第六是安全管理,包括用户身份认证、访问控制以及系统资源保护等。

常见的操作系统

1)Windows,这是最常见的桌面操作系统,由 Microsoft 开发。

2)Linux,很多服务器都是 Linux,比如:云服务器、Docker 容器、Nginx、Redis、MySQL。

3)Unix,现代操作系统的重要鼻祖,很多系统都参考它设计,比如 Linux、MacOS。

4)macOS,由 Apple 开发。

Linux 更适合服务器和命令行开发,Windows 更适合桌面和办公。

用户态和内核态

用户态权限较低,只能执行非特权指令,只能访问用户程序自己的资源,不能直接操作硬件设备。

内核态权限最高,操作系统核心功能运行在内核态,可以访问 CPU、内存、磁盘、网卡等所有系统资源。

当程序执行文件读写、网络通信等需要特权操作时,会通过系统调用从用户态切换到内核态,由操作系统完成底层操作,再切换回用户态。这种设计主要是为了保证系统的安全性、稳定性和性能。

为什么要有用户态和内核态?

为了安全、稳定、隔离权限。

如果只有一个内核态,所有程序都有最高权限:

  • 安全性极差,任何程序都能改内存、杀进程、读磁盘。
  • 稳定性极差,一个程序崩溃,直接拖垮整个系统。
  • 资源冲突,多个程序直接抢 CPU / 内存 / IO。

用户态和内核态如何切换

第一种是系统调用,这是最主要的方式,由应用程序主动发起,比如文件读写和网络通信。

第二种是中断,由外部硬件设备触发,例如磁盘 IO 完成后通知 CPU。

第三种是异常,由程序运行错误引起,例如除零异常和缺页异常。

切换过程中需要保存和恢复上下文,因此会带来一定的性能开销。

第一步:保存用户态上下文 第二步:切到内核栈 第三步:执行内核代码 ​​​​​​​第四步:恢复上下文

系统调用

凡是与系统态级别的资源有关的操作(如设备管理、文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。

  • 设备管理:完成设备(输入输出设备和外部存储设备等)的请求或释放,以及设备启动等功能。
  • 文件管理:完成文件的读、写、创建及删除等功能。
  • 进程管理:进程的创建、撤销、阻塞、唤醒,进程间的通信等功能。
  • 内存管理:完成内存的分配、回收以及获取作业占用内存区大小及地址等功能。

😺进程、线程

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

第一是互斥锁,通过加锁机制保证同一时刻只有一个线程访问共享资源,例如 synchronized 和 Lock。

第二是读写锁,允许多个线程同时读取,但写操作必须互斥,适用于【读多写少】场景。

第三是信号量,用于限制同一时刻访问资源的线程数量。

第四是屏障,用于等待多个线程到达某个同步点后再一起继续执行。

第五是等待通知机制,通过 wait 和 notify 实现线程之间的协作。

​​​​​PCB 是什么?

PCB(Process Control Block)即进程控制块,是操作系统中用来管理和跟踪进程的数据结构,每个进程都对应着一个独立的 PCB。你可以将 PCB 视为进程的大脑。

当操作系统创建一个新进程时,会为该进程分配一个唯一的进程 ID,并且为该进程创建一个对应的进程控制块。当进程执行时,PCB 中的信息会不断变化,操作系统会根据这些信息来管理和调度进程。

PCB 主要包含以下信息:

  1. 进程标识信息,例如进程 ID 和名称;
  2. 进程状态和调度信息,例如运行态、就绪态、阻塞态以及优先级;
  3. CPU 上下文信息,例如程序计数器、寄存器和栈指针;
  4. 资源信息,例如内存、IO 设备和文件描述符。

操作系统通过 PCB 完成进程管理和上下文切换。

进程有哪几种状态?

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

常见进程通信方式

1)管道(Pipe):一个进程写,一个进程读,像水管一样,适用于父子进程通信。

2)消息队列(Message Queue):以消息为单位进行异步通信。

3)共享内存:多个进程访问同一块物理内存,效率最高。

4)Socket:支持本机和跨网络进程通信。

进程的调度算法

进程调度算法的核心目标是决定就绪队列中的哪个进程应该获得 CPU 资源,其设计目标通常是在吞吐量、周转时间、响应时间公平性之间做权衡。

第一类:非抢占式调度

这种方式下,一旦 CPU 分配给一个进程,它就会一直运行下去,直到任务完成或主动放弃(比如等待 I/O)。

1. 先到先服务调度算法(FCFS,First Come, First Served): 这是最简单的,就像排队,谁先来谁先用。优点是公平、实现简单。但缺点很明显,如果一个很长的任务先到了,后面无数个短任务都得等着,这会导致平均等待时间很长。

2. 短作业优先的调度算法(SJF,Shortest Job First): 从就绪队列中选出一个估计运行时间最短的进程为之分配资源。理论上,它的平均等待时间是最短的,吞吐量很高。但缺点是,它需要预测运行时间,这很难做到,而且可能会导致长作业“饿死”,永远得不到执行。

第二类:抢占式调度

3. 时间片轮转调度算法(RR,Round-Robin): 这是最经典、最公平的抢占式算法。它给每个进程分配一个固定的时间片,用完了就把它放到队尾,切换到下一个进程。它非常适合分时系统,保证了每个进程都能得到响应,但时间片的设置很关键:太长了退化成 FCFS,太短了则会导致过于频繁的上下文切换,增加系统开销。

4. 优先级调度算法(Priority):每个进程都有一个优先级,进程调度器总是选择优先级最高的进程,具有相同优先级的进程以 FCFS 方式执行。这很灵活,可以根据内存要求,时间要求或任何其他资源要求来确定优先级,但同样可能导致低优先级进程“饿死”。

结合:5. 多级反馈队列调度算法(MFQ,Multi-level Feedback Queue)

现实世界中最常用的一种算法,它结合了 RR 和优先级调度,设置了多个不同优先级的队列,每个队列使用 RR 调度,时间片大小也不同。新进程先进入最高优先级队列,如果在一个时间片内没执行完,就会被降级到下一个队列。这样既照顾了短作业(在高优先级队列中快速完成),也保证了长作业不会饿死(最终会在低优先级队列中得到执行),是一种非常均衡的方案。

进程调度到底是谁在做?

进程调度是操作系统内核完成的,由两个组件协作完成,调度程序(Scheduler)是“决策者”,分派程序(Dispatcher)是“执行者”。

调度程序负责从就绪队列中按照调度算法选择下一个要执行的进程。

分派程序负责具体的上下文切换,包括保存当前进程的 CPU 状态并恢复新进程的执行状态,将 CPU 控制权切换给新进程。

😺死锁

产生死锁的四个必要条件

  • 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。如果另一进程申请该资源,那么必须等待直到该资源被释放为止。
  • 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
  • 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
  • 循环等待:有一组等待进程 {P0, P1,..., Pn}, P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,……,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。

解决死锁的方法

解决死锁的方法可以从多个角度去分析,一般的情况下,有预防,避免,检测和解除四种

1)死锁预防:这是我们程序员最常用的方法。通过编码规范来破坏条件。只要破坏四个条件中的任意一个,就不会发生死锁。

  • 破坏“互斥条件”(基本不可行)。
  • 破坏“占有并等待”(最常用预防):一次性申请所有资源,也叫静态分配策略。
  • 破坏“不可抢占”(部分可行):资源可以被强制收回。适用CPU 调度、内存管理,不适用打印机、文件写入,强行抢占会导致数据损坏。
  • 破坏“循环等待”(最实用):给资源编号,按顺序申请,不可能形成闭环等待。

2)死锁避免:死锁避免是一种在资源分配过程中动态防止死锁发生的策略。它允许死锁的四个必要条件同时存在,但通过在每次资源分配前进行安全性检查,确保系统始终处于安全状态。

这是一种更动态的方法,比如操作系统的银行家算法。它会在分配资源前进行预测,如果这次分配可能导致未来发生死锁,就拒绝分配。但这种方法开销很大,在通用系统中用得比较少。

系统状态分为安全状态和不安全状态。安全状态指的是存在一个安全序列,使所有进程都能顺利完成;不安全状态则可能导致死锁。

3)死锁检测与解除:不管死锁是否发生,先正常运行,等真的死锁了再检测并处理。

这是一种“事后补救”的策略,就像乐观锁。系统允许死锁发生,但会有一个后台线程(或机制)定期检测是否存在死锁环路(比如通过分析线程等待图)。一旦发现,就会采取措施解除,比如强制剥夺某个线程的资源或直接终止它。数据库系统中的死锁处理就常常采用这种方式。

其核心是利用进程-资源分配图来描述系统状态。如果图中无环,则系统无死锁;如果存在环,则在单实例资源情况下必定死锁,在多实例资源情况下需要进一步检测。检测方法是通过类似拓扑排序的过程,反复寻找能够执行并释放资源的进程,如果所有进程都能完成,则无死锁,否则存在死锁。

检测到死锁后,进行死锁解除,强行破坏其中一个条件(通常是后两个)。

  • 立即结束所有进程的执行,重新启动操作系统:这种方法简单,但以前所在的工作全部作废,损失很大。
  • 撤销涉及死锁的所有进程,解除死锁后继续运行:这种方法能彻底打破死锁的循环等待条件,但将付出很大代价,例如有些进程可能已经计算了很长时间,由于被撤销而使产生的部分结果也被消除了,再重新执行时还要再次进行计算。
  • 逐个撤销涉及死锁的进程,回收其资源直至死锁解除(更合理)
    👉优先杀谁?考虑:运行时间长短、占用资源多少、优先级、是否可恢复。
  • 抢占资源:从涉及死锁的一个或几个进程中抢占资源,把夺得的资源再分配给涉及死锁的进程直至死锁解除,不一定要杀进程,更温和,通常需要配合回滚机制。

Q:资源抢占有什么问题?
A:需要回滚,被抢占进程可能需要重新执行,且可能导致活锁。

Q:如何选择要终止的进程?
A:根据优先级、资源占用、执行时间和恢复成本等因素综合判断。

Q:实际开发中怎么处理死锁?
A:一般通过超时机制、事务回滚、重试机制解决。

😺内存管理

  • 内存的分配与回收:对进程所需的内存进行分配和释放,malloc 函数:申请内存,free 函数:释放内存。
  • 地址转换:将程序中的虚拟地址转换成内存中的物理地址。
  • 内存扩充:当系统没有足够的内存时,利用虚拟内存技术或自动覆盖技术,从逻辑上扩充内存。
  • 内存映射:将一个文件直接映射到进程的进程空间中,这样可以通过内存指针用读写内存的办法直接存取文件内容,速度更快。
  • 内存优化:通过调整内存分配策略和回收算法来优化内存使用效率。
  • 内存安全:保证进程之间使用内存互不干扰,避免一些恶意程序通过修改内存来破坏系统的安全性。

什么是内存碎片?

内存碎片是由内存的申请和释放产生的,通常分为下面两种:

内部内存碎片(Internal Memory Fragmentation,简称为内存碎片):已经分配给进程使用但未被使用的内存。导致内部内存碎片的主要原因是,当采用固定比例比如 2 的幂次方进行内存分配时,进程所分配的内存可能会比其实际所需要的大。举个例子,一个进程只需要 65 字节的内存,但为其分配了 128(2^7) 大小的内存,那 63 字节的内存就成为了内部内存碎片。

外部内存碎片(External Memory Fragmentation,简称为外部碎片):由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片。也就是说,外部内存碎片指的是那些并未分配给进程但又不能使用的内存。我们后面介绍的分段机制就会导致外部内存碎片。

内存碎片会导致内存利用率下降,如何减少内存碎片是内存管理要非常重视的一件事情。

常见的内存管理方式

  • 连续内存管理:为一个用户程序分配一个连续的内存空间,内存利用率一般不高。
  • 非连续内存管理:允许一个程序使用的内存分布在离散或者说不相邻的内存中,相对更加灵活一些。

连续内存管理 -- 伙伴系统(Linux)

按 2^n 切分内存,并将相邻的内存块组合成一对伙伴。

当进行内存分配时,伙伴系统会尝试找到大小最合适的内存块。如果找到的内存块过大,就将其一分为二,分成两个大小相等的伙伴块。如果还是大的话,就继续切分,直到到达合适的大小为止。

假设两块相邻的内存块都被释放,系统会将这两个内存块合并,进而形成一个更大的内存块,以便后续的内存分配。

可以有效解决外部内存碎片的问题,但内部碎片问题仍存在,这主要是因为伙伴系统只能分配大小为 2^n 的内存块。对于内部内存碎片的问题,Linux 采用SLAB进行解决,不深究。

非连续内存管理 -- 段、页、段页

1)分段(Segment):按“逻辑结构”分段,比如:代码段、数据段、栈段,每段大小不同。符合程序逻辑,易于管理,但是有外部碎片。

2)分页(Page):把物理内存切成固定大小的页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页,通过页表建立映射:虚拟页 → 物理页。没有外部碎片,内存利用率高,但有少量内部碎片,是现代操作系统广泛使用的一种内存管理方式。

3)段页式(结合方案):把物理内存先分成若干段 → 每个段又继续分成若干大小相等的页,兼顾逻辑性(段),兼顾效率(页)。

在地址转换过程中分为两步:

第一步是段式地址转换:
虚拟地址由段号和段内偏移组成,通过段号查找段表,获取段基址,再加上段内偏移得到线性地址。

第二步是页式地址转换:
将线性地址划分为页号和页内偏移,通过页号查页表,找到对应的物理页框,再加上页内偏移得到最终物理地址。

Q:分页和分段的区别?
A:分页按固定大小划分,分段按逻辑划分。

Q:为什么分页没有外部碎片?
A:因为内存按固定大小划分。

Q:为什么现代操作系统用分页?
A:因为内存利用率高且支持虚拟内存。

虚拟内存

虚拟内存是一种内存管理机制,它为每个进程提供独立的虚拟地址空间,通过页表将虚拟地址映射到物理地址。

当物理内存不足时,操作系统会将部分数据换出到磁盘,从而实现更大的逻辑内存空间。

虚拟内存 = 操作系统给每个进程“画的一块假内存”。你写程序时以为你在用一整块连续的大内存,但实际上操作系统在背后帮你映射到真实物理内存。

程序访问虚拟地址 ↓ 操作系统查页表 ↓ 找到物理地址 ↓ 访问真实内存
  • 进程隔离(最重要):每个进程都有独立虚拟空间,互不影响,提高安全性,一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。
  • 提高内存利用率:操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存。
  • 支持超大内存:即使物理内存 8G,程序也可以使用 16G,不够的放磁盘(Swap),虚拟内存 ≈ 内存 + 磁盘。
  • 简化编程:程序员只操作虚拟地址,不用管物理内存、分配位置。
  • 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库。这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存。

Q:虚拟地址如何转换成物理地址?
A:通过页表完成映射。

Q:什么是缺页异常?
A:访问的页不在内存,需要从磁盘加载。

Q:虚拟内存为什么能比物理内存大?
A:因为使用磁盘作为扩展(Swap)。

Q:没有虚拟内存有什么问题?
A:如果没有虚拟内存,程序将直接访问物理内存,会带来多个问题:首先,进程之间无法隔离,容易发生内存覆盖,导致程序崩溃甚至系统崩溃;其次,多进程环境下地址冲突严重,系统稳定性差;再次,内存利用率低,程序必须一次性加载全部数据;此外,程序无法使用超过物理内存的空间;最后,编程复杂度大大增加。因此,虚拟内存通过提供独立的地址空间、按需加载以及内存映射机制,解决了这些问题。

单级页表有什么问题

单级页表的主要问题是占用内存空间大。在 32 位系统中,一个进程的页表可能占用约 4MB 内存,并且大部分页表项可能未被使用,造成严重浪费。

为了解决这一问题,引入了多级页表。多级页表将页表分层管理,仅在需要时才创建下一级页表,从而显著减少内存占用。

比如二级页表:[一级索引][二级索引][页内偏移]

多级页表是一种典型的“以时间换空间”的优化方式,通过增加地址转换次数来降低页表存储开销。

TLB(快表)

Translation Lookaside Buffer转址旁路缓存,TLB = 页表的缓存(Cache)。

TLB 是用于缓存页表项的高速缓存,位于 CPU 的 MMU(Memory Management Unit,内存管理单元)中,用于加速虚拟地址到物理地址的转换。

在没有 TLB 的情况下,每次访问内存需要两次访存:

  1. 访问页表获取物理地址
  2. 再访问目标数据

引入 TLB 后:

  • 如果 TLB 命中(TLB hit),可以直接获取物理地址,仅需一次内存访问
  • 如果 TLB 未命中(TLB miss),需要访问页表,并将结果缓存到 TLB,再访问目标数据

TLB 的本质是利用程序访问的局部性原理,将常用的页表项缓存起来,从而减少访存次数,提高性能。

页缺失

页缺失(Page Fault)是指 CPU 在访问虚拟内存时,通过页表进行地址转换时发现目标页不在物理内存中,从而触发的一种异常机制。

页缺失主要分为三种类型:

  1. Hard Page Fault(硬缺页):物理内存中没有该页,需要从磁盘加载到内存中,开销较大。
  2. Soft Page Fault(软缺页):物理内存中已经存在该页,只是未建立映射关系,由操作系统建立映射即可。
  3. Invalid Page Fault(非法缺页):访问了无效地址,属于非法访问,会触发异常终止程序。

页缺失的本质是虚拟内存机制下的一种正常异常处理机制,用于实现按需分页加载,提高内存利用率。

换页机制和页面置换算法

换页机制是操作系统在物理内存不足时,将部分不常用的页从内存换出到磁盘,并在需要时再换入内存的一种机制。

  1. OPT(最佳置换算法):淘汰未来最长时间不会被访问的页面,缺页率最低,但无法预测未来,因此无法实现,仅作为理论参考标准。
  2. FIFO(先进先出算法):按照页面进入内存的时间顺序进行淘汰,选择最早进入的页面进行替换,实现简单但性能较差。
  3. LRU(最近最久未使用算法 Least Recently Used):淘汰最长时间未被访问的页面,基于局部性原理,是实际应用中最常用的算法之一。
  4. LFU(最少使用频率算法 Least Frequently Used):淘汰访问次数最少的页面,适用于长期访问模式,但对短期变化不敏感。
  5. Clock(时钟算法):LRU 的近似实现,通过环形队列和访问位减少维护开销,在实际系统中广泛使用。

其中,OPT 最优但不可实现,FIFO 简单但可能产生异常,LRU 和 Clock 是实际系统中最常用的方案。

分页机制 vs 分段机制

分页机制和分段机制本质上都是在解决如何让程序使用“虚拟地址”,并映射到“物理内存”的问题。

它们的共同点是:

  1. 都属于非连续内存管理
  2. 都通过地址映射机制实现虚拟地址到物理地址的转换
  3. 都用于内存管理和内存保护

它们的区别主要包括:

  1. 管理单位不同:
    分页以固定大小的页为单位进行管理,而分段以逻辑意义上的段为单位进行管理。
  2. 大小是否固定:
    页的大小是固定的,由操作系统决定;段的大小不固定,由程序逻辑决定。
  3. 物理/逻辑属性:
    页是物理单位,用于内存管理;段是逻辑单位,表示程序结构。
  4. 内存碎片问题:
    分页可以避免外部碎片,但可能产生内部碎片;分段容易产生外部碎片。
  5. 地址结构不同:
    分页通过页表进行地址映射,分段通过段表记录段基址和长度进行映射。
  6. 使用方式不同:
    分页对程序透明,程序无需感知;分段需要程序显式划分段结构。

局部性原理

局部性原理是指程序在执行过程中,对数据和指令的访问呈现出一定的局部集中性特征,主要包括时间局部性和空间局部性。

时间局部性指一个数据或指令在短时间内会被多次访问,例如循环中的变量重复使用。

空间局部性指访问某个数据时,其相邻的数据也可能被访问,例如数组的顺序遍历。

在虚拟内存和分页机制中,局部性原理具有重要作用。由于程序访问具有局部性特点,操作系统可以利用时间局部性通过缓存机制提高页的命中率,利用空间局部性通过预取机制提前加载相邻页面,从而减少缺页次数,提高内存访问效率。

😺文件系统

  • 存储管理:将文件数据存储到物理存储介质中,并且管理空间分配,以确保每个文件都有足够的空间存储,并避免文件之间发生冲突。
  • 文件管理:文件的创建、删除、移动、重命名、压缩、加密、共享等等。
  • 目录管理:目录的创建、删除、移动、重命名等等。
  • 文件访问控制:管理不同用户或进程对文件的访问权限,以确保用户只能访问其被授权访问的文件,以保证文件的安全性和保密性。

文件系统是操作系统中负责管理和组织磁盘文件与目录的数据管理模块。核心作用是将底层复杂的磁盘存储抽象成统一的文件和目录结构,方便用户使用。

硬链接 vs 软链接

在 Linux 文件系统中,硬链接和软链接都是用于指向文件的机制。作用是让多个路径指向同一个文件或资源。

在文件系统中,inode(索引节点)才是真正的文件实体,文件名只是“映射”。

所以 Linux 允许:

  • 一个 inode → 多个文件名(硬链接)
  • 一个路径 → 另一个路径(软链接)

硬链接是多个文件名指向同一个 inode 节点,因此它们本质上是同一个文件,删除其中一个不会影响其他硬链接,只有所有硬链接都被删除后文件才会被真正释放。硬链接不能跨文件系统,也不能对目录创建。

软链接类似于快捷方式,它拥有独立的 inode,内部保存的是目标文件的路径引用。当源文件被删除后,软链接会失效,成为断链。软链接可以跨文件系统,也可以指向目录。

提高文件系统性能

第一,硬件优化,可以使用 SSD 或 NVMe 等高速存储设备替代机械硬盘。

第二,选择合适的文件系统,不同文件系统在性能和特性上存在差异,应根据业务场景选择合适的文件系统。

第三,使用缓存机制,通过将热点数据缓存在内存中,减少磁盘 IO 访问次数,从而提升整体性能,但需要注意缓存命中率问题。

第四,避免磁盘过度使用,应合理控制磁盘使用率,避免磁盘空间过满导致性能下降。

第五,进行合理的磁盘分区,将不同类型的数据分开存储,以减少文件碎片,提高访问效率。

常见的磁盘调度算法

  • 先来先服务算法(First-Come First-Served,FCFS):按照请求到达顺序处理,简单但性能较差。
  • 最短寻道时间优先算法(Shortest Seek Time First,SSTF):优先处理距离磁头最近的请求,性能较好但可能产生饥饿问题。
  • 扫描算法(SCAN):磁头像电梯一样双向移动,避免饥饿问题。
  • 循环扫描算法(Circular Scan,C-SCAN):磁头只单向移动,到达边界后返回起点,提供更均匀的等待时间。
  • 边扫描边观察算法(LOOK):对 SCAN 的优化,磁头不会移动到磁盘边界,而是在最后一个请求处反向。
  • 均衡循环扫描算法(C-LOOK):对 C-SCAN 的优化,如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

Q:为什么 SSTF 会导致饥饿?
A:因为总是优先处理最近的请求,远距离请求可能长期得不到执行。

Q:SCAN 为什么叫电梯算法?
A:因为磁头像电梯一样沿一个方向移动,逐层处理请求,到达边界再反向。

Q:LOOK 和 SCAN 有什么区别?
A:SCAN 必须移动到磁盘边界,而 LOOK 在没有请求时会提前反向,避免无效移动。

http://www.jsqmd.com/news/659844/

相关文章:

  • ClawdBot应用教程:本地AI助手权限管理,devices命令全解析
  • 从华数杯到数学建模:手把手教你用CCR模型搞定‘脱贫绩效评价’这类题
  • WebPlotDigitizer:5分钟学会图表数据提取,科研效率提升700%
  • 如何高效分析虚幻引擎Pak文件:UnrealPakViewer终极指南
  • 3步解锁微信网页版:告别“无法登录“的终极浏览器插件方案
  • 为什么你的C盘总是爆满?3个步骤让Windows Cleaner帮你彻底解决
  • UnrealPakViewer终极指南:5个简单步骤掌握虚幻引擎Pak文件分析
  • 解决MVC Web API中的级联保存问题
  • 10个宝藏资源网站盘点
  • 阿里 HappyOyster :AI 交互的下一个试金石?
  • 终极指南:3步掌握Wallpaper Engine资源提取与转换神器
  • DeepSeek-R1-Distill-Qwen-7B多场景应用:Ollama本地部署后支持教育领域习题讲解与解题步骤生成
  • Phi-4-mini-reasoning 3.8B:开源轻量模型在多样化任务上的综合能力展示
  • 【雷达成像】主动式毫米波安检成像Matlab实现
  • 米拉-魁北克AI研究所教会小模型“聪明干活“
  • 如何5分钟完成视频字幕提取:Video-subtitle-extractor完整解决方案指南
  • 免费开源!AMD Ryzen处理器底层调试终极指南:SMUDebugTool让你的硬件性能触手可及
  • YDFID-1:纺织行业AI质检标准化数据集的革命性突破
  • 芯擎科技宣布完成超1亿美元融资 京铭资本领投 宇通跟投
  • 如何用CLIP实现更精准的图像分割?CRIS框架实战解析(附代码)
  • 杭州邹氏建设服务有限公司:杭州砸墙拆除服务 - LYL仔仔
  • C++ if else 语句怎么用?
  • SpringAOP:面向切面编程
  • 环境配置地狱终结者:DevContainer实战避坑手册
  • GLM-OCR部署性能调优:CUDA Graph启用+KV Cache优化降低首token延迟
  • Qwen3.5-9B镜像部署全攻略:开箱即用,体验强逻辑推理与多模态理解
  • WechatDecrypt微信聊天记录解密工具:3步轻松恢复加密数据
  • 微信立减金套装回收是真的吗?表妹的经历让我恍然大悟 - 京顺回收
  • TranslucentTB透明任务栏:Windows 10/11系统美化实战解决方案
  • 空气解决方案提供商Madison Air纽交所上市:募资22亿美元 市值155亿美元