这是我参与「第四届青训营 」笔记创作活动的第3天
进程和线程
进程:
进程是资源分配的基本单位。是一个抽象的概念,一般由程序,数据集合和进程控制快三部分组成。
-
程序用于描述进程要完成的功能,是控制进程执行的指令集。
-
数据集合是出现在执行时所需要的数据和工作区。
-
程序控制块,包含进程的描述信息和控制信息,是进程存在的唯一标识。
线程:
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
线程不是越多越好的!!!
-
因为一个CPU核心同一时刻,只能执行一个线程,然后操作系统切换上下文,CPU核心开始执行另外一个线程的任务。因此给定一个CPU核心,按顺序执行任务A和B比 并发执行A和B要快。计算机的“并行“能力取决于CPU的核心数目。一旦线程的数量超过了CPU核心数,再提高线程数也不会提高处理速度,反而因为上下文切换带来的损耗降低处理速度。
-
但是当线程的任务有大量的“I/O等待”时,线程总是阻塞着等待磁盘、网络等,此时CPU处于IDLE(即空闲)状态,可以用于服务其他线程。这个时候,增加线程数,“并发”处理任务,可以提高系统处理速度。
区 别
-
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源
-
线程是独立调度的基本单位,在同一个进程中,线程的切换不会引起进程的切换,从一个进程中的一个线程切换到另一个进程中的线程,会引起进程的切换。
-
进程要比线程消耗更多的资源。每个进程都有独立的代码和数据空间(包括代码段、数据集、堆等),进程之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小.
-
线程之间可以直接通过读写同一个进程中的数据进行通信,但进程之间通讯需要借助IPC
IPC(Inter-Process Communication)进程间通信
(1) 管道:(单向交替传输);只能在父子进程或者兄弟进程中使用。
(2) FIFOs(命名管道):去除了管道只能在父子进程中使用的限制。常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
(3) 消息队列:相比于 FIFO,消息队列具有以下优点:
-
消息队列可以独立于读写进程存在,从而避免了 FIFO 中同步管道的打开和关闭时可能产生的困难;
-
避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
-
读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收。
(4) 信号量:它是一个计数器,用于为多个进程提供对共享数据对象的访问。
(5) 共享内存:允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种 IPC。需要使用信号量用来同步对共享存储的访问。
多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外 XSI 共享内存不是使用文件,而是使用内存的匿名段。
(6) WebSocket:与其它通信机制不同的是,它可用于不同机器间的进程通信。
- 如果某个线程修改了内存,另一个线程能感知到吗?
通过全局变量volatile,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。