内存映射

主存管理

送分小仙女□ 提交于 2020-01-22 08:38:51
1 概念 存储器 storage, memmory 能接收数据和保存数据、而且能根据命令提供这些数据的装置。 存储器分成两类: 内存储器(简称内存、主存、物理存储器) 处理机能直接访问的存储器。用来存放系统和用户的程序和数据,其特点是存取速度快,存储方式是以新换旧,断电信息丢失。 外存储器(简称外存、辅助存储器) 处理机不能直接访问的存储器。用来存放用户的各种信息,存取速度相对内存而言要慢得多,但它可用来长期保存用户信息。在文件系统中介绍。 1.内存的物理组织 物理地址: 把内存分成若干个大小相等的存储单元,每个单元给一个编号,这个编号称为内存地址(物理地址、绝对地址、实地址),存储单元占8位,称作字节(byte)。 物理地址空间: 物理地址的集合称为物理地址空间(主存地址空间),它是一个一维的线性空间。 2.程序的逻辑结构 程序地址:用户编程序时所用的地址(或称逻辑地址 、虚地址 ),基本单位可与内存的基本单位相同,也可以不相同。 程序地址空间(逻辑地址空间、虚地址空间):用户的程序地址的集合称为逻辑地址空间,它的编址总是从0开始的,可以是一维线性空间,也可以是多维空间。 2存储管理的功能 1.存储管理功能 地址映射 将程序地址空间中使用的逻辑地址变换成主存中的地址的过程 (2) 主存分配 按照一定的算法把某一空闲的主存区分配给作业或进程。 (3) 存储保护 保证用户程序

Windows进程间通信

假装没事ソ 提交于 2020-01-21 20:07:27
  Microsoft Win32应用编程接口(Application Programming Interface, API)提供了大量支持应用程序间数据共享和交换的机制,这些机制行使的活动称为进程间通信(InterProcess Communication, IPC),进程通信就是指 不同进程间进行数据共享和数据交换 。进程间通信的方式有: 1、文件映射   文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。   Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。 应用程序有三种方法来使多个进程共享一个文件映射对象:   (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。   (2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。   (3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等

Mybatis 学习笔记 -雷云龙

纵然是瞬间 提交于 2020-01-21 17:53:32
Mybatis 学习笔记 -雷云龙 一 、mybatis概述 mybatis是java持久层框架,即是操作数据库的。内部封装了jdbc,只需要关注sql 本身 mybatis通过xml 或者注解 的方式将需要执行的statement配置起来,并通过java对象和statement中sql 的动态参数进行映射,最终生成完整的sql,最后mybatis 执行sql 并将结果映射成对象返回 采用ORM思想解决了实体和数据库映射的问题,对jdbc进行了封装 二、mybatis 入门 1、环境搭建 1.坐标 < dependencies > < dependency > < groupId > org.mybatis </ groupId > < artifactId > mybatis </ artifactId > < version > 3.5.0 </ version > </ dependency > < dependency > < groupId > mysql </ groupId > < artifactId > mysql-connector-java </ artifactId > < version > 5.1.6 </ version > < scope > runtime </ scope > </ dependency > < dependency > <

linux内存管理之vmalloc函数分析

谁说胖子不能爱 提交于 2020-01-21 09:05:54
2017-07-09 今天周末,闲来无事聊聊linux内核内存分配那点事……重点在于分析vmalloc的执行 流程 以传统x86架构为例,内核空间内存(3G-4G)主要分为三大部分:DMA映射区,一致映射区、高端内存区。其中前两者占据低端892M,而剩下的128M作为高端内存区。DMA映射区涉及到外部设备,咱们暂且不讨论,那么就剩下一致映射区和高端内存区。一致映射区的虚拟地址均一一对应了物理页框,因此此区间虚拟地址的访问可以直接通过偏移量得到物理内存而不需进行页表的转换。但是1G内核地址空间说实话有些捉襟见肘,如果都用作一致映射,那么当物理内存大于4G时,内核仍然无法利用。鉴于此,留下128M的地址空间作为高端内存,扮演着临时映射的作用。回想下PAE模式的原理,是不是有些相似呢?一致映射区既然都已经关联了物理内存就可以通过slab缓存来管理,以加速分配。而高端内存这点有些类似于用户进程的内存分配,但又并不完全相同,后面咱们会讲到。在这里咱们先回忆下用户空间内存分配流程,一个普通的进程调用malloc函数分配一段地址空间,有可能在 堆中,如果内存过大海有可能在mmap映射区,同时会由一个vm_area_struct记录下本次分配出去的地址空间信息,如大小,起始地址等由于进程独享虚拟地址空间,所以这些vm_area_struct都是按照进程为单位进行管理的。这也没毛病

打造自己的数据访问层(二)

拜拜、爱过 提交于 2020-01-21 05:49:38
上一篇 打造自己的数据访问层(一) 中,我们已了解了.NET对数据库操作的基本原理,并就Ado.net对象的使用提出了几点疑问: 1、如何由系统来判断数据库型。 2、如何消除这些重复代码。 而上篇中也提出了一种解决思路,对ADO.NET对象进行封装,具体应该如何实施? 1、需要一个对象,该对象用于建立内存表与物理表的之间映射关系,解决数据查询、更新操作,形成了数据映射对象,定义为DataMapping。 2、每一个映射对象只与一张物理建立映射关系,如果有多个这样的对象同时操作,如何解决?这时就需要另一个对象,用于添加映射对象集合,打包映射对象操作,形成了数据执行者,定义为DataExecutor。 想想看,只需要这两个基本对象,就可以形成简单的数据访问层了。 先实现DataMapping,它应具备如下功能。 1、需要知道物理表的信息,表名、主键集、字段集。 2、需要知道映射的是什么类型的数据库,MSSql数据库、Oracle数据库、MySql数据库或者其他类型的数据库。 3、可查询数据,即填充内存表。 4、可更新数据,并且可设置更新操作方式。 5、可加入到事务中去。 根据上述功能,可初步设计出的DataMapping类: public class DataMapping{ public DataMapping() { } /// <summary> /// 填充数据集 /// <

mmap 映射的内存访问出错

倾然丶 夕夏残阳落幕 提交于 2020-01-20 12:00:24
现象 把一个打开的文件描述符,通过mmap映射到一片内存区间,对这块区间进行读写,长时间运行后出现访存错误 SIGBus Error, GDB分析相应的core出现一些内存空间不可用的错误。 问题分析 参考man mmap , 在出现下列情况下,会出错: ERRORS EBADF fd is not a valid file descriptor (and MAP_ANONYMOUS was not set). EACCES A file descriptor refers to a non-regular file. Or MAP_PRIVATE was requested, but fd is not open for reading. Or MAP_SHARED was requested and PROT_WRITE is set, but fd is not open in read/write (O_RDWR) mode. Or PROT_WRITE is set, but the file is append-only. EINVAL We don't like start or length or offset. (E.g., they are too large, or not aligned on a PAGESIZE boundary.) ETXTBSY

《Linux Device Drivers》第十五章 内存映射和DMA——note

微笑、不失礼 提交于 2020-01-20 03:04:37
简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂、性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现过程 讲述怎样跨越边界直接訪问用户空间的内存页 讲述了直接内存訪问(DMA)I/O操作,它使得外设具有直接訪问系统内存的能力 Linux的内存管理 地址类型 Linux是一个虚拟内存系统,这意味着用户程序所使用的地址与硬件使用的物理地址是不等同的 有了虚拟内存,在系统中执行的程序能够分配比物理内存很多其它的内存,甚至一个单独的进程都能拥有比系统物理内存很多其它的虚拟地址空间 以下是一个Linux使用的地址类型列表 用户虚拟地址 这是在用户空间程序所能看到的常规地址 物理地址 该地址在处理器和系统内存之间使用 总线地址 该地址在外围总线和内存之间使用,通常它们与处理器使用的物理地址同样 内核逻辑地址 内核逻辑地址组成了内核的常规地址空间 在大多数体系架构中。逻辑地址和与其相关联的物理地址不同,只在它们之间存在一个固定的偏移量 kmalloc返回的内存就是内核逻辑地址 内核虚拟地址 和内核逻辑地址的同样之处在于。它们都将内核空间的地址映射到物理地址上 内核虚拟地址与物理地址的映射不必是线性的一对一的 全部的逻辑地址都是内核虚拟地址。可是非常多内核虚拟地址不是逻辑地址

第十五章 内存映射和DMA

拜拜、爱过 提交于 2020-01-20 03:03:29
1、mmap设备操作 映射一个设备意味着将用户空间的一段内存与设备内存关联起来。无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备。不是所有的设备都能进行mmap抽象。比如像串口和其他面向流的设备就不能。mmap的另一个限制是:必须以PAGE_SIZE为单位进行映射。 mmap方法是file_operation结构的一部分,并且执行mmap系统调用时将调用该方法。为了执行mmap,驱动程序只需要为该地址范围建立合适的页表,并将vma->vm_ops替换为一系列的新操作即可。 有两种建立页表的方法:使用remap_pfn_range函数一次全部建立,或者通过nopage方法每次建立一个页。 2、执行直接IO访问 如果需要传递的数据量非常大,直接进行数据传输,而不需要额外的从内核空间拷贝数据操作的参与,这将会大大提高速度。使用直接IO并不在任何情况下都能提高性能。设置直接IO的开销很大,而又没有使用IO缓存的优势。比如,使用直接IO需要write系统调用同步执行;否则应用程序将会不知道什么时候能再次使用他的IO缓冲区。在每个写操作完成之前不能停止应用程序,这样会导致关闭程序缓慢,这就是使用直接IO的应用程序也使用异步IO的原因。 在字符设备中执行直接IO是不行的,也是有害的。只有确定设置缓冲IO的开销特别大,才使用直接IO。块设备和网络设备不担心实现直接IO的问题

Django Web框架教学笔记

假装没事ソ 提交于 2020-01-17 22:51:35
目录 文章目录 目录 admin 后台数据库管理 自定义后台管理数据表 修改后台Models的展现形式 模型管理器类 数据库表管理 数据表关联关系映射 一对一映射 一对多映射 多对多映射 cookies 和 session cookies session 会话控制 admin 后台数据库管理 django 提供了比较完善的后台管理数据库的接口,可供开发过程中调用和测试使用 django 会搜集所有已注册的模型类,为这些模型类提拱数据管理界面,供开发者使用 使用步骤: 创建后台管理帐号: 后台管理–创建管理员帐号 $ python3 manage.py createsuperuser 根据提示完成注册,参考如下: $ python3 manage.py createsuperuser Username ( leave blank to use 'tarena' ) : tarena # 此处输入用户名 Email address: laowei@tedu.cn # 此处输入邮箱 Password: # 此处输入密码(密码要复杂些,否则会提示密码太简单) Password ( again ) : # 再次输入重复密码 Superuser created successfully. $ 用注册的帐号登陆后台管理界面 后台管理的登录地址: http://127.0.0.1:8000

进程间通信(IPC)

流过昼夜 提交于 2020-01-17 01:03:50
进程间通信(Interprocess communication) 一、概述: 进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。进程间通信是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。 二、目的: (1)数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。 (2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。 (3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。 (4)资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。 (5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 进程通过与内核及其它进程之间的互相通信来协调它们的行为。Linux支持多种进程间通信(IPC)机制