【操作系统】操作系统IO和虚拟文件系统VFS

news2024/11/26 8:30:48

1.什么是操作系统的IO

输入(input)和输出(output),就是对磁盘的读(read)和写(write)。

I/O模式可以划分为本地IO模型(内存、磁盘)和网络IO模型。

I/O关联到用户空间和内核空间的转换,也称为用户缓冲区和内核缓冲区。

用户态的应用程序不能直接操作内核空间,需要将数据从内核空间拷贝到用户空间才能使用。

  • read和write操作,都只能在内核空间里执行
  • 磁盘IO和网络IO请求都是先放在内核空间,然后加载到内存的数据

2.什么是文件系统

在linux中一切皆文件,文件系统是管理磁盘上的全部文件,文件管理组织方式多种多样,所以文件系统存在多样化。

文件系统是管理数据,而存储数据的物理设备有硬盘、U盘、SD卡、网络存储设备等。

不同的存储设备其物理结构不同,不同的物理结构就需要不同的文件系统去管理。

例子:

  • Windows有FAT12、FAT16、FAT32、NTFS、exFAT等文件系统。
  • Linux有Ext2、Ext3、Ext4、tmpfs、NFS等文件系统。

查询系统用了哪些文件系统:df -h -T

在这里插入图片描述

两个核心概念:

  • 索引节点(index node)
    • 简称inode,记录文件的元信息,比如文件大小、访问权限、修改日期、数据存储位置等。
    • 索引节点也需要持久化存储,占用磁盘空间。
  • 目录项(directory entry)
    • 简称为dentry,记录目录结构,比如文件的名字、索引节点指和其他目录的关联关系等,树状结构居多。
    • 存储在内存中,也叫目录项缓存。

3.什么是虚拟文件系统VFS

虚拟文件系统VFS(Virtual File System)就是调用读写位于不同物理介质上的不同文件系统,为各类文件系统提供统一的接口进行交互。

应用程序和具体的文件系统之间引入一个抽象层,开发者不用心底层的存储介质和文件系统类型就可以使用。

在这里插入图片描述

平时调用write的时候,数据是从应用写入到了C标准库的IO Buffer(存在用户态)

在关闭流之前flush下文件,通过flush将数据主动写入到内核的Page Cache中,如果应用挂了,数据不安全(存在内核态)

然后将内核中的Page Cache的数据写入到磁盘的缓存中,即使系统挂了,数据也是安全的,需要调用fsync(存在持久化介质)

4.写入磁盘数据不同参数案例

(1)写入到Page / Buffer Cache中

# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test1 bs=1M count=1024

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

(2)直接写入到磁盘的缓存区

# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test2 bs=1M count=1024 oflag=direct

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

(3)写入到磁盘的缓存区在同步到磁盘

# 释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
dd if=/dev/zero of=lixiang_test3 bs=1M count=1024 oflag=sync

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

(4)结果

  • 没有oflag的时候,文件复制速度是 oflag=direct 的多倍
    • 答案:默认是buffered I/O,数据写到缓存层便返回,所以速度最快
  • oflag=direct的速度又比 oflag=sync 快了点
    • 答案:数据写到磁盘缓存便返回,所以速度比上面的buffered I/O方式要慢
  • oflag=sync 的速度最慢
    • 答案:写入的数据全部落盘才返回,所以速度比上面的仅写到磁盘缓存要慢
    • 物理磁盘也会带有缓存 disk cache,用于提供I/O速度, 一般磁盘中带有电容,断电也能把缓存数据刷写到磁盘中

5.机械硬盘HDD简介

在这里插入图片描述

(1)概念介绍

  • 盘面号(磁头号)
    • 硬盘的每一个盘片都有两个盘面(Side),即上下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。
    • 每一个这样的有效盘面都有一个盘面号,按顺序从上至下从“0”开始依次编号。在硬盘系统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头
  • 磁道
    • 磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。
  • 柱面
    • 所有盘面上的同一磁道构成一个圆柱,通常称作为柱面(Cylinder),每个圆柱上的磁头由上而下从“0”开始编号。
  • 扇区
    • 即磁盘块、物理块。
    • 现代系统中,一般是512B大小,即512字节。
    • 将物理相邻的若干个扇区称为了一个簇。操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是簇(Cluster)。
    • 簇一般有这几类大小 4K,8K,16K,32K,64K等。

(2)磁盘如何读取数据

  • 磁臂摆动+盘片转动(耗时大所以导致慢,随机在硬盘上找一个数据,需要8-14ms),定位到目标扇区读取数据。
  • 磁臂在一定范围内摆动,来找到目标扇区,靠磁头把某个扇区的数据传输到总线上
  • 磁臂摆动范围有限,触达不到比较远的扇区,靠转轴来带动盘片,比如磁盘转速有7200转/分,1秒就是120圈
  • 常规1秒可以做100次随机IO,所以高并发业务单靠磁盘上扛不住的,基本都是要结合缓存
  • 想要优化,不用随机IO,采用顺序IO,节省了大量的物理耗时,比如Kafka、RocketMQ

6.磁盘读写常见指标

IOPS(Input/Output Operations per Second)

  • 指每秒能处理的I/O个数,表示块存储处理读写(输出/输入)的能力,单位为次,有顺序IOPS和随机IOPS
  • 比如100次/秒,那iops就是100次/秒,例如数据库类应用等典型场景重点提升这个指标,下面是阿里云盘性能
    • 高效云盘:2120 IOPS
    • ESSD云盘:2280 IOPS
    • SSD云盘:3000 IOPS
    • 参考:https://help.aliyun.com/document_detail/25382.html

吞吐量/带宽(Throughput)

  • 是指单位时间内可以成功传输的数据数量,单位为MB/s
  • 比如 一个硬盘的读写 IO 是 1MB,硬盘的 IOPS 是 100,那么硬盘总的吞吐率就是 100MB/s
    • 带宽 = IOPS * IO大小
  • 如果需要部署大量顺序读写的应用,例如Hadoop离线计算型业务等典型场景,需要关注吞吐量

容量(Capacity) 查看。df -h

  • 是指存储空间大小,单位为TiB、GiB、MiB或者KiB,块存储容量按照二进制单位计算
1B(byte 字节)=8bit
1KB(Kilobyte 千字节)=1024B
1MB(Megabyte 兆字节 简称“兆”)=1024KB
1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
1TB(Terabyte 万亿字节 太字节)=1024GB,
1PB(Petabyte 千万亿字节 拍字节)=1024TB,
1EB(Exabyte 百亿亿字节 艾字节)=1024PB

7.Linux磁盘IOPS性能测试

(1)什么是fio

  • 全称flexible I/O tester(灵活的I/O测试工具)是一个I/O工具
  • 可以根据用户指定的I/O类型,利用多线程/进程的I/O来对硬件进行压力测试和验证
# 安装fio
yum install fio -y
参数说明
filename待测试的文件或块设备
如果是文件,则是测试文件系统的性能,例:-filename = /work/fstest/fio.img
如果是块设备,则是测试裸设备的性能,例:-filename = /dev/vda1(注意容易损坏磁盘)
ioengineIO引擎fio支持多种引擎如:cpuio、mmap、sync、psync、filecreate、libaio等
常用libaio是linux异步读写IO(Linuxnative asynchronous I/O)
iodepth表示使用AIO时,同事发出I/O数的上限为128
direct是否采用直接I/O,(directIO)方式进行读写
如果采用直接I/O,则取值-direct = 1,否则取值-direct = 0
一般是用直接I/O写测试,测试结果更加真实
rw读写模式
read:顺序读测试,使用方式 -rw = read
write:顺序写测试,使用方式 -rw = wrie
randread:随机读测试,使用方式 -rw = randread
randwrite:随机写测试,使用方式 -rw = randwrite
randrw:随机读写,-rw = randrw,默认比率为5:5
numjobs测试进程的并发数,比如-numjobs = 16
bs单次IO的大小,比如 -bs = 4k
size测试文件的大小,比如 -size = 1G
sync设置同步模式,同步 -sync = 1,异步 -sync = 0
runtime设置测试运行时间,单位秒,比如:-runtime = 100
group_reporting结果把多线程汇总输出

(2)测试命令

# 随机读  
fio -direct=1 -iodepth=128 -rw=randread  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest1 -name=iotest1

在这里插入图片描述

# 随机写
fio -direct=1 -iodepth=128 -rw=randwrite  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest2 -name=iotest2

在这里插入图片描述

# 顺序读
fio -direct=1 -iodepth=128 -rw=read  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest3 -name=iotest3

在这里插入图片描述

# 顺序写
fio -direct=1 -iodepth=128 -rw=write  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest4 -name=iotest4

在这里插入图片描述

# 随机读写
fio -direct=1 -iodepth=128 -rw=randrw  -ioengine=libaio -bs=4k -size=1G  -runtime=10  -filename=iotest5 -name=iotest5

在这里插入图片描述

8.固态硬盘SSD简介

(1)什么是固态硬盘SSD

  • 固态电子元器件组成,没有盘片、磁臂等机械部件,不需要磁道寻址,靠电容存储数据。
  • 某块区域存在数据,机械硬盘写入可以直接覆盖,而固态硬盘需要先擦出,再写入。
  • block块擦的越多寿命就越短,业务数据高频更新,则不太建议使用固态硬盘
  • 最小读写单位是页,通常大小是4KB、8KB
  • 性能高,IOPS可以达到几万以上,价格比机械硬盘贵,寿命短。

(2)固态硬盘的组成结构

  • SSD多个裸片组成
  • 裸片多个平面组
  • 平面plane(多个block组成)
  • 块block(通常64个page组成一个block)
  • 页 page 4k

在这里插入图片描述

(3)磁盘的擦除数据

  • SSD里面最小读写单位是page,但是最小擦除单位是block。
  • 一个块上的某些页的数据被标记删除,不能直接擦除这些页,除非整个块上的页都被标记删除。
  • 块还有其它有效数据,当有新数据只能写入白色区域,并不能利用红色区域,时间越长,不能被使用的碎片越多。
  • 解决方式为标记整理机制程序,有效页数据复制到一个空白的块里,然后把整个块完全擦除。
  • **擦除数据 类似JVM的GC ,标记整理 Mark Compact **
    • 先对对象进行一个标记,看看哪些对象是垃圾
    • 整理会在清除的过程中,把可用的对象向前移动,让内存更为紧凑,避免内存碎片的产生
    • 整理之后发现内存更紧凑,连续的空间更多,就不会造成内存碎片的问题

在这里插入图片描述

9.操作系统的磁盘分区

(1)为啥要磁盘分区?

  • 方便管理、提升系统的效率和做好存储空间隔离分配
    • 将系统中的程序数据按不同的使用分为几类,将不同类型的数据分别存放在不同的磁盘分区中
    • 在每个分区上存放的都是相似的数据或程序,这样管理和维护就容易多
    • 分区可以提升系统的效率,系统读写磁盘时,磁头移动的距离缩短了,即搜寻的范围小了
    • 如果不运用分区,每次在硬盘上寻找信息时可能要寻找整个硬盘,所以速度会很慢
  • 允许在一个磁盘上有多个文件系统,每个分区可以分配不同的文件系统
    • 从而使操作系统可以识别每个分区的文件系统,从而实现文件的存储和管理
    • 创建硬盘分区后,还不能立即使用,还需要创建文件系统,即格式化
    • 格式化后常见的磁盘格式有:FAT(FAT16)、FAT32、NTFS、ext2、ext3等

(2)硬盘分区类型(不同类型的磁盘支持分区的数量有限制)

  • 主分区:直接在硬盘上划分,一个硬盘可以有1到3个主分区和1个扩展分区。
  • 扩展分区:是一个概念实际在磁盘中看不到,也无法直接使用扩展分区,在扩展分区中建立逻辑分区。

在这里插入图片描述

  • 容量
    • 硬盘的容量 = 主分区的容量+扩展分区的容量
    • 扩展分区的容量 = 各个逻辑分区的容量之和
  • 多个硬盘多个分区查看命令:lsblk
  • Linux系统下的硬盘分区设备名称
设备介绍设备在Linux中的中文名
IDE硬盘Hard DiskIntegrated Drive Electronics 电子集成驱动器
/dev/hd 是IDE 接口硬盘分区,一般用于普通桌面和服务器
/dev/hd[字母] [数字]
SCSI光盘Solid DiskSmall Computer System Interface 小型计算机系统接口
/dev/sd 是SCSI 接口硬盘分区,一般用于服务器
/dev/sd[字母] [数字]
virtio 虚拟磁盘Virtual Disk/dev/vd 虚拟磁盘分区,一般用于在虚拟机上扩展存储空间/dev/vd[字母] [数字]
  • fdisk 管理磁盘分区

在这里插入图片描述

  • df 检查文件系统的磁盘空间占用情况 ( 全称: disk free)

    • df -h -T 以磁盘分区为单位查看文件系统,获取硬盘被占用了多少空间,目前还剩下多少空间等信息

    • 通常加 -h 选项为根据大小适当显示

在这里插入图片描述

字段说明
Filesystem文件系统
Size分区大小
Used已使用容量
Avail还可以使用的容量
Use%已用百分比
Mounted on挂载点

10.磁盘冗余阵列

(1)磁盘阵列

  • 独立磁盘冗余阵列RAID(Redundant Array of Independent Disks)
  • 一种提供高可用性和数据容错性的数据存储技术。把几块硬盘组成一个阵列,并将它们的数据分布在不同的磁盘上。
  • 在硬盘发生故障时保护数据,还可以提高I/O性能,使系统能够更快的完成任务。
  • 简单来说:是把相同的数据存储在多个硬盘的不同的地方,存储冗余数据增加了容错。
  • 根据性能、容量、可靠性、有多个级别,如 RAID0、RAID1、RAID5、RAID10

(2)RAID方案

  • RAID0磁盘阵列
    • 至少需要两块硬盘,磁盘越多,读写速度快,一个磁盘吞吐 * 磁盘数量 * 0.8,没有冗余。
    • 磁盘利用率100%,安全性低。
    • 优点是读写性能比一般的硬盘要好,缺点是没有数据冗余,一块硬盘出现故障可能导致数据损坏。

在这里插入图片描述

  • RAID1镜像阵列
    • 全部数据都分别复制到多块盘上,当其中一块盘出现故障时另外一块盘的数据可以被立即使用,从而保证数据的安全性。
    • 每次写数据时都会同时写入镜像盘,读写性能较低,只能用两块硬盘,一块磁盘冗余,磁盘的利用率只有50%。
    • 优点是数据冗余性高,缺点是读写性能比一般的硬盘差。
    • 适合服务器、数据库存储等领域。

在这里插入图片描述

  • RAID5条带阵列
    • 至少需要三块硬盘,一块磁盘冗余,是最通行的配置方式,是将多块硬盘按特定顺序组合起来。
    • 在每块硬盘上都会存储1份数据和1份校验信息,1块硬盘出现故障时,根据另外2块硬盘的校验信息可以恢复数据
    • 这种存储方式只允许有一块硬盘出现故障,出现故障时需要尽快更换
    • 综合了RAID-0和RAID-1的优点和缺点,是RAID0和RAID1的折中方案
    • 适合需要安全和成本兼顾的领域,性能要求稍高,比如金融数据库存储

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/336405.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

测试的阶段性小小总结

转眼入职2年之余,毕业后就投入测试行业。在日常的工作中也有自己的一些思考和总结。2021到2023是多变的两年,加入教培行业,受双减政策影响,注定艰难。参与了各种类型的测试项目,不断在探索和前行,万变不离其…

C++ —— 多态

目录 1.多态的概念 2.多态的定义及实现 2.1构成多态的两个硬性条件 2.2虚函数的重写 2.3override和final 3.抽象类 3.1接口继承和实现继承 4.多态原理 4.1虚函数表 4.2原理 4.3静态绑定和动态绑定 5.单继承和多继承体系的虚函数表 5.1单继承体系的虚函数表 5.2多继…

【MyBatis】第七篇:动态sql

mybatis中的动态sql,其实就是在mybatis中映射配置文件中通过if等判断语句写sql。现在聊一下,常用的的判断语句。 前面准备: CREATE TABLE student (sid int DEFAULT NULL,sname varchar(10) CHARACTER SET utf8mb3 COLLATE utf8mb3_general…

2023年深圳/东莞/惠州CPDA数据分析师认证报名入口

CPDA数据分析师认证是中国大数据领域有一定权威度的中高端人才认证,它不仅是中国较早大数据专业技术人才认证、更是中国大数据时代先行者,具有广泛的社会认知度和权威性。 无论是地方政府引进人才、公务员报考、各大企业选聘人才,还是招投标加…

计算机网络-传输层

文章目录前言概述用户数据报协议 UDP(User Datagram Protocol)传输控制协议 TCP(Transmission Control Protocol)TCP 的流量控制拥塞控制方法TCP 的运输连接管理TCP 的有限状态机总结前言 本博客仅做学习笔记,如有侵权,联系后即刻更改 科普&#xff1a…

LeetCode经典问题总结笔记—一文搞懂滑动窗口和哈希表结合使用之3. 无重复字符的最长子串问题(第一篇)

今日主要总结一下可以使用滑动窗口和哈希表结合使用解决的一道题目,3. 无重复字符的最长子串 题目:3. 无重复字符的最长子串 Leetcode题目地址 题目描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示…

华尔街分析师:斗鱼2023财年前景暗淡,但盈利能力有望提升

来源:猛兽财经 作者:猛兽财经 华尔街预计斗鱼2023财年收入前景悲观 根据S&P Capital IQ的一致性数据,华尔街卖方分析师预计,斗鱼(DOYU)的收入将从2022财年的71.93亿元下降到2023财年的67.53亿元&#x…

react -- Context

使用Context简单传参例子 解决父子组件多层嵌套传参,中间不用通过props传值 import React, { useContext } from "react"; // 参数对象 const param { title: "星期四" }; // 创建一个 Context 对象 // const MyContext React.createContex…

基于matlab使用机器学习和深度学习进行雷达目标分类

一、前言此示例展示了如何使用机器学习和深度学习方法对雷达回波进行分类。机器学习方法使用小波散射特征提取与支持向量机相结合。此外,还说明了两种深度学习方法:使用SqueezeNet的迁移学习和长短期记忆(LSTM)递归神经网络。请注…

【快排与归并排序算法】

作者:指针不指南吗 专栏:算法篇 🐾或许会很慢,但是不可以停下🐾 文章目录一、快速排序 ( Quick Sort )二、归并排序 ( Merge Sort )总结一、快速排序 ( Quick Sort ) 1.思路 找出一个分界点,随机的调整区间…

openmmlab 语义分割算法基础

本文是openmmlab AI实战营的第六次课程的笔记,以下是我比较关注的部分。简要介绍语义分割:如下图,左边原图,右边语义分割图,对每个像数进行分类应用语义分割在个各种场景下都非常重要,特别是在自动驾驶和医…

【docker知识】联合文件系统(unionFS)原理

一、说明 Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其…

为什么静默安装未经过数字签名的驱动是不可行的?

我想,在 Windows XP 系统上,造成蓝屏的最主要原因是带有 Bug 的设备驱动程序。 请问在座的,谁赞成,谁反对。 因为驱动运行在内核模式,再也没有更高级别的组件对其进行行为监管,它可以做它想做的任何事情。…

Power BI 筛选器函数---Index实例详解

一、Index函数 语法&#xff1a; INDEX ( <检索行号>, [<关系>], [<OrderBy>],[空白],[PartitionBy] ) 含义&#xff1a; 对指定分区(PartitioinBy)中的行&#xff08;关系表&#xff09;&#xff0c;按指定的列进行排序(OrderBy)后&#xff0c;根据&…

医院智能化解决方案-门(急)诊、医技、智能化项目解决方案

【版权声明】本资料来源网络&#xff0c;知识分享&#xff0c;仅供个人学习&#xff0c;请勿商用。【侵删致歉】如有侵权请联系小编&#xff0c;将在收到信息后第一时间删除&#xff01;完整资料领取见文末&#xff0c;部分资料内容&#xff1a;篇幅有限&#xff0c;无法完全展…

Docker镜像的创建

Docker镜像Docker镜像Docker 镜像是一个特殊的文件系统提供容器运行时所需的程序、库、资源、配置等文件包含一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;镜像不包含任何动态数据&#xff0c;其内容在构建之后也不会被改变。Docker镜像的…

论文中常用的注意力模块合集(上)

在深度卷积神经网络中&#xff0c;通过构建一系列的卷积层、非线性层和下采样层使得网络能够从全局感受野上提取图像特征来描述图像&#xff0c;但归根结底只是建模了图像的空间特征信息而没有建模通道之间的特征信息&#xff0c;整个特征图的各区域均被平等对待。在一些复杂度…

【化学试剂】endo-BCN-PEG4-Pomalidomide,(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺纯度95%+

一、基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a;CAS号&#xff1a;N/A中文名&#xff1a;(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺英文名&#xff1a;endo-BCN-PEG4-Pomalidomide二、详细产品数据&#xff08;Detailed Product Data&#xff09…

【软件测试】软件测试工作上95%会遇到的问题,你遇到多少?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、测试负责人要进行…

C语言rand和srand用法详解

在实际编程中&#xff0c;我们经常需要生成随机数&#xff0c;例如&#xff0c;贪吃蛇游戏中在随机的位置出现食物&#xff0c;扑克牌游戏中随机发牌。在C语言中&#xff0c;我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数&#xff0c;它的用法为&#xff…