一、进程和线程区别
1.1 本质区别
- 进程是资源分配的基本单位
- 线程是操作系统调度的基本单位
1.2 所属关系
- 一个线程属于一个进程
- 一个进程可以拥有多个线程
1.3 地址空间
- 进程有独立的虚拟地址空间
- 线程共享进程中的虚拟地址空间,但是有自己的栈、程序计数器、本地存储LS
虚拟地址空间:
- 代码段:二进制可执行代码
- 数据段:已初始化的静态常量和全局变量
- BSS段:未初始化
- 堆段:动态分配的内存
- 文件映射段:动态库、共享内存
- 栈段
- 内核空间
1.4 内存
- 系统会为每个进程分配不同的内存空间
- 系统不会为线程分配内存,线程所属资源来自于所属进程
1.5 并发性
- 进程的并发性能较低
- 线程的并发性能较高
1.6 健壮性
- 线程崩溃会导致进程奔溃
- 进程之间具有隔离性
二、进程和线程切换的区别
2.1 切换过程
- 保存当前进程的硬件上下文
- 修改当前进程的PCB(线程:TCB),修改运行状态(阻塞或就绪),存储管理数据的保存
- 切换另外一个进程的PCB(线程:TCB),将状态转换成运行态
- 如果是进程,还有存储管理数据的切换
- 恢复被调度进程的上下文,让PC指向被调度的进程代码
2.2 区别
-
进程到进程 = 线程到其他进程中的线程
-
线程到所属进程的另一个线程
三、系统调用是否引起线程切换
-
系统调用是由软中断来实现的 int 0x80
-
系统调用的过程:
- 触发中断,将系统调用号写入寄存器中
- 切换堆栈(用户态切换成内核态)
- 执行中断处理
- 从中断处理程序返回 iret
- 会引起线程切换:使用阻塞io,io未就绪,那么就会发生线程切换(运行态->阻塞态)
- 不会引起线程切换:非阻塞io,io无论就绪与否,都不会发生线程切换
四、写时复制的原理以及应用
- fork系统调用
- 为什么拷贝的很快:因为只涉及页表拷贝,没有拷贝物理内存
五、为什么要使用虚拟内存
- 进程可使用的内存大小可超过物理内存
- 解决多进程之间地址空间冲突的问题
- 更可靠的内存访问
六、多个进程加载同一份动态库,动态库中全局变量是否存在竞态
- 进程是如何加载
- 预处理
- 汇编
- 链接(.bss .data .rodata)
- 加载 Ldr64.exe
- 运行
- 动态库原理是什么
link.exe msvc
- 是否存在竞态:否,因为每个进程会复制一份到自己的进程空间