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. 将PCM格式存储成WAV格式文件

    将PCM格式存储成WAV格式文件 WAV比PCM多44个字节(在文件头位置多) 摘自:https://blog.csdn.net/u012173922/article/details/78849076 ...

  2. 为什么在MySQL数据库中无法创建外键?(MyISAM和InnoDB详解)

    问题描述:为什么在MySQL数据库中不能创建外键,尝试了很多次,既没有报错,也没有显示创建成功,真实奇了怪,这是为什么呢? 问题解决:通过查找资料,每次在MySQL数据库中创建表时默认的情况是这样的: ...

  3. websehll的使用和预防措施

    (1).webshell概念 webshell就是以asp.php.jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门.黑客在入侵了一个网站后,通常会将asp或php后 ...

  4. Python第一阶段04

    1.文件操作: # 指明编码 f = open("sisi", encoding="utf-8") # 读 data = f.read() print(data ...

  5. css代码陷阱

    1.选择器优先级 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. poj1228(稳定凸包+特判最后一条边)

    题目链接:https://vjudge.net/problem/POJ-1228 题意:我是真的没看懂题意QAQ...搜了才知道.题目给了n个点,问这n个点确定的凸包是否能通过添加点来变成一个新的凸包 ...

  7. Deepin中安装docker

    1.sudo apt install docker-ce: 2.安装好后可以用docker version查看一下是否成功,还可以通过网络详情里是否多了一个docker0来判断: 3.sudo use ...

  8. LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)

    199. 二叉树的右视图 199. Binary Tree Right Side View 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. Giv ...

  9. 【转帖】2019年中国5G行业细分市场发展现状和市场前景分析 通信基站数量快速增长

    2019年中国5G行业细分市场发展现状和市场前景分析 通信基站数量快速增长 中国有 600多万个基站 平均每200个人 一个基站.. 一个基站十万块钱的话 相当于 每个人 需要分摊 500块钱. ht ...

  10. todo---git 生成密钥 原理分析

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRJkDZ2z7syFC2QDCaORKF41ecwbL/kyFwkycOVE3MavTRBliAhoAhOaZQTr4j ...