进程通信概念简介 多线程上篇(六)

进程通信指的是进程间的信息交换 ,IPC(Inter-Process Communication,进程间通信)

之前说到:

进程通信就相当于一种工作方式、沟通形式,比如你给我一个SVN标签号并且告知我意图,我去库中检索指定标签修改的指定内容,就完成了一个任务的协作。

进程同步中,也有信息的交换,比如互斥量访问,再比如生产者和消费者,共享缓冲池,但是这些通常被称之为低级的进程通信。

以信号量为例,如果你说我在塔顶点亮灯表示危险,否则表示安全,这没问题,如果你想用灯亮灯灭来像QQ一样,大段大段的传递讯息可能么?

多搞几盏灯?然后用编码?即使那样你依然是很费力的。

所以说尽管比如信号量机制作为同步工具是卓有成效的,但作为通信工具,则不够方便

首先是效率低,另外共享数据结构的设置、数据的传送、进程的互斥与同步等,都必须由程序员自己去实现

所以,对于进程间的通信,我们迫切的渴望有“封装好的方法”

进程通信主要指的就是操作系统提供的进程通信工具(“封装好的方法”)用来进程间的信息交换。

进程通信类型

主要有四种通信方式

共享存储器系统

共享存储系统关键在于共享

主要两种:

  • 共享数据结构
  • 共享存储区

管道通信

这种方式首创于UNIX 系统,由于它能有效地传送大量数据,因而又被引入到许多其它的操作系统中

管道指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,这个文件又被叫做pipe文件

管道可以理解为一种比较特殊的“共享存储器系统”的通信方式

消息传递系统

在该机制中,进程不必借助任何共享存储区或数据结构,而是以格式化的消息(message)为单位,将通信的数据封装在消息中

并利用操作系统提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换

计算机网络中的报文就是一种message

消息传递系统中的消息,其实也是“共享数据结构”的一种形式,是一种特殊的形式

因为被共享的数据结构而不是随便自定义的,而是大家共同设计好的,认可的,一致的一种格式。

基于这种一致性的格式,然后操作系统对他提供了支持

所以,他就是共享数据结构的一个特例,这个特例使用更加方便简单。

简单说,计算机报文是一种message,那么操作系统对整个TCP/IP协议栈的实现,这就是通信命令,封装了底层的传输细节,对开发者来说是透明的

客户服务器系统

客户机一服务器系统的通信机制,在网络环境的各种应用领域已成为当前主流的通信实现机制

BS架构的系统本质也是包装演化的CS,浏览器难道不是客户端软件么

主要有三种:

  • 套接字
  • 远程过程调用
  • 远程方法调用

远程过程调用 RPC(Remote Procedure Call),RPC采用客户机/服务器模式,请求程序就是一个客户机,而服务提供程序就是一个服务器

RPC允许你 透明的 调用远程服务器上提供的服务

对于面向对象的编程中,远程过程调用通常也被称为远程方法调用

比如java1.1中实现的Remote Method Invocation,RMI,可以认为是RPC的Java版本,RMI大大增强了Java开发分布式应用的能力。

概括地说的话:

远程过程调用RPC是一种协议概念,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC不依赖于具体的网络传输协议,tcp、udp等都可以。

协议必然需要被实现才能使用,他只是一种协议与标准,RMI就相当于是sun对RPC的一个Java实现

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是更加底层的通信工具,所以可以认为RPC是socket的上层建筑

一个或许不是很合适的比喻:如果RPC是议论文格式,那么RMI可能是汉语的议论文,socket可能是汉字

套接字原理步骤

双方进程运行在不同主机的网络环境下,被分配了一对套接字,一个属于接收进程(或服务器端),一个属于发送进程(或客户端)。

发送进程(或客户端)发出连接请求时,随机申请一个套接字,主机为之分配一个端口,与该套接字绑定,不再分配给其它进程。

接收进程(或服务器端)拥有全局公认的套接字和指定的端口(如ftp服务器监听端口为21,Web或http服务器监听端口为80),并通过监听端口等待客户请求。因此,任何进程都可以向它发出连接请求和信息请求,以方便进程之间通信连接的建立。

接收进程(或服务器端)一旦收到请求,就接受来自发送进程(或客户端)的连接,完成连接,即在主机间传输的数据可以准确地发送到通信进程,实现进程间的通信;

当通信结束时,系统通过关闭接收进程(或服务器端)的套接字撤销连接。

远程过程原理步骤

负责RPC的调用的进程有两个,一个是本地客户进程,另一个是远程服务进程,这两个进程也被称之为网络守护进程,主要负责网络之间的消息传递

通常处于阻塞之中,等待消息。

而远程过程调用的透明化核心就是所谓的存根,也叫做桩stub

所以说两个进程和两个存根是RPC的根本

桩的原理

桩类似代理者、转换器一类的角色

举一个例子:在一些与底层硬件芯片等交互的软件层,软件层依赖底层芯片的处理,如何更方便的进行代码测试?

也就是相当于A类中有方法functionA,B类中有方法functionB(假定functionB 是硬件处理部分,测试并不方便,需要依赖设备)

functionA(){

functionB();

}

我们就可以编写一个新的类C,提供桩方法:functionStubC,所有调用functionB的地方全部使用functionStubC,也就是

functionA(){

functionStubC();

}

而functionStubC的返回值,永远是functionB成功的返回值。

这就是一个打桩的概念。

RPC也是通过这个桩的概念来实现透明的远程过程调用

对本地调用来说,他看到的只是客户端存根(stub)

就如同我们上面的functionStubC,当然比functionStubC要更加复杂,所有的处理都在他背后被执行

所以对本地调用来说是透明的

RPC过程步骤

  1. 本地过程调用者以一般方式调用远程过程在本地关联的客户存根,传递相应的参数,然后将控制权转移给客户存根;
  2. 客户存根执行,完成包括过程名和调用参数等信息的消息建立,将控制权转移给本地客户进程;
  3. 本地客户进程完成与服务器的消息传递,将消息发送到远程服务器进程;
  4. 远程服务器进程接收消息后转入执行,并根据其中的远程过程名找到对应的服务器存根,将消息转给该存根;
  5. 该服务器存根接到消息后,由阻塞状态转入执行状态,拆开消息从中取出过程调用的参数,然后以一般方式调用服务器上关联的过程;
  6. 在服务器端的远程过程运行完毕后,将结果返回给与之关联的服务器存根;
  7. 该服务器存根获得控制权运行,将结果打包为消息,并将控制权转移给远程服务器进程:
  8. 远程服务器进程将消息发送回客户端;
  9. 本地客户进程接收到消息后,根据其中的过程名将消息存入关联的客户存根,再将控制权转移给客户存根;
  10. 客户存根从消息中取出结果,返回给本地调用者进程,并完成控制权的转移。

总结

进程通信的一些核心思想与基本形式就是上面的这些简介

这些是最纯粹基本的理论知识,而对于我们实际的开发中,面对的总是各种各样的对于现存的理论的实现版本

核心仍旧是依赖操作系统以及语言本身的实现以及一些框架等

但是理解这些概念是必要的,能让你后续的学习路线越来越明朗,技术是层不出穷的,你仅仅学习招式,永远也无法穷尽,还导致自己没有底蕴。

原文地址:进程通信概念简介 多线程上篇(六)

原文地址:https://www.cnblogs.com/noteless/p/10354581.html

时间: 2024-11-05 16:00:28

进程通信概念简介 多线程上篇(六)的相关文章

进程控制概念简介 多线程上篇(三)

进程控制 进程的基本数据信息是操作系统控制管理进程的数据集合,这些信息就是用来控制进程的,此处我们说的进程控制就是进程的管理. 比如进程有状态,那么进程的创建.终止,状态的切换,这都不是进程自主进行的,都是通过操作系统进行管理的 如下图所示,所有的相关数据都是操作系统用来管理维护进程的 操作系统抽象出进程概念的核心是为了运行程序 所以进程的执行态是最为核心的 其他的状态则是为了更好的控制管理进程以及进程的并发执行而附加的 所以,一定程度上来讲,操作系统对于进程的控制,可以认为是对于进程的不同状态

进程同步概念简介 多线程上篇(四)

进程同步概念 临界资源 一旦有对资源的共享,就必然涉及竞争限制 比如尽管有两个人去水井打水,但是水井却只有一个:合理安排的话刚好错开,但是如果安排不合理,那就会出现冲突,出现冲突怎么办?总有一个先来后到,等下就好了. 这个水井就是一个临界资源 临界资源用来表示一种公共资源或者说是共享数据,可以被多个线程使用. 但是每一次,只能有一个线程使用它,一旦临界资源被占用,其他线程要想使用这个资源,就必须等待. 当多进程访问临界资源时,比如打印机 假设A进程和B进程轮流获得CPU时间片执行,A打印数学,B

Java多线程概念简介 多线程中篇(一)

Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JDK1.2中,线程模型变为基于操作系统原生线程模型来实现的 所以说Java虚拟机中线程的映射实现,是受制于操作系统的,操作系统支持怎样的线程模型,决定了Java虚拟机中线程的样子. 虚拟机规范中也并未限定Java线程需要使用哪种线程模型来实现. 线程模型只对线程的并发规模和操作成本产生影响,对Java程序

线程概念简介 什么是线程 多线程上篇(七)

操作系统为了程序的并发执行引入了进程的概念,提高了资源的利用率以及吞吐量. 在20世纪 60年代人们提出了进程的概念后,在OS中一直都是以进程作为能拥有资源和独立运行的基本单位的. 直到 20 世纪 80 年代中期,人们又提出了比进程更小的能独立运行的基本单位——线程(Threads) 试图用它来提高系统内程序并发执行的程度,从而可进一步提高系统的吞吐量. 简言之,进程的概念,使之能够并发执行多道程序,线程的概念让你更好地并发执行程序,一个是能不能的问题,一个是更好的问题. 线程与进程对比 线程

进行概念详解 多线程上篇(二)

操作系统是程序与硬件交互的中间层,现代操作系统将程序的一次执行抽象为进程和线程的概念. 进程作为资源分配的基本单位,线程作为执行的基本单位. 进程和线程其实就是操作系统程序本身实现控制一个程序运行的数据项描述 所有的程序都是面向语言进行开发的,而语言本身是面向操作系统的,线程是操作系统对程序一次运行的抽象 所以,所有的多线程编程模型,必然遵从操作系统的大逻辑,必然是符合操作系统的对线程的抽象概念,操作系统在抽象之上提供了API供应用程序调用 简言之,应用程序的底层是借助于操作系统来完成多线程编程

linux之多线程fork:进程通信

++++++++++++++++++信号机制+++++++++++++++++++ 接收信号 int signal(int sig,__sighandler_t handler); int func(int sig); sig 指明了所要处理的信号类型,handler是SIG_IGN,SIG_DFL或者返回值为整数的函数地址. 当执行了signal函数后,进程只要接收到类型为sig 的信号,就立即执行 func()函数,不管其正在执行程序的哪一部分.当func()函数执行结束后,程序返回到进程被

【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了

一.前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11774836.html],谢谢! 提起跨进程通信,大多数人首先会想到AIDL.我们知道,用AIDL来实现跨进程通信,需要在客户端和服务端都添加上aidl文件,并在服务端的Service中实现aidl对应的接口.如果还需要服务端给客户端发送信息,还需要再添加回调相关的aidl文件,以及使用RemoteCallbackList来辅助实现该功能.在我的另外一篇文章[朝花夕拾]Android性能

第七课 进程通信

unix_c_07.txt================第七课 进程通信================一.基本概念------------1. 何为进程间通信~~~~~~~~~~~~~~~~~进程间通信(Interprocess Communication, IPC)是指两个,或多个进程之间进行数据交换的过程.2. 进程间通信分类~~~~~~~~~~~~~~~~~1) 简单进程间通信:命令行参数.环境变量.信号.文件.2) 传统进程间通信:管道(fifo/pipe).3) XSI进程间通信:

Linux间的进程通信;以及子进程的创建

1 "-----第六天-----------------------------------------------------------------------------" 2 3 1.版本控制:svn/git; 4 5 2.进程的概念: 6 1)程序和进程: 7 每个进程操作系统会为它分配 0-4G 的虚拟内存空间(32位操作系统): 其中0-3G为用户内存空间,进程可以对它进行读写操作: 3G - 4G 为系统内核空间,进程没有读写权限. 8 进程只能读写用户空间,没有权限读