同时有两个进程 A 、B,每个进程都打开不同的文件。A 进程进行追加写入,这种情况下,调度到 B 进程后,B 读写 fd,需要转动磁盘。再次调度回到 A 进程,还是要再次转动磁盘,这不就是相当没有起到追加写的作用吗?
1
misaka19000 2021-03-22 22:40:30 +08:00
不知道楼主在说什么,我猜可能是指 A 进程的追加写入没达到楼主的性能预期?
|
2
abersheeran 2021-03-22 23:18:25 +08:00 via Android
是的。楼主想法没错。所以一般这里会采取 mmap,让操作系统自己想办法整活,我们就别管了。
|
3
hxndg 2021-03-22 23:28:51 +08:00
操作系统会维护页缓存不需要你来维护 dirty page,
至于何时写入我记得是有策略吧。 因此并不是你进程写了就立刻执行写入的。 |
4
xuanbg 2021-03-22 23:30:18 +08:00 1
你说调度磁头就调度磁头啊。
无论是 A 进程还是 B 进程,都不能调度磁头。进程只能输出到文件,至于文件怎么写,写到哪里去,完全是操作系统在那里按着先来后到进行安排调度罢了。 |
5
zhgg0 2021-03-22 23:40:45 +08:00
不主动 fsync,进程写文件时,操作系统不一定真的写;并不是进程要求读多少文件内容,操作系统就读多少,可能多读一点。看下 pagecache 的相关文章能解决这个疑问不?
|
6
ch2 2021-03-23 00:36:09 +08:00 via iPhone 3
操作系统的意见也是很重要啊,你说转就转?
|
7
ragnaroks 2021-03-23 08:24:01 +08:00
按照我的理解,都是写到内存了(file.write),由操作系统来进行物理写入(file.flush)
|
8
yolee599 2021-03-23 08:29:42 +08:00 via Android
磁头不是操作系统调度的,也不是进程调度的,是硬盘上的 BIOS 调度的,它会处理这一切,你只需要告诉硬盘需要在哪写数据就行。数据先保存在硬盘的缓存,至于要不要转动,何时写入由硬盘自己决定
|
9
fuchaofather 2021-03-23 14:49:59 +08:00
我是这样理解的. 无论是追加还是随机写, **首次磁头寻道**的时间是**必须要做**的. 而追加写比随机写快是比较**寻道后的写速度**.
进程 A 顺序写, 进程 B 随机写, 同样的的时间片, A 写入的要远大于 B 写入数据, B 在运行期间会多次随机移动磁头速度, 即使有比较好的磁头调度还是避免不了再次寻道. 而 A 写入速度基本就是磁盘写入上限(转速) |
10
DoctorCat 2021-03-23 14:50:52 +08:00
总结:文件系统没法决定磁盘转不转。假如持续 3ms 丫要是转不到,那数据也到写缓存里了等着写盘。
|
11
jiang1234321 OP @fuchaofather 很难做到进程 A 一直顺序写入吧,比如,在写入文件的时候,还有打印日志。磁盘又要转动磁头去写入日志文件。
|
12
fuchaofather 2021-04-02 16:52:23 +08:00
@jiang1234321 你理解错了, 吞吐量比的是同一段时间内的读写字节数. 比如说跑车比公交快, 你不能拿跑车不跑时候跟公交跑的时候比速度吧?
|
13
jiang1234321 OP @fuchaofather 没太理解这个比喻,意思是一个进程无法同时对多个文件进行追加写入吗?
|