第3讲 进程间通信

2023-05-16

文章目录

    • 3.1 简介
    • 3.2 互联网协议的API
    • 3.3 外部数据表示和编码
    • 3.4 组播通信
    • 3.5 网络虚拟化:覆盖网络

3.1 简介

UDP的应用程序接口提供了消息传递(Message Passing)抽象
-进程间通信的最简单形式
-使得发送进程能够给一个接收进程传递一个消息
-包含消息的独立的数据包称为数据报(datagram)

TCP的应用程序接口提供了进程对之间的双向流(two-way stream)抽象
-相互通信的信息由没有消息边界的一连串数据项组成
-双向流为生产者—消费者通信提供了构造成分

3.2 互联网协议的API

1 进程间通信的特征
由Send和Receive这两个消息通信操作来支持一对进程间进行的消息传递,均用目的地和消息定义
一个进程发送一个消息到目的地,在目的地的另一个进程接收消息
该活动设计发送进程到接收进程间的数据通信,涉及两个进程的同步

同步和异步通信
每个消息目的地与一个队列相关:发送进程将消息添加到远程队列中,接收进程从本地队列中移除消息
发送进程和接收进程间可以是同步也可以是异步的
-同步(synchronous)通信
发送进程和接收进程在每个消息上同步
Send和Receive都是阻塞操作
-异步(asynchronous)通信
Send操作是非阻塞的,只要消息复制到本地缓冲区,发送进程就可以继续其他处理
消息传递和发送进程并行
Receive操作包括阻塞和非阻塞两种形式

什么是Socket
独立于具体协议的网络编程接口
在ISO模型中,主要位于会话层和传输层之间
BSD Socket(伯克利套接字)是通过标准的UNIX文件描述符和其它程序通讯的一个方法,目前已经被广泛移植到各个平台。

Socket类型
流式套接字(SOCK_STREAM)
-提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。
数据报套接字(SOCK_DGRAM)
-提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。
原始套接字(SOCK_RAW)
-可以对较低层次协议,如IP、ICMP直接访问。

不同操作系统中的Socket
Windows Socket (Winsock)
Linux Socket (BSD Socket)

2 套接字
UDP和TCP都是用套接字(Socket)抽象
套接字提供进程间通信的一个端点
进程间通信是在两个进程各自的一个套接字之间传送一个消息

用于互联网地址的Java API
Java提供了一个InetAddress类,用以表示互联网地址
可以通过调用InetAddress的静态方法来获得地址
InetAddress aComputer = InetAddress.getByName(“bruno.dcs.qmul.ac.uk”)
InetAddress类封装了互联网地址的细节,可以表示IPv4和IPv6

3 UDP数据报通信
由UDP发送的数据报从发送进程传输到接收进程,不需要确认或重发。如果发生故障,消息可能无法到达目的地。
当一个进程send数据报,另一个进程receive该数据报时,数据报就会在进程间传送。
要发送或接收消息,进程必须首先创建于一个本地主机的互联网地址和本地端口绑定的套接字。
-服务器将它的套接字绑定到一个服务器端口(server port),该端口应让客户端知道,以便客户端给该端口发送消息
-客户将它的套接字绑定到任何一个空闲的本地端口。
-Receive方法除了获得消息外,还获得发送方的互联网地址和端口,这些信息允许接收方发送应答。

数据报通讯相关问题
-消息大小(message size)
接收进程要指定固定大小的用于接收消息的字节数组。
如果消息大于数组大小,那么消息会在到达时被截断。
-阻塞(blocking)
套接字通常会提供非阻塞的send操作和阻塞的receive操作
除非套接字上设置了超时,否则receive方法将会一直阻塞直到接收到一个数据报为止。
-超时(timeout)
在有些程序中,receive操作不适合无限制等待下去
-任意接收(receive from any)
receive方法不指定消息的来源

UDP的使用
对一些应用而言,使用偶尔有遗漏故障的服务是可接受的-域名服务、VOIP等
UDP的优势在于没有保证消息传递相关的开销
UDP的开销主要包括:
需要在源和目的地存储状态信息
传输额外的消息
发送方的延迟

4 TCP流通信
TCP协议的API源于BSD 4.x UNIX,它提供了可读写的字节流。
流抽象可以隐藏网络的下列特征:
消息大小(message size)
消息丢失(lost message)
流控制(flow control)
消息重复和排序(message duplicate and ordering)
消息的目的地(message destination)

客户和服务器的套接字对由一对流相连接,每个方向一个流
每个套接字都有一个输入流,一个输出流
进程对中的任何一个进程都可以通过将信息写入它的输出流来发送信息给另外一个进程,而另一个进程可以通过读取它的输入流来获得信息
当一个应用close一个套接字时,表示它不再写任何数据到它的输出流。输出缓冲区的中所有数据被送到流的另一端,放在目的地套接字的队列中,并指明流已断开。

3.3 外部数据表示和编码

存储在运行的程序中的信息都表示成数据结构,而消息中的信息由字节序列组成
不论使用何种通信形式,数据结构在传输时都必须转换成字节序列,到达目的地后再重构
在消息中传送的单个简单数据项可以是不同类型的数据值

编码(marshalling)是将多个数据项组成合适消息传送的格式的过程
解码(unmarshalling)是在消息到达后分解消息,在目的地生成相等的数据项的过程

1 CORBA的公共数据表示
CORBA的公共数据表示(Common Data Representation, CDR)是CORBA 2.0定义的外部数据表示。
CDR能表示所有在CORBA远程调用中用作参数和返回值的数据类型。
基础类型(Primitive):
CDR定义了大序法排序和小序法排序的表示
值按照发送端消息中指定的顺序传送
接收端如果要求不同的顺序就要进行翻译
结构化类型(Constructed Types):
组成每个结构化类型的简单类型值按特定的顺序加到字节序列中

CORBA中的编码
根据在消息中传送的数据项类型的规约,可以自动生成编码操作
数据结构的类型和基本数据类型用CORBA IDL描述
CORBA接口编译器根据远程方法的参数类型和结果类型的定义为参数和结果生成适当的编码和解码操作

2 JAVA对象序列化
在Java RMI中,对象和简单数据值都可以作为方法调用的参数和结果传递。一个对象是一个Java类的实例。
例如:CORBA IDL中定义的Person struct作用相当于Java类

Public class Person implements Serializable{
        private String name;
        private String place;
        private int year;
        public Person(String aName, String aPlace, int aYear){
              name = aName;
              place = aPlace;
              year = aYear;
        }
}

上面的类表明实现了Serializable接口,该接口没有方法,意味着它的实例能够序列化

3 可扩展标记语言
可扩展标记语言(Extensible Markup Language, XML)
XML和HTML都是从SGML(标准化的通用标记语言)派生出来的
XML数据项以“标记”串做标签,标记用于描述数据的逻辑结构,并将属性—值对与逻辑结构关联起来。
XML可用于实现客户与Web服务的通信以及定义Web服务的接口和其他属性
XML是可扩展的,这意味着用户能定义自己的标记
XML文档是文本形式存储的
-使得XML可以独立于某个平台
-使用文本而不是二进制会使得消息内容变大

4 远程对象引用
客户端调用远程对象中的一个方法时,就会向存放远程对象的服务器进程发送一个调用消息。这个消息需要指定哪一个对象具有要调用的方法。
远程对象引用(remote object reference)是远程对象的标识符,在整个分布式系统中有效。
远程对象引用在调用消息中传递,以指定调用哪一个对象。
远程对象应用必须确保空间和时间唯一性的方法生成
-在远程对象上有许多进程,所以远程对象引用在分布式系统的所有进程中必须是唯一的

3.4 组播通信

一个进程与一组进程通信是必要的
消息成对交换不是一个进程到一组进程通信的最佳模式
组播操作(multicast operation)是更合适的方式
-将单个消息从一个进程发送到一组进程的每个成员的操作
-组的成员对发送方通常是透明的
组播的行为有很多种情况,最简单的组播不提供消息传递保证或排序保证

组播消息为构造具有下列特征的分布式系统提供了基础设施:
-基于复制服务的容错
一个复制服务由一组服务组成,客户请求被组播到所有成员,每个成员执行相同操作
-在自发网络中发现服务
客户和服务器使用组播消息来找到可用的发现服务
-通过复制的数据获得更好的性能
例如:数据副本放在用户计算机上,每次数据改变,新值就组播到副本数据各个进程中
-事件通知的传播
在发生某些事件时通知相关进程

3.5 网络虚拟化:覆盖网络

互联网通信协议通过API提供了一组有效的构造分布式软件的构造块
-不断增加的大量不同类型的应用在互联网上并存
-改变互联网协议来适用运行在其上的每一个应用是不实际的
-IP传输服务是实现在网络技术之上的
网络虚拟化涉及在一个已有的网络之上构造多个不同的虚拟网络
每个虚拟网络被设计成支持一个特定的分布式应用
-支持多媒体数据流、多人在线游戏
面向特定应用的虚拟网络构建在一个已有的网络上并为特定的应用进行优化,而不改变底层网络的特征

覆盖网络(overlay network)
节点和虚拟链接组成的虚拟网络,位于一个底层网络之上
-满足一类应用需求的服务或一个特别高层的服务,例如:多媒体内容分发
-在一个给定的联网环境中的更有效的操作,例如:在一个自组织网络中的路由
-额外的特色,例如:组播或安全通道

覆盖网络的好处:
不改变底层网络就能定义新的网络服务-取决于该领域标准化的水平和修补底层路由功能的困难
鼓励对网络服务进行实验和对服务进行面向特定应用的定制
能定义多个覆盖网,它们能同时存在,从而形成更开放和扩展的网络体系结构

覆盖网的不足:
引入了额外的间接层(因此可能会有性能损失)

覆盖网与熟悉的分层概念相关:
一个覆盖网是一层,是标准体系结构(TCP/IP)外存在的一层
覆盖网可以定义如上所述的网络的核心元素:寻址模式、扫采用的协议、路由方法等

Skype:一个覆盖网络的例子
Skype是一个对等应用,在IP上提供语音电话服务(Voice over IP)。
-包括SkypeIn和SkypeOut提供即时消息、视频会议和标准电话服务的接口
-2009年已有3.7亿用户
Skype在不修改互联网体系结构的前提了,展示了如何以应用特定的方式提供高级功能。
Skype构建了一个虚拟网络,用于建立用户间的连接。在此之上创建一个呼叫无需IP地址或端口。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第3讲 进程间通信 的相关文章

  • 【C++服务器入门基础------4.IPC进程间通信--管道】

    大学生寒假在家过于无聊 xff0c 整理一下以前学过的知识 xff0c 顺便复习一下 xff0c 水平较低 xff0c 专业性差 xff0c 仅供参考 xff0c 不喜勿喷 xff08 反正也没人看 xff09 连续一周多出去泡妞了 xff
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • c++进程间通信

    C 语言中的进程间通信方式有多种 xff0c 包括共享内存 消息队列 信号量 套接字等 共享内存是指多个进程可以访问同一块内存 xff0c 从而实现进程间的通信 共享内存的优点是速度快 xff0c 但实现较为复杂 xff0c 需要自己维护同
  • 【进程间通信】——认识同步与互斥,了解生产者消费者原理。

    临界资源 在操作系统中 xff0c 进程是占有资源的最小单位 xff08 线程可以访问其所在进程内的所有资源 xff0c 但线程本身并不占有资源或仅仅占有一点必须资源 xff09 但对于某些资源来说 xff0c 其在同一时间只能被一个进程所
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • linux消息队列服务,Linux进程间通信-消息队列(mqueue)深入理解

    前面两篇文章分解介绍了匿名管道和命名管道方式的进程间通信 xff0c 本文将介绍Linux消息队列 posix 的通信机制和特点 1 消息队列 消息队列的实现分为两种 xff0c 一种为System V的消息队列 xff0c 一种是Posi
  • 第3讲 进程间通信

    文章目录 3 1 简介3 2 互联网协议的API3 3 外部数据表示和编码3 4 组播通信3 5 网络虚拟化 xff1a 覆盖网络 3 1 简介 UDP的应用程序接口提供了消息传递 xff08 Message Passing xff09 抽
  • 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

    1 架构 说起Blackberry的QNX操作系统 想必大家都听说过 xff0c 但到底为什么QNX能如此有名 xff1f 难道微软的Windows和Linux都不能与之抗衡 xff1f 美国NASA的太空接驳飞船也使用QNX操作系统 QN
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • FreeRTOS进程间通信-消息队列

    消息队列是进程间的一种通信机制 xff0c 实际项目运用很多 1 什么是消息队列 xff1f 2 消息队列API函数 3 在进程间通信使用消息队列 4 在中断中使用消息队列 1 1 消息队列是什么 xff1f 消息队列是realtime o
  • Orange's 进程间通信

    新增一个系统进程 xff0c 和TESTA进行通信 xff0c 通信的流程是这样的 xff0c 如果首先执行到系统进程 xff0c 发送消息 xff0c 那么会触发内中断到ring0级 xff0c 完成发送所需要的动作 xff0c 之后回到
  • 进程间通信

    现在的嵌入式系统往往有并发的特征 xff0c 就像多任务操作系统的多进程一样 xff0c 其内核会提供几种机制处理任务间通信 xff0c 本文对四种常见通信模式进行了分析 xff0c 并对其各自的优劣作较细致的比较 目前 xff0c 越来越
  • linux---进程间通信(ipc)之管道

    进程间通信方式 管道共享内存消息队列信号量本地套接字等等都能作为我们进程间通信的方法 操作系统提供进程间通信方式的原因 因为对于我们进程来说 xff0c 每一个进程都是相互独立的 xff0c 具有独立性 xff0c 如果我们需要两个不同的进
  • linux---进程间通信(ipc)之共享内存

    前面我们讲解了进程间通信之管道 xff0c 这段我们讲解我们的共享内存 共享内存是所有进程间通信方式最快的一种 内存共享模型就像下面的图一样 xff0c 就是将物理内存映射到我们进程的虚拟地址上 xff0c 我们就可以直接操作我们虚拟地址空
  • 【进程间通信 之 通信的建立】

    目录 前言 进程间通信的目的 进程间通信的方式 管道 1 匿名管道 简单示例1 消息传输 五个特性 四种场景 简单示例2 进程控制 对管道的深入理解 2 命名管道 简单示例3 不相关进程间通信 system V 共享内存 简单示例4 通知事
  • 【iOS】UserDefaults使用的一些“坑”

    UserDefaults使用的一些 坑 项目场景 问题1 初始化程序组对应UserDefaults失败 原因分析 问题2 没有记录数据的时候 读取值为0 or false 导致配置使用时错误 原因分析 问题3 extension进程中监听需
  • 什么事IPC(Inter-Process Communication,进程间通信)

    进程间通信IPC 也就是Inter Process Communication的缩写 首先我们明白一个进程其实就是一个狭义上的程序 一个服务器也就是一个进程 比如客户端和服务器的连接就是两个进程在通信 只是这两个进程并不在同一台计算机上 它
  • 面试了这么多场,“ 进程间的通信 ” 真是从不缺席,小伙伴们赶快重视起来!!

    进程间通信 1 管道 2 消息队列 3 共享内存 4 信号量 5 信号 6 Socket 套接字 每个进程的用户地址空间都是独立的 一般而言是不能互相访问的 但内核空间是每个进程都共享的 所以进程之间要通信必须通过内核 在内核中开辟一块缓冲
  • qt子进程和父进程读写数据通信

    进程A 例如主程序 创建了一个进程 B 这个B就称为A的子进程 而A称为B的父进程 这也称为进程间通信 有多种方式 TCP IP Local Server Socket 共享内存 D Bus Unix库 QProcess 会话管理 这里 因
  • 进程间通讯的7种方式

    1 常见的通信方式 管道pipe 管道是一种半双工的通信方式 数据只能单向流动 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关系 命名管道FIFO 有名管道也是半双工的通信方式 但是它允许无亲缘关系进程间的通信 消息队

随机推荐

  • 12小时上线“新冠肺炎同程查询工具”,开发者这样狙击疫情

    阿里妹导读 xff1a 2020开年极为复杂 面对新型肺炎的疫情 xff0c 我们每一个人都与国家命运紧密相连 全社会的力量都凝聚在一起 xff0c 众志成城 xff0c 共克时艰 有这么一群热爱代码的人 xff0c 用自己的方式提升效率
  • 35 个你也许不知道的 Google 开源项目

    Google是支持开源运动的最大公司之一 xff0c 它们现在总共发布有超过500个的开源项目 xff08 大部分都是利用它们的API来完成 xff09 xff0c 本文将列举一些有趣的开源项目 xff0c 其中很可能有不少你不知道的哦 文
  • Ubuntu 清除缓存 apt-get命令参数

    整理了Ubuntu Linux操作系统下apt get命令的详细说明 分享给大家 常用的APT命令参数 xff1a apt cache search package 搜索包 apt cache show package 获取包的相关信息 x
  • [code]使Ext.DatePicker只显示年月选择界面

    Ext override Ext DatePicker onRender function container position var m 61 39 lt table cellspacing 61 34 0 34 gt 39 39 lt
  • The BASEDIR environment variable is not defined correctly This environment variable is needed to run this program

    今天配一台服务器的时候 xff0c 启动tomcat莫名其妙的报错说 xff1a The BASEDIR environment variable is not defined correctly This environment vari
  • BIRT Viewer 参数设置详解

    BIRT作为一款功能强大的开源报表工具 xff0c 其版本的升级更新速度也非常快 xff0c 从1 0到2 0 xff0c 一直到最新的2 2 1版本 xff0c 无论从功能上还是性能上都得到了极大的提高和扩充 BIRT也提供了一个标准的J
  • [code]将Ext.DatePicker年份调到左边,月份调到右边

    Ext override Ext DatePicker createMonthPicker function if this monthPicker dom firstChild var buf 61 39 lt table border
  • ibatis配置log4j输出sql语句等日志信息

    整了一上午的ibatis xff0c 记得自己以前配置过log4j可以输出sql语句 xff0c 但是这次不知道咋了 xff0c 就是不输出 xff0c 找以前的项目还找不到 了 xff0c 上网上搜索了半天 xff0c 都是差不多的配置l
  • Dreamweaver 代码配色方案 DIY

    Dreamweaver 代码配色方案 DIY 最近刚换上隐形眼镜 xff0c 电脑上满屏的白花花的颜色 xff0c 看得我眼泪鼻涕直流 xff0c 无奈 xff0c 代码还是要看滴 xff0c 改造了一下Dreamweaver代码配色方案
  • xampp的apache启动失败

    xampp xff08 apache 43 mysql 43 php 43 perl xff09 是一个功能强大的建站集成软件包 许多人通过他们自己的经验认识到安装 Apache 服务器是件不容易的事儿 如果您想添加 MySQL PHP 和
  • 降级论

    几乎一年没有写博客了 xff0c 说没时间那是借口 xff0c 唯一的原因是 xff0c 年纪越大越发觉自己肤浅 有些想法还没提笔 xff0c 就发现很幼稚 xff0c 就不敢发出来贻笑大方了 这次先给大家说个小故事 xff1a 从前有三个
  • 阿里传奇工程师多隆的程序世界

    阿里妹导读 xff1a 写代码写到入定 xff0c 是一种什么样的体验 xff1f 11月29日 xff08 本周三 xff09 xff0c 阿里技术人纪录片系列 将带大家走进大神多隆的代码世界 在此之前 xff0c 我们先来重温一篇关于多
  • 将Sublime Text2 加入右键菜单

    在googleread里面看有人推荐sublime text2 说开发很方便 就下载一个试试 写html还真的挺爽 于是按照vim加入鼠标右键的方法 果然可以 这里和大家分享 1 运行中输入 regedit 打开注册表 2 在HKEY CL
  • PIXHAWK飞控最新控制部分源码详解与分析(v 1.8.0)

    px4控制源码中文注释及解读 作 者 xff1a chen honglin时 间 xff1a 2018 9 27联系方式 QQ 260437028 写在前面 xff1a 关于本篇文章 作者经过两天的啃代码 发现新版本与旧版本相差不小 而网络
  • PX4应用程序编写

    PX4应用程序编写 本文将较为详细的阐述如何自己写一个程序 xff0c 并且将其添加到编译脚本中去 本文所需基础 多线程编程 第一部分 xff1a 写一个自己的程序 在Firmware src moudle下 xff0c 创建一个文件夹 x
  • 计算机操作系统之系统调用

    目录 x1f4a8 什么是系统调用 xff0c 有何作用 xff1f x1f4a8 系统调用与库函数的区别 x1f4a8 系统调用背后的过程 x1f4a8 总结 我们将带着以下问题去学习什么是系统调用 什么是系统调用 xff0c 有何作用
  • SimpleFOC移植STM32(一)—— 简介

    目录 一 代码移植说明二 控制原理2 1 有感FOC控制原理2 2 有感FOC 不带电流采样 控制原理2 3 FOC heart function 三 适配硬件3 1 Bluepill3 2 SimpleMotor 四 程序架构五 演示功能
  • SimpleFOC移植STM32(二)—— 开环控制

    目录 注意事项一 硬件介绍1 1 硬件准备1 1 1 SimpleMotor方案1 1 2 SimpleFOCShield V2 0 3方案 1 2 硬件连接1 2 1 原理图1 2 2 SimpleMotor接线1 2 3 STM32接线
  • 恶意样本分析-Lab16-01 反调试1分析

    恶意样本分析 Lab16 01 反调试1分析 这个样本是随书 恶意代码分析实战 第十六章的样本 xff0c 主要用来熟悉反调试的一些手段 xff0c 这个算是样本分析中需要掌握的基础知识 这篇笔记会包含了静态分析和静态分析 基本要求 在分析
  • 第3讲 进程间通信

    文章目录 3 1 简介3 2 互联网协议的API3 3 外部数据表示和编码3 4 组播通信3 5 网络虚拟化 xff1a 覆盖网络 3 1 简介 UDP的应用程序接口提供了消息传递 xff08 Message Passing xff09 抽