精华内容
下载资源
问答
  • 进程间通信的方式

    2020-08-09 16:20:28
    文章目录进程间通信管道管道的特性匿名管道命名管道共享内存消息队列信号量 ...进程间通信的方式: 从unix借鉴而来:管道(资源传输) systemV标准的进程间通信方式:共享内存,消息队列,信号量 命令

    进程间通信

    进程间通信(IPC):操作系统为用户提供的几种进程间通信方式

    为什么操作系统要为用户提供进程间通信方式?

    • 因为进程的独立性(每个进程都有自己的独立虚拟地址空间,操作的都是自己的虚拟地址),因此进程之间无法直接通信

    如何提供进程间通信方式?

    • 给多个进程之间提供一个大家都能访问到的传播介质

    进程间通信的方式:

    • 从unix借鉴而来:管道(资源传输)
    • systemV标准的进程间通信方式:共享内存,消息队列,信号量

    命令操作

    • ipcs:查看进程间通信资源
    • -m:查看共享内存
    • -q:查看消息队列
    • -s:查看信号量
    • ipcrm:删除进程间通信资源 -m

    管道

    管道的本质:内核中的一块缓冲区;若多个进程可访问到同一个缓冲区,就可以实现通信

    管道的特性

    • 管道是半双工通信(可以选择方向的单向传输)
    • 管道的读写特性:
      • 若管道中没有数据,则调用read读取数据会阻塞1
      • 若管道中数据满了,则调用write写入数据会阻塞
      • 若管道的所有读端pipefd[0]被关闭,则继续调用write会产生异常导致进程退出
      • 若管道的所有写端pipefd[1]被关闭,则继续调用read,read会读完管道中的数据返回0,不再阻塞
    • 管道的生命周期随进程(打开管道的所有进程退出,管道就会被释放(命名管道也一样,本质都是缓冲区,文件只是标识符))
    • 管道提供字节流传输服务(可靠、有序、基于连接的一种高灵活性传输服务)
    • 管道自带同步与互斥
      • 管道的读写特性之一:管道中没有数据则read阻塞/数据满了则write阻塞,体现同步2
      • 管道的读写操作在PIPE_BUF(默认4096字节)大小以内保证操作的原子性3,体现互斥4

    匿名管道

    内核中一块没有具体标识符的缓冲区,只能用于具有亲缘关系的进程间通信。子进程只能通过复制父进程的方式获取到管道的文件描述符(操作句柄),因为父进程创建管道的时候操作系统会返回管道的文件描述符

    创建匿名管道:

    int pipe(int pipefd[2]); 	// pipefd[2]具有两个int型节点的数组的首地址,用于接收创建管道返回的操作句柄
    							// pipefd[0]用于从管道中读取数据,pipefd[1]用于向管道中写入数据
    

    管道是单向的资源传输,自身并不限制资源的传输方向,使用时只能用一端,哪一端不使用就关闭哪一端

    命令行中管道符的实现:ps -ef | grep ssh

    命名管道

    一块具有标识符的缓冲区,可用于同一主机上的任意进程间通信。多个进程可以通过打开同一个命名管道文件访问同一个管道(内核中的缓冲区)实现通信

    创建命名管道文件接口:

    int mkfifo(char* filename,mode_t mode);
    // 参数:
    // filename:管道文件名称
    // mode:管道文件权限
    // 返回值:成功返回0,失败返回-1
    

    共享内存

    共享内存是一块物理内存

    实现原理:在物理内存上开辟一块空间,多个进程可以将这块物理内存空间映射到自己的虚拟地址空间,通过自己的虚拟地址直接访问这块空间,通过这种方式实现数据共享

    操作流程

    1. 创建共享内存:在物理内存上开辟空间
    2. 进程将共享内存映射到自己的虚拟地址空间(基本的内存操作都可以对这块空间进行操作)
    3. 解除虚拟地址空间与共享内存的映射关系
    4. 释放共享内存资源

    特性

    • 共享内存是最快的进程间通信方式
    • 共享内存的生命周期随内核,在物理内存开辟空间,信息存储在内核;共享内存是属于内核的一个进程间通信资源,不会随着进程的退出而释放,内核重启或手动释放才能释放共享内存
    • 不自带同步与互斥,在多个进程进行访问的时候存在安全问题

    代码操作

    1.创建共享内存:

    int shmget(key_t key,size_t size,int shmflg);
    
    • key:内核中共享内存的标识符—多个进程通过相同的标识符才能打开同一个共享内存
    • size:共享内存大小—以内存页为单位进行分配
    • shmflg:IPC_CREAT—存在则打开,不存在则创建|IPC_EXCL—与IPC_CREAT同时使用,若存在则报错,不存在则创建|mode
    • 返回值:返回一个非负整数—共享内存的操作句柄;失败返回-1

    2.将共享内存映射到虚拟地址空间:

    void* shmat(int shmid,const void* shmaddr,int shmflg);
    
    • shmid:shmget返回的共享内存操作句柄
    • shmaddr:共享内存映射在虚拟地址空间中的首地址—通常置NULL
    • shmflg:映射成功之后对共享内存可以进行的操作 SHM_RDONLY用于只读(前提是有读的权限)/0—默认可读可写
    • 返回值:返货共享内存映射在虚拟地址空间的首地址—通过这个首地址进项后续的内存操作,失败返回(void*)-1

    3.解除映射关系:

    int shmdt(const void* shmaddr);
    
    • shmaddr:映射在虚拟地址空间中的首地址
    • 返回值:成功返回0,失败返回-1

    4.删除共享内存:

    shmctl(int shmid,int cmd,struct shmid_ds* buf);
    
    • shmid:共享内存操作句柄

    • cmd:对共享内存想要进行的操作IPC_RMID—删除共享内存

    • buf:用于获取/设置共享内存信息的结构,不使用则置NULL

    • 返回值:成功返回0,失败返回-1;

    • 共享内存删除的时候并不会立即被删除,只是将其状态置为被销毁状态,移除标识,为了不让这个共享内存继续被其它进程映射连接;等到当前共享内存映射连接数为0时,才会真正删除这块共享内存

    共享内存与管道的区别

    • 共享内存数据的写入是一种针对地址指向空间的覆盖式写入
    • 管道的通信中涉及到两次用户态与内核态之间的数据拷贝:将数据写入管道、从管道读取数据
    • 共享内存的通信直接通过虚拟地址访问物理内存实现共享内存中的数据操作,相较于管道这种通信方式,少了两次用户态与内核态之间的数据拷贝操作,因此速度最快

    消息队列

    概念:内核中的一个优先级队列
    实现原理:多个进程通过访问同一个队列,进行添加节点或者获取节点实现通信
    操作流程

    1. 创建消息队列:在内核中创建一个优先级队列
    2. 进程可以向队列中添加节点/获取节点
    3. 删除消息队列

    特性:自带同步与互斥、生命周期随内核

    信号量

    概念:用于实现进程间的同步与互斥(共享内存本身不提供同步与互斥,操作存在安全隐患,因此需要使用信号量保护对共享内存的操作)
    本质:一个内核中的计数器+pcb等待队列
    实现原理

    • 信号量通过自身计数器对数据资源进行计数,进程在访问资源之前,先通过计数判断能否访问资源
    • 计数>0可以访问;获取一个资源,计数-1
    • 计数<=0不能访问;计数-1,将pcb状态置为可中断休眠状态,加入等待队列
    • 其它进程产生了一个可用资源,计数+1;若计数>0则什么都不做,若计数<0则从等待队列中唤醒一个pcb去获取资源

    1. 阻塞:为了完成一个功能发起调用,若当前不具备完成条件则一直等待 ↩︎

    2. 同步:通过条件判断实现临界资源(一次只能供一个进程访问的资源)操作的合理性 ↩︎

    3. 原子操作:不能被打断的操作,指的是一个操作要么一次完成,要么就不做 ↩︎

    4. 互斥:通过同一时间唯一访问实现临界资源操作的安全性 ↩︎

    展开全文
  • 进程间通信的方式 管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 有名管道 (named pipe) : 有名管道也是半双工的...

    进程间通信的方式

    • 管道( pipe ):
      管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    • 有名管道 (named pipe) :
      有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    • 信号量(semophore ) :
      信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    • 消息队列( messagequeue ) :
      消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    • 信号 (sinal ) :
      信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    • 共享内存(shared memory ) :
      共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    • 套接字(socket ) :
      套接口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同设备及其间的进程通信。

    管道、命名管道、信号量、消息队列、信号及共享内存只适用于本地进程间通信,套接字则可用于远程通信,因而一般用于网络编程。

    部分概念解释

    匿名管道是在缓存中开辟的输出和输入文件流的空间,只能用于父子关系的进程之间。因为父子进程的输入和输出文件描述符是一致的。
    命名管道是一种实际存在的FIFO文件,称作“管道文件”,用于不同进程之间,命名管道进程间打开同一个FIFO文件,进行数据传递。

    信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作。

    线程间通信

    • 锁机制
      包括互斥锁、条件变量、读写锁。
      互斥锁提供了以排他方式防止数据结构被并发修改的方法。
      读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
      条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。互斥锁用于上锁,条件变量用于等待。
    • 信号量(Semaphore):信号量分两种,一种是无名信号量,一种是有名信号量。无名信号量一般用于线程间同步或互斥,而有名信号量一般用于进程间同步或互斥。它们的区别和管道及命名管道的区别类似,无名信号量则直接保存在内存中,而有名信号量要求创建一个文件。
    • 信号(Signal):类似进程间的信号处理。

    进程与线程之间根本区别在于多进程中每个进程有自己的地址空间,线程则共享地址空间。只有进程间需要通信。同一进程的线程共享地址空间,没有通信的必要,但要做好同步/互斥,保护共享的全局变量。而进程间通信都是由操作系统保证的,是系统调用。

    展开全文
  • 四种进程间通信的方式:activity 、service AIDL 、ContentProvider 、BroadcastReceiver 一个客户端一个服务端,相互通信
  • 进程间通信的方式有哪些? 1、进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字共六种 2、管道:管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且...

    进程间通信的方式有哪些?




    1、进程间通讯方式有:管道,信号,信号量,消息队列,共享内存,套接字共六种

    2、管道:管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,一般用于两个不同进程之间的通信。有名管道也是一种半双工的通信方式,但它允许无亲缘关系进程间的通信。

    3、信号:信号是一种比较复杂的通信方式,信号产生的条件:按键、硬件异常、进程调用kill函数将信号发送给另一个进程、用户调用kill命令将信号发送给其他进程,传递的消息比较少用于通知接收进程某个时间已经发生

    4、信号量:信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同 步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段

    5、消息队列:消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载 无格式字节流以及缓冲区大小受限等特点。

    6、共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。他往 往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

    7、套接字:套接字可用于不同及其间的进程通信。

    流式套接字: 提供可靠的,面向连接的通讯流

    数据包套接字: 定义一种无连接的服务,通过相互独立的报文进行传输,是无序的

    原始套接字: 用于新的网络协议的测试


    转载自:https://blog.csdn.net/xiaonan153/article/details/81502245

    展开全文
  • Linux进程间通信的方式 IPC是进程间通信的简称,是运行在某操作系统之上的不同进程间各种消息传递的方式。进程间通信的方法主要有以下几种: (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程...

    Linux进程间通信的方式

    IPC是进程间通信的简称,是运行在某操作系统之上的不同进程间各种消息传递的方式。进程间通信的方法主要有以下几种:

      (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先(父子进程关系)的进程之间进行通信。

      (2)命名管道(namedpipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。

     

    补充:匿名管道和命名管道的区别

    管道(PIPE)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读出来.管道分为两种:匿名管道和命名管道.匿名管道是在父进程和子进程间单向传输数据的一种未命名管道,只能在本地计算机中使用,而不能用于网络间的通信.

    匿名管道不支持异步读写操作.
    命名管道是在管道是在管道服务器和一台或多台管道客户机之间进行单向或双向通信的一种命名的管道.一个命名管道的所有实例共享同一个管道名,但是每一个实例均拥有独立的缓存和句柄,并且为客户-服务通信提供一个分离的管道.

    命名管道可以在同一台计算机的不同进程之间或在跨越一个网络的不同计算机的不同进程间进行有连接的可靠数据通信,如果连接中断,连接双方都能立即收到连接断开的信息。

     

      (3)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数)。

      (4) 消息(Message)队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点

      (5)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

      (6)内存映射(mappedmemory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它。

      (7)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

      (8)套接字(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字

    展开全文
  • 消息队列,信号量不光是freertos任务间通信的方式,也是Linux进程间通信的方式。 。
  • 我们先来看看面试题目:(学习视频分享:java视频教程)面试题一:进程间的通信方式(VIVO、阿里巴巴面试题)面试题二:进程通信方式有哪些,问我分别怎么使用,管道有哪些类型,各有什么优缺点。(百度面试题)一、进程...
  • 进程间通信的方式及比较  进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户控件是互相独立的,一般而言是不能互相访问的,唯一区别的是共享内存区。...
  • 进程间通信的方式——信号、管道、消息队列、共享内存 常见的通信方式: 1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系...
  • Java面试题:进程间通信的方式有哪些?线程间通讯方式有哪些? 一、进程间的通信方式 管道( pipe ): 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指...
  • 之前一直对进程间和线程间的通信方式都是比较模糊概念,平时开发也很少接触到,今天面试遇到面试官问了,回答不是很好,今天对它们总结一下。 一、进程间的通信方式: 1、管道( pipe ):管道是一种半双工...
  • 面试题:进程间通信的方式

    万次阅读 多人点赞 2018-09-04 15:05:50
    liunx六大进程间通信方式  管道,消息队列,共享内存,信号量,socket,信号,文件锁 1,管道  1,匿名管道:  概念:在内核中申请一块固定大小缓冲区,程序拥有写入和读取权利,一般使用fork函数实现父子...
  • Windows的进程间通信的方式

    千次阅读 2009-12-25 23:46:00
    Windows的进程间通信的方式:1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。 ...
  • linux下进程间通信的几种主要手段简介: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系...
  • 进程间通信的方式——信号、管道、消息队列、共享内存 多进程: 首先,先来讲一下fork之后,发生了什么事情。 由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是...
  • 进程间通信的目的如下: ①数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 ②共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的...
  • 【资料】linux进程间通信的方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 # 有名管道 (named ...
  • 一种网络进程间通信的方式—— 管道 摘要: 文章主要介绍了计算机网络进程间通信的必要性以及进程间通信所采用的几种方式,重点说明了管道通信的原理及命名管道的实现方法。 关键词:管道 命名管道 进程   一、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,829
精华内容 5,131
关键字:

进程间通信的方式