一、目的
??1、熟悉类UNIX系统的I/O设备管理 ??2、熟悉MINIX块设备驱动 ??3、熟悉MINIX RAM盘
二、内容与设计思想
?? · 在Minix3中安装一块x MB大小的RAM盘,可以挂载并且存取文件操作。 ?? · 编写测试文件,测试不同块大小下、不同块扫描方式(顺序/随机)RAM盘和Disk盘的文件读写速度并分析其读写速度差异原因。
三、使用环境
??物理机:Windows10 ??虚拟机:Minix3 ??虚拟机软件:Vmware ??终端控制软件:MobaXterm ??物理机与虚拟机文件传输:FileZilla
四、实验过程
(1)在Minix3中安装一块RAM盘
?? · 修改/usr/src/minix/drivers/storage/memory/memory.c,增加默认的用户RAM盘数。重新编译内核,重启虚拟机。
#define RAMDISKS 7
?? · 创建设备mknod /dev/myram b 1 13,并输入ls /dev/ | grep ram查看设备是否创建成功。 ?? · 参考/usr/src/minix/commands/ramdisk/ramdisk.c,实现buildmyram.c容量初始化工具,将单位从KB修改为MB。同时,在同一目录下的Makefile文件中添加相应条目。重新编译内核,重启虚拟机。
#define KFACTOR 1048576
PROG= ramdisk
PROG= buildmyram
?? · 执行命令 buildmyram /dev/myram,创建一个RAM盘。 ?? · 在RAM盘上创建内存文件系统,mkfs.mfs /dev/myram。 ?? · 将RAM盘挂载到用户目录下,mount /dev/myram /root/myram,输入df查看是否挂载成功。 ??注意:重启后用户自定义的RAM盘内容会丢失,因此每次重启后都需要重新设置大小,创建文件系统并挂载。
(2)编写测试代码
?? · 主函数实现思路: ??分别调用相应函数测试在顺序和随机两种块扫描方式下,RAM盘和Disk盘多个进程并发读写不同大小块的时间,并计算平均读写速度。 ?? - 为每个进程分配独立的文件 ?? - wait(NULL)函数等待所有子进程读写结束再记录结束时间 ?? - 经测试,进程并发度在7~10之间吞吐量达到最大,基于此在实验中可以修改并发度大小来获得良好的实验数据
for(int blocksize=64;blocksize<=1024*32;blocksize=blocksize*2){
int Concurrency=7;
gettimeofday(&starttime, NULL);
for(int i=0;i<Concurrency;i++){
if(fork()==0){
read_file(blocksize,true,filepathDisk[i]);
exit(0);
}
}
while(wait(NULL)!=-1);
gettimeofday(&endtime, NULL);
spendtime=get_time_left(starttime,endtime)/1000.0;
int block=blocksize*Concurrency*times;
printf("blocksize_KB=%.4fKB,speed=%fMB/s\n",(double)blocksize/1024.0,(double)block/spendtime/1024.0/1024.0);
}
?? · write_file & read_file函数实现思路: ??通过多次重复的读写操作来计算RAM盘/Disk的读写速度。 ?? - 若为随机读写,则每次读写结束后利用lseek(fp,rand()%(filesize-blocksize),SEEK_SET)函数定位到文件任意位置。 ?? - 为了减小主机操作系统的缓存机制造成的误差,将文件大小filesize设置为300MB ??注意:对(filesize-blocksize)取余,防止写出文件
void write_file(int blocksize, bool isrand, char *filepath){
int fp=open(filepath,O_RDWR|O_CREAT|O_SYNC,0755);
if(fp==-1) printf("open file error!\n");
int res;
for(int i=0;i<times;i++){
if((res=write(fp,buff,blocksize))!=blocksize){
printf("%d\n",res);
printf("write file error!\n");
}
if(isrand){
lseek(fp,rand()%(filesize-blocksize),SEEK_SET);
}
}
lseek(fp,0,SEEK_SET);
}
void read_file(int blocksize,bool isrand,char *filepath){
int fp=open(filepath,O_RDWR|O_CREAT|O_SYNC,0755);
if(fp==-1) printf("open file error!\n");
int res;
for(int i=0;i<times;i++){
if((res=read(fp,readbuff,blocksize))!=blocksize){
printf("%d\n",res);
printf("read file error!\n");
}
if(isrand){
lseek(fp,rand()%(filesize-blocksize),SEEK_SET);
}
}
lseek(fp,0,SEEK_SET);
}
?? · get_time_left函数实现思路: ??利用测试得到的starttime和endtime计算读写所耗费的时间。
long get_time_left(struct timeval starttime,struct timeval endtime){
long spendtime;
spendtime=(long)(endtime.tv_sec-starttime.tv_sec)*1000+(endtime.tv_usec-starttime.tv_usec)/1000;
return spendtime;
}
五、实验结果
(1)实验数据表
随机写 | 64B | 128B | 256B | 512B | 1KB | 2KB | 4KB | 8KB | 16KB | 32KB |
---|
磁盘 | 0.244 | 3.255 | 5.086 | 6.104 | 8.138 | 10.652 | 12.079 | 14.422 | 15.452 | 26.042 | RAM盘 | 2.631 | 6.104 | 9.766 | 21.047 | 42.093 | 73.426 | 97.656 | 167.650 | 233.907 | 260.417 |
顺序写 | 64B | 128B | 256B | 512B | 1KB | 2KB | 4KB | 8KB | 16KB | 32KB |
---|
磁盘 | 2.589 | 5.026 | 10.358 | 20.715 | 32.944 | 41.430 | 131.777 | 164.474 | 170.898 | 201.613 | RAM盘 | 3.590 | 7.398 | 12.207 | 29.593 | 39.063 | 78.125 | 156.25 | 188.253 | 234.962 | 454.546 |
随机读 | 64B | 128B | 256B | 512B | 1KB | 2KB | 4KB | 8KB | 16KB | 32KB |
---|
磁盘 | 1.7089 | 3.418 | 6.8359 | 10.3575 | 16.4721 | 23.5721 | 32.9443 | 43.75 | 45.2898 | 56.9661 | RAM盘 | 1.8384 | 4.069 | 7.3536 | 32.552 | 58.8291 | 83.4669 | 180.8449 | 267.5514 | 312.5 | 374.7002 |
顺序读 | 64B | 128B | 256B | 512B | 1KB | 2KB | 4KB | 8KB | 16KB | 32KB |
---|
磁盘 | 2.059 | 6.8359 | 19.5313 | 39.0625 | 59.1856 | 156.25 | 165.7197 | 260.4167 | 312.5 | 437.5 | RAM盘 | 5.0265 | 10.3575 | 20.715 | 42.7446 | 82.8598 | 165.7197 | 218.75 | 331.4394 | 437.5 | 527.1084 |
??注:读写速率的单位:MB/s
(2)实验数据图
(3)实验结果分析
??总体来看,写的速率比读的速率慢,随机读写的速率比顺序读写的速率慢,尤其是磁盘两种快扫描方式的速率差异更加明显。究其原因在于磁盘读写时,机械寻道是影响磁盘读写速率的主要因素,随机读写每次都需要重新寻道,而顺序读写只需要在第一次进行寻道,因此两种方式的读写速率差别很大。 ??对比Disk盘和RAM盘,RAM盘的读写速率普遍快于Disk盘,特别是随机读写性能。由于RAM盘为内存分配的一块区域,因此没有寻道和旋转延迟,所以RAM的读写速率优于Disk。但对Disk进行一次读后,其内容会被缓存,之后再次读Disk上的数据,其效率有所提高。
完整代码与测试文件: https://github.com/RachelllYe/OSProject 欢迎探讨与指正,谢谢!
|