P3:I/O subsystem
目标
在MINIX3中安装一块X MB大小的RAM盘,可以挂载并且存取文件操作。
测试RAM和DISK盘的文件读写速度
分析读写速度有差异的原因。
安装盘–增加RAM盘
/*todo */
修改/usr/src/minix/drivers/storage/memory/memory.c
增加RAM盘数
1
重新编译内核
make build MKUPDATE=yes
;重启reboot选择latest kernel创建设备
mknod /dev/myram b 1 13
;1
2/*mknod的使用方式*/
mknod DEVNAME{b|c} MAJOR MINORDEVNAME创建的设备文件名,这里为/dev/myram
b:块设备:系统从设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘。
这里,我们的RAM盘,就是用内存来虚拟一个硬盘,所以这里选项应该是b。
MAJOR和MINOR表示主设备号和次设备号。
检测设备是否创建成功:
ls /dev/ | grep ram
实现buildmyram初始化工具:
a. 在/usr/src/minix/commands/目录下新建buildmyram文件夹,参照/usr/src/minix/commands/ramdisk文件增加buildmyram也作为minix的内置命令。
b.编写buildmyram.c文件
类比ramdisk.c,但要注意但没和修改
PATH
变量。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
main(int argc, char *argv[])
{
int fd;
signed long size;
char *d;
if(argc < 2 || argc > 3) {
fprintf(stderr, "usage: %s <size in MB> [device]\n",
argv[0]);
return 1;
}
d = argc == 2 ? _PATH_MYRAMDISK : argv[2];
if((fd=open(d, O_RDONLY)) < 0) {
perror(d);
return 1;
}
long int MFACTOR=1024*1024;//注意这里的MFACTOR
size = atol(argv[1])*MFACTOR;//size是我输入的参数成kb,mb 就再乘1024嘛
if(size < 0) {
fprintf(stderr, "size should be non-negative.\n");
return 1;
}
if(ioctl(fd, MIOCRAMSIZE, &size) < 0) {
perror("MIOCRAMSIZE");
return 1;
}
fprintf(stderr, "size on %s set to %ldMB\n", d, size/MFACTOR);
return 0;
} c. 将buildmyram.c修改完毕以后,新建buildmyram文件下的Makefile文件(此新建也同样类比于ramdisk),同时修改commands目录下的Makefile文件(此修改类比于Project2)
在ram盘上创建内存文件系统:
mkfs.mfs /dev/myram
将ram盘挂载到用户目录下:
mount /dev/myram /root/myram
检验挂载是否成功,输入命令
df
进行检测:可以看出,有了dev/myram即我们挂载成功。
重启后用户自定义的ram盘内容会丢失,需要重新设置大小,创建文件系统,并挂载。
性能测试
采用多进程并发的同步读写。
concurrency的数目要增加到设备接近“饱和”状态。
总吞吐量:fileSize(总文件大小)/执行时间(spend time)
饱和:吞吐量难以继续提升,同时I/O延时恶化。
- 性能测试的变量:“block size“和块扫描方式。
P3-test的编写
P3-test的框架结构:
1 | void write_file(int blocksize,int isrand,char *filename,int fs){ |
还有什么更好的测试方式嘛….