进程间的通信方式, 从小至大的方式

这里有我了解的一些进程间通信的方式

1 . 管道
  • 匿名管道

    • 这种通信方式是单向的, 只能把第一个管道输出传递给目标管道

    • 匿名管道虽然实现类进程间的通信, 但是单单方向的通信肯定是无法满足我们对进程间通信的需求的, 那么你可以使用 命名管道来进行进程间的相互通信

      netstat -tulnp | grep 8027
      
  • 命名管道

    • 如上所述, 命名管道可以实现进程间双向通信
    • 命名管道可以实现进程间双向通信
    mkfifo test   // 创建命名管道
    echo "this is a nnew pipe" > test // 写数据
    cat < test    // 读数据
    
    • 以上命令可以实现了一个进程写入数据, 然后另一个进程读取数据, 从而实现进程间通信, 当然也可以这个进程写入数据, 然后等待另一个进程来读取数据, 从而实现了进程间的双向通信
    • 管道的通知机制和缓存的运行机制十分相似, 就如一个进程将数据放入管道区域, 然后等另一个进程读取, 当然管道也是 单向传输 ,我们通过它们的名字可以实现双向数据传输
    • 明白了这么多, 那么它的缺点也就很明显了, 没错, 就是效率十分低下 , 只有当进程放入管道的数据被读取后才能返回, 只要进程间通信量一多, 那么不崩溃都是神奇的, 那么又该怎么做呢, 这时候就可以将目光转向 消息对列
2 . 消息对列
  • 如何解决命名管道效率低下的问题呢, 消息队列是如何运行的呢?
  • 消息队列的通信模式就是用来解决这个问题的, 如果 进程1 要给 进程2 发送消息, 只需要把消息放在对应的消息对伦理中就可以了, 进程2 需要的时候再去对应的消息对列里面将数据取出
  • 这样就解决了一定程度上的进程间通信数据量的问题, 那么你就想问, 消息对立是否有无缺点, 缺点又是咋样的呢 ?
    • 当然没有完美无缺的技术
    • 你可以想象一下, 如果 进程1 发送的数据占用的内存比较大, 并且这两个进程间通信比较频繁的话, 消息队列模型就有心无力了, 因为 进程1 发送的数据很大, 意味着 发送消息(拷贝)该过程需要花费很多的时间
    • 那么你肯定又想知道该如何解决这个问题了, 别急, 往下看
3 . 共享内存
  • 共享内存 这个通信方式就可以很好解决拷贝所消耗的时间了
  • 我们都知道, 系统加载一个进程的时候, 分配给进程的内存并不是实际物理内存, 而是 虚拟内存空间 . 那么就可以让两个进程各自拿出一块虚拟地址空间来, 然后映射到相同的物理内存中, 这样, 两个进程虽然有独立的虚拟内存空间, 但是一部分却是映射到相同的物理内存, 这样就完成了 内存共享 机制
  • 共享内存又有什么问题呢
    • 当你一块物理内存空间能够被多个进程读取的时候, 问题就来了, 那就是多线程竞争的问题, 那么如何解决呢?
4 . 信号量
  • 信号量的本质就是一个计数器, 用来实现进程之间的互斥和同步, 例如信号量的初始值是 1 , 然后进程 1 进来访问 内存1 的时候, 五年就把信号量设置为 0, 然后 进程2 也来访问 内存1 的时候, 看到信息量为 0 的时候, 就知道该线程已经被占用, 就无法访问 内存1, 所以, 信号量也是进程间的一种通信方式
5 . Socket
  • 上面说的都是一台机器内部的进程通信, 那么网络上进程如何通信呢?
  • Socket , 通过浏览器发起一个 http 请求, 然后服务器给你返回对应的数据, 这种就是采用 Socket 的通信方式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

§九千七§

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值