[操作系统] 进程、线程、协程

1.进程

当一个用户程序启动时,操作系统会为其启动一个进程,其中包括运行程序所需要的各种资源。

也就是说,进程是一个包含了运行一个程序所需的各种资源的容器。

进程包括的资源包括:

1)线程,一个进程可以有一或者多个线程。最开始创建的是进程的主线程。

2)代码和数据,保存在内存用户空间中,创建进程时从文件系统加载到内存。

3)资源操作符和句柄,文件、设备和操作系统其他内容的操作句柄(例如文件描述符)。

进程间的数据共享相对更困难(因为内存数据不共享)。

不同的进程可以在多台机器的多个物理处理器上并行执行。

2.线程

线程归属于进程,是一个执行空间,它会被操作系统在物理处理器上调度执行

由于线程共享父进程的资源,因此可以通过信号量和共享内存等实现线程间数据传递。

不同的线程可以在多个本机物理处理器上并行执行。

3.协程

协程是线程的运行状态,或者可以理解为一个函数运行的上下文信息。

一个线程可以拥有多个协程,或者说可以在一个线程上以分时复用的方式运行多个协程

Q:已经有多线程模型,为什么还需要多协程模型

A:a.协程是在用户态而非内核态切换,因此切换开销较线程切换低。b.协程的内存占用量也较线程低。可以在相同配置下启动更多协程。

由于多个协程在线程上进行分时复用运行,因此被分配到同一个线程运行的多个协程将无法并行执行,只能并发执行。

协程的执行位置取决于被分配到运行它的线程的物理处理器。

4.比较

进程是一个完整的应用程序执行的容器。包括各种运行资源。不同进程拥有不同的虚拟地址空间。

线程是进程下的执行空间,是实际被放在物理处理器执行的东西。线程共享自己所属进程的内存空间

协程是复用线程的执行内容。

切换内容对比:

1)进程切换内容包括 全局目录、内核栈、硬件上下文,保存在内存中。

2)线程切换内容包括内核栈、硬件上下文,保存在内核栈中。

3)协程切换内容包括硬件上下文,保存在用户栈或者堆中。

5.注意事项

1)一个线程崩溃是否会影响进程的其他线程?

不一定,线程崩溃对其他线程的影响有很多种可能,例如破坏堆栈数据、触发SIGSEGV(Segmentation Fault)。

如果设置了对错误的处理(如高级程序语言的exception caught),那么错误的线程会被销毁并且不影响其他线程。如Java多线程模型由于是在JVM运行因此采用这种机制。

如果没有处理,则可能导致操作系统认为整个进程异常进行终止进程中所有的线程。

2)什么情况应当采用多线程而非多进程?

当需要更轻量级的执行切换开销、并且需要线程间数据共享时。

3)什么情况应当采用多协程?

协程不能像多线程/进程模型那样利用多个物理处理器。而是可以在等待IO时进行线程复用。

协程的使用需要和异步IO相结合。

6.(补充)线程同步

1)锁机制,主线程(或控制线程)获得一个锁,等待目标线程运行至获取锁而被阻塞。随后主线程释放锁,使得目标线程继续运行。

mutex 普通互斥体 recursive_mutex 可重入锁(同一时间可由同一线程多次获得)、timed_mutex限时抢占锁(有尝试获得的时间限制)、recursive_timed_mutex。

2)wait、wait_for(指定最大等待时间)、notify、notify_one、notify_all

即主动等待和唤醒其他线程。

3)条件变量

与wait和notify(one 或者 all)配合,可以控制哪些线程被唤醒。

posted @ 2022-03-19 19:42  Cheung-10  阅读(5)  评论(0)    收藏  举报