死锁
1、什么是死锁?
多个进程/线程同时被阻塞,他们中的一个或全部都在等待某个资源释放。由于进程/线程被无限期地阻塞,程序无法正常终止的情况。
2、产生死锁的四个条件?
- 互斥:一次只有一个进程可以使用资源。如果另一进程申请该资源,必须等待直到该资源被释放为止。
- 请求保持:一个进程至少占有一个资源,并等待另一资源,而该资源等其他进程占有。
- 不可剥夺:资源不能被抢占,只能等待持有资源的进程完成后释放。
- 循环等待:P1等待的资源被P2占有,P2等待的资源被P3占有…Pn等待的资源被P1占有。
3、解决死锁的方法?
- 预防:限制并发进程对资源的请求。
- 避免:系统分配资源时,根据资源的使用情况提前预测,避免发生死锁。
- 检测:系统设有专门的机构对死锁检测。
- 解除:与检测配套的措施,用于将进程从死锁状态下解脱出来。
4、如何避免死锁?
- 破坏请求与保持条件:一次性申请所有资源
- 破坏不可剥夺条件:占用部分资源进一步申请其他资源时,如果申请不到,可以主动释放其占有的资源
- 破坏循环等待条件:按序申请资源。让所有进程按照相同的顺序请求资源,释放资源则反序释放。
内存管理
1、内存管理主要做什么?
- 内存分配与回收:对进程所需的内存进行分配和回收
- 地址转换:将程序中的虚拟地址转换为内存中的物理地址
- 内存扩充:当系统内存不足时 ,利用虚拟内存技术或自动覆盖技术从逻辑上扩充内存
- 内存映射:将文件映射到进程的 进程空间中,通过内存指针读取内存的方式读取文件,速度更快
- 内存优化:通过调整内存分配策略和回收算法来优化内存使用效率
- 内存安全:保证程序之间的内存互不干扰,避免恶意程序破坏系统安全
2、什么是内存碎片?
内存碎片是由内存的申请和释放产生的,通常分为两种:
- 内部内存碎片:已经分配给进程使用,但未被使用的内存。
- 外部内存碎片:由于未分配的连续内存区域太小,以至于不能满足任意进程所需要的内存分配请求,这些小片段且不连续的内存空间。简言之,外部碎片指那些未分配给进程又不能使用的内存。
3、常见内存管理方式?
- 连续内存管理:为一个用户程序分配一个连续的内存空间,内存利用率不高
- 块式管理:将内存分为固定大小的几块,当程序需要内存时,OS就分配一块给它。存在内部碎片和外部碎片。
- Linux中使用伙伴系统算法来实现连续内存管理,可以有效解决外部碎片问题。将内存按照2的幂次划分,并将相邻的内存块合成一对伙伴。内存分配时,伙伴系统会不断切分内存直到找到大小合适的内存,内存释放时,将两个内存块合并形成更大的内存块,以便后续分配。
- 非连续内存管理:允许一个程序使用的内存分布在离散或不相邻的内存中,更灵活
- 段式管理:以段(一段连续的物理内存)的形式管理/分配物理内存。
- 页式管理:将物理内存分为连续等长的物理页,虚拟地址空间也被划分为连续等长的虚拟页。
- 段页式管理机制:先将内存分段,再将段分页
虚拟内存
1、虚拟内存是什么?有什么用?
虚拟内存是一个假想出来的空间,只是在逻辑上存在 ,主要作用是为了作为进程访问主存的桥梁并简化内存管理。
总体而言,虚拟内存的作用包括以下:
- 隔离进程
- 提升物理内存使用率:
- 简化内存管理
- 多个进程共享物理内存
- 提高内存使用安全性
- 提供更大的可使用内存空间
2、虚拟地址和物理地址?
- 物理地址:真正的物理内存中的地址
- 虚拟地址:程序访问的内存地址
- 地址翻译/地址转换:OS通过CPU中的MMU(内存管理单元)将虚拟地址转换为物物理地址
3、虚拟地址和物理地址如何映射?
- 分页机制
- 分段机制
- 段页机制
整理自JavaGuide