1. 操作系统文件系统中的的block

文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes

也因为这个原因MBR启动的手 0磁道 0扇区的 512bytes 首先加载到内存, 先包含了 446byte的MBR启动信息, 还包含 64bytes 的磁盘分区信息 所以MBR的磁盘格式只支持4个主分区 并且大小仅能够扩展到2TB

后来使用GPT分区的模式可以扩充使用2TB大小以上的磁盘.

操作系统的文件簇大小 可以与扇区大小也可以是扇区大小的整数倍

比较常见的SSD 一般是4kB的扇区大小 所以就有一个SSD操作系统盘的 4k对齐问题(Win7 MBR的情况)

单个文件系统的block 仅能够分给一个文件, 不能同时被两个文件持有, 所以如果文件block较大的情况下会造成磁盘空间的大量浪费

但是如果文件系统的block太小的话 又会影响一定的IO性能.

2. 数据库中的block

oracle与sqlserver针对最小的数据库的读写单元的命名不一样

oracle跟操作系统一般 将最小的读写单元写为block sqlserver的叫做page

他们的大小与操作系统相关 一般为操作系统文件系统的block的整数倍

比如一般的windows系统的文件簇是4kB 的话 oracle与 sqlserver的基本的block的大小就是8kB

sqlserver的page中有page head 和 业内偏移量等信息内容, 单个page 是 8192bytes 一般可用来存数据的部分是 8060byte 其余的 132 byte 用来存储头和偏移量

Oracle的block 在dbca创建数据库时可以指定, 也是操作系统的整数倍 11g 以上的版本一般默认都是 8kB 可以调整为更大的情况

数据库的单次IO 会抓取一个block中的内容填充到SGA区域中(direct path read 应该是读取到PGA区域中)

oracle数据库 多个block 组成extent区域 oracle应该 以extent为最小的逻辑分配单元 给schema分配存储区域

extent 在11g 最开始增加了延迟短创建的特性, 创建完没有insert数据时 是不进行extent段的创建的

extent在首次创建时好像只包含8个block 也就是 64kB大小

当扩展到一定程度到达16个extent 时 也就是1MB 大小时 可能会默认每次分配1MB 的区域给这个用户

Oracle为了提高extent的扩展性能这一块做过很多优化处理

Oracle只是块级别的并发 行级锁 好像就是可以同时处理一个extent区域内的block记录 提高并发响应性能.

3. 内存页面.

现代操作系统处理的都是虚拟内存, 由硬件底层或者是其他方式进行虚拟内存与物理内存的映射处理.

在不启用大页的情况下x86的操作系统不管是windows还是linux很多现在常用的版本的单个内存页面的大小都是4KB 大小了,

为了加快内存的访问速度, CPU 访问内存一般通过多级缓存来进行,

这里面可以有一个微观的认识:

光速是30万千米没小时在一个3GHZ的CPU 的一个cycle内 光可以走10cm 感觉此处可能会限制CPU 做到特别大面积的可能.

CPU访问寄存器 应该是在一个1cycle内来解决,时间是0.5ns以内

CPU 访问内存的延迟要高一些,可能达到十几个cycle 总体时间可能要12ns左右

CPU 完成获取内存地址以及从内存中取数可能会耗时超过100ns

从硬盘中取数 加上磁盘寻道以及数据获取大概要耗时10ms以上, 此时看到内存中的速度要比硬盘中快十万倍 但是比CPU 寄存器取数也要慢100-200倍

CPU为了加快内存取数 内存寻址部分尽量没有通过内存获取 而是通过寄存器或者是一二三级缓存来实现

寄存器的名字是TLB TLB 里面应该是存储了 64位地址长的部分 因为一个内存页面是4KB 所以 需要有12内的页内偏移量来一个位标识一个bytes内的内容 除了12位偏移量的部分 来标识页的位置

现在应该是段页式内存管理, 但是操作系统的课程没学好, 这一段内容一致没理解透彻.

因为TLB 的总体大小有限,所以TLB中进行虚拟地址到物理地址的转换总是会出现TLB miss 所以可以增加page entry的方式来缩减 页表项目 我理解为增加地址中页内偏移量的大小来减少内存中的页数,保证TLB的hits命中率来提高性能

Linux里面大页的处理 应该/proc/meminfo 信息中包含hugepage的字段 即可视为支持大页.

我对windows的段页式内存管理 一直没有理解好(其实深入的内容都不理解...!-_-!).

一个IO操作可能涉及的点是非常多的. 以上只是自己简单的理解 非常不全面.

文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)的更多相关文章

  1. 数据库的应用——直接从内存中读取osg节点 (转)

    数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件 ...

  2. JVM中,对象在内存中的布局

    在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机 ...

  3. java基础知识汇总(持续更新中....)

    1.java四大特性:抽象.继承.封装,多态 构造函数: http://blog.csdn.net/qq_33642117/article/details/51909346 2.java数据基本类型: ...

  4. C#基础知识汇总(不断更新中)

    ------------------------------目录---------------------------- 1.隐式类型2.匿名类型3.自动属性4.初始化器5.委托6.泛型7.泛型委托8 ...

  5. MySQL中关于SQL注入的相关需要的基础知识

    零.绪论: 文章部分整理来源于公司同事,特此鸣谢!!! 一.关于注入点在KEY上的注入: 我们来看一个查询,你的第一个字段是过滤器(filter)第二个字段是查询的关键字,例如查询ip == 1.2. ...

  6. 代码演示C#中string和StingBuilder内存中的区别

    关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. //Demo  string memory model namespace C ...

  7. JavaScript中的变量在内存中的具体存储形式

    栈内存和堆内存 JavaScript中的变量分为基本类型和引用类型 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在栈空间,通过按值访问 引用类型是保存在堆内存中的对象,值大小不固 ...

  8. JS中的事件类型和事件属性的基础知识

    周末无聊, 这几天又复习了下JS搞基程序设计3, 想着好记性不如浪笔头哇, 要么把这些东西写下来, 这样基础才能更加扎实么么哒, 知道的同学也可以直接过一下,当做复习,  小姨子再也不用担心我的学习啦 ...

  9. java中方法调用在内存中的体现

    在java中,方法以及局部变量(即在方法中声明的变量)是放在栈内存上的.当你调用一个方法时,该方法会放在调用栈的栈顶.栈顶的方法是目前正在执行的方法,直到执行完毕才会从栈顶释放.我们知道,栈是一种执行 ...

随机推荐

  1. Python高级网络编程系列之第二篇

    在上一篇中,我们深入探讨了TCP/IP协议的11种状态,理解这些状态对我们编写服务器的时候有很大的帮助,但一般写服务器都是使用C/Java语言,因为这些语言对高并发的支持特别好.我们写的这些简单的服务 ...

  2. Spring中实现多数据源事务管理

    文章转自  https://www.2cto.com/kf/201507/424229.html 前言 由于项目中引入了多个数据源,并且需要对多个数据源进行写操作,那么多数据源的事务管理自然成了不可避 ...

  3. Python基础(2)——列表、字典、数据运算

    1.列表 #创建列表 name_list = ['alex', 'seven', 'eric'] #或 name_list = list(['alex', 'seven', 'eric']) #访问列 ...

  4. Android学习之基础知识十三 — 四大组件之服务详解第二讲(完整版的下载示例)

    上一讲学习了很多关于服务的使用技巧,但是当在真正的项目里需要用到服务的时候,可能还会有一些棘手的问题让你不知所措.接下来就来综合运用一下,尝试实现一下在服务中经常会使用到的功能——下载. 在这一讲我们 ...

  5. java 文件字节和字符流 缓冲流

    流的原理 1) 在 Java 程序中,对于数据的输入/输出操作以“流”(stream) 方式进行:2) J2SDK 提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据 ...

  6. MySQL(十)操纵表及全文本搜索

    一.创建表 MySQL不仅用于表数据操作,还可以用来执行数据库和表的所有操作,包括表本身的创建和处理. 创建表一般有如下两种方式: ①使用具有交互式创建和管理表的工具: ②直接使用MySQL语句操纵表 ...

  7. 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(视频总揽)

    1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽) https://v.youku.com/v_show/id_XNDE0Njk3Njg2OA==. ...

  8. Identity(四)

    本文摘自:ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇 探索身份验证与授权 在这一小节中,我将阐述和证明ASP.NET 身份验证和授权的工作 ...

  9. xml中的四则运算与时间爱格式

    取值第一个 和最后一个<tr> <td height="28" colspan="2" style="font-size:14px& ...

  10. SQL Server数据库(时间戳timestamp)类型 (转载)

    timestamp介绍 公开数据库中自动生成的唯一二进制数字的数据类型. timestamp 通常用作给表行加版本戳的机制. 存储大小为 8 个字节. 不可为空的 timestamp 列在语义上等价于 ...