进程和线程
进程是资源分配的最小单位,线程是 CPU 调度的最小单位。
线程是进程中的更小单位,描述了执行一段指令所需的时间。
一个进程就是一个程序的运行实例。详细解释就是,启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,我们把这样的一个运行环境叫进程。进程是运行在虚拟内存上的
进程和线程之间的关系有以下四个特点: (1)进程中的任意一线程执行出错,都会导致整个进程的崩溃。 (2)线程之间共享进程中的数据。 (3)当一个进程关闭之后,操作系统会回收进程所占用的内存,当一个进程退出时,操作系统会回收该进程所申请的所有资源;即使其中任意线程因为操作不当导致内存泄漏,当进程退出时,这些内存也会被正确回收。 (4)进程之间的内容相互隔离。进程隔离就是为了使操作系统中的进程互不干扰,每一个进程只能访问自己占有的数据,也就避免出现进程 A 写入数据 到进程 B 的情况。正是因为进程之间的数据是严格隔离的,所以一个进程如果崩溃了,或者挂起了,是不会影响到其他进程的。如果进程之间需要进行数据的通信,这时候,就需要使用用于进程间通信的机制了
进程和线程的区别
- 进程可以看做独立应用,线程不能
- 资源:进程是 cpu 资源分配的最小单位(是能拥有资源和独立运行的最小单位);线程是 cpu 调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)。
- 通信方面:线程间可以通过直接共享同一进程中的资源,而进程通信需要借助 进程间通信。
- 调度:进程切换比线程切换的开销要大。线程是 CPU 调度的基本单位,线程的切换不会引起进程切换,但某个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存、I/O 等,其开销远大于创建或撤销线程时的开销。同理,在进行进程切换时,涉及当前执行进程 CPU 环境还有各种各样状态的保存及新调度进程状态的设置,而线程切换时只需保存和设置少量寄存器内容,开销较小。
协程
Fiber 也称协程或者纤程。它和线程并不一样,协程本身是没有并发或者并行能力的(需要配合线程),它只是一种控制流程的让出机制。让出 CPU 的执行权,让 CPU 能在这 段时间执行其他的操作。渲染的过程可以被中断,可以将控制权交回浏览器,让位给高优先级的任务,浏览器空闲后再恢复渲染。
并发和并行
并发就是在一段时间内,多个任务都会被处理;但在某一时刻,只有一个任务在执行。
并行就是在同一时刻,有多个任务在执行。这个需要多核处理器才能完成,在微观上就能同时执行多条指令,不同的程序被放到不同的处理器上运行,这个是物理上的多个进程同时进行。
进程之间的通信方式
- 管道
- 消息队列
- 信号量通信
- 信号
- 共享内存
- 套接字
进程间通信指的是不同进程之间进行数据交换和共享的过程。常见的进程间通信方式有以下几种:
-
管道(Pipe):管道是一种半双工的通信方式,只能在具有亲缘关系的进程之间使用,即 父进程与子进程之间。
-
命名管道(FIFO):命名管道也是一种半双工的通信方式,但不限于亲缘关系的进程之间,可以在 任意进程之间进行通信。
-
消息队列(Message Queue):消息队列是一种可供多个进程共享的消息链表,它由消息标识符、消息类型和消息数据三部分组成。
-
信号量(Semaphore):信号量是一种计数器,用于多个进程对共享资源的访问,通过对信号量的操作来实现对 共享资源的互斥和同步。
-
共享内存(Shared Memory):共享内存是最快的一种进程间通信方式,它允许多个进程共享同一块物理内存,从而避免了数据的复制。
-
套接字(Socket):套接字是一种网络编程接口,可以在不同主机之间的进程进行通信,是最常用的一种进程间通信方式之一。