进程(Process)
进程是操作系统结构的基础,是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念。进程是一个具有独立功能的程序关于某个数据集合的一次运行活动,它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程由进程控制块、程序段、数据段三部分组成。一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事,在程序被运行后,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。进程在运行时,状态(state)会改变:
状态之间的转换关系如图:
如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的发生。
进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位,每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一计算机上或网络连接的不同计算机上。进程间通信技术包括消息传递、同步、共享内存和远程过程调用。IPC是一种标准的Unix通信机制。主要的IPC方法:
l信号(Signals):信号是Unix系统中使用的最古老的进程间通信的方法之一。操作系统通过信号来通知进程系统中发生了某种预先规定好的事件(一组事件中的一个),它也是用户进程之间通信和同步的一种原始机制;
l套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。
l消息队列(Message queue):消息队列就是消息的一个链表,它允许一个或多个进程向它写消息,一个或多个进程从中读消息;
l管道(Pipe)和命名管道(Named Pipe):管道可用于具有亲缘关系进程间的通信,命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
l信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段;
l共享内存:通常由一个进程创建,其余进程对这块内存区进行读写;
l消息传递(Message passing)(不共享):用于MPI规范,Java RMI,CORBA,MSMQ, MailSlot 以及其它;
l内存映射文件(Memory-mapped file):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。
java实现进程间通信的方法主要有socket、RMI和CORBA