问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

程序间通讯方式

发布网友 发布时间:2022-12-28 16:21

我来回答

1个回答

热心网友 时间:2023-10-03 08:37

程序间通讯方式

用于程序间通讯(IPC)的四种不同技术: 1. 讯息传递(管道,FIFO,posix和system v讯息伫列) 2. 同步(互斥锁,条件变数,读写锁,档案和记录锁,Posix和System V讯号灯) 3. 共享记忆体区(匿名共享记忆体区,有名Posix共享记忆体区,有名System V共享记忆体区) 4. 过程呼叫(Solaris门,Sun RPC) 讯息伫列和过程呼叫往往单独使用,也就是说它们通常提供了自己的同步机制.相反,共享记忆体区通常需要由应用程式提供的某种同步形式才能正常工作.解决某个特定问题应使用哪种IPC不存在简单的判定,应该逐渐熟悉各种IPC形式提供的机制,然后根据特定应用的要求比较它们的特性. 必须考虑的四个前提: 1. 联网的还是非联网的.IPC适用于单台主机上的程序或执行绪间的.如果应用程式有可能分布到多台主机上,那就要考虑使用套接字代替IPC,从而简化以后向联网的应用程式转移的工作. 2. 可移植性. 3. 效能,在具体的开发环境下执行测试程式,比较几种IPC的效能差异. 4. 实时排程.如果需要这一特性,而且所用的系统也支援posix实时排程选项,那就考虑使用Posix的讯息传递和同步函式. 各种IPC之间的一些主要差异: 1. 管道和FIFO是位元组流,没有讯息边界.Posix讯息和System V讯息则有从传送者向接受者维护的记录边界(eg:TCP是没有记录边界的位元组流,UDP则提供具有记录边界的讯息). 2. 当有一个讯息放置到一个空伫列中时,Posix讯息伫列可向一个程序传送一个讯号,或者启动一个新的执行绪.System V则不提供类似的通知形式. 3. 管道和FIFO的资料位元组是先进先出的.Posix讯息和System V讯息具有由传送者赋予的优先顺序.从一个Posix讯息伫列读出时,首先返回的总是优先顺序最高的讯息.从一个System V讯息伫列读出时,读出者可以要求想要的任意优先顺序的讯息. 4. 在众多的讯息传递技术—管道,FIFO,Posix讯息伫列和System V讯息伫列—中,可从一个讯号处理程式中呼叫的函式只有read和write(适用于管道和FIFO). 比较不同形式的讯息传递时,我们感兴趣的有两种测量尺度: 1. 频宽(bandwidth):资料通过IPC通道转移的速度.为测量该值,我们从一个程序向另一个程序传送大量资料(几百万位元组).我们还给不同大小的I/O操作(例如管道和FIFO的write和read操作)测量该值,期待发现频宽随每个I/O操作的资料量的增长而增长的规律. 2. 延迟(latency):一个小的IPC讯息从一个程序到令一个程序再返回来所花的时间.我们测量的是只有一个1个位元组的讯息从一个程序到令一个程序再回来的时间(往返时间) 在现实世界中,频宽告诉我们大块资料通过一个IPC通道传送出去需花多长时间,然而IPC也用于传递小的控制资讯,系统处理这些小讯息所需的时间就由延迟提供.这两个数都很重要.

程序和执行绪的区别,程序间通讯方式有哪

程序间和执行绪间的协作区别:
程序互斥、同步的概念
程序互斥、同步的概念是并发程序下存在的概念,有了并发程序,就产生了资源的竞争与协作,从而就要通过程序的互斥、同步、通讯来解决资源的竞争与协作问题。
下面是根据《作业系统教程》3.1.4 中的介绍,整理的程序互斥、同步的概念。
在多道程式设计系统中,同一时刻可能有许多程序,这些程序之间存在两种基本关系:竞争关系和协作关系。
程序的互斥、同步、通讯都是基于这两种基本关系而存在的,为了解决程序间竞争关系(间接制约关系)而引入程序互斥;为了解决程序间松散的协作关系( 直接制约关系)而引入程序同步;为了解决程序间紧密的协作关系而引入程序通讯。
第一种是竞争关系
系统中的多个程序之间彼此无关,它们并不知道其他程序的存在,并且也不受其他程序执行的影响。例如,批处理系统中建立的多个使用者程序, 分时系统中建立的多个终端程序。由于这些程序共用了一套计算机系统资源,因而, 必然要出现多个程序竞争资源的问题。当多个程序竞争共享硬装置、储存器、处理器 和档案等资源时,作业系统必须协调好程序对资源的争用。
资源竞争出现了两个控制问题:一个是死锁 (deadlock )问题,一组程序如果都获得了部分资源,还想要得到其他程序所占有的资源,最终所有的程序将陷入死锁。另一个是饥饿(starvation )问题,这是指这样一种情况:一个程序由于其他程序总是优先于它而被无限期拖延。
作业系统需要保证诸程序能互斥地访问临界资源,既要解决饥饿问题,又要解决死锁问题。
程序的互斥(mutual exclusion )是解决程序间竞争关系( 间接制约关系) 的手段。 程序互斥指若干个程序要使用同一共享资源时,任何时刻最多允许一个程序去使用,其他要使用该资源的程序必须等待,直到占有资源的程序释放该资源。
第二种是协作关系
某些程序为完成同一任务需要分工协作,由于合作的每一个程序都是独立地以不可预知的速度推进,这就需要相互协作的程序在某些协调点上协 调各自的工作。当合作程序中的一个到达协调点后,在尚未得到其伙伴程序发来的讯息或讯号之前应阻塞自己,直到其他合作程序发来协调讯号或讯息后方被唤醒并继续执行。这种协作程序之间相互等待对方讯息或讯号的协调关系称为程序同步。
程序间的协作可以是双方不知道对方名字的间接协作,例如,通过共享访问一个缓冲区进行松散式协作;也可以是双方知道对方名字,直接通过通讯机制进行紧密协作。允许程序协同工作有利于共享资讯、有利于加快计算速度、有利于实现模组化程式设计。
程序的同步(Synchronization)是解决程序间协作关系( 直接制约关系) 的手段。程序同步指两个以上程序基于某个条件来协调它们的活动。一个程序的执行依赖于另一
个协作程序的讯息或讯号,当一个程序没有得到来自于另一个程序的讯息或讯号时则需等待,直到讯息或讯号到达才被唤醒。
不难看出,程序互斥关系是一种特殊的程序同步关系,即逐次使用互斥共享资源,也是对程序使用资源次序上的一种协调。

列举linux程序间通讯方式,linux pthread执行绪同步的方式有哪些

程序间通讯程序间通讯就是不同程序之间传播或交换资讯,程序的使用者空间是互相独立的,程序之间可以利用系统空间交换资讯。 管道(pipe)管道是一种半双工的通讯方式,资料只能单向流动。如果要进行双工通讯,需要建立两个管道。 管道只能在具有亲...

要传输大约1MB的资料,应该用哪种程序间通讯方式最佳

Simpson and Sons
54 Madison Street
Sydney, Australia.
7th November 2008
Dear Person-in-charge,
Re: Amendments of L/C No. 5058
We are writing to amend L/C No. 5058 of 3,000 dozens of Poplin Shirts as follows:
1) The beneficiary pany should be Pacific Trading Co., Ltd as opposed to Oriental Trading Co., Ltd.
2) The credit terms should be cash on delivery instead of 60 days credit terms.
3) The trade term or price term should be CFRC3 Marseilles in instead of CFR Marseilles.
4) The total transaction amount should be USD 300,000.00 and not GBP 300,000.00.
We apologized for any inconvenience caused. Please kindly make the following amendments as soon as possible and do not hesitate to contact me at xxx-xxxx-xxxx should you required further information.
Thank you.
Yours truly,
XXX

程序间同步是程序间通讯吗

管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系程序间的通讯,有名管道克服了管道没有名字的*,因此,除具有管道所具有的功能外,它还允许无亲缘关系程序间的通讯; 讯号(Signal):讯号是比较复杂的通讯方式,用于通知接受程序有某种事件发生,除了用于程序间通讯外,程序还可以传送讯号给程序本身;linux除了支援Unix早期讯号语义函式sigal外,还支援语义符合Posix.1标准的讯号函式sigaction(实际上,该函式是基于BSD的,BSD为了实现可靠讯号机制,又能够统一对外介面,用sigaction函式重新实现了signal函式); 报文(Message)伫列(讯息伫列):讯息伫列是讯息的连结表,包括Posix讯息伫列system V讯息伫列。有足够许可权的程序可以向伫列中新增讯息,被赋予读许可权的程序则可以读走伫列中的讯息。讯息伫列克服了讯号承载资讯量少,管道只能承载无格式位元组流以及缓冲区大小受限等缺点。 共享记忆体:使得多个程序可以访问同一块记忆体空间,是最快的可用IPC形式。是针对其他通讯机制执行效率较低而设计的。往往与其它通讯机制,如讯号量结合使用,来达到程序间的同步及互斥。 讯号量(semaphore):主要作为程序间以及同一程序不同执行绪之间的同步手段。 套介面(Socket):更为一般的程序间通讯机制,可用于不同机器之间的程序间通讯。

程序间通讯方式中一般公司用的最多的是哪几个?做嵌入式的

pipe, fifo, 讯息伫列,共享记忆体这些传统的程序间通讯方式公司一般都不用,虽然共享记忆体可能快一点点,但是带来的维护开销等是很大的,公司一般会用socket也就是网路通讯的方式,或者是用资料库,程序1写资料库,程序2去读。我说的是linux系统。

python程序间通讯怎么理解

在2.6才开始使用
multiprocessing 是一个使用方法类似threading模组的程序模组。允许程式设计师做并行开发。并且可以在UNIX和Windows下执行。
通过建立一个Process 型别并且通过呼叫call()方法spawn一个程序。
一个比较简单的例子:
#!/usr/bin/env python
from multiprocessing import Process
import time
def f(name):
time.sleep(1)
print 'hello ',name
print os.getppid() #取得父程序ID
print os.getpid() #取得程序ID
process_list = []
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
p.start()
process_list.append(p)
for j in process_list:
j.join()
程序间通讯:
有两种主要的方式:Queue、Pipe
1- Queue类几乎就是Queue.Queue的复制,示例:
#!/usr/bin/env python
from multiprocessing import Process,Queue
import time
def f(name):
time.sleep(1)
q.put(['hello'+str(name)])
process_list = []
q = Queue()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
p.start()
process_list.append(p)
for j in process_list:
j.join()
for i in range(10):
print q.get()
2- Pipe 管道
#!/usr/bin/env python
from multiprocessing import Process,Pipe
import time
import os
def f(conn,name):
time.sleep(1)
conn.send(['hello'+str(name)])
print os.getppid(),'-----------',os.getpid()
process_list = []
parent_conn,child_conn = Pipe()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(child_conn,i))
p.start()
process_list.append(p)
for j in process_list:
j.join()
for p in range(10):
print parent_conn.recv()
Pipe()返回两个连线类,代表两个方向。如果两个程序在管道的两边同时读或同时写,会有可能造成corruption.
程序间同步
multiprocessing contains equivalents of all the synchronization primitives from threading.
例如,可以加一个锁,以使某一时刻只有一个程序print
#!/usr/bin/env python
from multiprocessing import Process,Lock
import time
import os
def f(name):
lock.acquire()
time.sleep(1)
print 'hello--'+str(name)
print os.getppid(),'-----------',os.getpid()
lock.release()
process_list = []
lock = Lock()
if __name__ == '__main__':
for i in range(10):
p = Process(target=f,args=(i,))
p.start()
process_list.append(p)
for j in process_list:
j.join()
程序间共享状态 Sharing state beeen processes
当然尽最大可能防止使用共享状态,但最终有可能会使用到.
1-共享记忆体
可以通过使用Value或者Array把资料储存在一个共享的记忆体表中
#!/usr/bin/env python
from multiprocessing import Process,Value,Array
import time
import os
def f(n,a,name):
time.sleep(1)
n.value = name * name
for i in range(len(a)):
a[i] = -i
process_list = []
if __name__ == '__main__':
num = Value('d',0.0)
arr = Array('i',range(10))
for i in range(10):
p = Process(target=f,args=(num,arr,i))
p.start()
process_list.append(p)
for j in process_list:
j.join()
print num.value
print arr[:]
输出:
jimin@Jimin:~/projects$ python pp.py
81.0
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
'd'和'i'引数是num和arr用来设定型别,d表示一个双精浮点型别,i表示一个带符号的整型。
更加灵活的共享记忆体可以使用multiprocessing.sharectypes模组
Server process
Manager()返回一个manager型别,控制一个server process,可以允许其它程序通过代理复制一些python objects
支援list,dict,Namespace,Lock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value,Array
例如:
#!/usr/bin/env python
from multiprocessing import Process,Manager
import time
import os
def f(d,name):
time.sleep(1)
d[name] = name * name
print d
process_list = []
if __name__ == '__main__':
manager = Manager()
d = manager.dict()
for i in range(10):
p = Process(target=f,args=(d,i))
p.start()
process_list.append(p)
for j in process_list:
j.join()
print d
输出结果:
{2: 4}
{2: 4, 3: 9}
{2: 4, 3: 9, 4: 16}
{1: 1, 2: 4, 3: 9, 4: 16}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 8: 64}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
Server process managers比共享记忆体方法更加的灵活,一个单独的manager可以被同一网路的不同计算机的多个程序共享。
比共享记忆体更加的缓慢
使用工作池 Using a pool of workers
Pool类代表 a pool of worker processes.
It has methods which allows tasks to be offloaded to the worker processes in a few different ways.

c#多执行绪之间通讯方式有几种

多执行绪通讯的方法主要有以下三种: 1.全域性变数 程序中的执行绪间记忆体共享,这是比较常用的通讯方式和互动方式。 注:定义全域性变数时最好使用volatile来定义,以防编译器对此变数进行优化。 2.Message讯息机制 常用的Message通讯的介面主要有两个

windows程序间通讯和linux相同吗

# 管道( pipe ):管道是一种半双工的通讯方式,资料只能单向流动,而且只能在具有亲缘关系的程序间使用。程序的亲缘关系通常是指父子程序关系。 # 有名管道 (named pipe) : 有名管道也是半双工的通讯方式,但是它允许无亲缘关系程序间的通讯。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
异想记歌词,杨幂唱滴! 有什么好打理的烫发发型可以推荐? 有哪些韩系卷发造型比较好打理? 哪些短发卷发造型比较好打理? 什么样的卷发发型比较好打理? 好打理的卷发造型有哪些值得推荐? 有哪些卷发发型比较好打理? 有哪些卷发造型比较好打理? 为什么离线迅雷看看播放器就不能用了,毕竟里面的是已经下载好了的,知... 迅雷离线用不了,连云播的搜索都用不了,是被封了吗? office2010如何激活永久使用? 美国科学家发明了避雷针是谁 发明了避雷针的科学家是谁 银和铜可以戴在一起吗? 美国科学家谁发明了避雷针 pixellab为什么会报毒 烘干房的循环风是流量大好还是压力大好? 瓦斯隧道局扇无循环风是什么意思 实验设计DOE有哪些主要方法 汽车循环风怎么使用 微信接龙为什么总会重复昨天的内容? 00506写作(一)-模拟卷3 呼和浩特 属于北方 还是东北? 抖音点赞怎么刷 抖音点赞充值会员链接进不去 骤在文言文 搜狗输入法怎么设置皮肤 人生长激素简介 什么游戏可以赚话费?手机游戏! 高考报志愿在什么时间? 刘诗诗和刘亦菲谁最有钱 梦幻西游帮派里的职位都有什么权利? 新帮派成员所有的位子怎么分配啊 水彩白墨水可以调色吗 铁棍山药煮熟后炸皮是不是正宗的 江西那里铁棍山药卖的最快 退抖音小店保证没有原手机号码怎么办 刀歌之短刀行的演员有哪些刀歌之短刀行的演员有谁 刀歌之短刀行哪个软件可以看 秋华秋水是什么电视剧 秋华秋水是哪部电视剧角色 分数方程怎么做 怎么计算分数的方程 小舞生日是几月几号几几年 小舞的生日是什么时候 斗罗*里的小舞只是十万年魂兽么,我怎么记得两年前看的是千万年的,是我记错了,还是三哥改了 本溪市平山早市开了吗 本溪平山区崔东街道是高风险区吗 辽宁省本溪市平山区平山街道下辖村委会有哪些? 本溪平山区办理营业执照在哪里 辽宁省本溪市平山区下辖街道办事处有哪些? 本溪市平山区东风小区二玻璃厂地址 本溪市平山区来鞍山用隔离吗