操作系统面试真题总结(二)
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
栈空间和空间堆有什么区别?各自优缺点呢?
栈空间和堆空间在编程中都被用于数据存储
- 但它们的用途,分配方式,生命周期,甚至大小,都有显著的不同。
存储内容:
栈主要存储局部变量和函数调用的信息,比如函数的返回地址和参数。
- 堆被用来存储动态分配的数据,例如动态数组,对象
- 或者其他需要在程序运行中根据需要动态创建和销毁的数据。
生命周期:
- 栈空间中的数据在定义它们的函数返回之后就会自动销毁,生命周期较短。
- 而堆上的数据需要程序显式地创建和销毁,因此它们的生命周期可以被精确地控制
- 但同时也使内存管理变得更加复杂。
分配方式:
- 栈空间是由编译器自动分配和释放的,非常快速。
- 但是,堆空间是由程序在运行时动态分配和释放的,这通常需要更多的计算资源。
大小限制:
- 栈空间的大小通常在程序启动时就被固定,所以它的空间通常比较小。
- 而堆的大小通由系统的可用内存来决定,所以它的空间通常比较大。
优点和缺点:
- 栈空间的优点是管理简单,速度快。
- 但它的缺点是空间有限,不能动态分配,只能用于存储生命周期短且大小已知的数据。
堆空间的优点是能够动态地分配大量的内存。
- 但是它的缺点是需要手动管理,可能会引发内存泄漏或碎片,而且开销较大。
什么是物理地址?
物理地址,又称实际地址或绝对地址,是数据在计算机系统中物理内存(RAM)的实际位置或者地址。
- 这个地址是总线或者内存控制器用来读取或者写入特定的物理内存的。
逻辑地址在经过CPU的内存管理单元(
MMU
)的地址转换后,变成物理地址。
- 这个物理地址才是数据真正存储的地方。
- 操作系统、内存管理单元以及硬件一起工作,把高级的程序抽象(逻辑地址)与底层硬件实现(物理内存)连接起来。
什么是逻辑地址?
在操作系统中,逻辑地址(有时也被称为虚拟地址),是在运行过程中的程序或进程所看到的地址。
- 这个地址是由
CPU
生成的,并且不同于物理地址,后者是数据在主存储器RAM
中的实际地址。对于程序来说,它只需要对内存进行抽象的、逻辑的操作,不用关心具体数据在物理内存中的位置。
- 这就是为什么操作系统需要引入逻辑地址的原因。
什么是虚拟内存?
虚拟内存是操作系统提供的一种内存管理技术,它通过将实际内存和磁盘空间组合使用
- 给每个进程提供一个抽象的、看似连续的地址空间。
在虚拟内存中,每个进程能够访问的内存空间大于实际物理内存的容量。
- 操作系统会根据进程的需要,将部分内存数据存储在物理内存中
- 并将未使用的数据存储在磁盘上,以便于管理和利用。
通过使用虚拟内存,操作系统能够为每个进程提供独立的地址空间,使得进程之间相互隔离,更安全稳定。
- 同时,虚拟内存也提供了一种内存扩展机制,使得系统能够运行更多的程序
- 而不会因为物理内存不足而导致程序崩溃。
为什么需要虚拟内存?
虚拟内存有以下几个重要的作用和好处:
扩展可用内存:
- 虚拟内存使得每个进程可以访问比物理内存更大的内存空间。
- 当物理内存不足时,虚拟内存可以将一部分不常用的数据暂时存储在磁盘上,以释放出物理内存供其他进程使用。
- 这样,系统能够同时运行更多的程序,提升了系统的整体运行能力。
进程隔离和保护:
- 虚拟内存为每个进程提供了独立的地址空间,使得进程之间相互隔离。
- 这样,一个进程不能直接访问其他进程的内存空间,保护了进程的数据和代码的安全性。
- 如果一个进程出现了异常或崩溃,只会影响到该进程本身,而不会对其他进程造成影响。
简化内存管理:
- 虚拟内存使得内存管理更加简化。
- 操作系统可以在物理内存和磁盘之间进行数据交换,将内存调度和分配操作集中在物理内存上
- 而不需要关心具体的物理地址。
- 这样简化了内存分配和释放的操作,提高了内存管理的效率。
内存共享和进程通信:
- 虚拟内存允许多个进程共享同一部分内存,这样不同的进程可以轻松地共享数据和信息
- 实现进程间的通信和协作。
- 例如,多个进程可以共享同一块内存区域,实现高效的数据交换和共享资源。
分页与分段有什么区别?
分页和分段都是内存管理的策略,但它们的目的和方式是不同的:
分页:
- 分页是一种内存管理技术,它将虚拟内存空间和物理内存空间分割成固定大小的单元,我们称这个单元为页。
- 分页是为了解决内存碎片的问题,因为分页可以让每一块内存空间都被有效利用。
- 分页是透明的,也就是说这个过程对用户程序是不可见的。
- 用户程序看到的仍然是一个连续的内存空间。
分段:
- 对于分段,其主要目标是将程序自身的逻辑结构反映到物理存储器中去。
- 在逻辑上,程序员根据代码的逻辑关系将程序分成大小不等的段,比如说代码段、数据段等。
- 然后根据程序的需要,将这些段加载到内存中。
- 分段是可见的,也就是说程序员在编写程序的时候可以看到分段的效果。