当前位置: 首页 > news >正文

Linux下多任务间通信和同步-概述

Linux下多任务间通信和同步-概述

嵌入式开发交流群280352802,欢迎加入!

在前面,我们学习了两种多任务的实现手段:进程和线程.由于进程是工作在独立的内存空间中,不同的进程间不能直接访问到对方的内存空间,因而需要某种方式来通信.而同一进程内的线程共享内存空间,很容易实现数据共享,但需要严格控制多线程对同一内存地址的访问,因而需要采用某种方式来同步.

在linux中有一些多任务通信和同步的方式,有的方式既能实现通信又能实现同步,有的方式不但进程能用线程也能用,因此我们将这些东西放在一起来讲解,这些方式主要有:

(1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信.
(2)信号(Signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的.linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数).
(3)消息队列(Messge Queue):消息队列是消息的链接表,包括Posix消息队列SystemV消息队列.它克服了前两种通信方式中信息量有限的缺点,具有写权限的进程可以按照一定的规则向消息队列中添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息.消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点.
(4)共享内存(Shared memory):可以说这是最有效的进程间通信方式,是针对其他通信机制运行效率较低而设计的.它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新.这种通信方式需要依靠某种同步机制,如互斥锁和信号量等.

(5)套接字(Socket):这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛.起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字.
(6)信号量(Semaphore):主要作为进程之间以及同一进程的不同线程之间的同步和互斥手段.

(7)互斥锁(Mutex):互斥锁主要用于线程同步,它可以对共享资源加锁,任何其他试图在此对互斥量加锁的线程将会阻塞直至当前线程释放该互斥锁,保证每次只有一个线程可以对共享资源访问.

在以上7中方式中,前5种主要用于多任务通信,后两种主要用于多任务间同步.

相关文章:

  • 一初探js特效魅力之全选不选反选04
  • 360全线产品从小米应用商店下架
  • 阿里IPO弃港赴美?
  • 浅析数据库设计三范式
  • linux enable命令学习
  • Linux操作系统以及各大发行版介绍——Linux operating system and major distribution is introduced...
  • 一初探js特效魅力之选项卡05
  • 一初探js特效魅力之数组06
  • 大根堆排序
  • 初探js特效魅力之定时器的使用one
  • 初探js特效魅力之延时提示框07
  • 网络编程之TCP异步群聊:服务器端代码
  • 网络编程之TCP异步群聊:客户端代码
  • 关于多线程中回调函数的一个小例子
  • 关于多线程中代理的一个小例子
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • export和import的用法总结
  • extjs4学习之配置
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • mysql_config not found
  • PHP 7 修改了什么呢 -- 2
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • ViewService——一种保证客户端与服务端同步的方法
  • Zsh 开发指南(第十四篇 文件读写)
  • 大型网站性能监测、分析与优化常见问题QA
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 深度学习在携程攻略社区的应用
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (编译到47%失败)to be deleted
  • (第二周)效能测试
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (黑马C++)L06 重载与继承
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (篇九)MySQL常用内置函数
  • (五)MySQL的备份及恢复
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)h264中avc和flv数据的解析
  • (转)Scala的“=”符号简介
  • (转)scrum常见工具列表
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .Net - 类的介绍
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 简单实现MD5
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET下ASPX编程的几个小问题
  • .NET中的十进制浮点类型,徐汇区网站设计
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • []T 还是 []*T, 这是一个问题
  • [145] 二叉树的后序遍历 js
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [Android]一个简单使用Handler做Timer的例子
  • [bbk5179]第66集 第7章 - 数据库的维护 03