进程间通信

2016-06-27 并发编程

孤人 提交于 2020-02-01 18:05:23
摘自 深入理解操作系统 CHA 12 并发是在逻辑控制流上重叠。应用级并发在下列情况下是很有用的: 1 访问慢速I/O设备。 2 与人交互 3 通过推迟工作以降低延迟 4 服务多个网络客户端 5 在多核机器上进行并发运算 使用应用级并发的应用程序称为 并发程序。现代操作系统提供了3种基本的构造并发程序的方法: 1 进程:此方法,每个逻辑控制流都是一个进程,由内核来调度和维护。进程有自己的虚拟地址空间,若要和其他流进行通信,控制流必须使用IPC(进程间通信)机制。IPC机制有:管道,共享内存,队列,信号量 2 I/O多路复用:在此并发编程中,应用程序在一个进程的上下文中显式的调度他们自己的逻辑流。逻辑流被转化为状态机,数据到达文件描述符后,主程序显式的从一个状态转换到另一个状态。因为程序是一个单独的进程,所以所有的流都共享同一个地址空间。 3 线程:线程是运行在一个单一进程上下文中的逻辑流,由内核调度。可以把线程看作其他2中的混合体。像进程流一样由内核进行调度,而像I/O多路复用流一样共享一个虚拟的地址空间。 来源: https://www.cnblogs.com/gardenofhu/p/5621698.html

python多任务编程

眉间皱痕 提交于 2020-02-01 10:34:01
文章目录 进程 (Process) 多进程编程 multiprocessing 模块创建进程 创建自定义进程类 进程池技术 进程间通信 (IPC) 管道通信 Pipe 消息队列 共享内存 信号通信 信号量(信号灯) 线程 线程同步互斥方法 多线程并发 意义 : 充分利用计算机的资源提高程序的运行效率 定义 : 通过应用程序利用计算机的多个核心达到同时执行多个任务的目的,一次提高计算机运行效率。 实施方案 : 多进程 多线程 并行 : 多个计算机核心在同时处理多个任务,这时多个任务间是并行关系。 并发 : 同时处理多个任务,内核在多个任务间不断的切换,达到好像都在处理运行的效果。但实际一个时间点内核只能处理其中一个任务。 进程 (Process) 定义 : 程序在计算机中的一次运行过程 程序 : 是一个可执行的文件,是静态的占有磁盘空间,不占有计算机的运行资源 进程 : 进程是一个动态过程的描述,占有计算机的资源,有一定的生命周期 同一个程序的不同运行过程是不同的进程,占用资源和生命周期都不一样。 进程的创建流程 1.用户空间通过运行程序或者调用接口发起创建进程 2.操作系统接受用户请求,开始创建进程 3.操作系统分配计算机资源,确定进程状态,开辟进程空间等工作 4.操作系统将创建好的进程提供给应用程序使用 cpu时间片 如果一个进程占有计算机核心

进程方法,属性

旧街凉风 提交于 2020-01-31 13:50:16
p.start():启动进程,并调用该子进程中的p.run() p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程, 使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁 p.is_alive():如果p仍然运行,返回True p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。 等待进程p结束后,join函数内部会发送系统调用wait,去告诉操作系统回收掉进程p的id号 timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止, 并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置 p.name:进程的名称 p.pid:进程的pid p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束 p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串

Python 多任务 —— 进程

风流意气都作罢 提交于 2020-01-31 13:33:49
高级编程技巧 学习笔记 一、进程 1.1、进程与程序 进程: 正在执行的代码 + 用到的资源 程序: 没有执行的代码,是一个静态的 exe 文件 1.2、进程的状态 1.3、使用进程实现多任务 multiprocessing 模块 就是跨平台的多进程模块,提供了一个 Process 类 来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。 # 创建一个进程与创建线程非常相似 # 可以分别执行 线程 与 进程 , 在任务管理器中查看一下区别 import multiprocessing import time import threading def demo ( ) : while True : print ( "--1--" ) time . sleep ( 1 ) def demo1 ( ) : while True : print ( "--2--" ) time . sleep ( 1 ) def main ( ) : p1 = multiprocessing . Process ( target = demo ) p2 = multiprocessing . Process ( target = demo1 ) # t1 = threading.Thread(target=demo) # t2 = threading.Thread(target

进程间通信

与世无争的帅哥 提交于 2020-01-30 11:34:38
进程间通信原因 因为每一个进程都是拥有一个独立的虚拟地址空间的,促使进程独立,导致了进程之间需要协作。 进程间通信分为 数据传输-----管道,消息队列 数据共享-----共享内存 进程控制-----信号量 首先先谈谈管道和共享内存 管道 ---匿名管道,命名管道 本质:管道其实就是一块内存,是内核当中的缓冲区 匿名管道---没有标识 特性: 具有亲缘关系的进程间通信 半双工,数据只能有一个流向 提供字节流服务 自带同步与互斥功能 生命周期随进程,进程终止,生命周期消失 如果管道为空,则读阻塞 如果管道为满,则写阻塞 如果管道的读端被关闭,则写端往管道当中写数据的时候,会造成管道破裂,并且导致进程收到SIGPIPE信号,从而进程终止 如果管道的写端被关闭掉了,则读端读完管道的数据之后,read不会陷入阻塞状态,而是返回。执行代码剩下的正常流程 管道大小PIPE_SIZE:64K,PIPE_BUG:4K 如果写入的数据大于PIPE_BUG的话,则不保证写入数据的原子性 原子性:当前操作不被打断,换句话说,在管道的读写操作是不可以被打断的 临界资源:同一时间,当前资源只能被一个进程所访问 互斥:同一时间,保证只能有一个进程访问临界资源 同步:保证临界资源访问的合理性 创建一个管道(亲缘关系的进程中使用) int pipe(int pipefd[2]); pipefd[0]

金九银十中,看看这31道Android面试题

左心房为你撑大大i 提交于 2020-01-30 01:48:52
阅读目录 1.如何对 Android 应用进行性能分析 2.什么情况下会导致内存泄露 3.如何避免 OOM 异常 4.Android 中如何捕获未捕获的异常 5.ANR 是什么?怎样避免和解决 ANR(重要) 6.Android 线程间通信有哪几种方式 7.Devik 进程,linux 进程,线程的区别 8.描述一下 android 的系统架构 9.android 应用对内存是如何限制的?我们应该如何合理使用内存? 10. 简述 android 应用程序结构是哪些 11.请解释下 Android 程序运行时权限与文件系统权限的区别 12.Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 13.多线程间通信和多进程之间通信有什么不同,分别怎么实现 14.Android 屏幕适配 15.什么是 AIDL 以及如何使用 16.Handler 机制 17.事件分发机制 18.子线程发消息到主线程进行更新 UI,除了 handler 和 AsyncTask,还有什么 19.子线程中能不能 new handler?为什么 20.Android 中的动画有哪几类,它们的特点和区别是什么 21.如何修改 Activity 进入和退出动画 22.SurfaceView & View 的区别 23.开发中都使用过哪些框架、平台 24

高级进程间通信

て烟熏妆下的殇ゞ 提交于 2020-01-29 12:03:44
基于流的管道实际上就是一种全双工管道,它必须在基于流的系统上才能实现,Linux 默认对它是不支持的,而同样的逻辑,我们通常可以用基于 UNIX domain 的 socket 来实现,所以这里对它只作简单介绍。 17.2 UNIX域套接字 12 //使用他们面向网络的域的套接字借口或者使用socketpair函数创建一对无命名的,相互连接的UNIX域套接字int socketpair(int domain,int type,int protocol,int sockfd[2]);大专栏 高级进程间通信an> 12345 int serv_listen(const char *name);//服务器进程调用该函数声明它要在一个总所周知的名字上箭头客户进程的连接要求int serv_accept(int listenfd,uid_t *uidptr);//使用该函数等待客户进程连接请求的到达int cli_conn(const char *name);//客户进程调用该函数连接至服务器进程 来源: https://www.cnblogs.com/lijianming180/p/12239914.html

进程间通信小结

瘦欲@ 提交于 2020-01-29 02:04:28
进程间通信: 1、进程间的数据共享: 管道、 消息队列、 共享内存、 Unix域套接字 易用性: 消息队列 > Unix域套接字 > 管道 > 共享内存(经常与信号量一起用) 效 率: 共享内存 > Unix域套接字 > 管道 > 消息队列 常 用: 共享内存、Unix域套接字 2、异步通信 信号 3、同步与互斥(做资源保护) 信号量 来源: https://www.cnblogs.com/y4247464/p/12239464.html

生产者消费者模型 线程相关

冷暖自知 提交于 2020-01-28 11:41:43
知识点补充: 1、操作系统的调度算法: 时间片轮转法 多级反馈队列 2、同步异步(任务的提交方式): 同步:提交任务之后原地等待任务的返回结果,才能进行下一步操作 异步:提交任务之后不等待任务的返回结果,直接进行下一步操作 3、阻塞非阻塞 阻塞:程序处于阻塞态 非阻塞:程序处于运行或就绪态 4、进程理论: 进程:正在运行的程序 多道技术: 空间上的复用 多个程序共用一套硬件设备 时间上的复用 CPU来回切换:切换+保存状态 1、程序占用cpu时间过长会被操作系统强行剥夺走cpu的执行权限 2、程序的IO操作指的是: input 网络请求(recv accept) time.sleep 文件读写 print 5、创建进程的本质:在内存中申请一块独立的内存空间,需要申请内存空间,还需要拷贝代码    #1、进程间通信 #队列:先进先出 #堆栈:先进后出 #利用队列实现进程间通信 from multiprocessing import Queue q = Queue(5) #里面的参数代表最多放5个数据 q.put(1) #往队列里放数据 q.put(1) q.put(1) q.put(1) print(q.full()) #判断队列是否放满了,此时显示False,还有一个位置没放数据 q.put_nowait(2) #往队列里放数据, # q.put_nowait(2)

#Linux#进程间通信# 信号量(semophore)

偶尔善良 提交于 2020-01-28 08:21:39
信号量本质上是一个计数器( 不设置全局变量是因为进程间是相互独立的,而这不一定能看到,看到也不能保证++引用计数为原子操作 ),可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。主要作为进程间以及同一进程内不同线程之间的同步和互斥手段。 它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被 并发 调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量VI,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域