linux 关于文件读写的问题

linux 关于文件读写的问题,第1张

1. 文件write *** 作是原子的,多个进程同时写文件,原理上是没问题的。但是问题会出现在:如果多个进程写文件时是先lseek再write,就会出现覆盖。打开文件时使用append标志可以使先lseek再write这个 *** 作变成原子 *** 作,这样可以避免覆盖。

2. 多线程共享一个文件句柄的话,是不会有问题的。

3.

4.linux读写磁盘文件过程中,一般情况下并不是直接 *** 作磁盘上的文件,而是读写内存中的磁盘高速缓存,内核选择合适的时机把脏页同步到磁盘。所以读写文件时不立刻调用io不是因为你说的缓冲区,read和write是没有缓冲区的。

5. fprintf和printf一样,是有缓冲区的,不过大小我不知道,也没必要知道吧。

电流通过导体时,会在导体的周围会产生感应磁场。感应磁场的磁极随电流方向的改变而改变。

当闭合电路内的磁场发生变化(磁通量变化)时,闭合电路内会产生感应电动势。即闭合电路内磁场的变化会使电路内产生感应电流。 电流的方向与磁极方向有关。

磁头是一个外面被线圈缠绕着的U型磁芯,可以看出当磁头通电时便会产生磁场,磁场的方向随电流方向的变化而变化。

磁盘的表面涂有一层磁性物质,在未没有外部磁场影响的情况下,磁盘表面的磁性粒子的磁极方向是不会改变的。一般从未受到外部干扰的磁性粒子磁极方向是随机的,于是出现互相抵消的情况,这时磁盘的表现出无磁极显现。

写数据时磁头移到到磁盘要写入的位置,输入电流产生感应磁场。受磁场的影响,磁头下磁性粒子的磁极方向变为与磁场同向。如此通过给磁头不同的电流方向,使得磁盘局部产生不同的磁极,产生的磁极在未受到外部磁场干扰下是不会改变的。如此便将电信号持久化到磁盘上(当然并不是一个磁极方向代表1另一个代表0).

读取磁盘信息时,不通电的磁头在写入数据的位置上移动,上面可知数据在磁盘上就是一些磁极方向不同的微小局部区域,由于各个域的磁极方向不完全同,所以磁头在通过这些不同方向的区域时会产生不同方向的感应电流,这些微弱正负脉冲经过驱动的去噪扩大成为内存中的二进制数据。

在硬盘读写时,读 *** 作是远快于写 *** 作的,而且读/写 *** 作具有完全不同的特性,所以目前的硬盘一般都分离出读和写两个磁头,但原理还是不变的。

硬盘主要由碟片、磁头、电机马达、接口和控制电路控制芯片组成。

碟片的表面涂有磁性材料,厚度一般在0.5mm左右。碟片安装在主轴马达的转轴上,工作时所有碟片在主轴马达的带动下高速旋转。

每个碟片都有正反两面,称为盘面。第1个碟片的正面称为0面,反面称为1面,第2个碟片的正面称为2面,反面称为3面...依次类推。每个盘面都有一个对应磁头负责读写该该盘面上的数据。盘面数和磁头数是相等的。

关机时,磁头停留在硬盘的停泊区。当磁盘工作时,磁头移动到盘面上分,依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,与盘面的距离不到1微米。磁头在副轴马达的带动下可以在极短的时间内精确的切换到数据所在的磁道

在碟片高速旋转时磁头保持不变,那么就会形成一个圆形的轨迹,这些同心的圆行轨迹就是磁道(Track)。数据保存在磁道上面。每个盘面上有多个磁道,但磁道之间并不是紧挨着的,因为磁化的单元挨的太近会互相影响。

在每个盘面的最外圈的磁道是“0”磁道,向盘心方向依次增长为1磁道,2磁...。数据从最外面的磁道开始存放。

盘面上可以划分出很多的磁道,每条磁道容量从100多到300多kb不等,但我们读写并不需要每次都读写这么多数据,所以又将磁道划分为若干更小的弧段,每段称为一个扇区(Sector)。扇区是磁盘进行读写 *** 作的最小单位。

一般磁盘的一个扇区大小为512字节,这也就意味着哪怕我们只存放1字节的数据也会占用磁盘的一个扇区512个字节,读取时也会读取整个扇区的512个字节然后选择需要的哪个字节。

查看磁盘扇区大小:

扇区是硬盘的最小 *** 作单位,但扇区对于 *** 作系统来说还是太小了,一般 *** 作系统有自己的硬盘 *** 作最小单位,在linux下一般为4k

查看 *** 作系统IO大小:

交叉因子为1的扇区划分:

柱面是抽象出来的一个逻辑概念,盘面被划分为1磁道,2磁道,3磁道....,不同盘面上相同编号的磁道组成了一个圆柱面,即柱面(Cylinder)。

磁盘读写数据是按柱面进行,即在读写时磁头先寻找到数据所在的柱面(寻找磁道),然后再判断数据所在的盘面。这样大大提升了磁盘的读写效率,因为盘面的确定是电子 *** 作速度非常快,但磁道的寻找需要电动马达带动磁头移到到指定磁道上,是机械 *** 作。

磁盘读写时耗 = 寻道时间 + 旋转延迟时间 + *** 作时耗

寻道时间: 读写数据时磁头首先要移到到指定磁道(柱面),这段时间称为寻道时间

旋转延迟时间: 当磁头移动到指定磁道后,需要等待要 *** 作的扇区旋转到磁头的下方,这段时间称为转延迟时间

*** 作时耗: 磁头进行读写 *** 作花费的时间

早就能用了。只要是用新版本就可以了。不过有的机器硬件太新或者功能特强,还需要用老版没对应驱动的系统。比如服务器的 SAS ,装 RHEL 4.x 系列,一般才需要另找驱动。

bootloader 阶段使用 BIOS 功能,所有的 SATA 默认都有一个简单的 BIOS 读写兼容功能提供支持。也就是说开了 AHCI ,BIOS 依然会提供兼容模式。不过现在的 *** 作系统在内核启动后就会绕过 BIOS 直接 *** 作硬件。这个时候如果开启了 AHCI 模式,那么 IDE 兼容部分的硬件接口模拟就没了,不过 BIOS 自己提供的读写功能虽然继续提供,但系统已然不用了。所以 bootloader 可以读写硬盘并不代表 linux 内核可以读写硬盘。

linux 的驱动有两种存放状态,编入内核或者编成模块。

initrd 里面的就是模块,会被 bootloader 在读取内核时一起读取进入内存。一般内核模块只在需要时载入,可以节省内核的运行体积。但现在新版 linux 内核的 sata 驱动已经高度集成了,所以很多发行版的 SATA 驱动都直接进入内核不需要模块载入方式了。当然这要看系统的设计,有的系统既然 initrd 必然会提供,那么编入内核确实没意义。不过需要另外找驱动的硬件,都是模块方式存在,他们在系统启动时必须存在于 initrd 里面,不然内核自己没法集成,也不能从硬盘里面读取(没驱动没法读盘,没法读盘就没法读驱动)。

BIOS 的 INT13 功能太简单了。限制也特别多,现在都是能不用就不用的。所以这东西现在只有 bootloader 才会用。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7414592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存