
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了程序员在学习Java编程开发语言的时候需要掌握的一些基础知识等内容,而本文我们就继续来学习一下,进程间通信方式分享。
进程/线程间通信方式
进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC。
管道
它是半双工的,具有固定的读端和写端;
它只能用于父子进程或者兄弟进程之间的进程的通信;
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
命名管道
FIFO可以在无关的进程之间交换数据,与无名管道不同;
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。
消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符ID来标识;
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级;
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除;
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
信号量
信号量(semaphore)是一个计数器。用于实现进程间的互斥与同步,而不是用于存储进程间通信数据;
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存;
信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作;
每次对信号量的PV操作不仅限于对信号量值加1或减1,而且可以加减任意正整数;
支持信号量组。
共享内存
共享内存(SharedMemory),指两个或多个进程共享一个给定的存储区;
共享内存是快的一种IPC,因为进程是直接对内存进行存取。
Socket通信
前面说到的通信机制,都是工作于同一台主机,如果要与不同主机的进程间通信,那么就需要Socket通信了。Socket实际上不仅用于不同的主机进程间通信,还可以用于本地主机进程间通信,可根据创建Socket的类型不同,分为三种常见的通信方式,一个是基于TCP协议的通信方式,一个是基于UDP协议的通信方式,一个是本地进程间通信方式。
以上,就是进程间通信的主要机制了。你可能会问了,那线程通信间的方式呢?
同个进程下的线程之间都是共享进程的资源,只要是共享变量都可以做到线程间通信,比如全局变量,所以对于线程间关注的不是通信方式,而是关注多线程竞争共享资源的问题,信号量也同样可以在线程间实现互斥与同步:
互斥的方式,可保证任意时刻只有一个线程访问共享资源;
同步的方式,可保证线程A应在线程B之前执行;
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei456学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。