内存映射

反向映射和写时复制

房东的猫 提交于 2020-01-16 15:44:54
4.0的内核后,反向映射以vma为单位,且avc不在链入父辈进程 那么,在子进程发生写时复制,重新分配内存页后,为什么不将其从父进程的vma的avc中删除此子进程呢? wowotech上有个回答很不错, 如下: http://www.wowotech.net/memory_management/reverse_mapping.html ======================================================== anon rmap确实存在这个问题,比如进程A fork了进程B,进程B,fork了进程C..如果一个pageA属于进程A且映射到相应的vma,那么在对这个page进行逆向映射时,确实会扫描到3个vma。如果进程C触发写保护异常,分配了一个新页pageC,那么在做pageA的逆向映射时,仍然会扫描到3个vma。我猜测linux这么实现的原因可能是:一个vma可能映射对个page,即使子进程对一个页面触发了写保护异常,但是其它page的映射关系没有发生改变。为了避免逆向映射时找到错误的vma,所以Linux做了以下工作: 1.在page_referenced_one中通过page_check_address函数进行校验 2.通过mapcount来优化逆向映射的过程,一旦映射到page的pte数量等于了mapcount,就不再继续搜索了 ==

Linux动态DMA映射

爷,独闯天下 提交于 2020-01-16 08:53:33
1. 几种地址类型 虚拟地址   Linux内核使用的地址是虚拟地址,数据类型为void *。例如,kmalloc()和vmalloc()函数返回值就是虚拟地址。 物理地址   处理器真实地址总线上的地址,数据类型为phys_addr_t。   对I/O设备寄存器和内存统一编址的处理器,如ARM/PowerPC,参考手册一般会给出memory map,也就是各种I/O设备的寄存器在物理地址空间的分布。对I/O设备寄存器独立编址的处理器。如X86,访问I/O设备寄存器或内存时,向 地址总线发送地址,并通过控制信号来实现对I/O设备寄存器和内存的不同寻址。这些I/O设备寄存器的地址可以在/proc/iomem中查看,必须使用ioremap()映射到虚拟地址空间才可以使用。 总线地址   从I/O设备的角度看,I/O设备使用的地址是总线地址。DMA使用地址也是总线地址,数据类型为dma_addr_t。对一些简单的系统,设备通过DMA可以直接访问物理地址,但大多数系统都有IOMMU将总线地址转换为物理地址。 2. DMA寻址能力   默认情况下Linux认为设备DMA可以进行32位寻址。必须对DMA mask进行设置,将设备的DMA寻址能力通知内核。 int dma_set_mask_and_coherent(struct device *dev, u64 mask)  

MyBatis 笔记

安稳与你 提交于 2020-01-15 14:03:49
官方文档: 英文: https://mybatis.org/mybatis-3/ 中文: https://mybatis.org/mybatis-3/zh/index.html MyBatis概述 什么是MyBatis MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架。 MyBatis 避免了几乎所有的JDBC 代码和手动设置参数以及获取结果集。 MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录 Mybatis与其他持久化方式对比 MyBatis是一个半自动化的持久化框架 JDBC是SQL夹在Java代码中,耦合度高导致硬编码,维护不易且实际开发中SQL会经常变化 Hibernate和JPA是内部自动产生的SQL语句,不容易做特殊优化,长而复杂的SQL,hibernate处理也不容易,是基于全映射的全自动化框架,大量子弹的pojo进行部分映射比较困难,导致数据库性能下降 对于开发人员,核心SQL需要自己优化,所以需要SQL和java编码分开,功能界面明显,一个专注业务,一个专注数据 文档资料 下载地址:https://github.com/mybatis/mybatis-3 中文文档:http://www.mybatis.org

c++共享内存通信如何实现

萝らか妹 提交于 2020-01-15 04:36:52
c++共享内存通信如何实现 前言 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 小结 System V共享内存-对应cyber中XsiSegment 小结 参考链接 前言 现在很多对性能要求高的项目都会支持共享内存的进程间通信(IPC)方式,本文会以百度Apollo自动驾驶项目为例,展示两种c++中实现共享内存通信的方式(对应linux中两种不同的机制)。 共享内存实际上就是两个不相关的进程访问同一块逻辑内存,相应的肯定需要额外的同步机制来保证读写正确。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。 mmap机制-对应cyber中共享内存通信模式中的PosixSegment 内存映射机制mmap是POSIX标准的系统调用,mmap(

所谓的持久层框架?ORM框架?以及Hibernate和Mybatis区别?

久未见 提交于 2020-01-14 08:47:22
ORM框架? Object Relational Mapping,对象-关系映射。 项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据。 为什么需要ORM框架? ORM框架是对象关系映射,那为什么要映射mapping? 因为对象之间可以存在关联和继承关系,但是在数据库中,关系数据无法表达多对多关联和继承关系。(ps:在数据库原理中,会把逻辑上的多对多转换为多个一对关系才能实现)因此,对象和关系(业务实体的两种表现形式)想要映射正确,项目系统一般以中间件的形式,即持久层框架。 Hibernate? Hibernate是一个开源的对象关系映射框架。 它对jdbc进行了非常轻量级的对象封装,将pojo(普通的Java对象)与数据库表建立映射关系,是一个全自动的ORM框架,甚至自动生成SQL语句,自动执行。 因此,程序员可以随心所有地使用对象编程思维来操纵数据库。 Hibernate特点: Hibernate通过修改一个“持久化”对象的属性,从而修改数据库表中对应的记录数据 提供线程和进程两个级别的缓存提升应用程序性能 有丰富的映射方式将 Java对象之间的关系(POJO) 转换为 数据库表之间的关系 屏蔽不同数据库实现之间的差异。在Hibernate中只需通过“方言”的形式指定当前使用的数据库,就可以根据底层数据库的实际情况生成适合的SQL语句

Mybatis框架相关知识详解

旧巷老猫 提交于 2020-01-14 03:17:03
Mybatis框架 1、什么是Mybatis? 2、Mybatis的优点 3、Mybatis的缺点 4、Mybatis框架的适用场合 5、#{}和${}的区别是什么 6、实体类中的属性名和表中的字段名不一样,怎么办? 8、编写模糊查询like语句 9、Dao接口的工作原理 10、Mybatis分页原理 11、Mybatis的映射形式 12、使用MyBatis的mapper接口调用时有哪些要求? 13、resultType与resultMap的区别 14、在mapper中如何传递多个参数? 15、Mybatis的Executor执行器 16、Mybatis的动态sql 17、Mybatis的关联查询和实现方式以及区别 18、Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系 19、Mybatis的接口绑定以及其实现方式 20、Mybatis缓存 21、Mybatis延迟加载 22、Mybatis的基本工作流程 23、Mybatis实行一对多的操作方式 24、Mybatis实行一对一的操作方式 1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能

.NET(C#)有哪些主流的ORM框架

拈花ヽ惹草 提交于 2020-01-14 02:09:13
前言 在以前的一篇文章中,为大家分享了《 什么是ORM?为什么用ORM?浅析ORM的使用及利弊 》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)还是ServiceStack.OrmLite? 或者是你还有更好的ORM推荐呢? 如果有的话,不防也一起分享给大家。 .NET(C#)主流ORM总揽 今天这篇文章分享几款收集的目前.NET(C#)中比较流行的ORM框架,比如(以下框架均为开源框架,托管于github上): SqlSugar (国内) Dos.ORM (国内) Chloe (国内) StackExchange/Dapper (国外) Entity Framework (EF) (国外) NHibernate (国外) ServiceStack/ServiceStack.OrmLite (国外) linq2db (国外) Massive (国外) PetaPoco (国外) SqlSugar SqlSugar是国人开发者开发的一款基于.NET的ORM框架,是可以运行在.NET 4.+ & .NET CORE的高性能、轻量级 ORM框架,众多.NET框架中最容易使用的数据库访问技术。 特点: 开源、免费 国内开发者开发、维护; 支持.NET Core; 支持主流数据库,如:SQL Server

ORM PHP 学习记录

喜夏-厌秋 提交于 2020-01-14 01:44:12
ORM:object relation mapping,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。为什么要有这么一个映射?很简单,因为现在的开发语言基本都是oop的,但是传统的数据库却是关系型的。为了可以靠贴近面向对象开发,我们想要像操作对象一样操作数据库。 举个例子:获取一篇文章,传统的方式先要执行一个sql检索数据 select * from post where id = 1 然后输出标题和内容使用 echo $post['title']; echo $post['content']; 上面的代码遇到面向对象强迫症者,他们会纠结死的。 所以他们想出了这个东西,在ORM里获取一篇文章可以这样: $post = postTable::getInstance()->find(1);#会再内部执行select * from post where id = 1 然后输出: echo $post->getTitle(); echo $post->getContent(); 妈妈再也不用担心我的强迫症了^_^ 高级点的应用,文章和分类是一对多关系、文章和标签是多对多关系 $cate = $post->getCategory(); //获取文章分类 echo $cate->getName(); //获取分类名 $tags = $post->getTags(); /

阿里十年高端架构师总结:最大化Java NIO和NIO.2的五种方法

ぃ、小莉子 提交于 2020-01-11 23:23:17
JavaNIO的目的是改善Java平台上I / O密集型杂项的编程。十年后,许多Java程序员仍然不知道如何充分利用NIO,甚至更少的人意识到Java SE 7引入了更多新的输入/输出API(NIO.2)。在本教程中,您将找到五个简单的示例,这些示例演示了NIO和NIO.2软件包在常见Java编程场景中的优势。 NIO和NIO.2对Java平台的主要贡献是提高Java应用程序开发的核心领域之一中的性能:输入/输出处理。两种软件包都不是特别容易使用的,每个Java I / O场景都不需要新的Input / Output API。但是,正确使用Java NIO和NIO.2可以节省一些常见I / O操作所需的时间。这就是NIO和NIO.2的超级能力。 本文介绍了五种相对简单的方法来利用它们: 变更通知者(因为每个人都需要听众) 选择器帮助多路复用 渠道-承诺与现实 内存映射-至关重要 字符编码和搜索 NIO环境 已有 10年历史的增强功能仍然是Java 的New Input / Output包吗?原因是对于许多工作的Java程序员而言,基本的Java I / O操作已经足够了。大多数Java开发人员不具备学习NIO为我们的日常工作。而且,NIO不仅仅是性能套件。相反,它是与Java I / O相关的功能的异构集合。NIO通过“更接近Java程序”来提高Java应用程序的性能

Linux 内核中的 Device Mapper 机制

核能气质少年 提交于 2020-01-11 22:14:05
本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍。Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略,当前比较流行的 Linux 下的逻辑卷管理器如 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等都是基于该机制实现的。理解该机制是进一步分析、理解这些卷管理器的实现及设计的基础。通过本文也可以进一步理解 Linux 系统块一级 IO的设计和实现。 Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1。 图1 Device Mapper的内核体系架构 在 内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath