进程
进程包括进程上下文、代码、数据、栈。
Process = process context + code, data, and stack
![](https://i-blog.csdnimg.cn/blog_migrate/ffb5a411cb33f2f2f7ba33f4e7ffec8d.png)
线程
一个线程包括栈、线程上下文。线程上下文包括寄存器、条件码、栈指针、程序计数器、唯一的一个整数线程ID。
同一个进程的线程共享代码、数据和内核上下文。
Process = thread + code, data, and kernel context
![](https://i-blog.csdnimg.cn/blog_migrate/23591fde23bdc20287d2b03a7c45eaf2.png)
拥有多线程的进程
每个线程拥有自己的逻辑控制流
每个线程共享相同的代码、数据、内核上下文
每个线程有独立的栈。实际上也能从其他线程访问。
每个线程有自己的线程ID
![](https://i-blog.csdnimg.cn/blog_migrate/b8ec0d2c8de281009514ef0e5f6a6f8f.png)
切换线程是一种非常低开销的操作,因为只需要替换线程上下文,这只是一小部分数据。
每次执行fork都是创建了一个完成的继承结构,而线程只是池。可以将线程是为访问相同代码和数据的并发流池,内核负责调度这些流,以某种方式让每个流程在处理器上获得时间。
![](https://i-blog.csdnimg.cn/blog_migrate/221a472c8e92735207daeabd83df3b7e.png)
参考资料
《深入理解计算机系统》视频课23节 并发编程。