内存映射

Mybatis

丶灬走出姿态 提交于 2019-11-28 21:43:52
1. 什么是 mybatis MyBatis 是一个优秀的持久层框架,它对 jdbc 的操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建 connection 、创建 statement 、手动设置参数、结果集检索等 jdbc 繁杂的过程代码。 2. mybatis 入门 2.1 mybatis 下载 mybaits 的代码由 github.com 管理,地址: https://github.com/mybatis/mybatis-3/releases 2.2 工程搭建 第一步: 创建 java 工程 第二步:加入需要的jar 包 第三步:配置 db.properties 文件 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456 第四步: 编写 mybatyis 配置文件 SqlMapConfig.xml 为了看起来清晰,就把所有的配置文件放在一个新的文件夹中,所有在项目下新建一个文件夹 config, 把他设置为资源目录( classpath , src 也是资源目录),然后新建一个

MFC基础类及其层次结构

回眸只為那壹抹淺笑 提交于 2019-11-28 20:31:34
从类 CCmdTarget派生出绝大多数MFC中的类,其层次结构如下图: 从根类 Cobject层层派生出绝大多数MFC中的类,层次结构如下图: MFC中重点类: CObject类是MFC的绝大部分类的基类。该类完成动态空间的分配与回收,支持一般的对象诊断、运行时类型标识,出错信息处理和文档序列化等。 (1) 对象诊断 :利用成员函数 AssertValid进行对象有效性检查;利用成员函数Dump输出对象的数据成员的值,诊断信息以文本形式放入一个数据流中,用于调试器的输出窗口信息显示。(只能用于Debug版的应用程序) (2) 运行时类型识别 : GetRuntimeClass根据对象的类返回一个相关联的指向CRuntimeClass结构的指针,它包含了一个类的运行信息;函数IsKindOf用于测试对象与给定类的关系。 (3) 通过与 Carchive相结合 , CObject类为其派生类提供了序列化功能。要创建一个支持序列化的派生类,必须将DECLARE_SERIAL宏添加到类定义中,将IMPLEMENT_SERIAL添加到类的实现文件中。       CCmdTarget:由CObject类直接派生,所有能实行消息映射MFC类的基类。将系统事件和窗口事件发送给响应这些事件的对象,完成消息发送、等待和派遣(调度)等工作,实现应用程序的对象之间协调运行,功能如下:   ( 1)

Pinterest谈实战经验:如何在两年内实现零到数百亿的月访问

若如初见. 提交于 2019-11-28 11:50:24
Pinterest一直保持着指数增长,每一个半月都会翻一翻。在两年内,他们实现了从0到数百亿的月PV;从开始的两个创始人加一个工程师增长到现在超过40个工程师,从一个小型的MySQL服务器增长到180个Web Enigne、240个API Enigne、88个MySQL DB(cc2.8xlarge,每个DB都会配置一个从属节点)、110个Redis Instance以及200个Mmecache Instance。 在一个名为 《Scaling Pinterest》 的主题演讲上,Pinterest的 Yashwanth Nelapati 和 Marty Weiner 为我们讲述了这个戏剧性的过程。当然扩展到当下规模,Pinterest在众多选择中不可避免的走了许多的弯路,而Todd Hoff认为其中最宝贵的经验该归结于以下两点: 如果你的架构应对增长所带来的问题时,只需要简单的投入更多的主机,那么你的架构含金量十足。 当你把事物用至极限时,这些技术都会以各自不同的方式发生故障,这导致他们对工具的选择有着特殊的偏好:成熟、简单、优秀、知名、被更多的用户喜爱、更好的支持、稳定且杰出的表现、通常情况下无故障以及免费。使用这些标准,他们选择了MySQL、Solr、Memcache、Redis、Cassandra,同时还抛弃了MongoDB。 同样这两个点是有关联的

数据库分库分表思路

我的未来我决定 提交于 2019-11-28 11:46:24
一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。 数据库分布式核心内容无非就是数据切分(Sharding) ,以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。 数据切分根据其切分类型,可以分为两种方式: 垂直(纵向)切分和水平(横向)切分 1、垂直(纵向)切分 垂直切分常见有垂直分库和垂直分表两种。 垂直分库 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图: 垂直分表 是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销

三、内存管理

大城市里の小女人 提交于 2019-11-28 08:52:45
1、calloc 表头文件  #include <stdlib.h> 定义函数  void *calloc(size_t nmemb,size_t size); 函数说明  calloc()用来配置nmemb 个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。这和使用下列的方式效果相同:malloc(nmemb* size);不过,在利用calloc()配置内存时会将内存内容初始化为0。 返回值   若配置成功则返回一指针,失败则返回NULL。 2、free 表头文件  #include <stdlib.h> 定义函数  void free(void *ptr); 函数说明  参数ptr 为指向先前由malloc()、calloc()或realloc()所返回的内存指针。调用free()后ptr 所指的内存空间便会被收回。假若参数ptr所指的内存空间已被收回或是未知的内存地址,则调用free()可能会有无法预期的情况发生。 若参数ptr 为NULL,则free()不会有任何作用。 3、getpagesize 表头文件  #include<unistd.h> 定义函数  size_t getpagesize(void); 函数说明  返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。 返回值   内存分页大小。 4

共享内存

谁说我不能喝 提交于 2019-11-28 08:10:17
  共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。   采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。   默认情况下通过fork派生的子进程并不与父进程共享内存区。通过一个程序来验证,程序功能是让父子进程都给一个名为count的全局变量加1操作,程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include

Set和Map

孤街浪徒 提交于 2019-11-28 06:23:29
Set接口和Map接口 回顾 1 集合概念,用来存储一组数据的容器。和数组类似, 数组是长度固定的,集合长度可以变化。 数组能存储基本类型和引用类型,集合只能存储引用类型。 2 Collection接口,父接口, add() remove() clear() contains() iterator() 3 Collection有两个子接口 List和Set Collection:特点:一部分是有序的,有一部分是无序的,还有一部分可以重复,有一部分不能重复 4 泛型:本质使用数据类型作为参数传递:好处:1提高代码的重用性 2 防止类型转换异常,保证数据的安全 4.1 定义泛型类 泛型方法 泛型接口 <>表示泛型 T是一个占位符,表示一个数据类型,只能是引用类型 public class Generic<T>{ T t; pubic void show(T t){ } public T getT(){ return t; } } public class Generic2{ public <T> void show(T t){ } } public interface Usb<T>{ } 4.2 使用 创建类对象,指定泛型的实际类型 4.3 泛型限制,<?> 表示任何类型 <? extends T> 表示泛型上限, T类型或T的子类 <? super T> 表示泛型下限

进程地址空间分布

北城余情 提交于 2019-11-28 05:36:47
转载请注明出处:http://blog.csdn.net/wangxiaolong_china 对于一个进程,其空间分布如下图所示: C程序一般分为: 1. 程序段 :程序段为程序代码在内存中的映射.一个程序可以在内存中多有个副本. 2. 初始化过的数据 :在程序运行值初已经对变量进行初始化的 3. 未初始化过的数据 :在程序运行初未对变量进行初始化的数据 4.栈 (stack) :存储局部,临时变量,在程序块开始时自动分配内存,结束时自动释放内存.存储函数的返回指针. 5.堆 (heap) :存储动态内存分配,需要程序员手工分配,手工释放. 多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中,这个沙盘就是虚拟地址空间(virtual address space),在32位模式下,它总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用。每个进程都拥有一套属于它自己的页表,但是还有一个隐情,只要虚拟地址被使能,那么它将会作用于这台机器上运行的所有软件,包括内核本身,因此,有一部分虚拟地址必须保留给内核使用。进程内存空间分布如下图所示: 但是这并不意味着内核使用了这么多的物理内存,仅表示它可以支配这么大的地址空间。可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的特权级(ring2或以下),因此

Windows 进程间通信

淺唱寂寞╮ 提交于 2019-11-28 02:32:36
3.4 使用 WM_COPYDATA 消息通信 对于少量数据可以用WM_COPYDATA方便地实现通信。由于SendMessage()是阻塞的,只有接收方响应了消息,SendMessage()才能返回,否则一直阻塞。所以,对于大量数据来说,用SendMessage()就容易造成窗口假死。 3.4.1 通过 WM_COPYDATA 消息实现进程间通信的方法 在Win32中,WM_COPYDATA消息主要目的是允许在进程间传递只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。这个函数的原型如下: SendMessage(WM_COPYDATA,wParam,lParam) 其中wParam设置为包含数据的窗口句柄,lParam指向一个COPYDATASTRUCT的结构,其定义为: typedef struct tagCOPYDATASTRUCT{ DWORD dwData; DWORD cbData; PVOID lpData; }COPYDATASTRUCT; 其中dwData为自定义数据, cbData为数据大小, lpData为指向数据的指针。需要注意的是,WM_COPYDATA消息保证发送的数据从原进程复制到目标进程。但是,WM_COPYDATA消息不能发送HDC、HBITMAP之类的东西

网络数据包收发流程(三):e1000网卡和DMA

扶醉桌前 提交于 2019-11-28 01:00:35
转载 https://www.cnblogs.com/CasonChan/p/5166239.html 一、硬件布局 每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546。 上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助,如TSEC,PCI controller 以太网数据在 TSEC<-->DDR PCI_Controller<-->DDR 之间的流动,CPU的core是不需要介入的 只有在数据流动结束时(接收完、发送完),DMA Engine才会以外部中断的方式告诉CPU的core 二、DMA Engine 上面是DMA Engine的框图,以接收为例: 1. 在System memory中为DMA开辟一端连续空间,用来BD数组 (一致性dma内存) BD是给DMA Engine使用的,所以不同的设备,BD结构不同,但是大致都有状态、长度、指针3个成员。 2. 初始化BD数组,status为E,length为0 在System memory中再开辟一块一块的内存,可以不连续,用来存放以太网包 将这些内存块的总线地址赋给buf(dma映射) 3. 当MAC接收以太网数据流,放在了Rx FIFO中 4. 当一个以太网包接收完全后,DMA engine依次做以下事情 fetch bd