进程间通讯

c# 进程间通信

只谈情不闲聊 提交于 2020-03-04 05:47:34
一、 进程间通讯的方式 进程间通讯的方式有很多,常用的有共享内存(内存映射文件、共享内存DLL、剪切板等)、命名管道和匿名管道、发送消息等几种方法来直接完成,另外还可以通过 socket 口、配置文件和注册表 等来间接实现进程 间数据 通讯任务。以上这几种方法各有优缺点,具体到在进程间进行大数据量数据的快速交换问题上,则可以排除使用配置文件和注册表的方法;另外,由于管道和 socket 套接字的使用需要有网卡的支持,因此也可以不予考虑。这样,可供选择的通讯方式只剩下共享内存和发送消息两种。 二、 发送消息实现 进程间通讯前准备 下面的例子用到一个windows api 32函数 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr wnd,int msg,IntPtr wP,IntPtr lP); 要有此函数,需要添加using System.Runtime.InteropServices;命名空间 此方法各个参数表示的意义 wnd:接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。 msg

01.08 Day 24 - 管理设计篇之“边车模式”

独自空忆成欢 提交于 2020-01-08 10:01:49
大家好,我是 Snow Hide,作为《左耳听风》这个专栏的学员之一,这是我打卡的第 24 天,也是我第 24 次进行打卡这种操作。 今天我温习了该专栏里一篇叫《管理设计篇之“边车模式”》的文章。 关键词总结:边车模式设计(实现方式、优缺点)、边社设计重点(解决的问题)、边车设计注意事项(进程间通讯、服务协议标准化、应用容器技术、边车职责、边车操作、上下文传递机制)、边车设计适用的场景(扩展历史遗留系统、多语言环境、多个服务供应商、控制以及逻辑分离)、边社设计不适用的场景(架构不够复杂、服务间协议不统一、单体架构)。 所学总结: 边车模式设计 实现方式 SDK、Lib 或框架的方式; 边车的方式。 优缺点 软件包 :有侵入; 边车 :无侵入、增加复杂度、服务注册及健康检查、帮助服务发现寻址、日志监控、调用链跟踪、流控熔断、易于服务控制系统操作。 边社设计重点 解决的问题 将控制和逻辑进行分离; 解决服务调用中上下文的问题; 对控制类的功能进行统一地管控。 边车设计注意事项 进程间通讯 使用无侵入的方式。 服务协议标准化 使用标准统一的方式进行沟通。 应用容器技术 借助容器来降低各种复杂度。 边车职责 让边车只实现控制类的功能。 边车操作 尽量避免在边车里包含重试操作,除非操作是幂等的。 上下文传递机制 允许应用服务和边车的上下文进行传递操作。 边车设计适用的场景 扩展历史遗留系统

Android进程间通讯之messenger

断了今生、忘了曾经 提交于 2019-12-09 18:14:58
平时一说进程间通讯,大家都会想到 AIDL ,其实 messenger 和 AIDL 作用一样,都可以进行进程间通讯。它是基于消息的进程间通信,就像子线程和 UI 线程发送消息那样,是不是很简单,还不用去写 AIDL 文件,是不是有点小爽。哈哈。 此外,还支持记录客户端对象的 Messenger ,然后可以实现一对多的通信;甚至作为一个转接处,任意两个进程都能通过服务端进行通信。 与 AIDL 比较:   当您需要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现更加简单,因为 Messenger 会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。   对于大多数应用,服务不需要执行多线程处理,因此使用 Messenger 可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。 接下来看下怎么写: 服务端: 1. 创建一个 handler 对象,并实现 hanlemessage 方法,用于接收来自客户端的消息,并作处理 2. 创建一个 messenger( 送信人 ), 封装 handler 3.messenger 创建一个 IBinder 对象,通过 onBind 返回给客户端 客户端: 1. 在 activity 中绑定服务 2. 创建

进程间通讯

若如初见. 提交于 2019-12-06 08:04:10
之前再跟同学交流面试经验的时候,有小伙伴在讲述自己面试经历的时候,多次被问到了进程间通讯这个问题,由此可见这个知识点的重要程度可想而知了。 首先,在脑海里试想一下面试官如果问你“进程间通讯的方式有哪些?”你会怎么去回答。有的小伙伴就说了,这个还不简单了,不就是那几个吗,这个有什么难的! 进程间通讯方式有管道、消息队列、信号量、共享内存 如果你只能想到这些,那么我建议你回去还是好好看看这个模块的内容吧,这样回答问题,会让面试官很尴尬,面试官在心里肯定会鄙视你O(n^2)次的!那么到底该怎么回答这个问题呢? 我的思路是,首先你可以描述一下进程间通讯的含义,然后再按照每一个方式来展开描述,而不是简单的说明这几个专有名词。 先来看看,什么是进程间通讯呢?所谓的进程间通讯,其实就是操作系统为了解决复杂问题,或者复杂任务,单进程无法解决这样的问题,并且在完成这些任务的过程中,子任务之间需要而产生一定的数据传递,的一种运作方式。 先来看看管道 管道 管道是借助文件系统,在多个进程之间创建一个通讯信道,所有进程通过自己打开的文件描述符操作同一块内存空间,从而实现数据的传递。 管道分为有名管道和无名管道。 有名管道 在磁盘上会存在一个管道标识符,但是管道文件标识并不占用磁盘block空间,只占用一个inode节点,而真实的数据会缓存到内存空间上。 无名管道 不会存在管道文件标识

进程间通讯原理

人盡茶涼 提交于 2019-12-06 08:03:14
进程间通讯总结 进程间通讯是指两个进程间数据交换的过程。 1.进程与线程区别 线程:是cpu调度的最小单元,是一种有限的资源 进程:是指设备上的一个程序或者应用,是一个执行单元,一个进程可以包含多个线程。 Binder:是Android中的一个类实现了IBinder接口。是Android IPC跨进程通讯的一种方式,也可以理解为一种虚拟的物理设备。 1.从Framework角度说,Binder是SeiviceManager连接各种Manager(ActivityManager、WindowManage等)和相应ManagerSerivice的桥梁 2.从应用层来说它是客户端和服务端进行通信的媒介。 2.跨进程通讯底层原理 Android系统是基于Linux系统的,一个进程可以分为用户空间和内核空间,用户空间是相互独立的,内核空间系统共享的。 首先Binder驱动在内核空间创建一个数据接收缓冲区 接着在内核空间开辟一块内核缓存区,建立内核缓存区和内核中数据接收缓存区之间的映射关系,以及内核中数据接收缓存区和接收进程用户空间地址的映射关系 发送方进程通过系统调用copyfromuser将数据copy到内核中的内核缓存区,由于内核缓存区和接收进程的用户空间存在内存映射因此也就相当于把数据发送到了接收进程的用户空间,这样便完成了一次进程间的通信。 3.跨进程实现原理 Binder机制在

进程间通讯(七)消息队列

匿名 (未验证) 提交于 2019-12-02 23:37:01
进程通讯 linux文件描述符表、文件表、索引节点表的关系 进程间通讯(一)基本概念 进程间通讯(二)无名管道 进程间通讯(三)有名管道 进程间通讯(四)popen和pclose 进程间通讯(五)信号 进程间通讯(六)共享内存 进程间通讯(七)消息队列 消息队列 消息队列时通过链表,将一个一个的消息构成了一个队列,存储在内核空间中,每个消息都有自己的类型 每一个消息队列都有一个 msqid_ds 结构体与之关联,msqid_ds结构体标记着消息队列的状态,还有消息队列的链表头和链表尾 可以使用下面结构体来表示消息 struct msg { long type ; int len ; char buf [ n ] ; } ; 消息队列相关API介绍 函数形式: int msgget ( key_t key , int flag ) 功能:获取或者创建一个消息队列 参数: key - 和消息队列关联的 key 值, key 可以设置为 IPC_PRIVATE ( 只能在父子进程通讯 ) ,也可以是 ftok 创建 参数: flag - 消息队列的访问权限 返回值:成功是消息队列 ID ,出错是 - 1 函数形式: int msgsnd ( int msqid , const void * msgp , size_t size , int flag ) 功能:发送消息 参数: msqid