操作系统八股文学习笔记

news2025/1/16 4:52:27

总结来自于javaguide,本文章仅供个人学习复习
javaguide操作系统八股

操作系统主要的两大块,进程线程(利用CPU),内存分页(利用内存),文件管理(磁盘利用)

文章目录

  • 操作系统基础
    • 什么是操作系统?
    • 操作系统主要有哪些功能?
    • 常见的操作系统有哪些?
    • 用户态和内核态
    • 为什么要有用户态和内核态?只有一个内核态不行嘛?
    • 用户态和内核态是如何切换的?
    • 系统调用
  • 进程和线程
    • 什么是进程和线程?
    • 进程和线程的区别是什么?
    • 有了进程为什么还需要线程?
    • 为什么要使用多线程?
    • 线程间的同步的方式有哪些?
    • PCB是什么?包括哪些信息?
    • 进程有哪几种状态?
    • 进程间的通信方式有哪些?
    • 进程的调度算法有哪些?(重要)
    • 什么是僵尸进程和孤儿进程?
  • 死锁
    • 什么是死锁?
    • 产生死锁的四个必要条件是什么?
    • 能写一个模拟产生死锁的代码吗?
    • 解决死锁的方法
  • 内存管理
    • 内存管理主要做了什么?
    • 什么是内存碎片?
    • 常见的内存管理方式有哪些?
    • 虚拟内存
    • 分段机制
    • 分页机制
    • 分页机制和分段机制有哪些共同点和区别?
    • 段页机制
    • 局部性原理
  • 文件系统
    • 文件系统主要做了什么?
    • 硬连接和软链接有什么区别?
    • 硬链接为什么不能跨文件系统?
    • 提高文件系统性能的方式有哪些?
    • 常见的磁盘调度算法有哪些?

操作系统基础

什么是操作系统?

什么是操作系统?

  • 操作系统是管理计算机硬件与软件资源的程序,是计算机的基石
  • 操作系统本质上是一个运行在计算机上的软件程序,主要用于管理计算机硬件和软件资源.
  • 操作系统的存在屏蔽硬件层的复杂性.操作系统是硬件使用的负责人
  • 内核(kernel)是操作系统的核心部分,负责系统的内存管理,CPU\磁盘等硬件管理,文件系统管理,应用程序管理.
    应用程序<–>内核<–>CPU,内核是OS层面,CPU是硬件层面

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

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

  • 进程和线程的管理
  • 存储管理,内存\外存
  • 文件管理,文件的CRUD
  • 设备管理,完成设备(输入输出设备)
  • 网络管理,操作系统负责管理计算机网络的使用.
  • 安全管理,用户的身份认证\访问控制\文件加密

常见的操作系统有哪些?

常见的操作系统有哪些?
Windows\Unix\Linux\mac
Linux严谨应该称为GNU/Linux,Linux实际就是Linux内核,其余部分主要由GNU工程编写和提供的程序组成,操作系统除了内核还有用户界面\设备驱动程序\文件系统等

用户态和内核态

常见的操作系统有哪些?

  • 用户态:用户态运行的进程可以直接读取用户程序的数据,拥有较低的权限.
  • 内核态:内核态运行的进程几乎可以访问计算机的任何资源包括系统的内存空间\设备\驱动程序,拥有非常高的权限.
    进入内核态需要付出较高的开销(需要进行一系列的上下文切换和权限检查),应该尽量减少进入内核态的次数.

为什么要有用户态和内核态?只有一个内核态不行嘛?

常见的操作系统有哪些?

  • 在CPU的所有指令中,有一些指令是比较危险的比如内存分配\IO处理,如果所有的程序都能使用这些指令的话,很危险.
    只能由操作系统内核执行的指令被称为特权指令.
  • 如果只有一个内核态,所有程序或进程必须共享系统资源,CPU等,将导致系统资源的竞争和冲突,影响性能.
    为了让不同的进程有不同的权限

用户态和内核态是如何切换的?

用户态切换到内核态的3种方式:

  • 系统调用(Trap)
    用户态进程主动要求切换到内核态的一种方式,系统调用的机制核心还是使用了OS为用户特别开放的一个中断实现.
  • 中断(Interrupt)
    当外围设备完成用户请求的操作后,向CPU发出响应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。
  • 异常(Exception)
    当CPU在执行运行在用户态时,发生异常.
    异常是由指令造成的,中断是来自处理器外部的
例子
用户程序通过系统调用请求从硬盘读取数据:
    用户程序调用 read(),陷入内核态。
    内核通过硬盘驱动向硬盘发送读取请求。//发完请求到读取硬盘数据这段时间,进程或者CPU就可能干用户态别的去了
硬盘完成数据读取后,发出中断信号:
    CPU 接收到硬盘中断信号。
    当前的用户态程序暂停执行,切换到内核态,执行硬盘中断处理程序。
硬盘中断处理程序完成后:
    内核将读取的数据放入内存缓冲区。
    通知用户程序读取操作已完成,切换回用户态。

用户态和内核态的切换,本质上是 CPU 的运行模式在用户态和内核态之间的切换,而不是进程本身切换状态。

系统调用

什么是系统调用?
运行的程序基本都运行在用户态,系统调用通过调用操作系统提供的内核态级别的子功能.
按功能分为:

  • 设备管理
  • 文件管理
  • 进程管理
  • 内存管理
    系统调用和普通库函数的调用很相似,只是系统调用由操作系统内核提供,运行于内核态
    系统调用是应用程序与操作系统之间进行交互的一种方式,通过系统调用,应用程序可以访问操作系统底层资源.

系统调用的过程了解吗?

  1. 用户态的程序发起系统调用,因为系统调用中设计一些特权指令,用户态程序权限不足,因此会中断执行,也就是Trap
  2. 发生中断后,当前CPU执行的程序会中断,跳转到中断处理程序,内核程序开始执行,也就是开始处理系统调用.
  3. 内核处理完成后,主动触发Trap,这样会再次发生中断,切换回用户态工作.

进程和线程

linux系统上用户的关系

每个用户都有用户ID(UID),组ID(GID)
文件的面向不同的用户的权限:
- 文件所有者的权限
- 文件所属组的权限
- 其他所有用户的权限
权限有r(读)w(写)x(执行权限)

线程\进程\子进程的关系

子进程由父进程fork()创建,进程\子进程有独立的PCB,一个进程至少有一个主线程
线程是OS调度的最小单位,Linux中线程是特殊类型的进程,多个线程共享同一进程资源(内存\文件描述符),线程有独立的TCB
进程\子进程有独立的PID,子进程有PPID,线程有独立的TID,一个进程的多个线程共属一个PID
系统启动时会创建一个init(较新版本里时systemd)进程(祖父进程),每打开一个终端就是创建了一个进程,在这个终端中运行一个程序就是创建一个子进程,当关闭这个终端,这个程序还在运行,就会被systemd进程收养.
在子进程的父进程结束,还没被systemd收养的时间段是孤儿进程

什么是进程和线程?

什么是进程和线程?

  • 进程,计算机中正在运行的一个程序实例
  • 线程,被称为轻量级进程.

进程和线程的区别是什么?

进程和线程的区别是什么?

  • 从JVM的角度分析,一个进程可以有多个线程,多个线程共享进程的堆和方法区,但每个线程有自己的程序计数器\虚拟机栈和本地方法栈
  • 线程是进程划分的更小的运行单位,一个进程在其执行的过程中可以产生多个线程
  • 线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极可能互相影响
  • 线程执行开销小,但不利于资源的管理和保护

有了进程为什么还需要线程?

有了进程为什么还需要线程?

  • 进程切换是一个开销很大的操作,线程切换的成本低
  • 线程更轻量,一个进程可以创建多个线程
  • 多个线程可以并发处理不同的任务,更有效地利用了多处理器和多核计算机.而进程只能在一个时间干一件事
  • 同一进程内的线程共享内存和文件,因此它们之间互相通信无需调用内核

为什么要使用多线程?

为什么要使用多线程?

  • 从计算机底层来说:
    线程可以比作是轻量级的进程,线程间的切换和调度的成本远远小于进程.
  • 从当代互联网发展趋势来说:
    现在的系统动不动要求几百万级的并发量,多线程正是并发系统的基础,利用好多线程机制可以大大提高系统整体的并发能力性能.
  • 单核情况:单核时代多线程主要是为了提高进程利用CPU和IO系统的效率.比如当请求IO时,如果JAVA进程中只有一个线程,此线程被IO阻塞则整个进程被阻塞.
  • 多核时代:多核时代多线程主要是为了提高进程利用多核CPU的能力.如果一个复杂任务,只用一个线程的话,不论线程有几个CPU都只会有一个CPU核心被利用.

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

线程间的同步的方式有哪些?(这里的同步指的是一个线程内一段代码的同步,在一个完整的时间片执行)
线程同步是两个或多个共享关键资源的线程的并发执行.应该同步线程以避免关键的资源使用冲突.
几种方式:

  • 互斥锁(Mutex)
    采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限.比如java中的synchornized锁和Lock锁
  • 读写锁(Read-Write Lock)
    允许多个线程同时读取共享资源,但只有一个线程可以对共享资源写操作
  • 信号量(Semaphore)
    允许同一时刻多个线程访问同一资源,但需要控制同一时刻访问此资源的最大线程数量.
  • 屏障(Barrier)
    屏障是一种同步原语,用于等待多个线程到达某个点再一起继续执行.比如java中的CyclicBarrier
  • 事件(Event)
    Wait\Notify,通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作.

PCB是什么?包括哪些信息?

进程控制块,是操作系统中用来管理和跟踪进程的数据结构.每个进程一个PCB,视为进程的大脑.
当创建一个新进程时,为该进程分配一个唯一的进程ID,并创建PCB.进程执行时,PCB中的信息不断变化,操作系统根据这些信息来管理和调度进程.
内容:

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

进程有哪几种状态?

进程有哪几种状态?
这一点和线程很像,但不太一样,具体看多线程

  • 创建状态
  • 就绪状态,有执行资源(除CPU的一切资源),无执行权(CPU)
  • 运行状态
  • 阻塞状态,没有执行资源,没有执行权(CPU)
  • 结束状态

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

  • 管道/匿名管道,有亲缘关系的父子兄弟进程之间
  • 有名管道,匿名管道没有名字,只能用于亲缘关系的进程间的通信.有名管道遵循先进先出,以磁盘文件方式存在,实现本机任意两个进程通信
  • 信号(signal),信号是一种比较复杂的通信,用于通知接收进程某个事件已发生
  • 消息队列,消息队列是消息的链表,有特定的格式,存放在内存中并由消息队列标识符标识.也是先进先出的原则.
    与管道不同的是消息队列存放在内核中,只有在内核重启或者显式地删除一个消息队列时,该消息队列才会被真正地删除.消息队列可以实现消息地随机查询,消息不一定要以先进先出次序读取,也可以按消息地类型读取.
    消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点
    无名管道,只存在于内存中的文件
    有名管道,存在于实际的磁盘介质或文件系统
  • 信号量(semaphores)
    信号量是一个计数器,用于多线程对共享数据的访问,信号量的意图在于进程间同步.这种通信方式主要用于解决与同步相关的问题并避免竞争条件
  • 共享内存
    使多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程种对共享内存种数据的更新.这种方式需要依靠某种同步操作,如互斥锁和信号量等.可以说这是最有用的进程间通信方式.
  • 套接字
    此方法主要用于在客户端和服务器之间通过网络进行通信.端口通信

进程的调度算法有哪些?(重要)

进程的调度算法有哪些?

  • 先到先服务调度算法
  • 短作业优先的调度算法,从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用 CPU 时再重新调度。
  • 时间片轮转调度算法,每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
  • 多级反馈队列调度算法,
    前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成,因而它是目前被公认的一种较好的进程调度算法,UNIX 操作系统(windows也是\mac使用类似的)采取的便是这种调度算法。
    核心思想:
    根据进程的优先级划分多个队列,每个队列可能有不同的时间片大小。
    优先级较高的进程先运行,优先级较低的进程在资源空闲时运行。
    随着时间推移,长时间未运行的低优先级进程可能被动态提升优先级,以防止饥饿。
  • 优先级调度算法,具有相同优先级的进程以 FCFS 方式执行

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

什么是僵尸进程和孤儿进程?
当一个进程调用 exit()系统调用结束自己的生命时,内核会释放该进程的所有资源,包括打开的文件、占用的内存等,但是该进程对应的 PCB 依然存在于系统中。这些信息只有在父进程调用 wait()或 waitpid()系统调用时才会被释放,以便让父进程得到子进程的状态信息。
父进程结束,僵尸状态的子进程也会被清理,以上的情况适用在子进程结束,父进程还运行的情况
wait()函数,子进程没结束,父进程适用wait()会等待

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

如何查看是否有僵尸进程?
Linux 下可以使用 Top 命令查找,zombie 值表示僵尸进程的数量,为 0 则代表没有僵尸进程。
下面这个命令可以定位僵尸进程以及该僵尸进程的父进程:
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]'

死锁

什么是死锁?

什么是死锁?
死锁(Deadlock)描述的是这样一种情况:多个进程/线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于进程/线程被无限期地阻塞,因此程序不可能正常终止。
能列举一个操作系统发生死锁的例子吗?
嵌套锁

产生死锁的四个必要条件是什么?

产生死锁的四个必要条件是什么?

  • 互斥
  • 占有并等待
  • 非抢占,资源不能被抢占.只有在持有资源的进程完成任务后,该资源才会被释放
  • 循环等待,有一组等待进程{p0,p1…},P0 等待的资源被 P1 占有,P1 等待的资源被 P2 占有,……,Pn-1 等待的资源被 Pn 占有,Pn 等待的资源被 P0 占有。
    这四个条件是产生死锁的 必要条件 ,也就是说只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

能写一个模拟产生死锁的代码吗?

操了,手撕是吧

解决死锁的方法

  • 预防,限制并发进程对资源的请求,从而使得死锁的必要条件在系统执行的任何时间上都不满足
  • 避免,系统在分配资源时,根据资源的使用情况提前做出预测,从而避免死锁的发生
  • 检测,系统设有专门的机构,当死锁发生时,该机构能够检测死锁的发生,并精确地确定与死锁有关的进程和资源
  • 解除,与检测相配套的一种措施,用于将进程从死锁状态下解脱出来

内存管理

内存管理主要做了什么?

内存管理主要做了什么?

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

什么是内存碎片?

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

  • 内部内存碎片:已经分配给进程使用但未被使用的内存.导致内部内存碎片的主要原因是,当采用固定比例比如2的幂次方进行内存分配时,进程所分配的内存可能会比其实际所需要的大.举个例子,一个进程只需要65字节的内存,但为其分配了128大小的内存,那63字节的内存就成为了内部内存碎片
  • 外部内存碎片:由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间被称为外部碎片.也就是说,外部内存碎片指的是那些并未分配给进程但又不能使用的内存.分段机制就会导致外部内存碎片.
    内存碎片会导致内存利用率下降,如何减少内存碎片是内存管理非常重视的一件事.

常见的内存管理方式有哪些?

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

  • 连续内存管理
    块式管理,早期计算机使用,为每个进程分配一个块.内部和外部内存碎片都很严重
    Linux系统中,连续内存管理采用了伙伴系统(Buddy System)算法实现,主要思想是将内存按 2 的幂次划分(每一块内存大小都是 2 的幂次比如 2^6=64 KB),并将相邻的内存块组合成一对伙伴,
    有效解决外部内存碎片,但仍存在内部内存碎片问题.这主要是因为伙伴系统只能分配大小为 2^n 的内存块,因此当需要分配的内存大小不是 2^n 的整数倍时,会浪费一定的内存空间。举个例子:如果要分配 65 大小的内存快,依然需要分配 2^7=128 大小的内存块。
  • 非连续内存管理
    • 段式管理:一一段连续的物理内存的形式管理分配物理内存.应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。
    • 页式管理(现在广泛使用,重点理解):把物理内存分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页,是现代操作系统广泛使用的一种内存管理方式。
    • 段页式管理机制:结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。

虚拟内存

什么是虚拟内存?有什么用?
虚拟内存是计算机系统内存管理非常重要的一个技术,本质上来说它只是逻辑存在的,是一个假想出来的内存空间,主要作用是作为进程访问主存(物理内存)的桥梁并简化内存管理

  • 隔离进程:物理内存通过虚拟地址空间访问,虚拟地址空间与进程一一对应.每个进程都认为自己拥有了整个物理内存,进程之间彼此隔离,一个进程中的代码无法更改正在由另一个进程或操作系统使用的物理内存
  • 提升物理内存利用率:有了虚拟地址空间后,操作系统只需要将进程当前正在使用的部分数据或指令加载入物理内存
  • 简化内存管理:进程都有一个一致且私有的虚拟地址空间,程序员不用和真正的物理内存打交道,而是借助虚拟地址空间访问物理内存,从而简化了内存管理.
  • 多个进程共享物理内存:进程在运行过程中,会加载许多操作系统的动态库.这些库对于每个进程而言都是公用的,它们在内存中实际只会加载一份,这部分称为共享内存
  • 提高内存使用安全性:控制进程对物理内存的访问,隔离不同进程的访问权限,提高系统的安全性.
  • 提供更大的可使用内存空间:可以让程序拥有超过系统物理内存大小的可用内存空间.这是因为当物理内存不够用时,可以利用磁盘充当,将物理内存页(通常为4KB)保存到磁盘文件(会影响读写速度),数据或代码页会根据需要在物理内存与磁盘之间移动.

没有虚拟内存有什么问题?
如果没有虚拟内存的话,程序直接访问和操作的都是物理内存,看似少了一层中介,但多了很多问题.
具体出现的问题:

  • 用户程序可以访问任意物理内存,可能会不小心操作到系统运行必须的内存,进而造成操作系统崩溃,严重影响系统的安全.
  • 同时运行多个程序容易崩溃.比如你想同时运行一个微信和一个QQ音乐,微信在运行的时候给内存地址1xxx 赋值后,QQ 音乐也同样给内存地址 1xxx 赋值,那么 QQ 音乐对内存的赋值就会覆盖微信之前所赋的值,这就可能会造成微信这个程序会崩溃。
  • 程序运行过程中使用的所有数据或指令都要载入物理内存,根据局部性原理,很大一部分可能都不会用到,白白占用宝贵的物理内存资源.

什么是虚拟地址和物理地址?
物理地址(Physical Address) 是真正的物理内存中地址,更具体点来说是内存地址寄存器中的地址。程序中访问的内存地址不是物理地址,而是 虚拟地址(Virtual Address) 。
操作系统一般通过CPU芯片中一个重要组件MMU(内存管理单元)将虚拟地址转换为物理地址,这个过程被称为地址翻译/地址转换

什么是虚拟地址空间和物理地址空间?

  • 虚拟地址空间是虚拟地址的集合,是虚拟内存的范围.每个进程都有一个一致且私有的虚拟地址空间
  • 物理地址空间是物理地址的集合,是物理内存的范围

虚拟地址与物理内存地址是如何映射的?
三种机制:

  • 分段机制
  • 分页机制
  • 段页机制
    现代操作系统广泛采用分页机制

分段机制

分段机制以段(一段 连续 的物理内存)的形式管理/分配物理内存。应用程序的虚拟地址空间被分为大小不等的段,段是有实际意义的,每个段定义了一组逻辑信息,例如有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。

段表有什么用?地址翻译过程是怎么样的?
分段管理通过段表映射虚拟地址和物理地址
分段机制下的虚拟地址由两部分组成:

  • 段号:标识着该虚拟地址属于整个虚拟地址空间中的哪一个段
  • 段内偏移量:相对于该段起始地址的偏移量

具体的地址翻译过程如下:

  1. MMU首先解析得到虚拟地址中的段号
  2. 通过段号去该进程的段表中取出对应的段信息
  3. 从段信息中取出该段的起始地址(物理地址)加上虚拟地址中的段内偏移量得到最终的物理地址

通过段号一定要找到对应的段表项吗?得到最终的物理地址后对应的物理内存一定存在吗?
不一定.段表项可能不存在:

  • 段表项被删除
  • 段表项还未创建,系统内存不足无法创建

分段机制为什么会导致内存外部碎片?
分段机制容易出现外部内存碎片,即在段与段之间留下碎片空间.从而造成物理内存资源利用率降低.
开始分段都是挨着分的,但是随着不用的内存的段被释放,久而久之,碎片就产生了

分页机制

分页机制把内存(物理内存)分为连续等长的物理页,应用程序的虚拟地址空间也被划分为连续等长的虚拟页.现代操作系统广泛采用分页机制.
这里的页是连续等长的,不同于分段机制下不同长度的段
按照固定页大小分配物理内存,使得物理内存资源易于管理,可有效避免分段机制中外部内存碎片的问题.

页表有什么用?地址翻译过程是怎么样的?
分页管理通过页表映射虚拟地址和物理地址.
分页机制下的虚拟地址由两部分组成:

  • 页号,通过虚拟页号可以从页表中取出对应的物理页号
  • 页内偏移量,物理页起始地址+页内偏移量=物理内存地址

具体的地址翻译过程如下:

  1. MMU首先解析得到虚拟地址中的虚拟页号
  2. 通过虚拟页号去该应用程序的页表中取出对应的物理页号
  3. 用该物理页号对应的物理页起始地址(物理地址)加上虚拟地址中的页内偏移量得到最终的物理地址

通过虚拟页号一定要找到对应的物理页号吗?找到了物理页号得到最终的物理地址后对应的物理页一定存在吗?
不一定.可能存在页缺失.也就是说,物理内存中没有对应的物理页或者物理内存中有对应的物理页但虚拟页还未和物理页建立映射(页表项不存在).

单机页表有什么问题?为什么需要多级页表?
以 32 位的环境为例,虚拟地址空间范围共有 2^32(4G)。假设 一个页的大小是 2^12(4KB),那页表项共有 4G / 4K = 2^20 个。每个页表项为一个地址,占用 4 字节,2^20 * 2^2 / 1024 * 1024= 4MB。也就是说一个程序啥都不干,页表大小就得占用 4M。
系统运行的应用程序多起来的话,页表的开销还是非常大的.而且,绝大部分应用程序可能只能用到页表中的几项,其他的白白浪费了.
为了解决这个问题,操作系统引入了多级页表,多级页表对应多个页表,每个页表与前一个页表相关联.32位系统一般为2级页表,64位系统一般为四级页表
假设只需要 2 个二级页表,那两级页表的内存占用情况为: 4KB(一级页表占用) + 4KB * 2(二级页表占用) = 12 KB。
多级页表属于时间换空间的典型场景,利用增加页表查询的次数减少页表占用的空间
虚拟地址解析后可得到一级页表索引+二级页表索引+偏移量
这个地址翻译的过程是:

  1. 解析虚拟地址,得一级页表索引+二级页表索引+偏移量
  2. 用一级页表索引从一级页表中得到二级页表地址
  3. 用二级页表索引从二级页表中得到物理页起始地址
  4. 物理页起始地址+偏移量得最终物理地址
    比如一个页可能存多个变量或对象.不同的偏移量要区分不同的对象啊

TLB有什么用?使用TLB之后的地址翻译流程是怎样的?
为了提高虚拟地址到物理地址的转换速度,操作系统在页表方案基础之上引入了转址旁路缓存(也称快表)
可以看作是缓存着键值对的哈希表
使用TLB之后的地址翻译流程是:

  1. 用虚拟地址中的虚拟页号作为key去TLB中查询
  2. 如果能查到对应的物理页的话,就不用再查询页表了,这种情况称为 TLB 命中(TLB hit)。
  3. 如果不能查到对应的物理页的话,还是需要去查询主存中的页表,同时将页表中的该映射表项添加到 TLB 中,这种情况称为 TLB 未命中(TLB miss)。
  4. 当 TLB 填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
    由于页表也在主存中,因此在没有 TLB 之前,每次读写内存数据时 CPU 要访问两次主存。有了 TLB 之后,对于存在于 TLB 中的页表数据只需要访问一次主存即可。
    TLB的设计思想非常简单,但命中率往往非常高,效果很好。这就是因为被频繁访问的页就是其中的很小一部分。
    看完了之后你会发现快表和我们平时经常在开发系统中使用的缓存(比如Redis)很像,的确是这样的,操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。

什么是页缺失?

  • 硬性页缺失,物理内存中没有对应的物理页.于是,Page Fault Handler 会指示 CPU 从已经打开的磁盘文件中读取相应的内容到物理内存,而后交由 MMU 建立相应的虚拟页和物理页的映射关系。
  • 软性页缺失,物理内存中有对应的物理页,但虚拟页还未和物理页建立映射。于是,Page Fault Handler 会指示 MMU 建立相应的虚拟页和物理页的映射关系。
    发生上面这两种缺页错误的时候,应用程序访问的是有效的物理内存,只是出现了物理页缺失或者虚拟页和物理页的映射关系未建立的问题。如果应用程序访问的是无效的物理内存的话,还会出现 无效缺页错误(Invalid Page Fault)。
    硬性页缺失的例子:
    假设程序在启动时请求了 2GB 的虚拟内存,但是它的物理内存只有 8GB。当程序仅仅使用了一部分内存时,操作系统会将未使用的部分页面交换到磁盘上。
    当当前进程修改的物理页(或者说与虚拟地址映射的)不在内存中,被交换到磁盘中,会在页表中标记"不在内存中",就可以解释在两个进程不希望共享的内存被对方使用又希望使用交换到磁盘的机制如何实现的了.

常见的页面置换算法有哪些?
当发生硬性页缺失时,如果物理内存中没有空闲的物理页面可用的话。操作系统就必须将物理内存中的一个物理页淘汰出去(到磁盘),这样就可以腾出空间来加载新的页面了

  • 最佳页面置换算法,
    先选择淘汰的页面是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,只是理论最优的页面置换算法,可以作为衡量其他置换算法优劣的标准。
  • 先进先出页面置换算法
  • 最近最久未使用页面置换算法(LRU)
  • 最少使用页面置换算法(LFU)
  • 时钟页面置换算法

FIFO 页面置换算法性能为何不好?

  • 经常访问或者需要长期存在的页面会被频繁调入调出
  • 存在Belady现象,被置换的页面并不是进程不会访问的,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。

哪一种页面置换算法实际用的比较多?
LRU 算法是实际使用中应用的比较多,也被认为是最接近 OPT 的页面置换算法。
不过,需要注意的是,实际应用中这些算法会被做一些改进,就比如 InnoDB Buffer Pool( InnoDB 缓冲池,MySQL 数据库中用于管理缓存页面的机制)就改进了传统的 LRU 算法,使用了一种称为"Adaptive LRU"的算法(同时结合了 LRU 和 LFU 算法的思想)。

分页机制和分段机制有哪些共同点和区别?

分页机制和分段机制有哪些共同点和区别?

  • 共同点
    • 都是非连续内存管理的方式
    • 都采用了地址映射的方法,将虚拟地址映射到物理地址,以实现对内存的管理和保护
  • 区别
    • 分页机制以页面为单位进行内存管理,而分段机制以段为单位进行内存管理.页的大小是固定的,由操作系统决定.段的大小不固定,取决于我们当前运行的程序
    • 页是物理单位,即操作系统将物理内存划分为固定大小的页面.而段是逻辑单位,是为了满足程序对内存空间的逻辑需求而设计的,通常根据程序中数据和代码的逻辑结构来划分
    • 分段机制容易出现外部内存碎片.
    • 分页机制采用了页表完成虚拟地址到物理地址的映射,页表通过一级页表和二级页表来实现多级映射;而分段机制则采用了段表来完成虚拟地址到物理地址的映射,每个段表项中记录了该段的起始地址和长度信息
    • 分页机制对程序没有任何要求,程序只需要按照虚拟地址进行访问即可;而分段机制需要程序员将程序分为多个段,并且显式地使用段寄存器来访问不同的段

段页机制

结合了段式管理和页式管理的一种内存管理机制,把物理内存先分成若干段,每个段又继续分成若干大小相等的页。
地址翻译的过程分为两个步骤:

  1. 段式地址映射
  2. 页式地址映射

局部性原理

想要更好地理解虚拟内存技术,必须要知道计算机中著名地局部性原理.另外,局部性原理既适用于程序结构,也适用于数据结构,是非常重要地一个概念.
局部性原理是指在程序执行过程中,数据和指令地访问存在一定地空间和时间上地局部性特点.其中,时间局部性是指一个数据项或指令在一段时间内被反复使用的特点,空间局部性是指一个数据项或指令在一段时间内与其相邻的数据项或指令被反复使用的特点.
在分页机制中,页表的作用是将虚拟地址转换为物理地址,从而完成内存访问.在这个过程中,局部性原理的作用体现在两个方面:

  • 时间局部性:由于程序中存在一定的循环或重复操作,因此会反复访问同一个页或一些特定的页,这就体现了时间局部性的特点.为了利用时间局部性,分页机制中通常采用缓存机制来提高页面的命中率,即将最近访问过的一些页放入缓存中,如果下一次访问的页已经在缓存中,就不需要再次访问内存,而是直接从缓存中读取.
  • 空间局部性:由于程序中数据和指令的访问通常是具有一定的空间连续性的,因此当访问某个页时,往往会顺带访问其相邻的一些页.为了利用空间局部性,分页机制中通常采用预取技术来预先将相邻的一些页读入内存缓存中,以便在未来访问时能够直接使用,从而提高访问速度.
    总之,局部性原理是计算机体系结构设计的重要原则之一,也是许多优化算法的基础。在分页机制中,利用时间局部性和空间局部性,采用缓存和预取技术,可以提高页面的命中率,从而提高内存访问效率

文件系统

文件系统主要做了什么?

文件系统主要做了什么?
文件系统主要负责管理和组织计算机存储设备上的文件和目录,其功能包括以下几个方面:

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

硬连接和软链接有什么区别?

硬连接和软链接有什么区别?
在Linux\类Unix系统上,文件链接是一种特殊的文件类型,可以在文件系统中指向另一个文件.常见的文件链接类型有两种:

  • 硬链接
    • 在Linux\类Unix文件系统中,每个文件和目录都有一个唯一的索引节点(inode)号,用来标识该文件或目录.硬链接通过innode节点号建立链接,硬链接和源文件的inode节点号相同,两者对文件系统来说是完全平等的(可看作互为硬链接,源头是同一份文件),删除其中任何一个对另外一个没有影响,可以通过给文件设置硬链接文件来防止重要文件被误删
    • 只有删除了源文件和所有对应的硬链接文件,该文件才会被真正删除
    • 硬链接具有一些限制,不能对目录以及不存在的文件创建硬链接,并且,硬链接也不能跨越文件系统.
    • ln命令用于创建硬链接.
  • 软链接
    • 软链接和源文件的inode节点号不同,而是指向一个文件路径
    • 源文件删除后,软链接依然存在,但是指向的是一个无效的文件路径
    • 软连接类似于windows系统中的快捷方式
    • 不同于硬链接,可以对目录或者不存在的文件创建软连接,并且,软连接可以跨越文件系统
    • ln -s命令用于创建软链接

硬链接为什么不能跨文件系统?

硬链接为什么不能跨文件系统?
我们之前提到过,硬链接是通过inode节点号建立链接的,而硬链接和源文件共享相同的inode节点号
然而,每个文件系统都有自己的独立inode表,且每个inode表只维护该文件系统内的inode.如果在不同的文件系统之间创建硬链接,可能会导致inode节点号冲突的问题,即目标文件的inode节点号已经在该文件系统中被使用.

提高文件系统性能的方式有哪些?

提高文件系统性能的方式有哪些?

  • 优化硬件:
    使用高速硬件设备(SSD\NVMe)替代传统的机械硬件,使用RAID(Redundant Array of Inexpensive Disks)等技术提高磁盘性能
  • 选择合适的文件系统选型:
    不同的文件系统具有不同的特性,对于不同的应用场景选择合适的文件系统可以提高系统性能
  • 运用缓存,
    访问磁盘的效率比较低,可以运用缓存来减少磁盘的访问次数.不过,需要注意缓存命中率,缓存命中率过低的话,效果太差
  • 避免磁盘过度使用
    注意磁盘的使用率,避免将磁盘用满,尽量留一些剩余空间,以免对文件系统的性能产生负面影响
  • 对磁盘进行合理的分区
    合理的磁盘分区方案,能够使文件系统在不同的区域存储文件,从而减少文件碎片,提高文件读写性能

常见的磁盘调度算法有哪些?

磁盘调度算法是操作系统中对磁盘访问请求进行排序和调度的算法,其目的是提高磁盘的访问效率
一次磁盘读写操作的时间由磁盘寻道/寻找时间、延迟时间和传输时间决定。磁盘调度算法可以通过改变到达磁盘请求的处理顺序,减少磁盘寻道时间和延迟时间。
磁盘是自转的,磁头是从内往外移动或者从外往内移动的
磁盘调度算法包括:

  • 先来先服务FCFS
  • 最短寻道时间优先算法.SSTF
    优先选择距离当前磁头位置最近的请求进行服务。SSTF 算法能够最小化磁头的寻道时间,但容易出现饥饿问题,即磁头附近的请求不断被服务,远离磁头的请求长时间得不到响应。实际应用中,需要优化一下该算法的实现,避免出现饥饿问题。
  • 扫描算法SCAN
    也被称为电梯(Elevator)算法,基本思想和电梯非常类似。磁头沿着一个方向扫描磁盘,如果经过的磁道有请求就处理,直到到达磁盘的边界,然后改变移动方向,依此往复。SCAN 算法能够保证所有的请求得到服务,解决了饥饿问题。但是,如果磁头从一个方向刚扫描完,请求才到的话。这个请求就需要等到磁头从相反方向过来之后才能得到处理。
  • 循环扫描算法C-SCAN
    算法的变体,只在磁盘的一侧进行扫描,并且只按照一个方向扫描,直到到达磁盘边界,然后回到磁盘起点,重新开始循环。
  • 边扫描边观察算法LOOK
    算法中磁头到了磁盘的边界才改变移动方向,这样可能会做很多无用功,因为磁头移动方向上可能已经没有请求需要处理了。LOOK 算法对 SCAN 算法进行了改进,如果磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向,依此往复。也就是边扫描边观察指定方向上还有无请求,因此叫 LOOK。
  • 均衡循环扫描算法C-SCAN
    只有到达磁盘边界时才能改变磁头移动方向,并且磁头返回时也需要返回到磁盘起点,这样可能会做很多无用功。C-LOOK 算法对 C-SCAN 算法进行了改进,如果磁头移动的方向上已经没有磁道访问请求了,就可以立即让磁头返回,并且磁头只需要返回到有磁道访问请求的位置即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2277349.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《深度剖析算法优化:提升效率与精度的秘诀》

想象一下&#xff0c;你面前有一堆杂乱无章的数据&#xff0c;你需要从中找到特定的信息&#xff0c;或者按照一定的规则对这些数据进行排序。又或者&#xff0c;你要为一个物流公司规划最佳的配送路线&#xff0c;以降低成本和提高效率。这些问题看似复杂&#xff0c;但都可以…

量子计算:从薛定谔的猫到你的生活

文章背景 说到量子计算&#xff0c;不少人觉得它神秘又遥不可及。其实&#xff0c;它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”&#xff0c;这些听上去像科幻小说的概念&#xff0c;却为计算世界开辟了一片全新的天地。如果经典计算是“…

Linux第二课:LinuxC高级 学习记录day02

2.4、shell中的特殊字符 2.4.4、命令置换符 或者 $() 反引号&#xff1a;esc下面的按键&#xff0c;英文状态下直接按 功能&#xff1a;将一个命令的输出作为另一个命令的参数 echo 不会认为hostname是一个命令 加上 之后&#xff0c;先执行hostname&#xff0c;拿到主机名…

基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制 ​ 玩游戏&#xff0c;那不是有手就行!!! mediapipe介绍 ​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架&#xff0c;用于构建基于机器学习的应用程序&#xff0c;特别是涉及到计算机视觉、音频处理、姿势估计等领域。…

安装软件缺少msvcp110.dll怎么办?出现dll丢失的解决方法

在日常使用电脑安装各类软件的过程中&#xff0c;相信不少朋友都遇到过 “缺少 msvcp110.dll” 的报错提示 。下面就来深入聊聊这个 msvcp110.dll 文件&#xff0c;以及当它缺失时&#xff0c;我们该如何巧妙应对。 一、msvcp110.dll 文件介绍 1.1 定义与功能 msvcp110.dll 是…

(学习总结19)C++11 列表初始化、右值引用、移动语义、引用折叠与完美转发

C11 列表初始化、右值引用、移动语义、引用折叠与完美转发 一、列表初始化C98 传统的 {}C11 中的 {}C11 中的 std::initializer_listC11 {} 列表初始化 与 std::initializer_list 区别 二、右值引用左值和右值左值引用和右值引用引用延长生命周期左值和右值的参数匹配类型分类 …

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

ffmpeg硬件编码

使用FFmpeg进行硬件编码可以显著提高视频编码的性能&#xff0c;尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件&#xff08;如Intel QSV、NVIDIA NVENC、AMD AMF等&#xff09;来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。 1. 硬件编码支…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景&#xff0c;需要实现自动化系统目标&#xff1a; 标准化。 流程自助化。 可视化&#xff1a;可观测系统各项指标、包括全链路跟踪。 自动化&#xff1a;ci/cd 自动化部署。 精细化&#xff1a…

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下&#xff1a; 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字&#xff0c;我们在搜索时候会把自己的信息进行分词&#xff0c;会把数据库…

arcgis中生成格网矢量带高度

效果 1、数据准备 (1)矢量边界(miain.shp) (2)DEM(用于提取格网标高) (3)DSM(用于提取格网最高点) 2、根据矢量范围生成格网 模板范围选择矢量边界,像元宽度和高度根据坐标系来输入,我这边是4326的,所以输入的是弧度,输出格网矢量gewang.shp 3、分区统计 …

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中&#xff0c;一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器&#xff0c;其社区版本已能支持连接近百种数据库&#xff0c;受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器&#xff0c;基于 Region 内存布局的&#xff0c;不设分代&#xff0c;使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障&#xff0c;而 ZGC 用到了读屏障 染色指针&a…

C# XPTable 日期字段处理(XPTable控件使用说明十三)

1、SQLite数据库定义为日期类型 2、XPtable中日期字段定义与显示 //显示时间表columnModel1.Columns.Clear();columnModel1.Columns.Add(new NumberColumn("id", 30));NumberColumn numberColumn new NumberColumn("次数", 50);numberColumn.Maximum 100…

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法&#xff1a; 第一步&#xff1a;安装distutils&#xff0c;在CMD命令行输入&#xff1a; python -m ensurepip --default-pip第二步&#xff1a;检查和安装setuptools和wheel&#xff1a; python -m pip install --upgrade …

晨辉面试抽签和评分管理系统之六:面试答题倒计时

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

王炸组合:Dolphinscheudler 3.1.*搭配SeaT unnel2.3.*高效完成异构数据数据集成

概述 本篇主要介绍如何通过Dolphinscheduler海豚调度搭配Seatunnel完成异构数据源之间的数据同步功能&#xff0c;这个在大数据流批一体数仓建设的过程中是一个非常好的解决方案&#xff0c; 稳定高效&#xff0c;只要用上了你肯定爱不释手。 环境准备 dolphinscheduler集群…

【AI日记】25.01.11 Weights Biases | AI 笔记 notion

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛&#xff1a;Forecasting Sticker Sales笔记&#xff1a;我的 AI 笔记主要记在两个地方 有道云笔记&#xff1a;数学公式和符号比较多的笔记notion&#xff1a;没什么数学公式的…

Oracle EBS GL定期盘存WIP日记账无法过账数据修复

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 用户反映来源为“定期盘存”和类别为“WIP”的日记账无法过账,标准日记账的界面上的过账按钮灰色不可用。但是,在超级用户职责下,该日记账又可以过账,细心检查发现该业务实体下有二个公司段值15100和…