进程和线程之间有什么区别
答:
进程是资源调度和分配的基本单位。
线程是程序执行的最小单位,线程是进程的子任务,是进程内的执行单元。 一个进程至少有一个线程,一个进程可以运行多个线程,这些线程共享同一块内存。
实际上,无论是创建进程的fork,还是创建线程的pthread_create ,底层实现都是调用同⼀个内核函数 clone 。
1. 如果复制对方的地址空间,那么就产出一个“进程”;
2. 如果共享对方的地址空间,就产生一个“线程”。
Linux内核是不区分进程和线程的,只在用户层面上进行区分。所以,线程所有操作函数 pthread *是库函数,而非系统调用。
资源开销:
- 进程:由于每个进程都有独立的内存空间,创建和销毁进程的开销较大。进程间切换需要保存和恢复整个进程的状态,因此上下文切换的开销较高。
- 线程:线程共享相同的内存空间,创建和销毁线程的开销较小。线程间切换只需要保存和恢复少量的线程上下文,因此上下文切换的开销较小。
通信与同步:
- 进程:由于进程间相互隔离,进程之间的通信需要使用一些特殊机制,如管道、消息队列、共享内存等。
- 线程:由于线程共享相同的内存空间,它们之间可以直接访问共享数据,线程间通信更加方便。
安全性:
- 进程:由于进程间相互隔离,一个进程的崩溃不会直接影响其他进程的稳定性。
- 线程:由于线程共享相同的内存空间,一个线程的错误可能会影响整个进程的稳定性。
并行和并发有什么区别
答:
- 并行是在同一时刻执行多个任务。
- 并发是在相同的时间段内执行多个任务,任务可能交替执行,通过调度实现。
多个处理核同时执行多个进程称为并行。在并行系统中,多个处理单元可以同时处理独立的子任务,从而加速整体任务的完成。
单个处理核在很短时间内分别执行多个进程成为并发。这些进程可能不是同时发生的,而是通过时间片轮转等方式交替执行。并发通常与任务之间的交替执行和任务调度有关。
解释一下用户态和核心态。什么场景下,会发生内核态和用户态的切换?
答 :
1、用户态和内核态的区别
用户态和内核态是操作系统为了保护系统资源和实现权限控制而设计的两种不同的CPU运行级别,可以控制进程或程序对计算机硬件资源的访问权限和操作范围。
- 用户态:在用户态下,进程或程序只能访问受限的资源和执行受限的指令集,不能直接访问操作系统的核心部分,也不能直接访问硬件资源。
- 核心态:核心态是操作系统的特权级别,允许进程或程序执行特权指令和访问操作系统的核心部分。在核心态下,进程可以直接访问硬件资源,执行系统调用,管理内存、文件系统等操作。
2、在什么场景下,会发生内核态和用户态的切换
- 系统调用:当用户程序需要请求操作系统提供的服务时,会通过系统调用进入内核态。
- 异常:当程序执行过程中出现错误或异常情况时,CPU会自动切换到内核态,以便操作系统能够处理这些异常。
- 中断:外部设备(如键盘、鼠标、磁盘等)产生的中断信号会使CPU从用户态切换到内核态。操作系统会处理这些中断,执行相应的中断处理程序,然后再将CPU切换回用户态。