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. osg创建灯光

    添加光照 osg::ref_ptr<osg::Node> MyOSGLoadEarth::CreateNode() { osg::ref_ptr<osg::Group> _ro ...

  2. Spring中好玩的注解和接口

    测试中: 一.unit中集中基本注解,是必须掌握的. @BeforeClass – 表示在类中的任意public static void方法执行之前执行 @AfterClass – 表示在类中的任意p ...

  3. F5负载均衡 MIBs bigip oid

    F5 MIBs       分组bigip-ltmpool-stat           oid=".1.3.6.1.4.1.3375.2.2.5.2.3.1.1" name=&q ...

  4. Python - Django - ORM 一对一表结构

    当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,可以把不怎么常用的字段 单独拿出来做成一张表,然后用一对一的表关联起来 这样既保证数据都完整的保存下来,又能保证检索更快 model ...

  5. webpack 安装vue(两种代码模式compiler 和runtime)

    使用webpack安装vue,import之后,运营项目报错,如下: [Vue warn]: You are using the runtime-only build of Vue where the ...

  6. Kubernetes环境部署

    简介 Kubernetes 是一个开源系统,用于容器化应用的自动部署.扩缩和管理.它将构成应用的容器按逻辑单位进行分组以便于管理和发现.   配置镜像源 Debian / Ubuntu apt-get ...

  7. 基于libuv的TCP设计(一)

    本人一直在寻找一个跨平台的网络库,boost与ACE比较庞大,不考虑.对比了libevent,libev,libuv后,最终选择了libuv.可libuv文档少,例子也简单,对于tcp只有个echo- ...

  8. linux 下修改时间

    修改linux的时间可以使用date指令 date命令的功能是显示和设置系统日期和时间. 输入date 查看目前系统时间. 修改时间需要 date -功能字符 修改内容 命令中各选项的含义分别为: - ...

  9. nightwatch对前端做自动化测试

    记录node环境使用nightwatch.selenium-server.chromedriver对部署后的前端页面进行自动化测试的项目搭建过程. 1.目标 能对部署后的前端项目进行自动化测试,能自动 ...

  10. 使用qt creator来编译 调试 用CMakeLists组织的工程

                                                   爱情原如树叶一样,在人忽视里绿了,在忍耐里露出蓓蕾. -- 何其芳 使用CMake作为构建系统,需要自己写 ...