文章目录前言原理初探共享内存的创建过程系列 API 的使用ftokshmgetshmatshmdtshmctl共享内存实例 前言 总结一下最近对于共享内存的学习, 可能比较浅显或者有疏漏, 欢迎指正! 原理初探 我们知道, 进程空间相互隔离, 互相对立, 但是共享内存允许多个进程可以访问同一块内存来达到进程间通信的目的. 共享内存是最高效的 IPC 机制, 它不涉及任何进程间的数据传输, 而且他和进程同处于用户空间, 不像消息队列, 信号量是内核空间的系统对象, 不需要花费额外的数据拷贝, 但是同时他并没有预防竞态条件, 也就是说在多进程利用共享内存进行通信的情况下, 我们需要自己去利用锁等操作来进行同步 共享内存的创建过程 当我们创建了一块共享内存, 其实是在 tmpfs 中创建了一个文件 (这个文件是存储于内存的), 也就意味着在 tmpfs 中创建了一个 iNode 节点 然后我们需要将这个创建好的文件映射到进程中 (如下图, 此图来自网络, 应该是哪个博客或者知乎吧…已经记不清了) 我们创 继续阅读 >>


吕子健 18/11/08 23:11:47
从6月开始,陆续关注了极客时间的几个专栏,这个知识付费平台给我的感觉是质量还蛮高的,里面的授课讲师也都是业内大牛。我自己购买学习了下面三门课程,分别是《数据结构与算法之美》、《从0开始学架构》、《Nginx核心知识100讲》,我觉着对一名Linux C/C++后台开发新手或者刚入门的同学来说,这三门课程还是很值的推荐的,干货满满,关于详细介绍和具体内容,大家可以扫下面二维码,自己去了解一下。 推荐一下陶辉大神的博客:陶辉的博客 一起成长! 作者:Tanswer_ 发表于 2018/11/07 21:57:38 原文链接 https://blog.csdn.net/Tanswer_/article/details/83832744 阅读:55 继续阅读 >>


杜肖孟 18/11/07 21:57:38
1.数据复制概述 1.1数据复制定义 数据复制使一个服务上的数据与另一个服务上数据保持同步 1.2复制用途 数据分布 负载均衡 备份 高可用和故障切换 MySQL升级测试 2.数据复制工作原理 2.1复制工作流程介绍(以主从架构为例) MySQL复制原理比较简单,其核心工作示意图如下: 主库把更新操作记录在二进制日志文件中 备库上的I/O线程收到主库的更新事件后,读取新增的二进制日志并写入自己的中继日志中 备库读取中继日志,将事件在数据库上重放,更新自身数据库数据 2.2对主从复制架构的思考 看完图2.1中MySQL主从架构,读者会不会感觉如果去掉中继日志,整个复制流程会更简单?中继日志究竟在复制架构中产生了什么作用? 如果备库去掉写中继日志这个流程,那么备库每次只需要读取binlog事件数据,紧接着直接重放sql事件即可。而增加了中继日志,不仅增加了流程的复杂性,而且多了一次写文件I/O的操作消耗了系统性能 其实中继日志对备机而言就是缓存事件的buffer而已,其作用就是对备机的俩个核心 继续阅读 >>


苗帅 18/11/07 17:35:27
最近在开发的过程中有一个点让我比较感兴趣,就是使用Lambda表达式的方式来实现Comparator接口。 1. 关于Comparator和Comparable 既然提到了Comparator,那就大致来说一下Comparator和Comparable接口的区别。 Comparator是一种策略模式,即被比较的对象自身不需要做任何改变(实现任何排序接口),而是通过实例化一个Comparator策略来实现对象之间的排序。 Comparable支持对象自身进行改变(对象自身实现Comparable接口),从而具有排序功能。 举个例子来说,一组对象需要用Collection的sort方法进行排序,有两种方法,要么是对象实现Comparable接口,自身具有可排序属性;要么是实现一个Comparator比较器,在调用sort方法是传入。 下面再来说一说Lambda表达式。 2. Lambda表达式 我们都知道,Lambda表达式是Java里面的函数式编程,那么在使用Lambda表达式首先要满足这样一个条件:首 继续阅读 >>


祝一迪 18/11/06 21:33:23
最简单的二分 1.循环实现 template <typename T> int binary_search(const vector<T> &set, const T &value) { auto low = set.begin(); auto high = set.end(); auto high_dump = high; auto low_dump = low; auto mid = low + ((high - low) >> 1); /*1. mid=(low+high)/2,如果 low 和 high 太大就会产生溢出*/ while ((low <= high) && (mid != high_dump)) /*2. 一定是 <= */ { if (*mid == value) return mid - low_dump; /*3. 一定要+1,-1,不然当  继续阅读 >>


刘生玺 18/11/04 22:52:10
前言 好久没写博客,我一直都觉得写博客说明最近很在学习状态阿。也说明确实很久都没在状态了。 终于穿上了秋裤,冬天和暖气都小跑着赶来了,我的大学时光也所剩无多,我在这里随便记下两三言,愿之后依然能想起此刻的心情。 秋招 8月中从深圳回到学校,一边等转正的结果,一边投了几家别的,开学之后,因为小组地方都没了,在东区三楼咖啡店答了N场笔试。 本来打算中秋回家了,因为9月中已经收到了转正意向书,并且被两个B司虐的不要不要的,然而美好的双假(中秋加国庆)被墨迹的体侧拖累了。再回家已经是中秋之后了。 从回家的路上开始补Produce101,心情是真的很放松呢,毕竟7个月没回家了。然而到家的第一顿饭还没吃上,广州的猪场便打来电话要求去面试,一番和HR的墨迹,最终约在了国庆之后的工作日。 放假在家的我彻底转换为咸鱼状态,101,电影,吃,买衣服,串门,这中间熊厂又给了面试机会,北京的现场面,时间安排在了10月中旬。那时心里已经有点感觉了,我的10月注定没有那么轻松。 国庆之后便是 家–>学校–>广州–> 继续阅读 >>


康艺杰 18/11/04 18:10:14
共享内存 共享内存简介 共享内存是所有进程间通信(IPC)手段中速度最快的,不同进程间使用事实上的同一内存区域,这样使得进程间使用信息时免去“复制”这一流程,减少开销。 以下面“进程A从文件f中读取数据,进行加工之后,将数据传递给进程B”这种场景为例,若使用其他的IPC形式,我们至少需要以下步骤: 1. 从文件f中复制数据到进程A的内存中; 2. 加工数据; 3. 将加工好的数据通过系统调用拷贝到内核空间中; 4. 进程B得知有数据发来,从内核空间将加工好的数据拷贝到进程B的内存中; 5. 进程B使用数据 而我们若使用共享内存,则至少需要以下三个步骤: 1. 从文件f中复制数据到共享内存区域中; 2. 加工数据; 3. 进程B使用数据 显然的,在使用共享内存时,我们减少了一些无意义的数据复制。 不过,在这之中还有一些隐藏在其中影响效率的其他细节——系统调用的数量。在我们使用其他的IPC形式时,读取、写入时将不可避免的使用系统调用,当进行大量的数据吞吐时,频繁的系统调用就会严重地拖累性能。而当我们使用 继续阅读 >>


娄泽豪 18/10/31 22:56:59
在使用IDEA开发比较大的Spring web项目的时候,常常会在pom文件中导入大量依赖,所以就有可能造成Maven的依赖冲突。下面来看一下如何解决Maven的依赖冲突。 1. 先清当前的jar包的缓存: IDEA的 File选项 -> invalidate caches/restart 2. 打印Maven的依赖树: mvn dependency:tree (建议将内容重定向到一个file里,方便查看,如:mvn dependency:tree > file.txt) Maven的依赖树的样式如下,图中圈出了一个包与其下所有子包的层级关系: 3. 定位产生依赖冲突的子包: 比如新加了xxx包之后,产生了依赖冲突,那么在file.txt依次全文搜索xxx包下依赖的所有子包,看看是否由别的包也依赖此子包。 如果在别的包(比如yyy包和zzz包)下面也发现有该子包,那么说明需要在xxx包、yyy包、zzz包其中两个包下排除这个子包的依赖,只保留一个包下的该子包的依赖。 那么,具体应该保留哪个 继续阅读 >>


祝一迪 18/10/25 20:51:53
哈希表的实现 何为哈希表 简单来说,哈希表是一种存储结构,它存储的数据是 key:value 类型的。通过空间换时间的方法来加快查询速度,具体思想是如下: 使用一个较大的一维数组存储value,这个数组为Array 实现一个哈希函数,使得hash(key)的值在上一步的一维数组下标范围内 如此,对于任意的key:value,使用hash(key),之后就可以知道value在数组中存储的下标,存取速度快过线性查找Array[hash(key)] 哈希表的注意要点 哈希函数的选取 由于我们期望,两个不同的key,hash(key)之后的结果尽量不相同,这样才能使得哈希表存储空间的利用率提高,另一点,哈希表的空间换时间的主要原因就是他使用了哈希函数来确定value在数组中的下标而非普通的线性查找。那么,基于以上两点,哈希函数的选取就有以下条件: hash函数运行速度不能过慢 对于不同的key(即便两个key只是字母顺序不一致),哈希函数须尽量保证hash(key)的值不一致 处理哈希碰撞 由于是无论k 继续阅读 >>


李余通 18/10/09 20:17:14
根据我上一片博客的介绍–c++函数模板初探 我们可以用模板实现很多函数,也对c++函数模板有了初步的了解。 但是加入有下面这个情况: template <class T1, class T2> void ft (T1 &x, T2 &y) { ... ?type? xpy = x+; ... } 在这种情况下xpy应该是什么类型呢?由于不知道ft()将如何使用,因此无法预知这一点。正确的类型可能是T1、T2或者其他类型。假如又出现了重载运算符,这会让问题更加的复杂。 于是为了解决这个问题,c++11新增了关键字 decltype。 我们可以这样使用: int x; decltype(x) y;//y的类型和x类型一致 除了上述这样写,我们也可以这样写: decltype(x+y) xpy; xpy = x+y; 通过这个关键字,我们可以把前面的代码修改成这样: template <class T1, class T2> void ft(T1 x, T 继续阅读 >>


陈苏扬 18/10/04 07:40:50