- 进程:
- 程序是静止的,当一个程序被运行,就是进程,进程是系统进行资源分配的基本单位。
- 线程:
- 线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,与同属一个进程的其他线程共享进程所拥有的全部资源。
- 进程和线程的关系:
- 一个进程可以包含多个线程,这就是多线程,比如看视频是进程,图画、声音、广告等就是多个线程
- 线程的作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能
- 进程是资源分配的最小单位,线程是调度执行的最小单位。
进程与线程
基本概念
- 进程:
- 程序是静止的,当一个程序被运行,就是进程,进程是系统进行资源分配的基本单位。
- 线程:
- 线程是属于进程的,是一个基本的 CPU 执行单元,是程序执行流的最小单元。线程是进程中的一个实体,是系统独立调度的基本单位,线程本身不拥有系统资源,只拥有一点在运行中必不可少的资源,与同属一个进程的其他线程共享进程所拥有的全部资源。
- 进程和线程的关系:
- 一个进程可以包含多个线程,这就是多线程,比如看视频是进程,图画、声音、广告等就是多个线程
- 线程的作用:使多道程序更好的并发执行,提高资源利用率和系统吞吐量,增强操作系统的并发性能
- 进程是资源分配的最小单位,线程是调度执行的最小单位。
并行与并发
- 并行:
- 两个及两个以上的作业在同一 时间段 内执行。
- 并发:
- 两个及两个以上的作业在同一 时刻 执行。
异步与同步
- 异步:
- 不需要等待结果返回,就能继续运行。
- 同步:
- 需要等待结果返回,才能继续运行。
进程通信和线程通信
进程间的通信方式有以下几种:
- 管道:包括匿名管道和命名管道。
- 匿名管道有两个描述符,一个是管道的读取文件描述符
fd[0]
,另一个是管道的写入文件描述符fd[1]
,通过读取描述符读取数据,通过写入描述符写入数据,子进程可以通过fork
得到父进程的fd[0]
和fd[1]
。对于匿名管道,它用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。 - 命名管道是以文件的方式存在,对于命名管道,它可以让不相关的进程间也能相互通信。因为命令管道,是提前创建了一个类型为管道的文件,在进程里只要使用这个文件,就可以相互通信。
- 匿名管道有两个描述符,一个是管道的读取文件描述符
- 消息队列:消息队列是保存在内核中的消息链表,只有在内核重启或者显式地删除一个消息队列时,该消息队列才会被真正的删除。消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销,因为进程写入数据到内核中的消息队列时,会发生从用户态拷贝数据到内核态的过程,同理另一进程读取内核中的消息数据时,会发生从内核态拷贝数据到用户态的过程。
- 共享内存:多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。
- 信号量:为了防止多进程竞争共享资源,而造成的并发问题,所以需要保护机制,使得共享的资源,在任意时刻只能被一个进程访问,信号量就实现了这一保护机制。信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步。
- 信号:用于通知进程某个事件已经发生,可以通过
kill
命令的方式给进程发送信号,比如kill -9
表示给进程发送SIGKILL
信号,用来立即结束该进程;Ctrl+C
表示发送SIGINT
信号,表示中断该进程。 - 套接字Socket:此方法主要用于跨网络的不同主机上的进程之间的通信。
- 管道:包括匿名管道和命名管道。
线程通信相对简单,因为线程之间共享进程内的内存,一个例子是多个线程可以访问同一个共享变量。
- Java 中的通信机制:volatile、等待/通知机制、join 方式、
InheritableThreadLocal
、MappedByteBuffer
- Java 中的通信机制:volatile、等待/通知机制、join 方式、