进程与线程之间的关系

503 阅读4分钟

一个小栗子

我们生活中有很多关于进程与线程的例子,比如打开一个微信,这就打开了一个进程,再打开一个chrome,就又打开了一个进程。当我们在微信里面进行各种操作,比如查看朋友圈,扫一扫等等,这些基于微信的操作就是线程。 我们可以认为进程是包含线程的,线程就是进程的一个子集。


进程

进程(process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。


线程

线程(thread) 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。


进程与线程的区别

1.进程是资源分配的最小单位,线程是程序执行的最小单位。

2.进程有子集的独立地址空间,每启动一个进程,系统就会分配地址空间,并建立数据表来维护代码段、堆栈段和数据段。而线程是共享进程中的数据的,使用相同的地址空间,因此cpu切换一个线程的开销要远远低于切换一个进程的开销。

3.线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。


深入理解

进程(线程+内存+文件/网络句柄)

内存

进程里的内存并不是我们所指的物理内存,而是逻辑内存,指的就是内存的寻址空间。而且每一个进程的内存是相互独立的。

文件/网络句柄

它们是所有的进程所共有的,例如打开同一个文件,去抢同一个网络的端口这样的操作是被允许的。

线程

看下面的线程。

线程(栈+程序计数器+线程本地存储)

我们从主线程的入口main函数,会不断的进行函数调用, 每次调用的时候,会把所有的参数和返回地址压入到栈中。

程序计数器

操作系统真正运行的是一个个的线程,而进程只是一个包含线程的容器。而程序计数器就是指向当前的指令,而这个指令是放在内存中的。每一个线程都有一串自己的指针,去指向自己当前所在内存的指针。计算机绝大部分是存储程序性的,说的就是我们的数据和程序是储存在同一片内存里的,这个内存中既有我们的数据变量,又有我们的程序。所以我们的程序计数器指针指向的就是我们的内存。

线程本地存储

之前我们看到的每一个进程都有自己独立的内存,那线程有没有自己独立的内存呢,线程本地存储就是用来存储区线程所独有的数据。因为线程才是操作系统真正去运行的,进程只是一个包含线程以及所需数据的容器。

补充

用户从输入网址开始,浏览器到底发生了什么呢。用户一般是在地址输入栏中输入域名,域名通过DNS解析出对应的ip地址,然后再对应的数据库中请求数据,下载HTML文档以及CSS样式表,然后进行构件DOM树以及CSSOM树,等两者构建完之后在构件渲染树,然后根据文档流以及盒模型计算出各个元素的大小和位置,将其绘制之后显示在显示屏上。

由于浏览器引擎分为渲染引擎以及JS引擎,两个不同的引擎分别是在浏览器这个进程里面的两个不同的线程,这也是为什么操作DOM节点的速度会慢,因为跨线程操作的速度要低于同意个线程里面的操作速度。