程序、进程、线程之间的区别,以及进程之间的通信方式
还是之前面试中碰到的问题,下去研究了下。
Q:说一下程序、进程、线程之间的区别?
A:简单来说就是:系统要做一件事,运行一个任务,所有要运行的任务就是一个程序。而每个运行中的程序就是一个进程,这一点在任务管理器上可以看到。当一个进程运行时,内部可能会包含多个执行流,每个执行流就是一个线程。下面分点来说:
1.程序:程序是一组指令的有序集合,含有指令和数据的文件,因此程序是静态的代码。
2.进程:进程是具有独立功能的程序的一次运行活动,因此可以说进程是动态的程序。进程是操作系统进行资源分配的基本单位。进程有以下几个特性:a) 独立性:进程是系统中独立存在的实体,它有自己独立的资源。b) 动态性:进程和程序的区别在于,程序是静态的,而进程是动态的。程序只是一个有序的指令集合,而进程是系统中正在运行的程序,它有时间的概念,比如生命周期。c) 并发性:进程之间交替执行。
3.线程:在一个进程的执行过程中,可以产生多个线程。相对于进程而言,进程是线程的容器,而线程是一个更加接近于执行体的概念。与进程独立占有资源不同的是,线程之间是共享系统资源的,这也是它和进程之间最根本的区别,其他所有区别都是在这个前提下引申出来的。比如说线程的创建速度快、线程之间的通信速度快、线程之间的切换速度快,原因是他们共享同一块内存空间。还有线程的资源利用率比进程好,原因也是他们共享同一块内存空间。还有线程之间是存在同步问题的:线程使用公共变量或者公共内存时需要使用同步机制,原因还是因为线程之间是共享资源的。 因此相较于进程,线程是存在一些优势的:1. 进程之间不能共享内存,但是线程就可以。2. 系统创建进程要为进程重新分配资源,而线程则不用重新分配资源,因此创建进程的代价远远高于创建线程的代价。因此多线程实现多任务并发,比多进程实现并发的效率高。3. 线程的上下文切换比进程上下文切换的速度快。 4. java语言内置多线程功能支持,而不是单独的作为底层操作系统的调度方式。
总而言之:一个程序运行至少产生一个进程,一个进程里面至少包含一个线程。线程是进程的组成部分。线程相对于进程而言很强大,做到了资源共享,资源的损耗降低,可以人为的手工控制程序的运行。
Q:讲一下进程上下文切换相比于线程上下文切换快的原因?
A:因为进程之间的资源是独立的。因此进程在切换是要保存当前进程的CPU环境,还要加载要切换到目的线程的CPU环境。而线程则不需要做这方面的工作,线程只需要保存和设置少量的寄存器内容。所以线程的切换速度更快一些。
Q:说一下线程间的通信方式:
A:首先,要实现线程间的通信的模型有两种:共享内存和消息传递。一下的方式都是基于这两种模式实现的。1.锁机制,比如可以使用volatile关键字、synchronized关键字等。2.可以使用Object类的wait和notify方法实现。3.可以使用J.U.C包工具下的各种工具类实现。4.可以使用ReetrantLock结合Condition来实现。5.使用LockSupport实现线程间的阻塞和唤醒
Q:说一下进程之间的通信方式?
A:进程间的通信方式主要有6种方式,分别是:
1. 管道(pipe)及有名管道(named pipe):管道是一种半双工的通信方式,可用于具有亲缘关系的父子进程间的通信。有名管道出了具有管道所具有的功能外,它还允许无亲缘关系的进程之间的通信。(至于管道的详情后面会详细讲解)
2. 信号(signal):用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。
3. 信号量(semphore):主要作为进程之间及同一个进程的不同线程之间的同步和互斥手段。
4. 消息队列(message queue):消息队列是消息的连接表,它克服了以上两种通信方式中的信号量有限的缺点。具有写权限的进程可以按照一定的规则向消息队列中添加信息,对消息队列有读权限的进程则可以从消息队列中读取信息。
5. 共享内存(shared memory):这是最有用的进程间通信方式,共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建。但多个进程都可以访问,其他进程可以看到对方进程中对共享内存中的数据的更新。这种方式需要依赖某种同步操作,如互斥锁和信号量
6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信。