多进程/多线程/协程浅显介绍
比较早写的笔记和理解,可能有错误,具体还是看现代操作系统相关文档.
初识进程线程
什么是进程
一个任务就是一个进程,是操作系统资源分配的基本单位。
进程是操作系统分配资源的基本单位,一个进程代表了一个正在运行的程序。每个进程有自己独立的地址空间、内存、数据栈以及其他用于跟踪执行的辅助数据。简单来说,一个任务就是一个进程。
例如,打开浏览器(如Chrome)、打开Word文档、运行游戏或者QQ,这些都是独立的任务,分别对应不同的进程。需要注意的是,同一种任务打开多个实例时,通常会创建多个进程。例如,打开多个Chrome标签页,实际在后台可能会启动多个Chrome进程。
重要的是,仅运行中的程序才能称为进程。未运行的程序只是一些存储在磁盘上的指令和数据的集合,并不能算作进程。
进程拥有以下特点:
- 独立的内存空间
- 独立的系统资源
- 自己的PID(进程ID)
- 可以包含多个线程
- 进程间通信需要特殊的IPC机制
什么是线程
线程可以看作一个任务的各项子任务,是操作系统直接的执行单元。
线程是进程内的一个执行单元,是操作系统直接调度的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间和文件描述符。线程可以看作是进程的子任务,它们共同完成一个更大的任务。
例如,在一个媒体播放器中,可能会有多个线程分别处理视频解码、音频解码、用户界面更新等任务。每个线程执行不同的功能,但共享同一个进程的资源。在一个进程中,至少存在一个线程,通常称为主线程,其他由主线程创建的称为子线程。
- 共享所属进程的内存空间
- 可以访问进程的资源
- 具有自己的栈空间
- 具有自己的线程ID
- 线程间通信相对简单,可以直接读写进程中的数据
小结
进程是资源分配的基本单位,具有独立的内存空间和资源。进程之间相互隔离,一个进程崩溃不会影响其他进程。 线程是执行的基本单位,属于进程的一部分,多个线程共享进程的资源。线程之间的通信更加高效,但一个线程的崩溃可能导致整个进程的失败。 操作系统的执行粒度是线程,资源分配的粒度是进程。在单核CPU上,通过线程的时间片轮转实现多任务;在多核CPU上,可以通过多进程和多线程同时利用多个核心。 需要注意的是,在Python中,由于**全局解释器锁(GIL)**的存在,多线程主要用于I/O密集型任务,而多进程更适合CPU密集型任务。
进程与线程的比较
进程的优缺点
多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。 但是缺点是创建进程的代价非常大 ,因为操作系统要给每个进程分配固定的资源,并且,操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状态。。不过,进程与进程之间是完全隔离的,进程A崩溃了完全不会影响到进程B。
线程的优缺点
多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩