linux和磁盘(1):基本概念

磁盘的物理构造

在这里插入图片描述
在这里插入图片描述

磁盘的工作过程可以参考下面这道腾讯的笔试题目。数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环磁道上有10个物理块,10个数据记录R1~R10存放在这个磁道上,记录的安排顺序如下表所示:

物理块 1 2 3 4 5 6 7 8 9 10
逻辑记录 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
    假设磁盘的旋转速度为20ms,磁盘当前处在R1的开头处,若系统顺序扫描后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录),则处理这10个记录的最长时间是多少?

    磁盘会一直朝某个方向旋转,不会因为处理数据而停止。
    本题要求顺序处理R1到R10,起始位置在R1,一周是20ms,共10个记录,所以每个记录的读取时间为2ms。
    首先读R1并处理R1,读R1花2ms,读好后磁盘处于R1的末尾或R2的开头,此时处理R1,需要4ms,因为磁盘一直旋转,所以R1处理好了后磁盘已经转到R4的开始了,这时花的时间为2+4=6ms。
    这时候要处理R2,需要等待磁盘从R5一直转到R2的开始才行,磁盘转动不可反向,所以要经过8*2ms才能转到R1的末尾,读取R2需要2ms,再处理R2需要4ms,处理结束后磁盘已经转到R5的开头了,这时花的时间为2*8+2+4=22ms。
    等待磁盘再转到R3又要8*2ms,加上R3自身2ms的读取时间和4ms的处理时间,花的时间也为22ms,此时磁盘已经转到R6的开头了。
    写到这里,就可以看到规律了,读取并处理后序记录都为22ms,所以总时间为6+22*9=204ms。

上面提到的单缓冲,另一种模式为
单缓冲:缓冲区数据传输到用户区后,才能再从磁盘读取数据。
双缓冲:缓冲区数据传输到用户区的同时,也能从磁盘读取数据。(理解为两个缓存工作)
不过单缓冲和双缓冲这些面试题我认为没有任何意义,虽然原理正确,因为实际情况根本和上述计算不一致。操作系统对硬盘的操作实际上要复杂的多。
其实,硬盘本身也有自己的缓存,用来减少自己需要驱动电机的次数。(和上面的缓冲就不是一回事了)
在这里插入图片描述
磁盘的缓冲区是磁盘提供的硬件。硬盘厂商觉得编软件的都是不靠谱,还是自己也加一层缓冲减少磨损提升下寿命,免得给自己招黑。这也提醒我们,在和计算机有关的所有领域,加上属于你自己的缓存是一条不成文的规则。

对于一个操作系统而言,一个磁盘块(物理块,blocksize)的大小是4096b。这是操作系统和磁盘打交道的基本单位。对于磁盘而言,最小的单位是扇区。一个数据的具体存储在磁盘组合 -> 单个磁盘 -> 某一盘面 -> 某一磁道 -> 某一扇区。对于大部分磁盘来说,一个扇区只有512b。但是少部分磁盘可能有4096b。所以,在划分分区时,请注意一直保持4k对齐(其实结束未知被4k整除)不然可能会影响性能。fdisk进行磁盘分区时,默认就是4k对齐的。

磁盘和操作系统

在这里插入图片描述

  • VFS
    VFS是Linux 核心的一部分,其他内核子系统与VFS打交道,VFS又管理其他逻辑文件系统。所以VFS是文件系统和Linux 内核的接口,VFS以统一数据结构管理各种逻辑文件系统,接受用户层对文件系统的各种操作。

VFS存在的意义

  1. 向上,对应用层提供一个标准的文件操作接口;

  2. 对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;

  3. VFS内部则通过一系列高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;

  4. 此外VFS把一些复杂的操作尽量抽象到VFS内部,使得底层文件系统实现更简单。

读写流程

  • 读文件
  1. 用户发起read操作
  2. 操作系统查找页缓存
    若未命中,则产生缺页异常,然后创建页缓存,并从磁盘读取相应页填充页缓存
    若命中,则直接从页缓存返回要读取的内容
  3. 用户read调用完成
  • 写文件
  1. 用户发起write操作
  2. 操作系统查找页缓存
    若未命中,则产生缺页异常,然后创建页缓存,将用户传入的内容写入页缓存
    若命中,则直接将用户传入的内容写入页缓存
  3. 用户write调用完成
  4. 页被修改后成为脏页,操作系统有两种机制将脏页写回磁盘
  5. 用户手动调用fsync()
  6. 由pdflush进程定时将脏页写回磁盘
    一个标准的写流程如下
    在这里插入图片描述
    读操作与之类似。
    Linux内核里负责回写脏页的线程称为flusher线程,它们以“flush-”+“设备名”来命名,例如”[flush-8:64]”(这里设备名是指用设备号拼接的字符串)。
    在BDI(即backing device info)模块初始化(default_bdi_init())时会创建”[sync_supers]”和”[bdi_default]”两个线程。其中,“[sync_supers]”线程用来周期性(间隔同flusher线程)地同步系统中所有的superblocks(遍历全局super_blocks链表)。“[bdi_default]”线程则用来在必要时创建、启动和停止flusher线程。
    系统中每新增一个bdi设备(例如硬盘)就会通过bdi_register()注册到全局的bdi_list链表中,每个bdi设备都会有自己的flusher线程,在某个设备需要回写脏页时,bdi_default线程就会为其创建”[flush-devname]”线程(bdi_forker_thread())并运行,如”[flush-8:64]”。flusher线程的处理函数为bdi_writeback_thread(),负责周期性地回写脏页,实际回写操作由wb_do_writeback()函数完成(其第二个参数为1会等IO完成才返回,为0则立即返回)。
    flusher线程的回写的周期间隔为 dirty_writeback_interval,默认为5秒,可通过/proc/sys/vm/dirty_writeback_centisecs修改(kernel/sysctl.c),当然,如果其所属的bdi设备没脏页或者dirty_writeback_interval被置为0,线程就闲着了。
    实际上我们主动调用sync()去刷脏页的时候,就是通过wakeup_flusher_threads()和sync_filesystem()来回写所有bdi设备的脏页(即脏的inodes的address_space)和所有的superblocks的。
    上述内容涉及的代码均在mm/backing-dev.c、fs/fs-writeback.c里面。

磁盘 分区 和卷

卷和分区差距很大, 一个分区是一个物理磁盘连续空间。一个卷却可以跨越多达32个物理磁盘,这在服务器上是非常实用的功能。
在我们自己的PC上,一般把磁盘分为主分区、扩展分区、逻辑分区(实际上也就是2个分区,主分区和扩展分区)。一般一个物理磁盘的最大分区数目仅仅为4,这个是因为磁盘的MBR只有64个字节。
一个硬盘的主分区也就是包含操作系统启动所必需的文件和数据的硬盘分区,要在硬盘上安装操作系统,则该硬盘必须得有一个主分区。
扩展分区也就是除主分区外的分区,但它不能直接使用,必须再将它划分为若干个逻辑分区才行。逻辑分区也就是我们平常在操作系统中所看到的D、E、F等盘。
不管使用哪种分区软件,我们在给新硬盘上建立分区时都要遵循以下的顺序:建立主分区→建立扩展分区→建立逻辑分区→激活主分区→格式化所有分区。
服务器上采用的当然不是这种形式,不过我们是程序员兼任修电脑的,所以上面的知识还是要了解一下。

LVM架构如下所示

在这里插入图片描述

Raid

Redundant Arrays of Independent Drives
RAID0并不提供实际的冗余功能,但是却可以进行并发访问,在阵列中并发读写,充分利用磁盘总线容量。
在这里插入图片描述
RAID1则是一个工作磁盘,一个镜像磁盘。
在这里插入图片描述
软RAID使用linux指令mdadm来实现。软raid不能用作启动分区、使用CPU实现所以降低CPU利用率,不推荐在生产环境下使用。
硬RAID需要服务器上有raid卡这个硬件。或者主板直接支持。
下面这个就是直接从查到PCI中,拥有两个SATA口和一个IDE口的阵列卡。可以组成RAID。
在这里插入图片描述

虽然RAID使用很广,但是并不是所有时候都推荐使用RAID机制。比如说HDFS拥有自己的冗余机制,官方不推荐使用RAID,甚至是RAID0
https://zh.hortonworks.com/blog/why-not-raid-0-its-about-time-and-snowflakes/

那么,实际中,在linux中,我们又是怎么使用磁盘的呢?请参考
https://blog.csdn.net/define_us/article/details/52317791

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值