1、线程与进程的区别与联系
①、进程,进程是操作系统资源分配和调度的最小单位,在系统中一般是一个程序的执行。
②、线程,线程是处理器任务调度和执行的基本单位,一个进程有多个线程。
为什么切换线程比切换进程开销小
对于一个程序来说,进程启动后会使用很多资源,比如寄存器、内存、文件等,这些在进程切换的时候必须要考虑保存当前进程的状态,包括存放在内存中的程序的代码和数据、栈、通用寄存器的内容、程序计数器、环境变量以及打开的文件描述符的集合,这个状态叫做上下文。
在一个进程中包含了很多线程,每个线程也都有自己的上下文,包括自己的栈、程序计数器等,线程的上下文可以看作进程上下文的子集,因此可以看出线程上下文的切换明显要比进程上下文切换的开销小很多。
2、进程的状态
进程的五态模型图如下:
类似于线程的状态。
3、进程的通信方式
,进程间通信的目的是为了数据共享、数据传输、时间通知、资源共享等,进程间通信方式有如管道(无名管道和命名管道)、消息队列、信号量、共享内存、套接字(Socket)等。
-
管道
半双工通信,数据只能单方向流动,有固定的读端和写端。而且它只能用于具有亲缘关系的管道(父子进程或者兄弟进程)。
命名管道除了具有管道的全部特性,他因为有名称还允许不具有亲缘关系的进程间相互通信。 -
信号量
信号量是一个计数器,可以用于控制对共享资源的访问,它常作为一种锁机制来控制在某个进程访问共享资源的时候其他进程也来访问此共享资源。因此常用来作为进程中不同线程的同步手段。 -
消息队列
消息队列是由消息组成的链表,存放在内核中,并由标识符(队列ID)标识。消息队列是面向记录的,其中的消息有特定的格式和特定的优先级,而且消息队列独立于发送和接收进程,进程终止时消息队列的内容不会被删除,消息队列可以实现消息的随机查询,不一定按照顺序。 -
FIFO,也称为命名管道,可以以一种无关的方式进行交互数据,以一种特殊的设备文件保存在文件系统中。
-
共享内存
共享内存指的是多个线程共享同一块内存存储区,共享内存是最快的进程间通信方式,因为进程直接对内存进行操作。
4、线程的通信方式
- 使用volatile关键字;
- 使用Object类下的wait()、notify()、notifyAll()等待唤醒机制;
- 使用ReentrantLock加Condition;
- 使用信号量、闭锁、栅栏。