linux系统线程通信的几种方式,Linux的进程/线程通信方式总结

linux系统线程通信的几种方式,Linux的进程/线程通信方式总结Linux系统中的进程通信方式主要以下几种:同一主机上的进程通信方式*UNIX进程间通信方式:包括管道(PIPE),有名管道(FIFO),和信号(Signal)*SystemV进程通信方式:包括信号量(Semaphore),消息队列(MessageQueue),和共享内存(SharedMemory)网络主机间的进程通信方式*RPC:RemoteProcedureCall…

大家好,又见面了,我是你们的朋友全栈君。

Linux系统中的进程通信方式主要以下几种:

同一主机上的进程通信方式

* UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal)

* System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue),

和共享内存(Shared Memory)

网络主机间的进程通信方式

* RPC: Remote Procedure Call 远程过程调用

* Socket: 当前最流行的网络通信方式, 基于TCP/IP协议的通信方式.

各自的特点:

管道:它传递数据是单向性的,只能从一方流向另一方,也就是一种半双工的通信方式;只用于有亲缘关系的进程间的通信,亲缘关系也就是父子进程或兄弟进程;没有名字并且大小受限,传输的是无格式的流,所以两进程通信时必须约定好数据通信的格式。管道它就像一个特殊的文件,但这个文件之存在于内存中,在创建管道时,系统为管道分配了一个页面作为数据缓冲区,进程对这个数据缓冲区进行读写,以此来完成通信。其中一个进程只能读一个只能写,所以叫半双工通信,为什么一个只能读一个只能写呢?因为写进程是在缓冲区的末尾写入,读进程是在缓冲区的头部读取,他们各自

的数据结构不同,所以功能不同。

有名管道:看见这个名字就能知道个大概了,它于管道的不同的是它有名字了。这就不同与管道只能在具有亲缘关系的进程间通信了。它提供了一个路径名与之关联,有了自己的传输格式。有名管道和管道的不同之处还有一点是,有名管道是个设备文件,存储在文件系统中,没有亲缘关系的进程也可以访问,但是它要按照先进先出的原则读取数据。同样也是单双工的。

消息队列:是存放在内核中的消息链表,每个消息队列由消息队列标识符标识,于管道不同的是,消息队列存放在内核中,只有在内核重启时才能删除一个消息队列,内核重启也就是系统重启,同样消息队列的大小也是受限制的。

信号量:也可以说是一个计数器,常用来处理进程或线程同步的问题,特别是对临界资源的访问同步问题。临界资源:为某一时刻只能由一个进程或线程操作的资源,当信号量的值大于或等于0时,表示可以供并发进程访问的临界资源数,当小于0时,表示正在等待使用临界资源的进程数。更重要的是,信号量的值仅能由PV操作来改变。

共享内存:就是分配一块能被其他进程访问的内存。共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。首先说下在使用共享内存区前,必须通过系统函数将其附加到进程的地址空间或说为映射到进程空间。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到

进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互

斥锁和信号量都可以。采用共享内存通信的一个显而易

见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而

共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就

解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存

中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

信号:信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基本通知功能外,还可以传递附加信息。信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源。信号分为可靠信号和不可靠信号,实时信号和非实时信号。进程有三种方式响应信号1.忽略信号2.捕捉信号3.执行缺省操作。

套接字:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机间的进程通信。这一块在网络编程那一块讲的

很多,在此就不在说拉。

Linux系统中的线程通信方式主要以下几种:

* 锁机制:包括互斥锁、条件变量、读写锁

互斥锁提供了以排他方式防止数据结构被并发修改的方法。

使用条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

读写锁允许多个线程同时读共享数据,而对写操作是互斥的。

* 信号量机制(Semaphore):包括无名线程信号量和命名线程信号量

* 信号机制(Signal):类似进程间的信号处理

线程间的通信目的主要是用于线程同步。所以线程没有像进程通信中的用于数据交换的通信机制。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151232.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • plsql 注册码「建议收藏」

    plsql 注册码「建议收藏」plsql下载地址https://www.allroundautomations.com/bodyplsqldevreg.html12.0.3.182164bit:注册码:ProductCode(产品编号):jtrexa75fat2mgcetfhx767laqrbtssqrkserialNumber(序列号):335566password:xs374ca12.0…

    2022年7月13日
    102
  • IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结

    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结IntelliJIDEA使用教程(总目录篇)首先,使用的时候,自己得先在电脑上安装个小乌龟。也就是svn啦。第一步安装小乌龟。如下:具体安装好像没什么具体要求,一路next,就好。如上图箭头所示,在安装TortoiseSVN的时候,默认commandlineclienttools,是不安装的,这里建议勾选上。这个我不确定我当时选没选,不过呢,你给安装…

    2022年5月15日
    92
  • 心脏出血漏洞小学习

    心脏出血漏洞小学习浅谈心脏出血漏洞心脏出血漏洞简述关于心脏出血漏洞环境的搭建漏洞poc原有漏洞展示修复后代码文章引用与特别鸣谢心脏出血漏洞简述引用百度百科的解释,心脏出血漏洞是一个出现在加密程序库OpenSSL的安全漏洞,该程序库广泛用于实现互联网的传输层安全(TLS)协议。它于2012年被引入了软件中,2014年4月首次向公众披露。只要使用的是存在缺陷的OpenSSL实例,无论是服务器还是客户端,都可能因此而…

    2022年7月17日
    16
  • .gitkeep常用写法

    .gitkeep常用写法

    2021年10月20日
    52
  • 操作系统中的同步和异步

    操作系统中的同步和异步操作系统中同步、异步性概念首先我们从操作系统的发展中学习什么是异步性。在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理。什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台计算机就为这一个作业服务(可想有多少资源被”浪费”),这样有一点好处就是整个程序是”封闭的”。这样的操作表明人和机器是没有交互的。那我们怎么实现人机交互呢?这个答案是中断。中断的引入,使得工作人员能…

    2022年10月28日
    0
  • 日期函数months_between的用法[通俗易懂]

    日期函数months_between的用法[通俗易懂]MONTHS_BETWEEN(date1,date2)用于计算date1和date2之间有几个月。如果date1在日历中比date2晚,那么MONTHS_BETWEEN()就返回一个正数。如果date1在日历中比date2早,那么MONTHS_BETWEEN()就返回一个负数。如果date1和date2日期一样,那么MONTHS_BET…

    2022年7月12日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号