内存管理总结

190 阅读3分钟

一、进程和线程区别

1.1 本质区别

  • 进程是资源分配的基本单位
  • 线程是操作系统调度的基本单位

1.2 所属关系

  • 一个线程属于一个进程
  • 一个进程可以拥有多个线程

1.3 地址空间

  • 进程有独立的虚拟地址空间
  • 线程共享进程中的虚拟地址空间,但是有自己的栈、程序计数器、本地存储LS

虚拟地址空间:

  1. 代码段:二进制可执行代码
  2. 数据段:已初始化的静态常量和全局变量
  3. BSS段:未初始化
  4. 堆段:动态分配的内存
  5. 文件映射段:动态库、共享内存
  6. 栈段
  7. 内核空间

1.4 内存

  • 系统会为每个进程分配不同的内存空间
  • 系统不会为线程分配内存,线程所属资源来自于所属进程

1.5 并发性

  • 进程的并发性能较低
  • 线程的并发性能较高

1.6 健壮性

  • 线程崩溃会导致进程奔溃
  • 进程之间具有隔离性

二、进程和线程切换的区别

2.1 切换过程

  1. 保存当前进程的硬件上下文
  2. 修改当前进程的PCB(线程:TCB),修改运行状态(阻塞或就绪),存储管理数据的保存
  3. 切换另外一个进程的PCB(线程:TCB),将状态转换成运行态
  4. 如果是进程,还有存储管理数据的切换
  5. 恢复被调度进程的上下文,让PC指向被调度的进程代码

2.2 区别

  • 进程到进程 = 线程到其他进程中的线程

  • 线程到所属进程的另一个线程

三、系统调用是否引起线程切换

  • 系统调用是由软中断来实现的 int 0x80

  • 系统调用的过程:

  1. 触发中断,将系统调用号写入寄存器中
  2. 切换堆栈(用户态切换成内核态)
  3. 执行中断处理
  4. 从中断处理程序返回 iret
  • 会引起线程切换:使用阻塞io,io未就绪,那么就会发生线程切换(运行态->阻塞态)
  • 不会引起线程切换:非阻塞io,io无论就绪与否,都不会发生线程切换

四、写时复制的原理以及应用

  • fork系统调用
  • 为什么拷贝的很快:因为只涉及页表拷贝,没有拷贝物理内存

五、为什么要使用虚拟内存

  • 进程可使用的内存大小可超过物理内存
  • 解决多进程之间地址空间冲突的问题
  • 更可靠的内存访问

六、多个进程加载同一份动态库,动态库中全局变量是否存在竞态

  • 进程是如何加载
  1. 预处理
  2. 汇编
  3. 链接(.bss .data .rodata)
  4. 加载 Ldr64.exe
  5. 运行
  • 动态库原理是什么

link.exe msvc

  • 是否存在竞态:否,因为每个进程会复制一份到自己的进程空间