进程和线程

个人理解
进程是系统资源分配的最小单位。
线程是分配给进程的系统资源的调度,通俗的可以说成是对进程分配资源的消耗。
因此,一个进程可以有多个线程,但至少有一个线程。

进程和线程之间的不同
多进程,每个进程都有自己的地址空间,而同一个进程的多个线程则共享这个进程的地址空间。

进程之间的通信方式

  • 信号
    信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。进程有三种方式响应信号:忽略信号、捕捉信号、执行缺省操作。
  • 信号量
    信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列
    消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,消息队列存放在内核中,消息队列的大小也是受限制的。
  • 共享内存
    分配一块能被其他进程访问的内存。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到 进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。是最快的IPC形式。
  • 管道
    管道传递数据是单向的,只用于有血缘关系的进程之间,没有命名和大小的限制,传递的是无格式流,所以两进程通信时必须规定好数据格式,管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自 的数据结构不同,所以功能不同。
  • 命名管道
    命名管道是服务器进程和一个或者多个客户端通信的单项或者双向管道,命名管道支持不相关的进程,和不同计算机之间通信。服务器建立管道是会给这个管道命名,任何进程都可以通过命名打开管道的另一端,根据给定的权限和服务器进程进行通信,命名管道提供了简单的编程接口,通过网络和多个进程传输数据效率很低。
    命名管道不同于管道的是可以在没有血缘关系的进程之间通信,提供了一个路径关联,有自己的数据格式。命名管道是个设备文件,存储在文件系统。
  • 嵌套字
    嵌套字可以用于不同主机之间的通信

线程之间的通信方式

  • 锁机制
    包括互斥锁、条件变量、读写锁
    互斥锁提供了以排他方式防止数据结构被并发修改的方法。
    读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
    条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

wait/notify 等待

Volatile 内存共享

CountDownLatch 并发工具

CyclicBarrier 并发工具

  • 信号机制
  • 信号量机制