1. 进程
第一印象
进程是程序的一个执行实例或者一个正在运行的程序,是OS分配资源的基本单位
Linux角度
进程是承担分配系统资源(CPU时间、内存)的实体,在内核当中使用struct task_struct
结构对进程进行描述,也就是进程控制块(PCB)
PCB是什么?(其中较为重要的内容)
- 标识符:描述本进程的唯一标识符,可以理解为ID
- 状态:任务状态,比如“退出代码”、“退出信号”等
- 优先级:相对于其他进程的优先级
- 程序计数器:程序中即将被执行的下一条指令的地址
- 内存指针:包括程序代码和进程相关程序的指针,还有和其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
- 其他信息…
2. 多进程
在Linux环境下,通过fork
函数来创建一个子进程,则构成了多进程环境
创建原理
子进程会拷贝父进程的PCB和页表等结构,创建子进程完成后,子进程具有自己的进程虚拟地址空间,具有自己的页表结构
3. 线程
通过上面的铺垫,可从以下三个角度来阐述线程
从进程角度:
- 线程是一个进程内部的控制序列
- 每个进程都至少有一个执行线程
- 线程在进程内部运行,本质是在进程地址空间内运行
从资源分配角度:
- Linux系统中,CPU眼中,所有线程PCB都要比传统的进程更加轻量化,也是CPU调度的基本单位
- 透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流
从内核角度:
- 在Linux系统中,线程被称之为轻量级进程,在内核中也是创建了
struct task_struct
结构体来描述线程,其中内存地址指向进程的虚拟地址空间 - 线程之间独有:线程ID、栈空间、一组寄存器、ERRNO(错误号)和信号屏蔽字
- 线程之间共享:文件描述符、文件的处理方式、当前进程工作目录、用户ID和组ID
4. 多线程
在Linux环境下,使用pthread_create
创建一个线程。其实在OS内核看来,就是创建了一个轻量级进程,同样线程的PCB也是拷贝进程(或者理解为主线程)的PCB
5. 优缺点
多进程优点
- 由于各自进程都有自己的进程虚拟地址空间,所以各个程序之间的运行不会相互干扰,运行稳定
- 子进程崩溃,不会影响父进程,反之同理
- 多个进程可以充分利用多核CPU,并行运行,不用担心对程序结果造成二义性
多进程缺点
- 由于进程的独立性,所以不同进程之间的数据交换需要用到进程间通信
- 创建一个子进程的开销要比创建一个线程的开销大,并且子进程占用的资源要比线程更多
- 子进程退出,需要父进程进行等待,否则会造成资源泄露
- 多进程程序切换比多线程程序切换,操作系统耗费的代价更大
多线程优点
- 创建一个线程的开销小
- 多线程程序切换的过程中,操作系统耗费的代价更小