进程间通信

并发编程之进程与线程

家住魔仙堡 提交于 2020-02-06 12:30:37
并发编程之进程与线程 2.1 线程与进程 2.1.1 进程 2.1.2 线程 2.1.3 二者对比 2.2 并行与并发 2.3 应用 2.1 线程与进程 2.1.1 进程 程序指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理IO的。 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士等) 2.1.2 线程 一个线程之内可以分为一到多个线程。 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给CPU执行。 Java中,线程作为最小调度单元,进程作为资源分配的最小单位。在windows中进程是不活动的,只是作为线程的容器。 2.1.3 二者对比 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集。 进程拥有共享的资源,如内存空间等,供其内部的线程共享。 进程间通信较为复杂 同一台计算机的进程通信称为IPC 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如HTTP 线程通信相对简单,因为他们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

计算机网络之应用层(一)

自作多情 提交于 2020-02-06 07:51:27
网络应用的体系结构 1、客户机/服务器(Client-Server, C/S) 服务器: 7*24小时提供服务 永久访问地址/域名 利用大量服务器实现可拓展性 客户机: 与服务器通信,使用服务器提供的服务 间歇性接入网络 可能使用动态IP地址 不会与其他客户机直接通信 例如:Web服务 2、点对点结构(Peer-to-peer,P2P) 没有永远在线的服务器 任意端系统/节点之间可以直接通信 节点间歇性接入网络 节点可能改变IP地址 缺点:难于管理 优点:高度可伸缩 3、混合结构(Hybrid) Napster 文件传输使用P2P结构 文件的搜索采用C/S结构——集中式 每个节点向中央服务器登记自己的内容 每个节点向中央服务器提交查询请求,查找感兴趣的内容 网络应用的进程间通信 进程: 主机上运行的程序 客户机进程: 发起通信的进程 服务器进程: 等待通信请求的进程 注意 :采用P2P架构的应用同样存在客户机进程/服务器进程之分 同一主机上运行的进程: 进程间通信机制 操作系统提供 不同主机上运行的进程: 消息交换 套接字:Socket 进程间通信利用scoket发送/接收消息实现 类似于寄信 发送方将消息送到门外邮箱 发送方依赖(门外的)传输基础设施将消息传到接收方所在主机,并送到接收方的门外 接收方从门外获取消息 传输基础设施向进程提供API 传输协议的选择 参数的设置

网络编程--Java网络编程入门

人走茶凉 提交于 2020-02-06 03:04:12
Java 网络编程入门 服务器与客户程序只需关心发送什么样的数据给对方,而不必考虑如何把这些数据传输给对方,传输数据的任务由计算机网络完成。 两个进程顺利通信的前提条件是它们所在的主机都连接到了计算机网络上。 网络协议是网络中主机之间通信的语言。 不同网络之间的互联靠网络上的标准语言—— TCP/IP 协议。 OSI 参考模型把网络分为 7 层,分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。不同主机之间的相同层称为对等层。 物理层:为上一层提供物理连接,以及规定通信节点之间的机械和电气特性。数据作为原始的比特 (bit) 流传输。 数据链路层:数据链路层负责在两个相邻节点间的线路上,无差错地传送以帧为单位的数据。典型设备是交换机。 网络层:选择合适的网间路由和交换节点,确保数据及时传送到目标主机。典型设备是路由器。 传输层:根据通信子网的特性最佳地利用网络资源,为两个端系统的会话层提供建立、维护和取消传输连接的功能,以可靠方式或不可靠方式传输数据。信息的传送单位是报文。 会话层:管理进程间的会话过程,即负责建立、管理、终止进程间的会话。数据传送单位是报文。 表示层:对上层数据进行转换,以保证一个主机的应用层的数据可以被另一个主机的应用层理解。数据传送单位是报文。 应用层:确定进程间通信的实际用途,以满足用户实际需求。

谈谈Android Binder机制及AIDL使用

Deadly 提交于 2020-02-05 22:25:23
Binder原理 1、概述 Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。例如当进 程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅于 此,整个Android系统架构中,大量采用了Binder机制作为IPC(进程间通信, Interprocess Communication )方案。 当然也存在部分其他的IPC方式,如管道、SystemV、Socket等。那么Android为什 么不使用这些原有的技术,而是要使开发一种新的叫Binder的进程间通信机制呢? ( 顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找 ) https://github.com/xiangjiana/Android-MS (VX:mm14525201314) 为什么要使用Binder? 性能方面 在移动设备上(性能受限制的设备,比如要省电),广泛地使用跨进程通信对通信 机制的性能有严格的要求,Binder相对于传统的Socket方式,更加高效。Binder数 据拷贝只需要一次,而管道、消息队列、Socket都需要2次,共享内存方式一次内 存拷贝都不需要,但实现方式又比较复杂。 安全方面 传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如Socket通信 的IP地址是客户端手动填入,很容易进行伪造

线程

北城以北 提交于 2020-02-05 19:34:50
1.线程介绍 1.什么是线程 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 2. 有了进程为什么要有线程   进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率。很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。 3.进程和线程的关系 线程与进程的区别可以归纳为以下4点 地址空间和其他资源:进程间相互独立,统一进程的歌线程间共享,某进程内的线程在其他进程不可见。 通信:进程间通信IPC,线程间可以直接读写进程进程数据段(如全局变量)来进行通信,需要进程同步和互斥手段的辅助,以保住数据的一致性。 调度和切换:线程上下文切换比进程上下文切换要快的多。 在多线程操作系统中,进程不是一个可执行的实体。  4.线程的特点

app性能优化

萝らか妹 提交于 2020-02-03 07:06:06
性能优化简图 打造一个高质量的应用应该以4个方向为目标:快、稳、省、小。 快:使用时避免出现卡顿,响应速度快,减少用户等待的时间,满足用户期望。 稳:减低 crash 率和 ANR 率,不要在用户使用过程中崩溃和无响应。 省:节省流量和耗电,减少用户使用成本,避免使用时导致手机发烫。 小:安装包小可以降低用户的安装成本。 要想达到这4个目标,具体实现是在右边框里的问题:卡顿、内存使用不合理、代码质量差、代码逻辑乱、安装包过大,这些问题也是在开发过程中碰到最多的问题,在实现业务需求同时,也需要考虑到这点,多花时间去思考,如何避免功能完成后再来做优化,不然的话等功能实现后带来的维护成本会增加。 卡顿优化 Android 应用启动慢,使用时经常卡顿,是非常影响用户体验的,应该尽量避免出现。卡顿的场景有很多,按场景可以分为4类:UI 绘制、应用启动、页面跳转、事件响应,如图: 卡顿场景分析 这4种卡顿场景的根本原因可以分为两大类: 界面绘制。主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。 数据处理。导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到时间片,三是内存增加导致 GC 频繁,从而引起卡顿。 引起卡顿的原因很多

进程间通信-Queue

无人久伴 提交于 2020-02-02 01:07:40
进程间通信-Queue Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理: #coding=utf-8 from multiprocessing import Queue q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息 q.put("消息1") q.put("消息2") print(q.full()) #False q.put("消息3") print(q.full()) #True #因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常 try: q.put("消息4",True,2) except: print("消息列队已满,现有消息数量:%s"%q.qsize()) try: q.put_nowait("消息4") except: print("消息列队已满,现有消息数量:%s"%q.qsize()) #推荐的方式,先判断消息列队是否已满,再写入 if not q.full(): q.put_nowait("消息4") #读取消息时,先判断消息列队是否为空,再读取 if not q

进程间通信-Queue

筅森魡賤 提交于 2020-02-02 00:54:08
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理: #coding=utf-8 from multiprocessing import Queue q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息 q.put("消息1") q.put("消息2") print(q.full()) #False q.put("消息3") print(q.full()) #True #因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常 try: q.put("消息4",True,2) except: print("消息列队已满,现有消息数量:%s"%q.qsize()) try: q.put_nowait("消息4") except: print("消息列队已满,现有消息数量:%s"%q.qsize()) #推荐的方式,先判断消息列队是否已满,再写入 if not q.full(): q.put_nowait("消息4") #读取消息时,先判断消息列队是否为空,再读取 if not q.empty(): for i

linux之间进程通信

扶醉桌前 提交于 2020-02-02 00:17:47
进程间通信方式: 同主机进程间数据交换机制: pipe(无名管道) / fifo(有名管道)/ message queue(消息队列)和共享内存。 必备基础: fork() 创建一个与之前完全一样的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都 复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。    vfork : 与fork用法相同,但是他和父进程共享同样的数据存储,因此无需完全复制父进程的地址空间。 // fork() study example 1#include <unistd.h> #include <stdio.h> int main () { pid_t fpid; //fpid表示fork函数返回的值 int count=0; // fork 会将这个变量存在两个不同的内存中,所以两次count的值都是 1 ,而不是 1,2 。 fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d、n",getpid(

python多进程编程

一世执手 提交于 2020-02-01 22:10:11
程序和进程 一个程序一般由代码和运行时的资源所组成,系统为每个程序分配一个或者多个编号,在程序中 运行的这些模块(逻辑模块)共同实现程序的设计目标,这些同时运行的模块中的每个成员都可以看作一个进程, 每个进程拥有独立的内存空间 。 命令行下,查看进程id和父进程id >>> import os >>> os.getpid() #当前进程id 10252 >>> os.getppid() # #父进程id 5884 多进程 python中的多进程模块multiprocessing, 常用类、方法和属性:Pool,Process,Queue 需要注意: 全局变量不能被多进程共享 。 可以通过 队列 multiprocessing.Queue向多进程传递数据,但是不能使用常规队列queue.Queue。 q = multiprocessing.Queue(3) # 设置队列可以容纳数据的最大数量 队列q的常用方法和属性:put、put_nowait、get、get_nowait、empty、full、qsize等。 通常,使用windows系统(不支持fork函数)进行多进程模块的某些类和方法编程时,需要把多进程代码写到if语句之下,否则报错。 def demo1(): pass def demo2(): pass if __name__ == '__main__': t1 =