打开文件
调用高级语言库函数(例如C语言的fopen),库函数内部调用系统调用接口open,操作系统为其分配文件描述符
写入数据
先将数据写入编程语言自己维护的缓冲区,在合适的时间将其刷新到内核缓冲区。内核缓冲区通过一个类似字典树的结构,找到文件逻辑地址(虚地址)对应的内存数据块(物理地址),再将IO请求放到IO请求队列(计算机可能同时存在多个IO请求),通过LBA(逻辑块寻址)的方式写入磁盘。
补充:
cache,主存,辅存等存储的硬件设备,内部空间都被操作系统分为一个个大小相等的数据块(一般是4KB)。
原因:时间和空间的局部性原理。未来要读取的数据可能是现在正在读取的数据;读取某个位置的数据,与其相邻的数据在未来可能也会读取。所以4KB为单位可以提高效率。
如何分块呢?
假设存储设备大小为4GB,每个数据块的大小为4KB,那么一共可以分成(4*2^30/4*2^10)2^20个数据块。
这些数据块都有各自的名称:
页框:主存的数据块
页:进程的数据块
页表存储了逻辑地址的页号和物理地址的块号(页框号)
逻辑地址 = 页号+偏移量(页内地址)
物理地址 = 框号(块号)+ 偏移量(块内地址)