操作系统

文件操作及磁盘调度

2022-04-19  本文已影响0人  Nefelibatas

文件基本操作

打开文件open()

头文件:
<sys/types.h> <sys/stat.h>
原型:
    int open(const char *pathname,int flags);
    int open(const char *pathname,int flags,mode_t mode);
    pathname:打开文件的路径名字
    flags:一个或多个标志位的按位或组合
    mode:表示文件的权限,如果flags位为0_CREAT则一定要有文件权限
返回值:成功返回fd,失败<0

flags 有一系列的常数值可以选择,可以同时选择多个使用按位或运算符连接起来,所以这些宏定义都是以0_开头的,表示or。

关闭文件close()

头文件:
<unistd.h> 
原型:
    int close(int fd);
    fd:文件描述符
返回值:成功0,失败-1

close会取消当前进程的文件描述符fd与其关联的文件之间的映射

当一个进程终止时,内核会对该进程所有尚未关闭的文件描述符调用close

open的返回值一定是该进程所未使用的最小描述符

创建文件create()

头文件:
<sys/types.h> <sys/stat.h><fcntl.h>
原型:
    int create(const char *pathname,model_t mode);
    pathname:打开文件的路径名字

    mode:表示文件的权限,同open()
返回值:成功返回fd,失败<0

读文件read()

头文件:
<unistd.h> 
原型:
    ssize_t read(int fd, void *buf,size_t_t count);
    fd:文件描述符
    buf:一块内存的首地址,存放写入fd的数据
    count:写入的字节数
返回值:写入的字节数,0表示什么也没写

写文件write()

头文件:
<unistd.h> 
原型:
    ssize_t write(int fd, void *buf,size_t_t count);
    fd:文件描述符
    buf:一块内存的首地址,存放写入fd的数据
    count:写入的字节数
返回值:读取到的字节数,0表示文件结束

阻塞与缓存

阻塞block

在阻塞文件中进程执行系统调用如scanf,该进程将会被设置为睡眠状态,因为资源不可达这时内核可以调度其他进程允许,直到该进程等待的事情发生才有可能继续运行。

缓冲buffer

缓冲区,又称为缓存。是内存的一部分。在内存中预留一定的存储空间就是缓冲区。

磁盘结构

每个盘面对应一个磁头,所有的磁头都是连在一个磁臂上,所有磁头只能共进退。

需要把磁头移动到想读/写的扇区所在的磁道。

磁盘会转起来让目标扇区从磁头下面划过才能完成对扇区的读、写操作。

磁盘的表面由一些磁性物质组成,用这些磁性物质记录二进制数据。

磁盘结构

按磁头是否可以活动分类

按盘片是否可以更换分类

磁盘调度算法

寻道时间TS:在读写数据前将磁头移动到指定磁道所花的时间。

启动磁头臂需要时间s。

移动磁头也是需要时间,假设磁头匀速移动每跨越一个磁道耗时m,总共需要跨越n条磁道,则:

寻道时间T_s = s + m*n

延迟时间TR:通过旋转磁盘使磁头定位到目标扇区所需要的时间,设磁盘转速r(单位:转/秒或转/分)。则平均所需的延迟时间:
T_R = \frac{1}{2} * \frac{1}{r} = \frac{1}{2r}
传输时间T_t: 从磁盘读出或向磁盘写入数据所经历的时间,假设磁盘转速r,此次读/写的字节数为b,每个磁盘上的字节数N。
传输时间T_t = \frac{1}{r}*\frac{b}{N} = \frac{b}{rN} \\ 总的平均存取时间 T_a = T_s+\frac{1}{2r}*\frac{b}{rN}

先来先服务算法FCFS

根据进程请求访问磁盘的先后顺序进行调度。

优点:公平、如果请求访问的磁道比较集中,算法性能还算过得去。

缺点:如果有大量进程竞争使用磁盘,请求访问的磁道很分散则FCFS在性能上很差寻道时间长。

最短寻找时间优先SSTF

优先处理的磁道是与当前磁头最近的磁道,可以保证每次的寻道时间最短,但并不能保证总的寻道时间最短。

优点:性能较好,平均寻道时间短

缺点:产生饥饿现象,磁头在一个小区域来回移动。

扫描算法SCAN

只有磁头移动到最外侧磁道才能往内移动,移动到最内侧磁道才能往外移动,也叫电梯算法。

优点:性能较好,平均寻道时间短,不会产生饥饿现象。

缺点:对各个位置磁道的响应频率不平均。

LOOK调度算法

如果在磁头移动方向上已经没有别的请求就可以立即改变磁头移动方向。

循环扫描算法C-SCAN

返回时直接快速移动至起始阶段而不处理任何请求。

C-LOOK调度算法

如果磁头移动方向上已经没有磁道访问请求就可以立即让磁头返回,并且磁头只需返回到有磁道访问请求的位置即可。

上一篇 下一篇

猜你喜欢

热点阅读