空间数据

linux内存

两盒软妹~` 提交于 2019-11-27 05:27:25
1 内存寻址 1.1 物理地址、虚拟地址以及线性地址 物理地址: 物理内存的内存单元地址 虚拟地址: 程序员看到的内存空间定义未虚拟地址,intel X86 CPU寻址使用了段机制,最初的8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址,解决了CPU数据总线16位寻址20位数据地址空间的问题。 虚拟地址一般用“段:偏移量”的形式来描述,比如在8086中A815:CF2D就代表段首地址为A815,段内偏移位为CF2D的虚地址。 线性地址: 是指一段连续的,不分段的,范围为0到4GB的地址空间,一个线性地址就是线性地址空间的一个绝对地址。 寻址模式有2种: 实模式: 是 段地址+偏移量 的方式,得到物理地址;如当程序执行“mov ax,[1024]”这样一条指令时,在8086的实模式下,把某一段寄存器(比如ds)左移4位,然后与16位的偏移量(1024)相加后被直接送到内存总线上,这个相加后的地址就是内存单元的物理地址,而程序中的地址(例如ds:1024)就叫虚拟地址 保护模式:不 允许通过段寄存器取值得到段的起始地址,而是把虚拟地址转进一个 MMU 的硬件,经过额外的转换和检查,进而得到一个物理地址,如下图所示: 保护模式下寻址 MMU是一种硬件电路,它包含两个部件,一个是分段部件,一个是分页部件

Linux写时拷贝技术(copy-on-write)

孤人 提交于 2019-11-27 05:06:19
COW技术初窥: 在Linux程序中,fork()会产生一个和父进程完全相同的子进程,但子进程在此后多会exec系统调用,出于效率考虑,linux中引入了“写时复制“技术,也就是只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程。 那么子进程的物理空间没有代码,怎么去取指令执行exec系统调用呢? 在fork之后exec之前两个进程用的是相同的物理空间(内存区),子进程的代码段、数据段、堆栈都是指向父进程的物理空间,也就是说,两者的虚拟空间不同,但其对应的物理空间是同一个。当父子进程中有更改相应段的行为发生时,再为子进程相应的段分配物理空间,如果不是因为exec,内核会给子进程的数据段、堆栈段分配相应的物理空间(至此两者有各自的进程空间,互不影响),而代码段继续共享父进程的物理空间(两者的代码完全相同)。而如果是因为exec,由于两者执行的代码不同,子进程的代码段也会分配单独的物理空间。 在网上看到还有个细节问题就是,fork之后内核会通过将子进程放在队列的前面,以让子进程先执行,以免父进程执行导致写时复制,而后子进程执行exec系统调用,因无意义的复制而造成效率的下降。 COW详述: 现在有一个父进程P1,这是一个主体,那么它是有灵魂也就身体的。现在在其虚拟地址空间(有相应的数据结构表示)上有:正文段,数据段,堆,栈这四个部分,相应的

JVM 内存模型概述

巧了我就是萌 提交于 2019-11-27 02:24:56
 我们都知道,Java程序在执行前首先会被编译成字节码文件,然后再由Java虚拟机执行这些字节码文件从而使得Java程序得以执行。事实上,在程序执行过程中,内存的使用和管理一直是值得关注的问题。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域都有各自的用途,以及创建和销毁的时间,并且它们可以分为两种类型:线程共享的方法区和堆,线程私有的虚拟机栈、本地方法栈和程序计数器。在此基础上,我们探讨了在虚拟机中对象的创建和对象的访问定位等问题,并分析了Java虚拟机规范中异常产生的情况。 本文内容是基于 JDK 1.6 的,不同版本虚拟机之间也许会有些许差异,但不影响我们对JVM 内存模型的整体把握和了解。 一. Java 虚拟机内存模型 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些数据区域可以分为两个部分:一部分是线程共享的,一部分则是线程私有的。其中,线程共享的数据区包括方法区和堆,线程私有的数据区包括虚拟机栈、本地方法栈和程序计数器。如下图所示: 1、线程私有的数据区    线程私有的数据区 包括 程序计数器 、 虚拟机栈 和 本地方法栈 三个区域,它们的内涵分别如下: 1)、程序计数器   我们知道,线程是CPU调度的基本单位。在多线程情况下,当线程数超过CPU数量或CPU内核数量时

RocksDB解析

孤人 提交于 2019-11-27 02:12:55
0. 存储引擎基础 存储引擎的基本功能和数据结构 一个存储引擎需要实现三个基本的功能: write(key, value) 二分查找并插入 read(key) -> return value 二分查找并返回 scan(begin, end) -> return values 求key在某区间内的所有元素。先两次二分查找,确定begin和end的位置。两位置之间的数据就是结果集 values 上述的存储引擎和普通的哈希表不同。最大的区别就是存储引擎内要求数据的存储顺序是 按照key有序 的。这比哈希表更节省空间,也容易实现scan()操作。 乍一看使用普通的有序数组好像就可以解决问题啦,但是普通的有序数组也有个问题:当一个新元素要write插入进来时,为保证数组有序,需要把后面的数据都移动一位,这样开销是很大的。 还有一种有序的结构叫做 平衡二叉树 。如果把数据有序放入平衡二叉树好像也不是不行。但是平衡二叉树会占用很多的额外空间(用于存放节点指针),另外 局部性 很差,读性能(read/scan)低。 ( 在OS的页面置换这一节中我们学过工作集的概念 ,其实这个和局部性很像。硬件、操作系统等等系统,绝大部分时候,执行一次 操作流程会有额外的开销(overhead)。因此很多部件、模块都设计成:连续执行类似或相同 的操作、访问空间相邻的内容时,则将多次操作合并为一次

程序地址空间

拜拜、爱过 提交于 2019-11-27 01:24:32
1、程序地址空间,从下到上(下面是低地址,上面是高地址)分别为全局数据区,堆,栈,堆往上增长,栈往下增长。 2、程序运行后,还存在一个代码区,代码区放的是可执行代码,索引了一个个的方法,可认为是数据加工厂。 3、全局数据区存放:全局数据,文本常量,具名常量,静态全局量,静态局部量。 转载于:https://www.cnblogs.com/nzbbody/p/3411280.html 来源: https://blog.csdn.net/weixin_30708329/article/details/99234499

sed命令

断了今生、忘了曾经 提交于 2019-11-27 01:11:47
1、sed一次读取一行数据,把读取的数据拷贝到模式空间,在模式空间(pattern space )内处理数据,然后读入下一行数据,直到结束。 2、sed并不是直接处理原数据,而是对原数据的副本进行处理,因此没有改变原数据。如果想直接改变原数据,使用 -i cfg.cnf 3、默认情况下,sed对每一行都进行处理。可以指定只对哪些行处理,有两种方式: a、地址范围,如1,4,对第1行到第4行的行进行处理。 b、匹配模式,如/my,对包含my的行进行处理。 4、sed的处理流程:从输入流中读取一行数据,放入模式空间,检查这一行是否需要处理(通过地址范围或者匹配模式),如果需要处理,在模式空间加工数据,然后把模式空间的内容,打印到标准输出。如果不需要处理,不处理,把模式空间的内容,打印到标准输出。清除模式空间的内容,读取下一行。 5、sed在读取下一行之前,都先把处理后的模式空间内容,打印到标准输出。有些行,我不想打印,怎么办? 6、有两种解决办法: a、对不想打印的行,执行d操作。相当于对模式空间执行d操作,模式空间为空(不是空行),打印到标准输出,也是为空。 b、对想要打印的行,执行p操作,这样就是把模式空间的内容打印到标准输出。同时使用-n选项,取消读取下一行之前,对模式空间内容的打印。 7、sed取下一行之前,把模式空间的内容打印到标准输出,并且清除模式空间的内容

操作系统原理(1)

為{幸葍}努か 提交于 2019-11-26 22:02:16
计算机体系结构 一个计算机系统由运算器、控制器、存储器(即内存)、输入设备、输出设备组成。其中运算器运算数据,而数据在内存中,运算器要通过控制器到内存中获取数据,运算器最后将运算后的结果通过控制器保存在内存中,通常程序由指令和数据组成,当程序运行时指令和数据保存在内存中,指令中有数据在内存中的地址信息,从而运算器知道数据在内存的位置,然后通过控制器获取所需的数据;一般来说IO设备是通过北桥或南桥芯片连入的,北桥成为高速总线控制器:内存和CPU通过北桥连接在一起。南桥称为低速总线控制器:外围设备和南桥连在一起,然后南桥和北桥相连; 对一个简单的PC机而言,在某一时刻只能运行一个程序,但PC计算能力很强一个程序运行的程序内容和占用的CPU时间不是特别长,因此为了能够尽可能利用计算机的资源,需要让PC具有同时运行多个程序的能力,因此每个程序在运行时需要一个协调器称为内核(内核是运行在硬件之上负责管理硬件资源并且将硬件资源虚拟成其他样子提供给上层所需的应用程序(这样做的原因是如果某一应用程序直接运行在硬件之上则此程序就可以控制硬件的各种属性,其它程序运行时可能彼此会产生干扰,一个恶意的程序可能导致其它程序统统退出所以就需要统一的资源管理者,而且每个程序要想使用硬件必须通过内核来完成,而内核也不会让程序直接访问硬件而是通过将硬件提供的计算能力通过一个个的称为系统调用(system call

Oracle之高水位线

社会主义新天地 提交于 2019-11-26 20:36:45
一、声明: 本人写的一些文章,其中有些是属于个人原创,有些属于转载+个人改编。就如本文属于转载+个人改编。 二、什么是水线(High Water Mark)? 所有的Oracle段(segments,在此,为了理解方便,建议把segments作为表的一个同义词)都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM。 这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很像一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。 三、HWM数据库的操作有如下影响: a)、全表扫描通常要读出直到HWM标记的所有的属于该表数据库块,即使该表中没有任何数据; b)、即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。 四、如何知道一个表的HWM? a)、首先对表进行分析: analyze table <tablename> extimate/compute statistics; b)

普及C组第三题(8.10)

ぐ巨炮叔叔 提交于 2019-11-26 20:07:55
2301. 【普及组T3或T4】线索 (File IO): input: assassin.in output: assassin.out 时间限制: 1000 ms 空间限制: 262144 KB 题目描述( 为毛是图片 ) 输入( 为毛是图片 ) 输出( 为毛是图片 ) 样例输入/输出( 为毛是图片 ) 数据范围限制( 为毛是图片 ) 思路: (1)伪思路当然要小一点:暴力模拟左右两边判断,能像多少种情况就打多少种。。。hhh。 小代码: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int n,p=0,q=0,ans=0,sum=0; bool flag1[1000001],flag2[1000001]; struct assassin { int left1,right1,money; char a; }; assassin ezio[1000001]; bool cmp1(assassin x,assassin y) { return x.left1<y.left1; } bool cmp2(assassin x,assassin y) { return x.right1<y.right1; } int main() {

RAM

你。 提交于 2019-11-26 20:02:02
1. 前记 我们知道,不同的计算机结构对RAM 的使用方式是有区别的,典型的计算机结构有两个,冯诺依曼结构和哈佛结构,而两大阵营的领军人物就是传说中的Intel X86系列的8086和51单片机系列的8051。请先对号入座,不理解的跳过去,继续往下看。 2. What? 长啥样? 内存条,RAM中的一种,常见的应该是DDR SDRAM。相信各位都触摸过它,冷冰,无情,当然,你上电后它就变了样,暖暖的,无怨无悔的为我们干活。 嘿!别唬我,这个俺知道,51单片机。没错,51单片机里面也内置了RAM ,叫片内RAM。 这个就是一般嵌入式板卡上的RAM, 为了加以区分,就叫片外RAM。 广义上讲,CPU内部的寄存器也算是RAM的一种。 在哪里? PC主板图片 嵌入式板卡图片 找一找你系统上的内存吧,再看看CPU datasheet 上有没有提到内置RAM。 特点是啥? RAM(Random Access Memory),随机存储器。特点如下: 如其名,可随时读写 快,读写速度杠杠的,CPU最喜欢和它一起“玩”了 掉电后,数据全部丢失,因此,别指望RAM中的数据长期存储,那么,我想要长期存储公司所有员工的数据怎么办?用FLASH吧。 请参考: RAM、ROM、Flash的分类、性能比较 RAM,ROM,FLASH存储器区别 与CPU的连接方式 RAM是用来存储CPU计算所需的数据的