进程间通信

Linux 进程间通信方式和原理

孤街浪徒 提交于 2020-02-13 15:31:26
Linux 进程间通信方式和原理 进程间的通信方式 进程的概念 进程时操作系统的概念,每当我们执行一个程序时,对于操作系统来讲究创建了一个进程,在这个过程中,伴随着资源的分配和释放。可以认为进程时是一个程序的一次执行过程。 进程通信的概念 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要相互通信,来完成系统的某项功能。进程通过与内核及其他进程之间的互相通信来协调它们的行为 进程通信的应用场景 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通信的方式 管道(pipe) 普通管道:通常有两种限制,一是单向传输,二是智能在父子或者兄弟进程间使用。 流管道:去除了第一种限制,为半双工,只能在父子或兄弟进程间使用,可以双向传输。 命令管道:去除了第二种限制,可以在许多并不相关的进程之间进行通信。 信息量

复习打卡--0823 队列和多进程

北城以北 提交于 2020-02-13 02:33:44
一、队列 Python的Queue模块中提供了同步的、线程安全的队列类,包括 FIFO (先入先出)队列 Queue , LIFO (后入先出)队列 LifoQueue ,和优先级队列 PriorityQueue 。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。 queue.Queue(maxsize=0) maxsize默认为0,不设置或设置为负数时,表示可接受的消息数量没有上限。 常用方法: Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。 Queue.join() 实际上意味着等到队列为空,再执行别的操作 Queue.put(item,block=True, timeout=None) 写入队列,block=True,Timeout=3 意味着等待3s,队列仍没有位置就报错;block=False 意思是不等待,队列如果满了直接报错; Queue.get(block=True, timeout=None) 获取队列,block和timeout参数说明同上put Queue.get_nowait() 相当于Queue.get(block=False),不等待 Queue

RT-thread内核之进程间通信

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-13 00:09:28
这里面见到的同步和互斥的概念非常清晰,转载自: http://www.cnblogs.com/King-Gentleman/p/4311582.html 一、进程间通信机制 rt-thread操作系统的IPC(Inter-Process Communication,进程间同步与通信)包含有中断锁、调度器锁、信号量、互斥锁、事件、邮箱、消息队列。其中前5个主要表现为线程间同步,邮箱与消息队列表现为线程间通信。本文主要介绍它们的一些特性及使用场合。 1、中断锁 关闭中断也叫中断锁,是禁止多任务访问临界区最简单的一种方式,即使是在分时操作系统中也是如此。当中断关闭的时候,就意味着当前任务不会被其他事件打断(因为整个系统已经不再响应那些可以触发线程重新调度的外部事件),也就是当前线程不会被抢占,除非这个任务主动放弃了处理器控制权。关闭中断/恢复中断API接口由BSP实现,根据平台的不同其实现方式也大不相同。比如在stm32平台中中断锁机制通过关闭中断函数(rt_base_t rt_hw_interrupt_disable(void),这个函数用于关闭中断并返回关闭中断前的中断状态。)以及恢复中断函数(void rt_hw_interrupt_enable(rt_base_t level),恢复调用rt_hw_interrupt_disable()函数前的中断状态)实现。 警告:

system V信号量和Posix信号量

五迷三道 提交于 2020-02-12 23:20:43
一、函数上的区别 信号量有两种实现:传统的System V信号量和新的POSIX信号量。它们所提供的函数很容易被区分:对于所有System V信号量函数,在它们的名字里面没有下划线。例如,应该是semget()而不是sem_get()。然而,所有的的POSIX信号量函数都有一个下划线。下面列出了它们提供的所有函数清单: Systm V POSIX semctl() sem_getvalue() semget() sem_post() semop() sem_timedwait() sem_trywait() sem_wait() sem_destroy() sem_init() sem_close() sem_open() sem_unlink() 二、使用上的区别 1、XSI system V的信号量是信号量集,可以包括多个信号灯(有个数组),每个操作可以同时操作多个信号灯 posix是单个信号灯,POSIX有名信号灯支持进程间通信,无名信号灯放在共享内存中时可以用于进程间通信。 2、POSIX信号量在有些平台并没有被实现,比如:SUSE8,而SYSTEM V大多数LINUX/UNIX都已经实现。两者都可以用于进程和线程间通信。但一般来说,system v信号量用于 进程间同步、有名信号灯既可用于线程间的同步,又可以用于进程间的同步、posix无名用于同一个进程的不同线程间

面试中那些操作系统常考问题

限于喜欢 提交于 2020-02-12 19:43:47
1. 进程和线程以及其区别? 1、进程是系统进行资源调度和分配的的基本单位,是程序的一次动态执行过程,可实现操作系统的并发;线程是系统资源调度的在最小单位,可实现进程内部的并发; 2、一个程序至少包含一个进程,一个进程至少包含一个线程,线程是进程的子任务; 3、进程有自己独立的内存单元,线程没有,多个线程共享一个进程的内存; 2. 进程间通信的方式? 1、 管道 :内存中固定大小的缓冲区;一个管道只能实现半双工通信,要实现全双工通信需要两个管道;数据没读空不能写,没写满不能读; 优缺点:简单,能保证数据确实已经被取出了(因为没读空是不能写的),但效率低。如a进程给b进程传输数据,只能等到b取出数据后才能返回。因此,其不适合频繁通信的进程。 能否将进程的数据放在某个内存之后不用等待其他进程来取就返回呢? 2、 消息队列 :a进程给b进程传输数据,把消息放在对应的消息队列即可,无需等待。 优缺点:如果a进程发送的数据占用内存较大,且两进程通信特别频繁,消息队列就不合适了。因为此时大量时间花费在内存的拷贝上。 如何解决上述拷贝耗时问题呢? 3、 共享内存 :a和b进程各自拿出一块虚拟内存地址空间,然后映射到同一个物理内存中,实现内存共享机制。 但是上述共享内存机制存在多进程竞争内存的问题,如何解决呢? 4、 信号量 :本质是计数器,用来实现进程之间的互斥和同步。比如信号量初值为1

SOCKET网络编程一:回射客户服务器

时光毁灭记忆、已成空白 提交于 2020-02-11 18:39:09
socket可以看成是用户进程与内核网络协议栈的编程接口。 socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信 一、基础TCP客户端服务器模型(C/S模型) 服务端: Socket创建套接字 ==》 安装一部话机 Bind 绑定 ==》绑定一个电话号码 Listen 监听 Accept 等待对方连接 ==》等待对方电话拨打过来,如果没有对方电话拨打过来就一直阻塞 客户端连接到达,开始处理请求read() Write()应答 客户端: Socket创建套接字 ==》 安装一部话机 Connect 连接 ==》 拨打对方电话号码,拨通后就建立连接,建立连接后双方就开始通信(三次握手)。 调用write()发起请求 接收应答read(); 通信过程中,任何一方都可以调用close终止通信。客户端调用close终止,服务端read后进行close 二、回射客户服务器: 实现功能:客户端从标准输入获取一行数据,通过网络发送给服务器端;服务器端接收到后不做任何处理,将数据发送给客户端,客户端再显示到标准输出 三、由基础CS模型可知,我们需要用到的函数有socket、bind、listen、accept、connect。接下来对每个函数进行说明: 第二个参数规定了最大并发连接数=已完成连接队列+未完成连接队列;Listen后,套接字变为被动套接字,用于接收连接

Python多进程

别等时光非礼了梦想. 提交于 2020-02-10 21:19:58
目录 Python多进程 Multiprocessing使用简介-1 Process 多进程的几种方法 Lock Pool Queue Python—队列、生产者消费者模型 @ Python多进程 • 用multiprocessing替代Thread • multiprocessing库的出现很大程度上是为了弥补thread库因为GIL低效的缺陷。它完整的复制了一套thread所提供的接口方便迁移。唯一的不同就是它使用了多进程而不是多线程。每个进程有自己的独立的GIL,完全并行,无GIL的限制(进程中包括线程),可充分利用多cpu多核的环境,因此也不会出现进程之间的GIL争抢。 • python多进程并发,模块名称:multiprocessing • python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。 • 借助这个包,可以轻松完成从单进程到并发执行的转换。 • 导入方式: import multiprocessing Multiprocessing使用简介-1 • multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该Process对象与Thread对象的用法相同,也有start()

宏內核與微內核區別

99封情书 提交于 2020-02-10 20:33:32
操作系統內核-宏內核與微內核(轉載) 聲明:本文從CSDN轉載,原文鏈接為: https://blog.csdn.net/Silencegll/article/details/51496158 操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址空间。所有的内核服务都在一个地址空间运行,相互之间直接调用函数,简单高效。微内核:功能被划分成独立的过程,过程间通过IPC进行通信。模块化程度高,一个服务失效不会影响另外一个服务。Linux是一个单内核结构,同时又吸收了微内核的优点:模块化设计,支持动态装载内核模块。Linux还避免了微内核设计上的缺陷,让一切都运行在内核态,直接调用函数,无需消息传递。 Linux大部分都是单内核的。 微内核(Microkernel kernel)――在微内核中,大部分内核都作为单独的进程在特权状态下运行,他们通过消息传递进行通讯。在典型情况下,每个概念模块都有一个进程。因此,假如在设计中有一个系统调用模块,那么就必然有一个相应的进程来接收系统调用,并和能够执行系统调用的其他进程(或模块)通讯以完成所需任务。 在这些设计中,微内核部分经常只但是是个消息转发站:当系统调用模块要给文档系统模块发送消息时

linux系统进程通信管理

∥☆過路亽.° 提交于 2020-02-10 18:44:01
常见IPC Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。 常用的进程间通信方式有: ① 管道 ( 使用最简单 ) ② 信号 ( 开销最小 ) ③ 共享映射区 ( 无血缘关系 ) ④ 本地套接字 ( 最稳定 ) 管道基础 管道是Linux进程间的一种通信方式,两个进程可以通过一个共享内存区域来传递信息,并且管道中的数据只能是单向流动的,也就是说只能有固定的写进程和读进程。 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质: 1. 其本质是一个伪文件 ( 实为内核缓冲区 ) 2. 由两个文件描述符引用,一个表示读端,一个表示写端。 3. 规定数据从管道的写端流入管道,从读端流出。 管道的原理 : 管道实为内核使用环形队列机制,借助内核缓冲区 ( 4 k ) 实现。 管道可以分为两种类型:匿名管道和命名管道。 其缺点为: 1 、读写数据过程中数据自己读不能自己写。 2 、数据一旦被读走

python语法基础-并发编程-进程-长期维护

大城市里の小女人 提交于 2020-02-10 06:18:06
############### 进程的启动方式1 ############## """ 并发编程: 进程 1,运行中的程序,就是进程,程序是没有生命的实体,运行起来了就有生命了, 操作系统可以管理进程,进程是操作系统基本的执行单元, 2,每一个进程都有它自己的地址空间,进程之间是不会混的,比如qq不能访问微信的地址空间, 操作系统替你隔离开了,这也是操作系统引入进程这个概念的原因, ####################################### 进程的调度 1,先来先服务,有一个不好的,就是不利于短作业 2,短作业优先算法,但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。 3,时间片轮转算法,就是轮流执行,已经很科学了, 4,多级反馈队列算法,有多个队列,有一个新任务来了放入第一个队列,这是优先级加上时间片轮转,第二个任务来了放入下一级, ####################################### 并发和并行: 进程的并行:这种只有在多核cpu才可以实现, 进程的并发:这是轮流执行,由于速度很快,看起来像是一起执行的,比如一遍听音乐,一遍写代码, ###################################### 进程的三状态转换图:非常重要 1,进程一开始运行的时候,是就绪的状态,这是第一个状态