精华内容
下载资源
问答
  • 进程的通信 ''' 两个进程之间想要进行通信,需要在进程之间建立一个管道,这个管道就是队列 ''' from multiprocessing import Queue q = Queue(5) # 括号内可以传入参数,表示队列最大存储数 括号内不传入参数...

    进程间的通信

    '''
    两个进程之间想要进行通信,需要在进程之间建立一个管道,这个管道就是队列
    '''
    from multiprocessing import Queue
    q = Queue(5)  # 括号内可以传入参数,表示队列最大存储数  括号内不传入参数时,默认最大值
    # 往队列中添加数据
    q.put(1)
    q.put(2)
    q.put(3)
    print(q.full())  # 判断队列是否满了
    q.put(4)
    q.put(5)
    print(q.full())
    q.put(6)  # 当队列满了之后再放入值,不会报错,会在原地等待,直到队列中有值被取走(阻塞态)
    
    
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.empty())  # 判断队列中的值是否被取走
    print(q.get())
    print(q.get())
    # print(q.get())  # 当队列中的值被取完时,不会报错,会在原地等待,等待值被传入队列(阻塞态)
    print(q.get_nowait())  # 当队列中的值被取完时,再取会直接报错
    
    '''
    full
    empty
    get_nowait
    都不适合多进程
    '''

    进程间通信ICP机制

    from multiprocessing import Process,Queue
    
    
    def send(q):
        q.put('hello')
    
    
    def get(q):
        print(q.get())
    
    
    if __name__ == '__main__':
        q = Queue()
        p = Process(target=send, args=(q,))
        p1 = Process(target=get, args=(q,))
        p.start()
        p1.start()
    
    
    
    
    '''
    子进程放数据,主进程获取数据
    两个子进程相互放,互相取
    '''

     

    转载于:https://www.cnblogs.com/asdaa/p/11343039.html

    展开全文
  • 进程及线程通信总结

    千次阅读 2012-02-19 18:08:45
     首先我们来看看最简单的方法,那就是使用全局变量(静态变量也可以)来进行通信,由于属于同一个进程的各个线程是处于同一个进程空间中的,并且它们共享这个进程的各种资源,因此它们都可以毫无障碍的访问这个进程...
     上文我们介绍了如何建立一个简单的多线程程序,多线程之间不可避免的需要进行通信。相比于进程间通信来说,线程间通信无疑是相对比较简单的

        首先我们来看看最简单的方法,那就是使用全局变量(静态变量也可以)来进行通信由于属于同一个进程的各个线程是处于同一个进程空间中的,并且它们共享这个进程的各种资源,因此它们都可以毫无障碍的访问这个进程中的全局变量。当需要有多个线程来访问一个全局变量时,通常我们会在这个全局变量前加上volatile声明,来告诉编译器这个全局变量是易变的,让编译器不要对这个变量进行优化(至于编译器到底有没有按照你的要求来对volatile进行处理这个暂且不理)。

        下面贴出一段简单的示例代码:

    #include "stdafx.h"
    #include 
    "windows.h"
    #include 
    "stdio.h"

    volatile int ThreadData = 0;

    void ThreadProcess()
    {
        
    for(int i=0; i<6; i++)
        
    {
            ThreadData 
    += 1000;
            Sleep(
    1000);
            printf(
    "Sub  Thread Tick %5d! %5d\n",(i+1)*1000, ThreadData);
        }

        printf(
    "Exit Sub Thread!\n");
        
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
        HANDLE hThread;
        DWORD ThreadID;
        hThread
    =CreateThread(NULL,
                         
    0,
                         (LPTHREAD_START_ROUTINE)ThreadProcess,
                         NULL,
                         
    0,
                         
    &ThreadID);
        
        
    for(int i=0; i<10; i++)
        
    {
            ThreadData 
    -= 600;
            Sleep(
    600);
            printf(
    "Main Thread Tick %5d! %5d\n", (i+1)*600, ThreadData);
        }

        printf(
    "Main Thread Loop Finished! \n");
        system(
    "pause");
        
    return 0;
    }

     

     

        除了全局变量之外,还有其他的方法,比如利用消息机制等来实现线程间通信。

     

    线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用。不过要注意的是线程间需要做好同步,一般用mutex

     

    一、互斥与同步
    1.互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

    2.同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源.

    3.同步是一种更为复杂的互斥,而互斥是一种特殊的同步.

    二、通信与同步
    进程间同步本身也是一种进程间通信(因为涉及信息的交换),当然也是一种原始的进程间通信,但同时又是更高级的进程间通信机制的基石。
    对线程亦然.

    三、临界区(Critical section)与互斥体(Mutex)的区别

    1、临界区只能用于对象在同一进程里线程间的互斥访问;互斥体可以用于对象进程间或线程间的互斥访问。
    2、临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
    3、临界区和互斥体在Windows平台都下可用;Linux下只有互斥体可用。

    四、linux IPC
    1.经典IPC:
    (1)管道、命名管道       //最基本最常用

    (2)消息队列、信号量、共享存储
    //分为Posix IPC和System V IPC,共享存储是运行在同一台机器上的进程间通信最快的方式

    2高级IPC: 流管道、命名流管道
    (以上是限于同一台主机的各个进程间的IPC)

    3.支持不同主机上各个进程的IPC:套接口、流

    五、线程间通信机制:
    1.互斥锁
    2.条件变量
    3.读写锁
    4.信号灯


    展开全文
  • 进程的管道通信实验

    2011-12-24 17:39:17
    进程的管道通信实验 实验四 进程的管道通信实验 1、了解什么是管道 2、熟悉UNIX/LINUX支持的管道通信方式 1、了解什么是管道 2、熟悉UNIX/LINUX支持的管道通信方式 利用linux下的vi编辑器GCC编辑工具完成实验 PC...
  • 2、编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话: Child 1 is sending a message! Child 2 is sending a message! 父进程从管道中读出二个来自子进程的信息...
  • 1.消息创建、发送和接收 任务: 使用系统调用msgget(),msgsnd(),msgrev()msgctl()编制一长度为1k...(2) Server端建立一个key为75消息队列,等待其他进程发送来消息。当遇到类型为1消息,则...

    1.消息的创建、发送和接收
    任务:
    使用系统调用msgget(),msgsnd(),msgrev()及msgctl()编制一长度为1k的消息发送和接受程序。
    思路:
    (1) 为了便于操作和观察结果,用一个程序作为引子,先后fork()两个子进程,server和client,进行通信。
    (2) Server端建立一个key为75的消息队列,等待其他进程发送来的消息。当遇到类型为1的消息,则作为结束信号,取消该队列,并退出server。Server每接收到一个消息后显示一句“(server)received”。
    (3) Client端使用key为75的消息队列,先后发送类型从10到1的消息,然后退出。最后的一个消息,即是server端需要的结束信号。Client每发送一条消息后显示一句“(client)sent”。

    这里写代码片
    展开全文
  • 在Linux系统下实现进程从创建到终止的全过程,从中体会进程的创建过程、父进程和子进程之间的关系、进程状态的变化、进程之间的互斥、同步机制、进程调度的原理和以管道为代表的进程间的通信方式的实现。 2. 内容...
  • Linux下进程通信

    2016-06-20 17:04:59
    -管道(Pipe)有名管道(name pipe):进程建立字节流队列。 -消息队列(Message Queue):进程建立消息队列 -信号(Signal):信号是在软件层次上对中断机制一种模拟。一个进程可以向另一个进程发送信号,就像外设...
    进程间的通信
    进程间通信的难点:
    -独立的进程地址空间
    -异步工作

    常用的进程间通信机制
    -管道(Pipe)及有名管道(name pipe):进程间建立字节流队列。
    -消息队列(Message Queue):进程间建立消息队列
    -信号(Signal):信号是在软件层次上对中断机制的一种模拟。一个进程可以向另一个进程发送信号,就像外设触发了CPU的中断。
    -共享内存(Shared memory):将同一块物理内存映射到两个不同进程的地址空间中
    -信号量(Semaphore):主要是作为进程之间的同步和互斥手段

    -套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器上的两个进城之间的进程间通信,应用非常广泛。

    管道主要包括两种:无名管道和有名管道
    -无名管道特点
    *只能用于具有亲缘关系的进城之间的通信(父子进程或者兄弟进程)
    *半双工的通信模式,具有固定的读端和写端
    *管道也可以看成是一种内存中的特殊文件,对于他的读写也可以使用普通的read()、write()等函数
    -有名管道特点

    *他可以使互不相关的两个进程实现彼此通信

    *对应一个实际的文件,并且在文件系统中是可见的。在建立了管道之后,两个进程就可以把它当作普通文件一样
    进行读写操作,使用非常方便。
    *严格地遵守先进先出的规则,对管道的度总之从开始处返回数据,对他们的写则是把数据添加到末尾,因此不支持如lseek()等文件定位操作。

    关于无名管道的系统调用
    -管道创建和关闭
    *管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fds[0]和fds[1],其中fds[0]
    固定用于读管道,而fd[1]固定用于写管道,这样就构成可一个半双工的通道。
    *管道关闭时只需将这两个文件描述符关闭即可,可使用普通的close()函数逐个关闭各个文件描述符。

    -无名管道读写注意点:

    只有在管道的读端存在是,向管道写入数据才有意义。否则,向管道写入数据的进程将收到内核传来的SIGPIPE信号
    向管道写入数据时,Linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。
    如果读进程不读取管道缓冲区中的数据,那么些操作将会一直阻塞。
    如果管道缓冲区是空,那么读进程将会一直阻塞

    有名管道(FIFO)
    -有名管道可以实现任意连个进程之间的通信,并不限制两个进程间有亲缘关系
    -有名管道作为一种特殊的文件存放在文件系统中,使用完仍然存在,除非对其进行删除
    -有名管道也只能用于单向传输

    有名管道
    -FIFO读写
    对于进程
    -若该管道是阻塞打开,且当前FIFO内没有数据,则读进程而言将一直阻塞到有数据写入
    -若该管道是非阻塞打开,则不论FIFO内是否有数据,读进程会立即执行读操作,即如果FIFO内没有数据,读函数都会立刻返回0
    对于进程
    -若该管道是阻塞打开,则写操作将一直阻塞到数据可以被写入
    -若该管道是非阻塞打开而不能写入全部数据,则读操作进行部分写入后者调用失败。

    Linux信号机制是在应用软件层次对中断机制的一种模拟,是一种异步通信方式
    每个进程都有一个自己私有的信号处理函数映射表,当该进程收到一个信号时,对应的信号处理函数被触发执行
    一个进程可以向另一个进程发送信号,也可以向自己发送信号,咋偶哦系统内核页可以向一个进程发送信号,以
    通知某些硬件事件。
    信号处理函数映射表共有64个表项。前32个信号,编号为0-31,有预定义的含义和处理函数;后32个作为扩充。
    前32个是不可靠信号,后32个为可靠信号。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号
    丢失,而后者不会。

    信号发送:kill() raise()
    kill系统命令是kill()函数一个用户接口,它不仅可以终止进程(实际上发出SIGKILL信号),也可以向进程发送其他信号。

    raise()函数允许进程向其自身发送信号
    信号捕捉:alarm() pause()
    alerm()也称为闹钟函数,他可以在进程中设置一个定时器,当定时器指定的时间到时,他就可以向进程发送SIGALARM信号。
    pause()函数是用于将调用进程挂起直至捕捉到信号为止(该信号没有被阻塞)。
    信号的处理:signal、sigaction

    信号量
    -信号量是用来共享资源的种进程访问机制,是的共享资源在一个时刻只有一个
    -信号量对应于某一种资源,取一个非负的整型值。信号量指的是当前可用的该资源的数量,若他等于0则意味着者目前没有可用的资源。
    -针对信号量的操作:
    P操作:如果有可用的资源(信号量值>0),则占用一个资源(给信号量值减去-,进入临界区代码),如果没有可用资源(信号量等于0),

    则进入到该信号量的等待队列中并阻塞休眠,直到系统将其唤醒。
    V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程。如果没有进程等待它,则释放一个资源。


    使用信号量的步骤
    第一步:创建信号量或获得系统已存在的信号量,此时需要调用semget()函数。不同进程通过使用同一个信号量
    键值来获取同一个信号量。
    第二步:初始化信号量,此时使用semctl()函数的SETVAL操作。当使用二维信号量时,通常将信号量初始化为1
    第三步:进行信号量的PV操作,此时调用semop()函数。这一步是实现进程之间的同步和互斥的核心工作部分
    第四步:如果不需要信号量,则从系统中删除它,此时使用semctl函数的IPC_RMD操作。此时需要注意,在程序中
    不应该出现对已经被删除的信


    共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝

    *为了在多个进程间交换信息,内核专门留出了一块内存区,可以有需要访问的进程将其映射到自己的私有地址空间
    *进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高效率。
    *由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等。

    实现共享内存的步骤
    -创建共享内存,这里用到的函数是shmget,也就是从内存中获得一段共享内存区域
    -映射到共享内存,也就是把这段创建的共享内存映射到具体的进程空间中去,这里使用的函数是shmst
    -到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作
    -撤销映射的操作,其函数为shmdt
    -删除共享内存使用shmctl函数。

    消息队列
    消息队列就是一些消息的列表。用户可以在消息队列中添加消息和读取消息。消息队列具有一定的FIFO特性,但
    是它可以实现消息的随机查询,比FIFO具有更大的优势。同时这些消息又是存在于内核中的,由"队列ID"来表示。


    消息队列的实现包括创建或打开消息队列、添加消息、读取消息和控制消息队列这4种操作。
    创建会打开消息队列使用的函数是msgget,这里创建的消息队列的数量谁受到系统消息队列数量的限制。
    添加消息使用的函数是msgsnd函数,他爸消息添加到已打开的消息队列末尾
    读取消息使用的函数是msgrcv,他把消息从消息队列中取走,与FIFO不同的是,这里可以指定取走某一条消息
    控制消息队列使用的函数是msgctl,塔尔可以完成多项功能。


    展开全文
  • 在Android APP中如果Service作为一个独立的进程在运行,那么前台进程(一般指Activity所在的进程)在同后台Service进程建立连接时,需要把同Service建立连接调用Service中方法代码放在一个独立线程中进行,否则...
  • 进程的亲缘关系通常是指父子进程关系。 2. 命名管道FIFO:有名管道也是半双工的通信方式,支持可靠的、单向或双向的数据通信。但是它允许无亲缘关系进程间的通信。 遵循先进先出(first in first out),对管道...
  • 进程通信IPC

    2018-02-28 12:55:18
    为什么需要进程通信机制IPC?1、信号量管程不能传递大量信息。2、管程不适合多处理器情况。适用于:分布式系统、基于共享内存多处理机...需要解决两个问题:1、物理内存建立一个进程间可以共享内存空间...
  • linux 进程通信 管道

    2019-09-21 22:31:29
    需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通文件,它不属于某种...
  • 操作系统实验一:进程的建立 一、 实验目的: 创建进程子进程; 在父子进程之间实现进程通信; 二、 实验内容: 创建进程并显示标识等进程控制块的属性信息; 显示进程的通信信息和相应的应答信息; ...
  • 需要双方通信时,需要建立起两个管道;  2.只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);  3.单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通文件,它不属于...
  • 文章目录(1)管道是什么(2)匿名管道A:读端和写端B:建立匿名管道函数C:最简单的进程通信-演示D:管道四大特性E:管道特点F:从内核角度理解管道G:管道总结(3)命名管道A:命名管道和匿名管道区别B:...
  • 需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通文件,它不属于某种文件...
  • 需要双方通信时,需要建立起两个管道; • 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); • 单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是
  • 只能用于具有亲缘关系的进程之间的通信   2.半双工通信模式  3.一种特殊文件,是一种只存在于内核中读写函数   管道基于文件描述符,管道建立时,有两个文件描述符: a. fd[0]: 固定用于读...
  • 一 管道  1有名管道 ... 只有相关的进程创建管道(pipe)的进程及其子进程可以访问  偏移信息没有像文件那样存在,所以进程不能lseek管道,即不能随机读管道  所有进程结束使用管道,内核
  • 1、管道概述相关API应用 1.1 管道相关关键概念 管道是Linux支持最初Unix IPC形式之一,具有...需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种
  • 进程通信 消息队列

    2018-10-14 21:24:35
    1 消息创建,发送和接受。  使用系统调用 msgget( ), msgsnd(), msgrev() msgctl() 编制一长度为1K消息发送和接受程序。... server 端建立一个Key 为 75 消息队列 ,等待其他进程发来...
  • 目录 管道通信 介绍 ...管道(Pipe)有名管道(Named Pipe):管道可用于具有亲缘关系进程的通信,有名管道克服了管道没有名字限制,因此,除具有管道所具有功能外,它还允许无亲缘关系...
  • 需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通文件,它不属于某种文件...
  • 一. 管道: 1.只能用于具有亲缘关系的进程之间的通信 2.半双工通信模式 3.一种特殊的文件,是一种只存在于内核中的读写函数 管道基于文件描述符,管道建立时,有两个文件描述符:a.... 子进程会继承父进程的管道 
  • 进程有自己的地址空间,当一个进程建立,系统就会为它分配地址空间,而线程是共享进程的数据,使用相同的地址空间。 一个进程中可以包含多个线程,但是至少有一个线程。 一个进程死掉不会影响其他进程,进程与进程...
  • 进程通信-匿名管道

    2013-01-09 16:13:13
    需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程); 单独构成一种独立文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通文件,它不属于某种文件...
  • 系统建立IPC通讯 (消息队列、信号量和共享内存) 时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。 头文件与函数原型: #include <sys/types.h> #include <sys/ipc.h> key_t ftok( const ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 596
精华内容 238
关键字:

进程的建立及通信