Posix和system v区别

所谓的IPC(进程间通信)指的是消息队列,共享内存,信号量3种机制合并起来,当然,这是个狭义的概念,只包含这三种。IPC又可以分为system v进程间通信和posix进程间通信。

下图说明了各种概念之间的关系。

IPC机制的作用范围是在整个系统,而不是仅限于进程,也就是说,一旦IPC对象被创建,除非显示的删除或者系统重启,否则对象一直存在,其中数据也保持不变。而进程打开的文件会在进程退出后自动关闭。

消息传递

管道

从本质上看,管道也是一种文件,只不过这种文件比较特殊。其有以下几种特点:

1)管道的数据流是单向的,只能由写入端向读出端

2)管道中的数据先进先出。

3)管道有大小限制,linux下,大小为4096字节。

1.普通管道:位于内存,只能由有亲缘关系的进程间通信

2.命名管道:位于文件系统中,可以实现不同进程间的通信。

消息队列

队列是一个受限的线性表,需要按照先进先出的方式进行。

消息就是进程间传递数据的内容。在消息队列机制中,消息是有类型的,对于一个同一个消息队列来说,可以存储不同类型的消息,而进程可以根据自己的需要从消息队列中取出自己感兴趣的消息。

消息的类型有一个结构模板,模板的名称是struct msgbuf,其定义位于<sys/msg.h>,结构定义如下所示。

Struct msgbuf
 {

Long int mytype;

Char mtext[1];

}

消息队列有以下特征:

1.消息队列中的消息是有类型的,再发送一条信息的时候,可以指定消息类型。在接受进程中,可以按照该消息类型从消息队列中获取数据。在实际应用中,可以多个应用共用一个队列,用消息类型区分不同的应用。

2.消息队列中的消息按照发送的顺序排队,对于相同类型的消息,先进入消息队列的消息先被接受。

限制:系统中最多允许16个消息队列。每条消息的最大字节数为8192,每个队列最多可容纳字节数是16384。

使用流程:

1.使用ftok获得一个键值。

2.根据键值申请消息队列,如果消息队列以经存在,则再次以第二个参数为零申请。

3.可以发送信息了,信息的类型是void

4.别忘了删除啊~~~~

消息队列的数据流的过程为:将数据复制到内核分配的缓冲区,接受进程再从内核的缓冲区复制到进程的虚拟地址空间。

共享内存

共享内存视同过将内核的缓冲区映射到进程的地址空间实现的,没有数据复制的过程,所以速度比消息队列要快。成功映射后读写共享内存就像读写进程变量一样高速。

使用一块共享内存的步骤:

1.申请键值

2.申请共享内存

3.映射共享内存

4.可以读写了

5.别忘了删除

同步

信号量

信号量为什么也要算到进程间通信呢,因为它可以配合共享内存使用,实现多个进程之间共享资源的保护。包括文件的共享也可以用信号量。

P和v是原语,任何中断都不能中断原语的执行过程。

信号量不一定只支持两个县城,只支持两个线程叫互斥信号量。

互斥锁和条件变量

感觉互斥锁

互斥锁指代相互排斥,他是最基本的同步形式。互斥锁用来保护临界区。如果有多个线程被阻塞在等待同一个互斥锁上,那么解锁之后各种锁和信号量将唤醒优先级最高的函数。

条件变量是用来等待。

问题:现在的问题是互斥锁已经可以用来等待了,为什么还需要条件变量呢?

答:因为条件变量可以用来达到一种等待的优化

首先,用来发送信号让等待的线程取消等待的不一定是上锁的线程,在这点上它和信号量有区别。

其次,即使没人上锁,线程也不一定能获得这个锁。

比如写的那个文件传输系统,并不是没人上锁就可以获得这个锁了,没人上锁且线程池中没任务仍然要等待。而发送信号取消等待的线程是添加任务的线程,它并没有上锁。所以互斥锁和条件变量在一起的时候上锁和发送信号解锁的操作不一定同时出现。

问题:信号量和互斥锁的区别。

答:

1.信号量是进程或线程间,而互斥锁一般用在线程间。

2.互斥锁非0即1,和互斥信号量类似。

3.信号量是IPC概念,作用域为整个系统,而互斥锁则在进程之内。

4.信号量是互斥,互斥锁是同步。同步包含了互斥的功能,但作用更大。

自旋锁

自旋锁不会引起调用者的睡眠,如果一个线程试图获得一个已经被持有的自旋锁,那么该线程就会一直忙着循环,一直等待下去,在那里看看是否该自旋锁的保持锁已经释放了锁。

自旋锁也是0-1.

适用于保持时间比较短,如果自旋锁的占用时间不会超过两次上下文切换,就应该使自旋锁(在多cpu领域)。而且信号量的初始化时间较长。

读写锁

读写锁实际上是一种特殊的自旋锁。

他把对资源的访问者分为了读者和写者,使用规则如下:

1.只要没有使用者把持有的锁用于写,那么任意数目的用户都可以持有该锁用于读。

2.仅仅当没有线程持有某个给定的读写锁用于读或者用于写,才能分配该锁用于写。

其他

信号

linux IPC简单学习的更多相关文章

  1. WSL Windows subsytem linux 的简单学习与使用

    1. win10 1709 以上的版本应该都增加上了 ctrl +r 运行 winver 查看版本 2. 添加删除程序 增加 wsl 增加一个功能 3. 打开cmd 输入 bash 即可 4. 可以将 ...

  2. Linux——软件包简单学习笔记

    Linux中的是那种软件包:  (这里学习是基于redHat的Cent-OS) 1: 二进制软件包管理(RPM.YUM) 2:源代码包安装 3: 脚本安装(Shell或Java脚本) 一: 二进制软件 ...

  3. linux IPC机制学习博客

    要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 - 共享内存 - 管道 - FIFO - 信号 - 消息队列 研究博客 管道(PIPE) 管道(PIPE): ...

  4. linux patch 简单学习

    使用patch 我们可以方便的进行软件补丁包处理,以下演示一个简单的c 项目补丁处理 原代码 app.c #include <stdio.h> int main(){ printf(&qu ...

  5. Linux 基本命令简单学习

    平常工作中需要使用到的一些Linux基本命令,简单记录: 通过订单号查看日志:   cat /---/---/xxxx20190908.log | grep C52918588112261 -C 5 ...

  6. Linux——shell简单学习(二)

    流控制语句: for…done语句 格式:for  变量   in   名字表 do  命令列表 done 例子: #!/bin/sh for DAY in Sunday Monday Tuesday ...

  7. Linux——GRUB简单学习笔记

    GRUB的配置文件默认为  :/boot/grub/grub.conf # ls -l /etc/grub.conf GRUB配置选项: default定义缺省启动系统 timeout定义缺省等待时间 ...

  8. Linux——shell简单学习(一)

    首先来一个小程序,来查看所在目录,以及该目录下的文件 #!/bin/sh # “#!”指定用sh执行shell脚本 #this is to show workstation # “#” 表示注释 ec ...

  9. Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道

    Linux 系统编程 学习:02-进程间通信1:Unix IPC(1)管道 背景 上一讲我们介绍了创建子进程的方式.我们都知道,创建子进程是为了与父进程协作(或者是为了执行新的程序,参考 Linux ...

随机推荐

  1. 报错:The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.

    报错背景: CDH中集成hive插件,启动报错. 报错现象: [main]: Metastore Thrift Server threw an exception... javax.jdo.JDOFa ...

  2. Python - Django - ORM 自定义 char 类型字段

    用 CharField 定义的字段在数据库中存放为 verchar 类型 自定义 char 类型字段需要下面的代码: class FixedCharField(models.Field): " ...

  3. Slf4j与log4j及log4j2、logbak的关系及使用方法

    Slf4j与log4j及log4j2的关系及使用方法 slf4j slf4j仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,就比如JDBC一样,只是一种规则而已,所以单独 ...

  4. POJ Corn Fields 状态压缩DP基础题

    题目链接:http://poj.org/problem?id=3254 题目大意(名称什么的可能不一样,不过表达的意思还是一样的): 种玉米 王小二从小学一年级到现在每次考试都是班级倒数第一名,他的爸 ...

  5. LODOP判断没成功发送任务-重打一下

    一般情况下打印执行了PRINT()或PRINTA(),就会加入打印机队列,如果打印机脱机,就会在队列里排队,当打印机连上并取消脱机的时候,正在排队的任务就会打出,所以一般建议用是否加入队列来判断打印成 ...

  6. Docker之使用Docker-compose搭建LNMP环境

    之前有随笔介绍使用Docker-compose搭建LNMP环境(centos6 php5.6) https://www.cnblogs.com/minseo/p/10146982.html 本文介绍D ...

  7. Python3 IO编程之StringIO和BytesIO

    StringIO 很多时候,数据读写不一定是文件,也可以在内存中读写. 要把str写入StringIO,我们需要先创建一个StringIO,然后像文件一样写入即可 >>> from ...

  8. JIRA+JIRA Agile敏捷项目管理工具

    jira插件下载地址 http://www.confluence.cn/pages/viewpage.action?pageId=1671327 下载GreenHopper插件 安装Jira-agil ...

  9. Redis 缓存问题及解决方案

    [相关概念] 缓存击穿:指的是一些热点数据过期,由于热点数据存在并发量大的特性,所以短时间内对数据库的造成很大的冲击,导致系统瘫痪.常见于例如微博系统中明星结婚或出轨时微博瘫痪的情况. 缓存雪崩:指的 ...

  10. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...