用于程序间通讯(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) : 有名管道也是半双工的通讯方式,但是它允许无亲缘关系程序间的通讯。
WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
为了实现 WebSocket 通信,在 HTTP 连接建立之后,需要完成一 次“握手”(Handshaking)的步骤。
握手·请求
为了实现 WebSocket 通信,需要用到 HTTP 的 Upgrade 首部字 段,告知服务器通信协议发生改变,以达到握手的目的。
Sec-WebSocket-Key 字段内记录着握手过程中必不可少的键值。 Sec-WebSocket-Protocol 字段内记录使用的子协议。 子协议按 WebSocket 协议标准在连接分开使用时,定义那些连接 的名称。
177 握手·响应
对于之前的请求,返回状态码 101 Switching Protocols 的响应。
Sec-WebSocket-Accept 的字段值是由握手请求中的 SecWebSocket-Key 的字段值生成的。 成功握手确立 WebSocket 连接之后,通信时不再使用 HTTP 的数 据帧,而采用 WebSocket 独立的数据帧。
成功握手确立 WebSocket 连接之后,通信时不再使用 HTTP 的数 据帧,而采用 WebSocket 独立的数据帧。
JavaScript 可调用“The WebSocket API”,以下为调用 WebSocket API,每 50ms 发送一次数据的实例。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)