一、线程和进程的区别?

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。

当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。

一个进程之内可以分为一到多个线程。

一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行

Java中,线程是调度的最小单位,进程是资源分配的最小单位。再Windows中,进程是不活动的,只是作为线程的容器

二者对比

  • 进程是正在运行的程序的示例,进程中包含了线程,每个线程执行不同的命令

  • 进程使用独立内存,而同一进程内的线程可共享内存。进程间通信(IPC)用于实现进程间交流,线程间则可通过共享内存轻松通信。

  • 线程相对轻量,上下文切换成本通常较低,因为进程由操作系统调度,而线程调度可以由操作系统或线程库(用户空间线程库)进行。

常见的IPC机制包括(Inter-Process Communication,IPC):

  1. 管道(Pipes): 管道是一种单向通信机制,允许一个进程的输出成为另一个进程的输入。它是基于文件描述符的,可以用于父子进程通信,或者任意两个有共同祖先的进程之间通信。

  2. 消息队列(Message Queues): 消息队列是一种通过消息进行进程间通信的方式。进程可以将消息发送到队列,其他进程则可以从队列中接收这些消息。消息队列提供了一种异步通信的机制。

  3. 共享内存(Shared Memory): 共享内存允许多个进程访问同一块物理内存。这使得它们可以直接共享数据,而无需进行显式的消息传递。然而,需要额外的同步机制来避免并发访问问题。

  4. 信号量(Semaphores): 信号量是一种计数器,用于多进程之间的同步。它可以用于解决竞态条件和互斥问题。

  5. 套接字(Sockets): 套接字是一种在网络上进行通信的机制,但它也可以用于本地进程间通信。本地套接字提供了一种通过网络套接字接口进行通信的方式。

  6. 共享文件映射(Memory-Mapped Files): 共享文件映射允许多个进程将同一文件映射到它们的地址空间,从而实现数据的共享。

二、并行和并发的区别

  • 并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。

  • 并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事