八股训练营第 10 天 | 进程和线程之间有什么区别?并行和并发有什么区别?解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?
进程和线程之间有什么区别
进程是资源分配和调度的基本单位。线程是程序执行的最小单位。线程是进程的子任务。一个进程可以有一个或多个线程,这些线程共享相同的内存空间。
资源开销:
- 每个进程都有独立的内存空间。进程的创建和销毁开销较大。进程间切换需要保存整个进程的状态。因此进程的上下文切换开销较大
- 线程共享相同的内存空间。线程的创建和销毁开销较小。线程间切换只要保存少量上下文信息。因此线程的上下文切换开销较小。
通信与同步:
- 进程之间相互隔离,想要通信必须借助特殊的方式,如管道、消息队列、共享内存等。
- 线程共享相同的内存空间,数据同步比较容易。
安全性:
- 进程由于相互隔离,一个进程的崩溃一般不会影响其他进程。
- 线程由于共享内存空间,一个线程崩溃可能会影响整个进程的稳定性。
并行和并发有什么区别
- 并行是在同一时间执行多个任务。这些任务运行在不同的处理单元(如多个 CPU 核心)上。一个并行系统通过并行执行多个任务来加速系统整体的任务执行。
- 并发是在一个时间段内执行多个任务。这些任务并不是同时执行,而是交替执行。由时间片轮转或调度算法决定。
解释一下用户态和核心态,什么场景下,会发生内核态和用户态的切换?
用户态和内核态是操作系统为了实现权限控制、保护系统资源而设计的两种 CPU 运行级别。用于控制进程 / 程序对计算机硬件资源的访问权限和操作范围。
- 用户态:进程 / 程序只能执行受限的指令,不能访问操作系统的核心,不能直接访问硬件资源。
- 内核态:进程 / 程序可以执行特权指令,能够访问操作系统核心,能够直接访问操作系统资源,执行系统调用、内存管理、文件系统等操作。
在以下场景会发送用户态到内核态的切换:
- 系统调用:当进程 / 程序需要请求操作系统内核的服务时,会通过系统调用
请求操作系统使 CPU进入内核态。 - 异常:当进程 / 程序出现错误或异常时,操作系统会将 CPU 由用户态转为内核态,由内核的异常处理程序来处理错误或异常。
- 中断:当有外部设备(鼠标、键盘等)产生中断时,操作系统会将 CPU 由用户态转为内核态,由内核的中断处理程序来响应这个设备,处理完后再转换为用户态。
