精华内容
下载资源
问答
  • ps:主要是想写一个模拟系统,但是对于磁盘分配知道的并不,在网上没找到资料,不知道如何下手(可能是我搜索的方式不对,如果有一些资料链接的话欢迎丢过来)。希望有大佬可以指点一二。十分感谢!
  • 这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果没给它赋值,它这个字段的值就是NULL。 那么假设这个字段的NULL值...

    1、为什么一行数据里的NULL值不能直接存储?

    这个所谓的NULL值列表,顾名思义,说的就是一行数据里可能有的字段值是NULL,比如有一个name字段,它是允许为NULL的,那么实际上在存储的时候,如果没给它赋值,它这个字段的值就是NULL。

    那么假设这个字段的NULL值我们在磁盘上存储的时候,就是按照“NULL”这么个字符串来存储,是不是很浪费存储空间?所以实际在磁盘上存储数据的时候,一行数据里的NULL值是肯定不会直接按照字符串的方式存放在磁盘上浪费空间的。

    2、NULL值是以二进制bit位来存储的

    对所有的NULL值,不通过字符串在磁盘上存储,而是通过二进制的bit位来存储,一行数据里假设有多个字段的值都是NULL,那么这多个字段的NULL,就会以bit位的形式存放在NULL值列表中。现在举个例子,假设有一张表,它的建表语句如下所示:

    CREATE TABLE customer (
    
        name VARCHAR(10) NOT NULL,
    
        address VARCHAR(20),
    
        gender CHAR(1),
    
        job VARCHAR(30),
    
        school VARCHAR(50)
    
    ) ROW_FORMAT=COMPACT;

    上面这个表就是一个假想出来的客户表,里面有5个字段,分别为name、address、genderjob、school,就代表了客户的姓名、地址、性别、工作以及学校。其中有4个变长字段,还有一个定长字段,然后第一个name字段是声明了NOT NULL的,就是不能为NULL,其他4个字段都可能是NULL的。

    那么现在来假设这个表里有如下一行数据,现在来看看,它在磁盘上是怎么来存储的:“jack NULL m NULL xx_school”,它的5个字段里有两个字段都是NULL。

    3、结合案例来思考一行数据的磁盘存储格式

    上面那个表里的那行案例数据,在磁盘上应该如何存储呢,因为他有多个变长字段,还有多个字段允许为NULL。前面说了,一行数据在磁盘上的存储格式应该是下面这样的:

    变长字段长度列表 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN

    如果这个变长字段的值是NULL,就不用在变长字段长度列表里存放它的值长度了,所以在上面那行数据中,只有name和school两个变长字段是有值的,把它们的长度按照逆序放在变长字段长度列表中就可以了,如下所示:

    0x09 0x04 NULL值列表 头信息 column1=value1 column2=value2 ... columnN=valueN

    接着来看NULL值列表,这个NULL值列表是这样存放的,所有允许值为NULL的字段,注意,是允许值为NULL,不是说一定值就是NULL了,只要是允许为NULL的字段,在这里每个字段都有一个二进制bit位的值,如果bit值是1说明是NULL,如果bit值是0说明不是NULL。

    比如上面4个字段都允许为NULL,每个人都会有一个bit位,这一行数据的值是“jack NULL m NULL xx_school”,然后其中2个字段是null,2个字段不是null,所以4个bit位应该是:1010。但是实际放在NULL值列表的时候,它是按逆序放的,所以在NULL值列表里,放的是:0101,整体这一行数据看着是下面这样的:

    0x09 0x04 0101 头信息 column1=value1 column2=value2 ... columnN=valueN

    另外就是实际NULL值列表存放的时候,不会说仅仅是4个bit位,一般起码是8个bit位的倍数,如果不足8个bit位就高位补0,所以实际存放看起来是如下的:

    0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN

    4、磁盘上的一行数据到底如何读取出来的?

    看上面的磁盘数据存储格式:

    0x09 0x04 00000101 头信息 column1=value1 column2=value2 ... columnN=valueN

    首先必然要把变长字段长度列表和NULL值列表读取出来,通过综合分析一下,就知道有几个变长字段,哪几个变长字段是NULL,因为NULL值列表里谁是NULL谁不是NULL都一清二楚。此时就可以从变长字段长度列表中解析出来不为NULL的变长字段的值长度,然后也知道哪几个字段是NULL的,此时根据这些信息,就可以从实际的列值存储区域里,把每个字段的值读取出来了。

    如果是变长字段的值,就按照值长度来读取,如果是NULL,就知道是个NULL,没有值存储,如果是定长字段,就按照定长长度来读取,这样就可以完美的把一行数据的值都读取出来了!

     

    展开全文
  • 玩机软件是一个“绿色、实用、免费”平台,我们致力于帮助更用户掌握电脑知识、手机技巧、互联网知识,并推荐电脑和手机等各种优质工具,发布各种实用软件及安装教程。如果你喜欢本文,请点击右下角的在看,并分享...

    6f0c24a3717713c5a98340048041471a.png

    玩机软件是一个“绿色、实用、免费”平台,我们致力于帮助更多用户掌握电脑知识、手机技巧、互联网知识,并推荐电脑和手机等各种优质工具,发布各种实用软件及安装教程。如果你喜欢本文,请点击右下角的在看,并分享到朋友圈。

    AppStore无法更新系统

    方法一:通过 macOS 恢复功能重新安装【安装大概需要4-8个小时】

    利用 macOS 恢复功能,您可以轻松重新安装 Mac 操作系统,即使您需要先抹掉启动磁盘也是如此。您只需连接到互联网即可。如果有可用的无线网络,则您可以从菜单栏的 Wi-Fi 菜单 8d6efede4e07c47ff89850393f4dd07e.png 中选取相应网络。macOS 恢复功能中也提供了这个菜单。

    1. 通过 macOS 恢复功能启动

    要通过 macOS 恢复功能启动,请开启 Mac 并立即按住键盘上的以下组合键之一。当您看到 Apple 标志、旋转的地球或其他启动屏幕时,请松开这些按键。

    Command (⌘)-R

    重新安装您的 Mac 上装有的最新 macOS(建议操作)

    Option-⌘-R

    升级到与您的 Mac 兼容的最新 macOS。

    Shift-Option-⌘-R

    重新安装 Mac 随附的 macOS 或与它最接近且仍在提供的版本。

      系统可能会提示您输入密码,例如固件密码,或这台 Mac 的管理员用户的密码。请输入要求的密码以继续。

    f430cf492875aebc4a1c8e6ccdc59c5b.png

    当您看到实用工具窗口时,即表示您已通过 macOS 恢复功能启动。

    729140c70e98160dafa97e757da01e4b.png

    2. 确定是否要抹掉(格式化)您的磁盘

    除非您要出售、折抵换购或赠送您的 Mac,或者遇到一个需要您抹掉磁盘的问题,否则您可能不需要抹掉磁盘。如果您在安装 macOS 之前需要抹掉磁盘,请从“实用工具”窗口中选择“磁盘工具”,然后点按“继续”。进一步了解何时以及如何抹掉。

    3. 安装 macOS

    在做好重新安装 macOS 的准备后,请从“实用工具”窗口中选取“重新安装 macOS”。然后,点按“继续”,并按照屏幕上的说明进行操作。系统将提示您选取一个作为安装目标的磁盘。

    • 如果安装器要求解锁您的磁盘,请输入您在登录 Mac 时所使用的密码。
    • 如果安装器无法识别您的磁盘,或者指出它无法安装到您的电脑或宗卷上,您可能需要先抹掉磁盘。
    • 如果安装器适用的 macOS 版本与您预期的版本有所不同,请了解 macOS 恢复功能例外情况。
    f31db67eb4cd59128c305b97c36a14bc.png请不要将 Mac 置于睡眠状态或合上上盖,以便安装完成。在安装过程中,Mac 可能会多次重新启动并显示进度条,并且屏幕可能每次都处于空白状态并持续几分钟时间。如果您的 Mac 重新启动并进入设置助理,但您要出售、折抵换购或赠送这台 Mac,请按下 Command-Q 以退出助理而不完成设置。然后点按“关机”。当新的所有者启动这台 Mac 时,他们可以使用自己的信息来完成设置。 

    macOS 恢复功能例外情况

    在某些情况下,macOS 恢复功能提供的 macOS 版本可能有所不同:
    • 如果这台 Mac 上从未安装过 macOS Sierra 10.12.4 或更高版本,则 Option-Command-R 会安装您的 Mac 随附的 macOS 或与它最接近且仍在提供的版本。此时,Shift-Option-Command-R 不可用。
    • 如果您抹掉了整个磁盘而不是仅抹掉磁盘上的启动宗卷,则 macOS 恢复功能可能只提供您的 Mac 随附的 macOS 或与它最接近且仍在提供的版本。您可以在之后升级到更高版本。
    • 如果您的 Mac 配备 Apple T2 安全芯片,并且您从未安装过 macOS 更新,则 Option-Command-R 会安装您的 Mac 上曾安装过的最新版 macOS。
    • 如果您在近期的维修过程中更换了 Mac 的主板,则 macOS 恢复功能可能只提供与您的 Mac 兼容的最新版 macOS。
    如果 macOS 恢复功能无法提供您所需的安装器,则您或许能够使用 macOS 的其他安装方式之一方法二:macOS 其他安装方式(U盘),上期发过制作U盘教程,回复关键字获取官网链接macOS系统制作:1、首先,准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料。2、下载好 macOS Mojave 正式版的安装程序备用,先不要启动安装。3、打开 “应用程序 → 实用工具 → 磁盘工具”,将U盘「抹掉」(格式化) 成「Mac OS X 扩展(日志式)」格式、GUID 分区图,并将 U 盘命名为「Mojave」。注意:这个盘符名称必须与后面的命令里的名称一致,需要认真看清楚,很多新手容易出错在这里) 

    533d0a04091dcc08bb986ddee1b4c5d4.png

     4、打开 “应用程序→实用工具→终端”,将下面的一段命令复制并粘贴进去:如要制作 macOS Mojave 启动盘,U盘名称要改成「Mojave」(必须与下面命令对应),然后拷贝这段命令:
    sudo /Applications/Install\ macOS\ Mojave.app/Contents/Resources/createinstallmedia --volume /Volumes/Mojave /Applications/Install\ macOS\ Mojave.app --nointeraction
     如要制作 macOS High Sierra 启动盘,U盘名称要改成「HighSierra」(要与下面命令对应),拷贝这段命令:
    sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/HighSierra --applicationpath /Applications/Install\ macOS\ High\ Sierra.app --nointeraction
     如要制作「旧版本的 macOS Sierra」,U盘名称改成「Sierra」(要与下面命令对应),拷贝这段命令:
    sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Sierra --applicationpath /Applications/Install\ macOS\ Sierra.app --nointeraction
     5、回车并执行该命令,这时会提示让你输入管理员密码,便会开始制作过程了: 

    ff9f571f8257f63e9e11cf4efd6e2219.png

     6、如上图,这时系统已经在制作中了,请耐心等待,出现下图字样即表示大功告成了!win系统制作:上期发过制作U盘教程,回复关键字获取官网链接于很多使用苹果电脑的读者在安装windows的时候出现了各种问题,但是又将苹果自带的苹果系统删除导致不仅没装成win反而连自带的苹果mac系统也没了,如果要恢复系统又要漫长的等待,这样买回来的苹果电脑就成了摆设,今天小编教读者在windows7下制作苹果mac os x 10.10Yosemiteu盘启动盘,有了u盘启动盘后安装苹果系统只需要在一小时内就能完成。二、win7下制作mac os x启动U盘步骤如下1、下载TransMac启动盘制作工具,并安装好;2、插入准备好的U盘,U盘数据要转移,打开TransMac,右键U盘选择“Format Disk for Mac”,将U盘格式化成Mac下的格式(链接带有操作流程)

    使用启动管理器

    在您使用启动管理器选择启动磁盘时,您的 Mac 将从相应磁盘启动一次,然后继续使用在“启动磁盘”偏好设置中选择的磁盘。
    1. 将 Mac 开机或重新启动后,立即按住 Option (Alt) 键。
    2. 当您看到“启动管理器”窗口时,松开 Option 键。如果您的 Mac 受固件密码保护,则您可以在系统要求您输入密码时松开这个按键。
    3. 选择启动磁盘,然后点按这个磁盘图标下的箭头或按下 Return 键。 选择系统盘按回车
    50eb520cce08aa84579949b93304a085.png

    抹掉启动磁盘

    1. 从 macOS 恢复功能启动。
    2. 从 macOS 恢复功能的“实用工具”窗口中,选择“磁盘工具”。然后,点按“继续”。

      88b23ab9580c84f0889b7ababe3d74b4.png

    3. 确保“磁盘工具”中的边栏显示启动磁盘的名称。除非您另外重新命名,否则代表启动磁盘的宗卷是 Macintosh HD。没看到它的名称?
    4. 查找具有相同名称的“Data”宗卷,例如“Macintosh HD - Data”。如果您有这样的宗卷,请选择它。然后,从菜单栏中选取“编辑”>“删除 APFS 宗卷”,或者点按“磁盘工具”工具栏中的删除宗卷按钮 (–)。
      当收到提示要求确认时,点按“删除”按钮。请勿点按“删除宗卷组”。执行相同的操作以删除启动磁盘上可能存在的其他宗卷,名为“Macintosh HD”的宗卷除外。

    028ed7c22b57bf9be486a4c96df5e781.png

    1. 删除所有数据宗卷后,在边栏中选择“Macintosh HD”。
    2. 点按“抹掉”按钮或标签页,然后填写以下各项:
    • 名称:输入您希望宗卷在被抹掉后使用的名称,例如“Macintosh HD”。
    • 格式:选取“APFS”或“Mac OS 扩展(日志式)”作为 Mac 宗卷的格式。默认情况下,“磁盘工具”会显示推荐的 Mac 格式。
    点按“抹掉”以开始抹掉磁盘。系统可能会提示您输入 Apple ID。

    0d3b653c6f8ab191c8ce9754719f658d.png

    完成后,退出“磁盘工具”以回到“实用工具”窗口。 如果您希望 Mac 能够再次从此宗卷启动,请从“实用工具”窗口中选取“重新安装 macOS”,然后按照屏幕上的说明操作,在宗卷上重新安装 macOS。如不重新安装 macOS,Mac 启动时可能会出现一个闪烁的问号 (?)。

    如何更改磁盘的分区图(方案)

    在某些情况下,您可能需要在抹掉时更改分区图(方案)。如果您遵循的说明要求选取方案,则“磁盘工具”中的操作步骤与上述步骤不同。
    1. 打开“磁盘工具”后,从菜单栏中选取“显示”>“显示所有设备”。
    2. 现在,边栏不仅显示宗卷,还显示包含这些宗卷的磁盘(设备)。在下面的示例中,APPLE SSD 是磁盘,Container disk1 是这个磁盘上的容器,而 Macintosh HD 是这个容器中的宗卷。(只有 APFS 格式的磁盘才包含容器。)

      f656e2afbfb2a4b07475aa078eb56ae0.png

    3. 选择要抹掉的磁盘,例如 Apple SSD。
    4. 查看窗口右侧显示的信息,找到当前正在使用的分区图:
    • GUID 分区图适用于 Mac 磁盘。
    • 主引导记录适用于与 PC 或“启动转换”一起使用的外置驱动器。
    如果分区图不适用于磁盘的预期用途,请点按“抹掉”按钮或标签页,然后填写以下各项:
    • 名称:输入您希望磁盘在被抹掉后使用的名称,例如“Apple SSD”。
    • 格式:要格式化为 Mac 磁盘,请选取“APFS”或“Mac OS 扩展(日志式)”。默认情况下,“磁盘工具”会显示兼容的格式。
    • 方案:选取适当的分区图方案。
    点按“抹掉”以开始抹掉磁盘。如果要抹掉启动磁盘,系统可能会提示您输入 Apple ID。完成后,退出“磁盘工具”。 如果您希望 Mac 能够再次从此磁盘启动,请从“实用工具”窗口中选取“重新安装 macOS”,然后按照屏幕上的说明操作,在磁盘上重新安装 macOS。9.再次选择系统盘点击安装系统,安装大概需要80分钟,自动安装,不需要盯屏幕。总结:1.U盘插到苹果电脑上,重启电脑,按option键,选U盘的分区进去2.选中-整个硬盘(内置下面) 点抹掉,名称写:MAC (或是由你写)

    格式是:MAC OS 扩展(日志式),方案选:GUID

    3.点击左上角第一个红色按钮,关了这个磁盘工具

    4.把电脑右上角的无线关了,有网线也拨出来。点屏幕顶部菜单栏,右边的{实用工具}找到终端

    在终端中直接输入 date 122014102017.30【10.14.6系统】,英文和数字之间有空格,输完回车。

    5.点菜单上面的终端两个字,退出终端。

    6.直接点 安装macOS(第二项),点继续。

    下载TransMac启动盘制作工具官网系统链接,点击【U盘安装mac系统 回复关键词获取!!!

    还请小伙伴们多多支持6b43fa019a107e8154f3776c78ac88fb.png,顺手给作者加个鸡腿650457f8c877543e5f3b714c9ef7911f.png,非常感谢

    展开全文
  • 作为名影音爱好者,经常拍摄和处理高清视频、照片是常有的事,因此也常常会遇到件很头痛的事情。那就是海量视频的转移、处理和存储问题,一般我们单机处理是没有太大的问题,但是如果要进行视频剪辑渲染、然后将...

    作为一名影音爱好者,经常拍摄和处理高清视频、照片是常有的事,因此也常常会遇到一件很头痛的事情。那就是海量视频的转移、处理和存储问题,一般我们单机处理是没有太大的问题,但是如果要进行视频剪辑渲染、然后将视频进行转移到其他媒介时,这时候就很头大了。

    0b84be7606b36f776eda09dbd5011485.png

    虽然现在电脑上都配置有高速端口,如苹果的闪电接口,目前已经发展到了闪电3(Thunderbolt3 )了,其理论速度技术比USB3.0快8倍(达到40Gbps),但是光有接口的支持是不够的,我们还得有相应的硬盘的足够大的存储空间来匹配,这时候我们就需要到磁盘阵列了。

    d08b59e26c2162141520389574da092f.png

    所谓磁盘阵列就是使用将多个硬盘组合成一个容量较大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能,不同的阵列模式能够带来不同的可靠性、空间使用率和传输速度的差异体验。

    b11ca0e723e4c59fa1e754d2cd37dce1.png

    铁威马(TERRA MASTER)D2-330 双盘位雷电3磁盘阵列盒(以下简称:铁威马D2-330磁盘阵列),作为一款定位影视非编存储柜,希望解决的就是海量高清视频的处理和存储问题,利用雷电接口的高速和磁盘阵列的高速和安全,带来快如闪电般的视频工作流。

    22b48a6d1b8e288ffa01aefa0e368e31.png

    磁盘阵列采用银色铝合金外壳,兼顾了轻巧与安全,有效保护硬盘和数据物理安全。

    左侧是两个硬盘工作指示灯和电源指示灯,最下方是电源开关。

    3e278460ab9e20db77d5cc04d4989be3.png

    铁威马D2-330磁盘阵列拥有两个硬件位,可最大支持总28TB硬盘(单个最多14TB)。可选用3.5寸 SATA硬盘、2.5寸 SATA硬盘或者是2.5寸 SSD硬盘。

    60ca8d961d8e6d96920956240d4c60d0.png

    227mm*119mm*133mm的尺寸,1.46g净重,配合上方的手柄使用,还是非常方便的,这样外带录影、拷片或者是送样片也都比较轻松。

    a9c1474d0b15e69a603655d61d84588d.png

    为了保证硬盘的长时间有效高速工作,铁威马D2-330磁盘阵列配置了一个80mm*80mm的大风扇,风扇是温度控制,自动调节的。

    右侧从上到下分别是:12V直流供电电源输入口(自带电源转换器)、DP1.2接口、两个闪电3接口。

    d80d15de3e7686fe3696482e9169f1ec.png

    铁威马D2-330磁盘阵列支持4种阵列模式,RAID0、RAID1、SINGLE和JBOD模式,RAID0速度最快,但是无备份。RAID1则是兼顾和速度与安全,但是容易只有一半。SINGLE模式两个硬盘独立使用模式,而JBOD只是将硬盘简单地组成了一个大硬盘。

    5c571496d2ee4a9a01763c0da1d77f0a.png

    用户可以依据自己的需要来调整不同的阵列工作模式,调整后,我们需要通过RESET来复位硬盘,并且初始化后才能正常使用磁盘阵列。

    e6016ca744beef5827b19ea3dc5cffbe.png

    所有的调整、安装过程中要使用到的小工具,厂家都附送好了。

    【安装】

    d15ccb01bbe5cfca821c24105a33b1f5.png

    向外抬起硬盘安装盒下方的开关即可取下安装盒

    55bc66928412ef3e76fd7394f8dd09b1.png

    这里我们选用两块同样规格的西数4TB SATA 3.5英寸硬盘,西部作为全球知名的硬盘厂商,也是历史最悠久的硬盘厂商之一,其品质和性能也是非常有保证的,这对于我们后期视频处理打下硬基础,毕竟好马配好鞍才能跑得快。

    70db2a6a7fd522c633c2c357d15e274f.png

    使用附送的螺丝刀和螺丝将硬盘安装好在硬盘安装盒上。

    e06129f2b9bb0a4d1b99cbe17759e566.png

    将硬盘嵌入到磁盘阵列中,这里要注意好方向。

    dfc3d03a7f10dbc286ca62e86b53d144.png

    安装过程还是非常简单的,其杠杆式的设计,既省力又能保证硬盘安装的牢固可靠,这点对于磁盘阵列的移动性保障非常重要。

    d3bd94a9446a299b0c31a6ac82de9fe4.png

    安装好后,为了方便识别,我们还可以给硬盘贴上标签。

    5f826e597567aacb212d3bebadbed2e3.png

    使用闪电3的连接线将硬盘和电脑连接好,再将电源连接好,开机。

    【测试】

    f0481228ed1952354f9403cda066e413.png

    我们首先进行RAID0模式的测试,将模式调整到RAID0,长按RESET进行硬盘的复位。(非切换模式不要随意复位,每次切换模式都要硬盘初始化,数据就没有了)

    87d6280a4531c79d27dcaf8d860f034e.png

    此时电脑会提示我们硬盘没有初始化,我们点击初始化,进入上面的界面,这里我们可以看到在RAID0下,两个硬盘是组成了一个高速硬盘,完整存储空间为8TB。我们通过抹掉来进行硬盘格式化。

    4f93abdd4d93029f464a655c59b8fa6b.png

    格式化由于没有设定名字,因此硬盘名叫未命名,对其使用blackmagic disk speed test进行读写测速。

    高速模式下西数SATA硬盘的写入速度327.5MB/s,读取速度为339.8MB/s,支持的各种高清格式视频格式的支持和处理速率还是不错的。如果使用SSD固态硬盘的话,相信结果会更出色。

    27be5e6c67f14fb6c689cef1be351f18.png

    再切换到SINGLE模式,我们可以看到两个独立的硬盘,都是4TB,这时我们测试其中一个硬盘的读写性能,可以看到读和写速度分别在179.1MB/s和174.9MB/s。

    46b60a881ce039317a346f308796cdad.png

    个人一般日常使用高速在RAID1上,保证速度的同时也让数据更加安全。实际影片剪辑处理也非常流畅,体验不错。

    【总结】

    b8db0953744c7298dc5cf4fb71f5ebd5.png

    铁威马(TERRA MASTER)D2-330 双盘位雷电3磁盘阵列盒,作为一款定位影视非编存储柜,能够非常高效快速地帮我们解决海量高清视频的处理和存储问题,为我们带来非凡地高速体验。多种阵列模式可选,方便用户使用。雷电3接口带来的高速传输,配合西数或者相关优秀的SATA或SSD硬盘,让我们的工作更有效率,更加安全。

    展开全文
  • 在前文《read文件一个字节实际会发生大的磁盘IO?》写完之后,本来想着偷个懒,只通过读操作来让大家了解下Linux IO栈的各个模块就行了。但很同学表示再让我写一篇关于写操作的。既然不少同学都有这个需求,那我...

    4aa4c729137808033fcb068ee87aeeda.png

    在前文《read文件一个字节实际会发生多大的磁盘IO?》写完之后,本来想着偷个懒,只通过读操作来让大家了解下Linux IO栈的各个模块就行了。但很多同学表示再让我写一篇关于写操作的。既然不少同学都有这个需求,那我就写一下吧。

    Linux内核真的是太复杂了,源代码的行数已经从1.0版本时的几万行,到现在已经是千万行的一个庞然大物了。直接钻进去的话,很容易在各种眼花缭乱的各种调用中迷失了自己,再也钻不出来了。我分享给大家一个我在琢磨内核的方法。一般我自己先想一个自己很想搞清楚的问题。不管在代码里咋跳来跳去,时刻都要记得自己的问题,无关的部分尽量少去发散,只要把自己的问题搞清楚了就行了。

    现在我想搞明白的问题是,在最常用的方式下,不开O_DIRECT、不开O_SYNC(写文件的方法有很多,有sync模式、direct模式、mmap内存映射模式),write是怎么写的。c的代码示例如下:

    #include <fcntl.h>
    int main()
    {
        char c = 'a';
        int out;
    
        out = open("out.txt", O_WRONLY | O_CREAT | O_TRUNC);
        write(out,&c,1);
        ...
    }

    进一步细化我的问题,我们对打开的文件写入一个字节后

    • write函数在内核里是怎么执行的?
    • 数据在什么时机真正能写入到磁盘上?

    我们在讨论的过程中不可避免地要涉及到内核代码,我使用的内核版本是3.10.1。如果有需要,你可以到这里来下载。https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/

    write函数实现剖析

    我花了不短的时候跟踪write写到ext4文件系统时的各种调用和返回,大致理出来了一个交互图。当然为了突出重点,我抛弃了不少细节,比如DIRECT IO、ext4日志记录啥的都没有体现出来,只抽取出来了一些我认为关键的调用。

    9f21dc177ab48fd7499fad69ce92207b.png
    图1 write函数内部实现

    在上面的流程图里,所有的写操作最终到哪儿了呢?在最后面的_block_commit_write中,只是make dirty。然后大部分情况下你的函数调用就返回了(稍后再说balancedirty_pages_ratelimited)。数据现在还在内存中的PageCache里,并没有真正写到硬盘。

    为什么要这样实现,不直接写硬盘呢?原因就在于硬盘尤其是机械硬盘,性能是在是太慢了。一块服务器级别的万转盘,最坏随机访问平均延迟都是毫秒级别的,换算成IOPS只有100多不到200。设想一下,假如你的后端接口里每个用户来访问都需要一次随机磁盘IO,不管你多牛的服务器,每秒200的qps都将直接打爆你的硬盘,相信作为为百万/千万/过亿用户提供接口的你,这个是你绝对不能忍的。

    Linux这么搞也是有副作用的,如果接下来服务器发生掉电,内存里东西全丢。所以Linux还有另外一个“补丁”-延迟写,帮我们缓解这个问题。注意下,我说的是缓解,并没有彻底解决。

    再说下balance_dirty_pages_ratelimited,虽然绝大部分情况下,都是直接写到Page Cache里就返回了。但在一种情况下,用户进程必须得等待写入完成才可以返回,那就是对balance_dirty_pages_ratelimited的判断如果超出限制了。该函数判断当前脏页是否已经超过脏页上限dirty_bytes、dirty_ratio,超过了就必须得等待。这两个参数只有一个会生效,另外1个是0。拿dirty_ratio来说,如果设置的是30,就说明如果脏页比例超过内存的30%,则write函数调用就必须等待写入完成才能返回。可以在你的机器下的/proc/sys/vm/目录来查看这两个配置。

    # cat /proc/sys/vm/dirty_bytes
    0
    # cat /proc/sys/vm/dirty_ratio
    30

    内核延迟写

    内核是什么时候真正把数据写到硬盘中呢?为了快速摸清楚全貌,我想到的办法是用systemtap工具,找到内核写IO过程中的一个关键函数,然后在其中把函数调用堆栈打出来。查了半天资料以后,我决定用do_writepages这个函数。

    #!/usr/bin/stap
    probe kernel.function("do_writepages")
    {
        printf("--------------------------------------------------------n"); 
        print_backtrace(); 
        printf("--------------------------------------------------------n"); 
    }

    systemtab跟踪以后,打印信息如下:

    0xffffffff8118efe0 : do_writepages+0x0/0x40 [kernel]
     0xffffffff8122d7d0 : __writeback_single_inode+0x40/0x220 [kernel]
     0xffffffff8122e414 : writeback_sb_inodes+0x1c4/0x490 [kernel]
     0xffffffff8122e77f : __writeback_inodes_wb+0x9f/0xd0 [kernel]
     0xffffffff8122efb3 : wb_writeback+0x263/0x2f0 [kernel]
     0xffffffff8122f35c : bdi_writeback_workfn+0x1cc/0x460 [kernel]
     0xffffffff810a881a : process_one_work+0x17a/0x440 [kernel]
     0xffffffff810a94e6 : worker_thread+0x126/0x3c0 [kernel]
     0xffffffff810b098f : kthread+0xcf/0xe0 [kernel]
     0xffffffff816b4f18 : ret_from_fork+0x58/0x90 [kernel]

    从上面的输出我们可以看出,真正的写文件过程操作是由worker内核线程发出来的(和我们自己的应用程序进程没有半毛钱关系,此时我们的应用程序的write函数调用早就返回了)。这个worker线程写回是周期性执行的,它的周期取决于内核参数dirty_writeback_centisecs的设置,根据参数名也大概能看出来,它的单位是百分之一秒。

    # cat /proc/sys/vm/dirty_writeback_centisecs
    500

    我查看到我的配置是500,就是说每5秒会周期性地来执行一遍。回顾我们的问题,我们最关心的问题的啥时候写入的,围绕这个思路不过多发散。于是沿着这个调用栈不断地跟踪,跳转,终于找到了下面的代码。如下代码里我们看到,如果是for_background模式,且over_bground_thresh判断成功,就会开始回写了。

    static long wb_writeback(struct bdi_writeback *wb,
                             struct wb_writeback_work *work)
    {
        work->older_than_this = &oldest_jif;
        ...
        if (work->for_background && !over_bground_thresh(wb->bdi))
            break;
        ...
    
        if (work->for_kupdate) {
            oldest_jif = jiffies -
                    msecs_to_jiffies(dirty_expire_interval * 10);
        } else ...
    }
    static long wb_check_background_flush(struct bdi_writeback *wb)
    {
        if (over_bground_thresh(wb->bdi)) {
            ...
            return wb_writeback(wb, &work);
        }
    }

    那么over_bground_thresh函数判断的是啥呢?其实就是判断当前的脏页是不是超过内核参数里dirty_background_ratio或dirty_background_bytes的配置,没超过的话就不写了(代码位于fs/fs-writeback.c:1440,限于篇幅我就不贴了)。这两个参数只有一个会真正生效,其中dirty_background_ratio配置的是比例、dirty_background_bytes配置的是字节。

    在我的机器上的这两个参数配置如下,表示脏页比例超过10%就开始回写。

    # cat /proc/sys/vm/dirty_background_bytes
    0
    # cat /proc/sys/vm/dirty_background_ratio
    10

    那如果脏页一直都不超过这个比例怎么办呢,就不写了吗? 不是的。在上面的wb_writeback函数中我们看到了,如果是for_kupdate模式,会记录一个过期标记到work->older_than_this,再往后面的代码中把符合这个过期条件的页面也写回了。dirty_expire_interval这个变量是从哪儿来的呢? 在kernel/sysctl.c里,我们发现了蛛丝马迹。哦,原来它是来自/proc/sys/vm/dirty_expire_centisecs这个配置。

    1158         {
    1159                 .procname       = "dirty_expire_centisecs",
    1160                 .data           = &dirty_expire_interval,
    1161                 .maxlen         = sizeof(dirty_expire_interval),
    1162                 .mode           = 0644,
    1163                 .proc_handler   = proc_dointvec_minmax,
    1164                 .extra1         = &zero,
    1165         },

    在我的机器上,它的值是3000。单位是百分之一秒,所以就是脏页过了30秒就会被内核线程认为需要写回到磁盘了。

    # cat /proc/sys/vm/dirty_expire_centisecs
    3000

    结论

    我们demo代码中的写入,其实绝大部分情况都是写入到PageCache中就返回了,这时并没有真正写入磁盘。我们的数据会在如下三个时机下被真正发起写磁盘IO请求:

    • 第一种情况,如果write系统调用时,如果发现PageCache中脏页占比太多,超过了dirty_ratio或dirty_bytes,write就必须等待了。
    • 第二种情况,write写到PageCache就已经返回了。worker内核线程异步运行的时候,再次判断脏页占比,如果超过了dirty_background_ratio或dirty_background_bytes,也发起写回请求。
    • 第三种情况,这时同样write调用已经返回了。worker内核线程异步运行的时候,虽然系统内脏页一直没有超过dirty_background_ratio或dirty_background_bytes,但是脏页在内存中呆的时间超过dirty_expire_centisecs了,也会发起会写。

    如果对以上配置不满意,你可以自己通过修改/etc/sysctl.conf来调整,修改完了别忘了执行sysctl -p。

    最后我们要认识到,这套write pagecache+回写的机制第一目标是性能,不是保证不丢失我们写入的数据的。如果这时候掉电,脏页时间未超过dirty_expire_centisecs的就真的丢了。如果你做的是和钱相关非常重要的业务,必须保证落盘完成才能返回,那么你就可能需要考虑使用fsync。

    欢搜索微信公众号开发内功修炼!

    展开全文
  • 1 当前设备的情况服务器上有四个磁盘, 一个500G的固态, 三个2T的机械。 目前的话系统是装在一个2T的机械盘上边, 导致其他用户无法访问其他盘的情况。 采用的解决方案是, 使外置硬盘开机自动挂载到root用户下,然后...
  • 电脑硬盘分区不见了怎么恢复数据?电脑硬盘分区不见了怎么办?丢失的分区和数据还能恢复吗?...根据用户需要,一块硬盘可以分成一个个分区,用于安装系统、存放个人数据等。电脑硬盘上的这些分区并不是...
  • 新电脑,新硬盘都是只有一个分区,所以有很小伙伴在买下新电脑或者新硬盘时,不知道该不该分区,又该如何分区,这个事难倒了众多网友。不过从今天开始,这个问题不再是问题,小编这就来给大家讲一讲分区得的那些事...
  • 展开全部给电脑硬盘进行格式化并2113且分区,一般分4个分区为5261好,尤4102其是MBR引导形式的硬盘,如果分区1653超过四个就得建立一个扩展分区,在扩展分区里再建立一个或者个逻辑分区,比较麻烦,不推荐!...
  • 有时候我们的电脑磁盘因为存放的数据和资料太满了,又不想一个一个的删除,这时候您就可以通过格式化的方法来快速释放磁盘空间了,下面来看看具体操作步骤。电脑怎么格式化磁盘1.小编这里以win7系统为例说明,双击...
  • 1、RAID0RAID0技术把块(至少两块)物理硬盘设备通过软件或硬件的方式串联在一起,组成一个大的卷组,并将数据依次写入到各个物理硬盘中。这样,在最理想的情况下,硬盘设备的读写性能会提升数倍,但是若任...
  • 新电脑,新硬盘都是只有一个分区,所以有很小伙伴在买下新电脑或者新硬盘时,不知道该不该分区,又该如何分区,这个事难倒了众多网友。不过从今天开始,这个问题不再是问题,小编这就来给大家讲一讲分区得的那些事...
  • 小强一键重装系统学习电脑技能,提升能力,优秀人士的聚集地。...二:win7电脑怎么清理磁盘碎片具体操作方法如下:1、打开计算机,右键单击一个盘符,选择属性选项,如图所示:2、切换到工具选项卡,并点击立即清...
  • 但很Mac book用户通常在实际使用过程中会有下面这些多样的需求和烦恼:1、 在mac下安装双系统,台电脑顶两台使用。但是每次使用不同系统都需要重启电脑,无法在macos中直接使用win软件。2、在mac里装虚拟机,...
  • 一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太或C盘太,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时...
  • #新机只有一个C盘可以使用那么想要拥有更的分区该怎么操作呢?今天小微就来给大家详细介绍一下Windows 10系统磁盘分区的操作方法!一起来看看吧~一、关闭C盘系统保护Step1:右击【此电脑】选择【属性】,点击右侧...
  • 一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太或C盘太,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时...
  • 在asktom的论坛里面,看到有人提问:一个tikv节点磁盘坏了,现在是down状态,tikv.log里面不停写入太关于这个节点访问不了的日志信息,占据大量磁盘,她的处理方式如下: a、根据ip地址,找到这个节点的store id ...
  • VHD虚拟磁盘,就是在C盘划分一定的空间出来,然后利用这个空间虚拟一个硬盘。VHD虚拟磁盘装系统不受分区限制,也不用格式化某个分区,只要是NTFS的磁盘分区格式就能创建,一般用于安装个操作系统。这篇文章是本站...
  • 之前在《如何让程序真正地后台运行》一文中提到了程序后台运行的写法,但是里面的示例程序在某些场景下是会有问题的,这里先不说什么问题,我们先看看这个磁盘满的问题是怎么产生的,通过这篇文章你将会学习到大量...
  • 请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言大多数系统管理员会...跟agedu工具打个招呼(发音为'age dee you') - 它会扫描一个目录...
  • 我们新买的笔记本电脑,买回来的时候发现只有一个C盘分区,怎么办呢?很用户都喜欢将工作、生活和游戏的资源分类存放,这样就需要给硬盘分区了。下面由小编手把手带大家进行磁盘的分区。 第一步:首先我们点击...
  • 2010年3月26日星期五GHOST后,整个磁盘就剩下一个C盘了 Ghost操作失误,装操作系统...磁盘中还有很重要的数据,这可怎么恢复呀。这个案例中最主要的原因是,在Ghost时,把磁盘的分区表弄丢了。要想找到以前的盘符,
  • 一般情况下在装机时都将一个磁盘分成4个分区,有时候是系统分区C盘太小,数据盘太或C盘太,其它数据盘太小。甚至还有一个硬盘的所有容量都划分给系统盘使用。总之就是磁盘分区可能不合理,这时怎么解决呢?这时...
  • 最近在用U盘的时候,一直弹出请插入卷集的最后一张磁盘,然后单击‘确定’继续,而且你点了还有,点了还有,很影响界面操作,第反应是U盘中病毒了,但是用金山毒霸查杀之后仍然有此问题,可见不是中病毒了。...
  • 平时大家用电脑很时候让人头疼的是电脑没装多少软件,也没有多少文件 磁盘就莫名其妙的满了,这是什么原因呢?安装了的软件我已经卸载了 文件已经删除了怎么空间也没大...今天就分享给大家一个专门清理这些垃圾...
  • 磁盘组概览磁盘组是一个或个磁盘的逻辑分组,ASM 将其作为一个集合来管理。每个磁盘组都包含与自身相关联的元数据。在概念上,ASM 磁盘组类似于...但是,一个磁盘组可以包含属于个数据库的文件,而一个数据库可...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 960
精华内容 384
关键字:

怎么多一个磁盘