4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它
使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共
享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间
得同步和互斥手段。
6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络
中不同机器之间的进程间通信,应用非常广泛。同一机器中的进程还可以使用
Unix domain socket(比如同一机器中 MySQL 中的控制台 mysql shell 和 MySQL 服
务程序的连接),这种方式不需要经过网络协议栈,不需要打包拆包、计算校验
和、维护序号和应答等,比纯粹基于网络的进程间通信肯定效率更高。
CPU 核心数和线程数的关系
前面说过,目前主流 CPU 都是多核的,线程是 CPU 调度的最小单位。同一
时刻,一个 CPU 核心只能运行一个线程,也就是 CPU 内核和同时运行的线程数
是 1:1 的关系,也就是说 8 核 CPU 同时可以执行 8 个线程的代码。但 Intel 引入
超线程技术后,产生了逻辑处理器的概念,使核心数与线程数形成 1:2 的关系。
在我们前面的 Windows 任务管理器贴图就能看出来,内核数是 6 而逻辑处理器
数是 12。
在 Java 中提供了 Runtime.getRuntime().availableProcessors(),可以让我们获
取当前的 CPU 核心数,注意这个核心数指的是逻辑处理器数。
获得当前的 CPU 核心数在并发编程中很重要,并发编程下的性能优化往往
和 CPU 核心数密切相关。
上下文切换(Context switch)
既然操作系统要在多个进程(线程)之间进行调度,而每个线程在使用 CPU
时总是要使用 CPU 中的资源,比如 CPU 寄存器和程序计数器。这就意味着,操
作系统要保证线程在调度前后的正常执行,所以,操作系统中就有上下文切换的
概念,它是指 CPU(中央处理单元)从一个进程或线程到另一个进程或线程的切换。
上下文是
CPU
寄存器和程序计数器在任何时间点的内容。
寄存器是
CPU
内部的一小部分非常快的内存
(
相对于
CPU
内部的缓存和
CPU
外部较慢的
RAM
主内存
)
,它通过提供对常用值的快速访问来加快计算机程序的
执行。
程序计数器是一种专门的寄存器,它指示
CPU
在其指令序列中的位置,并
保存着正在执行的指令的地址或下一条要执行的指令的地址,这取决于具体的系
统。
上下文切换可以更详细地描述为内核(即操作系统的核心)对 CPU 上的进程
(包括线程)执行以下活动:
1. 暂停一个进程的处理,并将该进程的 CPU 状态(即上下文)存储在内存中的
某个地方
2. 从内存中获取下一个进程的上下文,并在 CPU 的寄存器中恢复它