操作系统面试

一 操作系统基础

1.1 什么是操作系统

我通过以下四点向您介绍一下什么是操作系统吧!

  1. 操作系统(Operating System,简称 OS)是管理计算机硬件与软件资源的程序,是计算机的基石。
  2. 操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。 举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。
  3. 操作系统存在屏蔽了硬件层的复杂性。 操作系统就像是硬件使用的负责人,统筹着各种相关事项。
  4. 操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
    在这里插入图片描述

1.2 什么是系统调用

介绍系统调用前先简单说一下用户态和系统态。
根据进程访问资源的特点,我们可以吧进程在系统上运行分为两个级别:

  1. 用户态(user mode):用户运行进程或可以直接读取用户程序数据。
  2. 系统态(kernel mode):可以简单的理解为系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
    我们运行的程序基本都是运行在用户态,如果在需要调用操作系统提供的系统态级别的子功能,就需要系统调用了。
    也就是说在我们运行的用户程序中,凡是与系统态级别的资源有关的操作,都必须通过系统调用的方式向操作系统提出请求,并由操作系统代为完成。

这些系统调用按照功能来分可分为以下几种:

  • 设备管理:完成设备的请求或释放,以及设备启动等功能;
  • 文件管理:完成文件的读、写、创建和删除等功能;
  • 进程控制:完成进程的创建、阻塞、唤醒以及撤销等功能;
  • 进程通信:完成进程间的信息传递或信号传递等功能;
  • 内存管理:完成内存的分配、回收以及作业占用内存大小以及地址等功能;

二 进程和线程

2.1 进程和线程的概念,为什么要有进程和线程,其中有什么区别,他们各自又是怎么同步的

基本概念:
进程是对运行时程序的封装,是系统进行资源调配和分配的基本单位,实现了操作系统的并发;
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器;独自的寄存器组指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等),打开的文件队列和其他内核资源。

区别:

  1. 一个线程只能属于一个进程,而一个进程可以有多个进程,至少有一个线程。线程依赖于进程而存在。
  2. 进程在执行过程中拥有独立内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(对存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量临时变量。)
  3. 进程是资源分配的最小单位,线程是CPU调度的最小单位;
  4. 系统开销:由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤销线程的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程的切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。课件进程切换的开销也远大于线程切换的开销。
  5. 通信:由于同一 进程中的多个线程具有相同的地址空间,致使他们之间的同步和通信的实现,也变得比较同一。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无需操作系统内核的干预;
  6. 进程编程调试简单可靠性高,但是创建销毁开销大。线程正相反,开销小,切换速度快,但是编程调试相对复杂;
  7. 进程间不会互相影响;一个线程挂掉将导致整个进程挂掉;
  8. 进程适应于多核、多机分布;线程适应于多核;

2.2 进程有哪几种状态?

我们一般把进程大致分为5中状态,这一点和线程很想!

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

2.3 进程间的通信方式

进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket)

  1. 管道:
    管道主要包括无名管道和命名管道:管道可用于具有亲缘关系的父子进程间的通信,命名管道除了具有所具有的功能外,它还允许无亲缘关系进程间的通信。
    1.1 普通管道PIPE:
    1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
    2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)
    3)它可以看成是一种特殊文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

    1.2 命名管道FIFO:

    1. FIFO可以在无关进程之间交换数据
      2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
  2. 系统IPC
    2.1 消息队列
    消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符来标记。(消息队列克服了信息传递信息少管道只能承载无格式字节流以及缓冲区大小受限等特点)具有写权限的进程可以按照一定的规则向消息队列中添加新信息,对消息队列有读权限的进程则可以从消息队列中读取信息:
    特点:
    1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
    2)消息队列独立于发送和接收进程。进程终止时,消息队列及其内容不会被删除。
    3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

    2.2 信号量semaphere
    信号量(semaphere)与已经介绍过得IPC结构不同,它是一个计数器,可以用来控制多个进程对共享资源的访问。信号量用于实现进程间的互斥同步,而不是用于存储进程间通信数据。
    特点:
    1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
    2)信号量基于操作系统的PV操作(P加 V减),程序对信号量的操作都是原子操作
    3)每次对信号量的PV操作不仅限于对信号量的加1或减1,而且可以加减任意正整数。
    4)支持信号量组

    2.3 信号signal
    信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

    2.4 共享内存(shared Memory)
    它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等
    特点:
    1)共享内存是最快的一种IPC,因为进程是直接对内存进行存取
    2)因为多个进程可以同时操作,所以需要进行同步
    3)信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问

    1. 套接字SOCKET
      socket也是一种进程间通信机制,与其他通信机制不同的是,它可以用于不同主机之间的进程通信。

2.4 线程间的同步方式

线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。操作系统一般有三种线程同步方式:
临界区:通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
互斥量Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
信号量Semphere:为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

2.5 进程的调度算法

为了确定首先执行哪个进程以及最后执行哪个进程以实现最大CPU利用率,计算科学家定义了一些算法,他们是:

  • 先到先服务(FCFS)调度算法:从就绪队列中选择一个最先进入到该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用CPU时再重新调度。
  • 短作业优先(SJF)的调度算法:从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用CPU时再重新调度。
  • 时间片轮转调度算法:事件片轮转调度是一种最古老、最简单、最公平且使用最广的算法,又称RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片。即该进程允许运行的时间。
  • 多级反馈队列调度算法:前面介绍的几种进程调度算法都有一定的的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程。多级反馈队列调度算法既能使高级优先的作业得到相应又能使短作业(进程)迅速完成。因而它是目前被公认的一种较好的进程调度算法,UNIX操作系统采取的便是这种调度算法。
  • **优先级调度:**为每个流程分配优先级,首先执行具有最高优先级的进程,依次类推,具有相同优先级的进程以FCFS方式执行。可以根据内存要求,事件要求或任何其他资源要求来确定优先级。

三 操作系统内存管理基础

3.1 内存管理介绍

问:操作系统的内存管理主要是做什么?
操作系统的内存管理主要负责内存的分配与回收(molloc函数:申请内存,free函数:释放内存),另外地址转换也就是将逻辑地址转换成相应的物理地址等功能也是操作系统内存管理做的事情。

3.2常见的几种内存管理机制

问:操作系统内存管理机制有几种方式?
操作系统内存管理机制简单分为连续分配管理方式非连续分配管理方式这两种。连续分配管理方式是指为同一用户程序分配一个连续的内存空间,常见的如块式管理。同样的,非连续分配管理方式允许一个程序使用的内存分布在离散或者不相邻的内存中,常见的如页式管理段式管理

  1. **块式管理:**远古时代的计算机操作系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行至需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
  2. 页式管理:把主内存分为大小相等且固定的一页一页的形式,也较小,相对于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址也物理地址。
  3. **段式管理:**页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何意义。段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多。但是最重要的是段是有实际意义的,每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序段X、数据段D及栈段S等。段式管理通过段表对应逻辑地址和物理地址。
  4. 段页式管理机制:段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存分成若干,每个又分成若干,也就是说段页管理机制中段与段之间以及段的内部都是离散的。

3.3 块表和多级页表

问:页表管理机制中有两个很重要的概念:块表和多级页表,这两个东西分别解决了页表管理中很重要的两个问题。你给我简单介绍一下。

分页内存管理中,很重要的两点是:
1、虚拟地址到物理地址的转换要快。
2、解决虚拟地址空间大,页表也会很大的问题。

快表
为了解决虚拟内存到物理内存的转换速度,操作系统在页表方案基础之上引入了快表来加速虚拟地址到物理地址的转换。我们可以把快表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的Cache,她的作用于页表相似,但是提高了访问的速率。由于采用页表做地址转换,写入内存数据时CPU要访问两次主存。有了快表,有时只需要访问一次高速缓冲存储器,一次主存,这样可以加速查找并提高指令执行速度。

使用快表后的地址转换流程:

  1. 根据虚拟地址中的页号查快表;
  2. 如果该页在快表中,直接从快表中读取相应的物理地址;
  3. 如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射添加到快表中;
  4. 当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
    快表和我们平时经常在开发系统使用的缓存(比如Redis)很像,的确是这样,操作系统中的很多思想、很多经典的算法、都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。

多级页表
引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的经典场景。
多级页表如何节约内存?
有一个二级页表。
一、二级页表可以不存在
二、二级页表可以不存在主存
多级页表是典型的时间换空间的例子,动态创建二级页表、调入和调出二级页表都需要花费额外的时间的,远没有不分级的页表来的直接。

总结
为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即TLB)的概念。不论是快表还是多级页表实际上都利用了程序的局部性原理,局部性原理后面的虚拟内存这部分会介绍到。

分页机制和分段机制的共同点和区别

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

1、共同点

  • 分页机制和分段机制都是为了提高内存利用率,较少的内存碎片。
  • 页和段都是离散存储的,所以两者都是离散分配内存的方式。但是每个页和每个段中的内存是连续的。
    2、区别:
  • 页的大小是固定的,由操作系统决定;而段的大小是不固定的,取决于我们当前运行的程序。
  • 分页仅仅是为了满足操作系统内存管理的需求,而段是逻辑信息的单位,在程序中可以体现为代码段,数据段,能够更好满足用户的需求。

3.5 逻辑(虚拟)地址和物理地址

问:逻辑地址和物理地址这两个概念

我们编程一般只有可能和逻辑地址打交道,如果在C语言中,指针里面存储的数值就可以理解为内存里的一个地址,这个地址也就是我们所说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中的地址,更具体一点来说就是内存地址寄存器中的地址。物理地址是内存单元的真正地址。

CPU寻址?为什么需要虚拟地址空间

现代处理器使用的是一种称为虚拟寻址(Virtual Addressing)的寻址方式,使用虚拟寻址,CPU需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。实际上完成虚拟寻址转换为物理地址转换的硬件是CPU中一个被称为内存管理单元的硬件。

为什么要求虚拟地址空间呢?
没有虚拟地址空间的时候,程序都是直接访问和操作的都是物理内存。这样就会出现一些问题。

  1. 用户程序可以访问任意内存,寻址内存的每一个字节,这样就很同意破坏操作系统,造成操作系统崩溃。
  2. 想要同时运行多个程序特别困难。比如你想同时运行一个微信和Q音乐都不行。例如微信在运行的时候给内存地址1XXX赋值后,QQ音乐也同样的给这个内存地址赋值,那么QQ音乐对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序的崩溃。

总结来说:如果直接把物理地址暴露出来的话,会带来严重的问题,比如可能造成操作系统伤害以及同事运行多个程序造成困难。

通过虚拟地址访问内存有以下优势:

  • 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区
  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常为4KB)保存到磁盘文件。数据或代码会根据需要在物理内存和磁盘之间移动。
  • 不同进程使用的虚拟地址彼此隔离,一个进程中的代码无法更改正在另一个进程或操作系统使用的物理内存。

四 虚拟内存

4.1什么是虚拟内存(Virtual Memory)?

这个在我们平时使用电脑特别是Windows系统的时候很常见。很多时候我们使用点开了很多占内存的软件,这些软件占用内存可能已经远远超出了我们电脑本身的物理内存。通过虚拟内存可以让程序拥有超过系统物理内存大小的可用内存空间。另外,**虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。**这样会更加有效地管理内存并减少出错。

虚拟内存是计算机系统内存管理的一种技术,我们可以手动设置自己电脑的虚拟内存。不要单纯认为虚拟内存只是“使用磁盘空间来扩展内存”的技术。虚拟内存的重要意义是它定义了一个连续的虚拟地址空间,并且把内存扩展到硬盘上

维基百科
虚拟内存使得应用程序认为它拥有连续的可用的内存(一个连续完成的内存空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。目前,大多数操作系统都是用了虚拟内存,如windows家族的“虚拟内存”,Linux的“交换空间”等。

4.2 局部性原理

想要更好地理解虚拟内存技术,必须要知道计算机中著名的局部性原理。另外,局部性原理即适用于程序结构,也适用于数据结构,是非常重要的一个概念。

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就可以开始运行。

局部性原理表现在以下两个方面:

  1. **时间局部性:**如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作。
  2. **空间局部性:**一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般以向量、数组、表等形式簇聚存储的。

时间局部性是通过将近来使用的指令和数据保存到高速缓冲存储器中,并使用高速缓存的层次机构实现。空间局部性通常是使用较大的高速缓存,并将预取机制集成到高速缓冲控制逻辑中实现。虚拟内存技术实际上就是建立了“内存——外存”的两级存储器结构,利用局部性原理实现高速缓存。

4.3 虚拟存储器(虚拟内存)

基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其他部分留在外存,就可以启动程序执行。由于外存往往比内存大很多,所以我们运行软件的内存大小实际上是可以比计算机实际的内存大小大得。在程序执行过程中,所访问的信息不在内存时,由操作系统将搜需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不适用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样计算机好像为用户提供了一个比实际内存大得很多的存储器——虚拟存储器。
实际上,虚拟内存同样是一种时间换空间的策略,用CPU的计算时间,也的调入调出花费的时间,换来了一个虚拟的更大的空间;来支持程序的运行。

4.4 虚拟内存的技术实现

**虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。**虚拟内存的实现有以下三种方式:

  1. 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储功能而增加了请求调页功能页面置换功能。请求分页是目前最常用的一种实现虚拟存储的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如正在作业运行的过程中发现要访问的页面不存在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。
  2. 请求分段存储管理:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可以使用请求调入中断动态装入要访问但又不在内存中的程序段。当内存空间已满,而有需要装入新的段时,根据置换功能能适当调出某个段,以便腾出空间。
  3. 请求段页式存储管理

请求分段和分页存储管理,两者有何不同
请求分页存储管理建立在分页管理之上。他们的根本区别是是否将程序全部所需的全部地址空间都装入主存,这也是请求分页存储管理可以提供虚拟存储内存的原因。
它们的根本区别在于是否将一作业全部地址空间装入主存。请求分页存储管理不要求将作业全部地址空间同时装入主存。基于这一点请求分页存储管理可以提供虚拟内存,而分页存储管理且不能提供虚拟内存。

不管上面哪一种实现方式,我们一般都需要:
1、一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了;
2、缺页中断:如果需要执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存。然后继续执行;
3、**虚拟地址空间:**逻辑地址到物理地址的变换。

4.5页面置换算法

页面置换算法的作用?常用的页面置换算法有哪些?
地址映射过程中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断。
当发生缺页中断时,如果当前内存中没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法。我们可以吧页面置换算法看成淘汰页面的规则。

  • **OPT页面置换算法(最佳页面置换算法):**最佳(Optimal OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程内存下的若千页面中哪个是未来最长时间不再被访问的,因而该算法无法实现。一般作为衡量其他置换算法的方法。
  • FIFO(First infirstout)页面置换算法(先进先出页面置换算法):总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。
  • LRU(Least Currently Used)页面置换算法(最近最久未使用页面置换算法):LRU算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间T,当必须淘汰一个页面时,选择现有页面中其T最大的,即最近最久未被使用的页面予以淘汰。
  • **LFU(Least Frequencytly Used)页面置换算法(最少使用页面置换算法):**该置换算法选择在之前时期使用最少的页面作为淘汰页。

4.6 虚拟内存的好处和代价

好处:

  1. 扩大地址空间
  2. **内存保护:**每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改。
  3. **公平内存分配。**采用虚存之后,每个进程都相当于有同样大小的虚存空间。
  4. 当进程通信时,可以采用虚存共享的方式实现。
  5. 当不同的进程使用同样的代码时,比如库文件中的代码,物理内存中可以只存储一份这样的代码,不同的进程只需要把自己的虚拟内存映射过去就可以了,节省内存。
  6. 虚拟内存很适合在多道程序设计系统中使用,许多程序的片段同时保存在内存中。当一个程序等待它的一部分读入内存时,可以把CPU交给另一个进程使用。在内存中保留多个进程系统并发度提高。
  7. 在程序需要分配连续的内存空间的时候,只需要在虚拟内存空间分配连续空间,而不需要实际物理内存连续空间可以利用碎片

虚拟内存的代价:
1、虚拟的管理需要建立很多的数据结构,这些数据结构要占用额外的内存
2、 虚拟地址到物理地址的转换,增加了指令的执行时间
3、页面的换入换出需要磁盘I/O,这样会很耗时
4、如果页面中只有一部分数据,会浪费内存

4.7请你说一说操作系统中程序的内存结构

在这里插入图片描述
一个程序本质上都是BSS段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时,分为代码段、数据段和未初始化数据区三部分。
BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。
数据段:存放程序中以初始化的全局变量的一块内存区域。数据段页属于静态内存分配。
代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域属于只读。在代码段中,也可能包含一些只读的常数变量。
text段和data段在编译时已经分配好了空间,而BSS段并不占用可执行文件的大小,它是由链接器来获取内存的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值