内存映射

.2 HOST主桥(2)

南楼画角 提交于 2019-11-29 18:06:32
2.2 HOST主桥(2) 发布时间:2013-03-28 10:11:54 技术类别: 接口电路 个人分类: 浅谈PCIe体系结构 http://blog.sina.com.cn/s/blog_6472c4cc0100qli5.html PCI Express的outbound ATMU的window base register,translation baseregister. window base register是针对powerpc域的,translation base register是针对PCIExpress域的。 Outbound的BAR是mpc的地址空间,TAR是PCIE的高达64bit的地址空间。 Inbound的BAR是PCIE的高达64bit的地址空间,TAR是mpc的地址空间。 设备 在系统的 PCI 地址空间里申请一段来用,所申请的空间基址和大小保存在BAR寄存器里。 BAR里的只是 PCI 域的地址空间,需要映射到IO地址空间里或者内存地址空间里之后软件才能使用 。 映射到IO空间的话,用IO读写指令和函数去访问 设备 ;映射到内存空间的话,首先得到的是物理地址,映射到虚拟地址后就可以像用指针那样访问。 IO BAR和MEM BAR分别是映射到IO空间和内存空间的BAR;BAR寄存器的0位指示要映射到哪,有的 设备 这位可以由用户设置,有的只读。

MyBatis的发展和选型

走远了吗. 提交于 2019-11-29 16:06:19
xlecho编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!! 参考文章列表: ORM框架的简单介绍 数据层框架的发展史 JDBC编码的几大问题和MyBatis等框架的发展支持原因? 在最初编写JDBC连接数据库的时候,各种代码操作较为复杂,而且有很多缺陷。缺陷总结如下: 方法的封装问题 数据源的支持 映射结果集的接收和处理 SQL语句硬编码 程序参数只能按照顺序传入(占位符) 没有实现实体类到数据库记录的映射 没有提供缓存等功能 工具类封装的出现解决了一部分问题 相应的工具类如:springjdbc、jdbcutils、Apache DbUtils等。这样的工具类主要解决了一下几个问题: 方法的封装 数据源的支持 映射结果集 工具类的响应实现解决了部分JDBC的缺陷,但是并不完美。每一次的改进和工具类的出现的就是我们框架的前身出现,框架也是工具。在越来越完善的解决方案的出现之后,ORM框架基本就成型了。同时解决了以上JDBC列出来的各种问题。 ORM框架,全称Object Relational Mapping,对象关系的映 面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统

HTTP协议 处理流程

我与影子孤独终老i 提交于 2019-11-29 08:29:37
HTTP协议 处理流程 我们平时在浏览网页的时候都是使用浏览器,输入你要的网址后回车,就会显示出我们所想要的内容,看似这个简单的用户操作行为的背后,Web的工作原理是怎样的呢?到底隐藏了些什么呢? 对于传统的上网流程,系统它是这么做的:浏览器本身它是一个客户端,当输入URL地址的时候,浏览器首先会去请求DNS服务器,通过DNS查询获取相应的域名所对应的IP地址,然后通过这个映射的IP地址找到IP对应的服务器,并建立连接,等浏览器发送完HTTP Request(请求)包后,服务器接收到请求包之后才开始处理,返回HTTP Response(响应)包,客户端浏览器收到来自服务器的响应后就开始渲染这个Response包里的主体(body)部分,等收到全部的内容后断开与该服务器之间的连接。 一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端客户端内部也是浏览器实现的)。 Web服务器的工作原理可以简单地定义为: 1 客户机通过TCP/IP协议建立到服务器的TCP连接 2 客户端向服务器发送HTTP协议请求包,请求服务器里的资源文档 3 服务器向客户机发送HTTP协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端 4 客户机与服务器断开

内存管理

佐手、 提交于 2019-11-29 05:40:01
如何进行内存管理 为了让每个进程认为 独占 地使用内存,并且让每个进程看到的内存是 一致 的,操作系统对物理内存、磁盘进行了 抽象 ,抽象出 虚拟内存 。并且把虚拟内存、物理内存以相同固定大小的 页 进行切分管理( 分页 ),虚拟内存中叫页,物理内存中的叫页帧。 每个进程虚拟地址空间是独立的。用户访问的是虚拟内存的地址,即虚拟地址。需要通过 CPU 芯片上的 内存管理单元 MMU 硬件根据页表 翻译 成物理地址,才能真正访问内存。 页表 :每个进程都有它的独立的页表(放在内存里),用来存对虚拟页、物理页的 映射 。页表可以有多级页表,以时间换取空间(实际上,多级页表的地址翻译,并不比单级页表慢很多)。 为什么用分页机制 如果直接按一个个程序加载到内存,会出现内存 碎片 。 后来出现 分段 机制,按程序的各段来存储,从而减少碎片,但是还是有很多。 所以引出分页,把程序分成更小的页(一般大小为 4KB )来管理内存。分得更小,会增加负荷,但实际上利大于弊。 硬件关系 通过虚拟地址 访问 数据: MMU 先通过它里面的 TLB 缓存查询,如果没有,则去内存中的 页表 进行查询。成功翻译成物理地址后,访问 一级缓存 获取数据。如果没有则访问 二级缓存 (可能还有三级缓存)。还是没有就访问 内存 。 物理内存 不够 时: 将不用的页面换出到磁盘中的 swap 分区 里。 内存空间布局

性能分析 | Linux 内存占用分析

99封情书 提交于 2019-11-29 05:36:41
这篇博客主要介绍 linux 环境下,查看内存占用的两种方式:使用 ps,top等命令;查看/proc/[pid]/下的文件。文章简要介绍了命令的使用方法与一些参数意义,同时对/proc/[pid]/下的文件内容进行了一些详细的介绍。文章内容来自google和自我总结,如有不当之处,欢迎批评指正。 查看Linux内存的方法 linux 下面查看内存有多种渠道,比如通过命令 ps ,top,free, pmap 等,或者通过/proc系统。一般情况下,ps,top,pmap,free可以满足要求,如果需要比较详细和精确地知道整机内存或者某个进程内存的使用情况,可以通过/proc 系统。 使用命令 free : 显示系统可用内存以及已经使用的内存的信息 ps: 查看进程信息,静态,即当前状态 top: 查看进程信息,动态 pstree: 查看进程树 pmap: 根据进程ID查看进程信息 ps vs top ps命令–提供系统过去信息的一次性快照,也就是说ps命令能够查看刚刚系统的进程信息。 top命令反应的是系统进程动态信息,默认10s更新一次。 ps和top都是从/proc目录下读取进程的状态信息,内核把当前系统进程的各种有用信息都放在这个伪目录下。 常见ps命令: ps -aux: 查看系统所有进程 ps -l: 进查看自己的bash相关进程 top 命令详解,请参考http:/

在VIM中使用GDB调试 – 使用pyclewn

会有一股神秘感。 提交于 2019-11-29 04:08:27
:help pyclewn 在前面的文章中介绍了 使用vimgdb在vim中调试程序 ,这种方法允许在终端中的vim,以及图形化的gvim中调试你的程序。不过它的局限也是很明显的:首先,它需要给vim的源代码打补丁并重新编译vim;另外,它只能在Linux下使用,不能在windows上进行gdb调试。 要想在vim中调试,除了使用vimgdb外,还可以使用clewn和pyclewn,这两个工具也是vimgdb的作者提供的,用法基本相同。区别在于,clewn是使用C语言编写的,而pyclewn是使用python语言编写的,具有更好的跨平台能力。本文主要介绍pyclewn工具。 使用pyclewn需要计算机上安装有python 2.4(或以上版本)以及gvim 7.0或以上版本。需注意的是,pyclewn只能与gvim配合使用,它不支持终端中的vim(clewn也是如此) (update 2011/12/27: 在vim 7.3中,最新的pyclew已经支持终端中的vim调试)。另外,gvim在编译时需要使能 netbeans_intg 特性和 autocmd 特性。 如果上面的条件都已经满足,到 http://sourceforge.net/projects/pyclewn/ 下载pyclewn,下载后解压准备安装。安装pyclewn很简单,在我的计算机上

分布式架构之缓存系统

两盒软妹~` 提交于 2019-11-29 03:20:45
  一个大型稳健成熟的分布式系统的背后,往往会设计众多的支撑组件,将这些支撑系统成为分布式系统的基础设施。进行系统架构设计所依赖的基础设施,还包括分布式协作及配置管理组件、分布式缓存组件、持久化存储组件、分布式消息系统、搜索引擎、以及CDN系统、负载均衡系统、运维自动化系统等,还有实时计算系统、离线计算系统、分布式文件系统、日志收集系统、监控系统、数据仓库等。此处主要讲讲缓存系统组件。 缓存组件层 缓存系统带来的好处: 加速读写。缓存通常是全内存的,比如Redis、Memcache。对内存的直接读写会比传统的存储层如MySQL,性能好很多。由于单台机器的内存资源和承载能力有限,并且如果大量使用本地缓存,也会使相同的数据被不同的节点存储多份,对内存资源造成较大的浪费,因此才催生出了分布式缓存。 降低后端的负载。在高并发环境下,大量的读、写请求涌向数据库,磁盘的处理速度与内存显然不在一个量级,从减轻数据库的压力和提供系统响应速度两个角度来考虑,一般都会在数据库之前加一层缓存。 缓存系统带来的成本: 数据不一致性:在分布式环境下,数据的读写都是并发的,上游有多个应用,通过一个服务的多个部署(为了保证可用性,一定是部署多份的),对同一个数据进行读写,在数据库层面并发的读写并不能保证完成顺序,也就是说后发出的读请求很可能先完成(读出脏数据) 代码维护成本:加入缓存后

POSIX共享内存

只愿长相守 提交于 2019-11-29 01:59:12
前言 几种进程间的通信方式:管道,FIFO,消息队列,他们的共同特点就是通过内核来进行通信(假设POSIX消息队列也是在内核中实现的,因为POSIX标准并没有限定它的实现方式)。向管道,FIFO,消息队列写入数据需要把数据从进程复制到内核,从这些IPC读取数据的时候又需要把数据从内核复制到进程。所以这种IPC方式往往需要2次在进程和内核之间进行数据的复制,即进程间的通信必须借助内核来传递。如下图所示: 共享内存也是一种IPC,它是目前可用IPC中最快的,它是使用方式是将同一个内存区映射到共享它的不同进程的地址空间中,这样这些进程间的通信就不再需要通过内核,只需对该共享的内存区域进程操作就可以了,和其他IPC不同的是,共享内存的使用 需要用户自己进行同步操作 。下图是共享内存区IPC的通信: mmap系列函数简介 mmap函数主要的功能就是将文件或设备映射到调用进程的地址空间中,当使用mmap映射文件到进程后,就可以直接操作这段虚拟地址进行文件的读写等操作,不必再调用read,write等系统调用。在很大程度上提高了系统的效率和代码的简洁性。 使用mmap函数的主要目的是: 对普通文件提供内存映射I/O,可以提供无亲缘进程间的通信; 提供匿名内存映射,以供亲缘进程间进行通信。 对shm_open创建的POSIX共享内存区对象进程内存映射,以供无亲缘进程间进行通信。

Linux 下的DMA浅析

不打扰是莪最后的温柔 提交于 2019-11-29 00:02:20
DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来,从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统。每一种体系结构DMA传输不同,编程接口也不同。 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输。 a -- 软件请求数据 调用的步骤可以概括如下(以read为例): (1)在进程调用 read 时,驱动程序的方法分配一个 DMA 缓冲区,随后指示硬件传送它的数据。进程进入睡眠。 (2)硬件将数据写入 DMA 缓冲区并在完成时产生一个中断。 (3)中断处理程序获得输入数据,应答中断,最后唤醒进程,该进程现在可以读取数据了。 b -- 由硬件异步传输 在 DMA 被异步使用时发生的。以数据采集设备为例: (1)硬件发出中断来通知新的数据已经到达。 (2)中断处理程序分配一个DMA缓冲区。 (3)外围设备将数据写入缓冲区,然后在完成时发出另一个中断。 (4)处理程序利用DMA分发新的数据,唤醒任何相关进程。 网卡传输也是如此,网卡有一个循环缓冲区(通常叫做 DMA 环形缓冲区)建立在与处理器共享的内存中

linux内存管理

大兔子大兔子 提交于 2019-11-28 22:44:20
在linux下,使用top,vmstat,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache memeory,swap,avail Mem等,他们都代表什么意思呢?这篇文章将来聊一聊Linux下的内存管理并解答这个问题。 讨论Linux下的内存管理其实就是讨论Linux下虚拟内存的实现方式,本人不是内核专家,所以这篇文章只会介绍一些概念性的东西,不会深入实现细节,有些地方描述的有可能不精确。 在早些时候,物理内存比较有限,人们希望程序可以使用的内存空间能超过实际物理内存,于是出现了虚拟内存的概念,不过随着时间的推移,虚拟内存的意义已经远远的超过了最初的想法。 1、虚拟内存 虚拟内存是Linux管理内存的一种技术。它使得每个应用程序都认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间),而实际上,它通常是被映射到多个物理内存段,还有部分暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。 每个进程所能使用的虚拟地址大小和CPU位数有关,在32位的系统上,虚拟地址空间大小是4G,在64位系统上,是2^64=?(算不过来了)。而实际的物理内存可能远远小于虚拟地址空间的大小。 虚拟地址和进程息息相关,不同进程里的同一个虚拟地址指向的物理地址不一定一样,所以离开进程谈虚拟地址没有任何意义。 注意 : 网上很多文章将虚拟内存等同于交换空间