V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
jiang1234321
V2EX  ›  Linux

问一个磁盘顺序写入的问题

  •  
  •   jiang1234321 ·
    jiangbo9510 · 2021-03-22 22:24:29 +08:00 · 2335 次点击
    这是一个创建于 1347 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同时有两个进程 A 、B,每个进程都打开不同的文件。A 进程进行追加写入,这种情况下,调度到 B 进程后,B 读写 fd,需要转动磁盘。再次调度回到 A 进程,还是要再次转动磁盘,这不就是相当没有起到追加写的作用吗?

    13 条回复    2021-04-03 10:04:55 +08:00
    misaka19000
        1
    misaka19000  
       2021-03-22 22:40:30 +08:00
    不知道楼主在说什么,我猜可能是指 A 进程的追加写入没达到楼主的性能预期?
    abersheeran
        2
    abersheeran  
       2021-03-22 23:18:25 +08:00 via Android
    是的。楼主想法没错。所以一般这里会采取 mmap,让操作系统自己想办法整活,我们就别管了。
    hxndg
        3
    hxndg  
       2021-03-22 23:28:51 +08:00
    操作系统会维护页缓存不需要你来维护 dirty page,
    至于何时写入我记得是有策略吧。
    因此并不是你进程写了就立刻执行写入的。
    xuanbg
        4
    xuanbg  
       2021-03-22 23:30:18 +08:00   ❤️ 1
    你说调度磁头就调度磁头啊。

    无论是 A 进程还是 B 进程,都不能调度磁头。进程只能输出到文件,至于文件怎么写,写到哪里去,完全是操作系统在那里按着先来后到进行安排调度罢了。
    zhgg0
        5
    zhgg0  
       2021-03-22 23:40:45 +08:00
    不主动 fsync,进程写文件时,操作系统不一定真的写;并不是进程要求读多少文件内容,操作系统就读多少,可能多读一点。看下 pagecache 的相关文章能解决这个疑问不?
    ch2
        6
    ch2  
       2021-03-23 00:36:09 +08:00 via iPhone   ❤️ 3
    操作系统的意见也是很重要啊,你说转就转?
    ragnaroks
        7
    ragnaroks  
       2021-03-23 08:24:01 +08:00
    按照我的理解,都是写到内存了(file.write),由操作系统来进行物理写入(file.flush)
    yolee599
        8
    yolee599  
       2021-03-23 08:29:42 +08:00 via Android
    磁头不是操作系统调度的,也不是进程调度的,是硬盘上的 BIOS 调度的,它会处理这一切,你只需要告诉硬盘需要在哪写数据就行。数据先保存在硬盘的缓存,至于要不要转动,何时写入由硬盘自己决定
    fuchaofather
        9
    fuchaofather  
       2021-03-23 14:49:59 +08:00
    我是这样理解的. 无论是追加还是随机写, **首次磁头寻道**的时间是**必须要做**的. 而追加写比随机写快是比较**寻道后的写速度**.
    进程 A 顺序写, 进程 B 随机写, 同样的的时间片, A 写入的要远大于 B 写入数据, B 在运行期间会多次随机移动磁头速度, 即使有比较好的磁头调度还是避免不了再次寻道. 而 A 写入速度基本就是磁盘写入上限(转速)
    DoctorCat
        10
    DoctorCat  
       2021-03-23 14:50:52 +08:00
    总结:文件系统没法决定磁盘转不转。假如持续 3ms 丫要是转不到,那数据也到写缓存里了等着写盘。
    jiang1234321
        11
    jiang1234321  
    OP
       2021-04-01 13:34:53 +08:00
    @fuchaofather 很难做到进程 A 一直顺序写入吧,比如,在写入文件的时候,还有打印日志。磁盘又要转动磁头去写入日志文件。
    fuchaofather
        12
    fuchaofather  
       2021-04-02 16:52:23 +08:00
    @jiang1234321 你理解错了, 吞吐量比的是同一段时间内的读写字节数. 比如说跑车比公交快, 你不能拿跑车不跑时候跟公交跑的时候比速度吧?
    jiang1234321
        13
    jiang1234321  
    OP
       2021-04-03 10:04:55 +08:00
    @fuchaofather 没太理解这个比喻,意思是一个进程无法同时对多个文件进行追加写入吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5303 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 09:39 · PVG 17:39 · LAX 01:39 · JFK 04:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.