1、操作系统课程设计实验报告姓 名: 曾 林学 号: 0905020107班 级: 网络一班指导老师: 李艳军完成时间:2012 年 3 月 4 日任务一 I/O 系统调用开销比较一、实验目的:本任务主要目的在于了解 I/O 系统调用的特点并通过性能测试对此有直接的认识。二、 任务要求:在 LINUX 平台用 C 编程逆序一个文本文件,注意显示逆转结果的必须是原文件名。如文件原内容为“abcd” ,处理后内容应为“ dcba”。请分别使用三种方法1) 标准 C 的 I/O 库函数:fopen、fread 和 fwrite2) Unix 的 I/O 函数:open、read、write3) open
2、 和 mmap要求尽量考虑效率,比较三种方法的性能。三、 设计思路实验的主要是提供一个缓冲区,从而供库函数方便进行读写。首先申请一个缓存区,然后把文件的内容读出到缓存区中,通过逆序函数把文件的内容逆序,再把缓存区中的内容写入到原文件中,从而达到逆序的目的。针对 read 和fread 每次读取数据大小有要求,主要在于读取或写入时缓冲区的大小,动态定义缓冲区的大小实现每次读取或写入数据的大小控制。为实现测试文件的内容能完整地存入中间容器,即字符串数组,需要动态申请文件大小的数组,存取文件中的内容。Mmanp 指 memory-mapped(存储映射)其将文件内容映射到进程地址空间,相比传统的方法
3、而言,减少了系统调用和内容拷贝,无需进行文件内容的读取和写入,减少了完成所需要的时间,提高了整体的效率,从而提高了性能。主要在于数据的重新排序。四、 设计内容1. 使用标准 C 的 I/O 库函数:fopen、fread 和 fwrite 的设计代码如下:#include#include #include int main(int argc,char *argv)int i,j,filelen;char *buffer;char temp;FILE *fp;if(argc!=2)printf(“error!n“);exit(0);if(fp=fopen(argv1,“r“)=NULL)prin
4、tf(“open %s error!“,argv1);exit(0);fseek(fp,0L,SEEK_END);filelen=ftell(fp);buffer= (char *)malloc(sizeof(char)*filelen); /申请缓存区fseek(fp,0L,SEEK_SET);printf(“文件大小为:%d 字节n“,filelen);fread(buffer,1,filelen,fp); /第二个参数为每次读数据的大小fclose(fp);j=filelen-1;for(i=0;i#include#include#include#include#include#incl
5、ude#define BUFFSIZE 256*1024;int main(int argc,char *argv)int i,j,n,src;char temp;char *buffer;char path20;size_t fz;struct stat statbuf;if (argc != 2 )printf(“请输入要打开的文件路径n“);scanf(“%s“,path);else strcpy(path,argv1);n=open(path,O_RDWR);if(src=open(path,O_RDWR)#include #include #include #include #inc
6、lude #include #define LENGTH 100int main(int argc,char *argv)int src;int i;char * buffer;char path20;struct stat statbuf;size_t fz;char temp;if (argc != 2 )printf(“请输入要打开的文件路径n“);scanf(“%s“,path);else strcpy(path,argv1);if(src=open(path,O_RDWR)0 对应相应进程要释 放 sem_op 数目的共享资源;sem_op=0 可以用于对共享资源是否已用完的测试;s
7、em_op0 相当于进程要申请-sem_op 个共享资源。再联想操作的原子性,更不难理解该 系统调用何时正常返回,何 时 睡眠等待。调用返回:成功返回 0,否则返回 -1。3) int semctl(int semid,int semnum,int cmd,union semun arg)该系统调用实现对信号灯的各种控制操作,参数 semid 指定信号灯集,参数 cmd 指定具体的操作类型;参数 semnum 指定对哪个信号灯操作,只对几个特殊的 cmd 操作有意义;arg 用于设置或返回信号灯信息。该系统调用详细信息请参见其手册页,这里只给出参数 cmd 所能指定的操作。IPC_STAT 获
8、取信号灯信息,信息由 arg.buf 返回;IPC_SET 设置信号灯信息,待设置信息保存在 arg.buf 中(在 manpage 中给出了可以设置哪些信息) ;GETALL 返回所有信号灯的值,结果保存在 arg.array 中,参数 sennum 被忽略;GETNCNT 返回等待 semnum 所代表信号灯的值增加的进程数,相当于目前有多少进程在等待 semnum 代表的信号灯所代表的共享资源;GETPID 返回最后一个对 semnum 所代表信号灯执行 semop 操作的进程 ID;GETVAL 返回 semnum 所代表信号灯的值;GETZCNT 返回等待 semnum 所代表信号灯的值变成0 的进程数;SETALL 通过 arg.array 更新所有信号灯的值;同时,更新与本信号集相关的semid_ds 结构的 sem_ctime 成员;SETVAL 设置 semnum 所代表信号灯的值为 arg.val;调用返回:调用失败返回-1,成功返回与 cmd 相关:实验结果:实验体会:通过这个实验更加了解了上个学期学习操作系统课程中对于线程进程的知识,把课本上的知识通过实践表达出来是一件有成就感的事情,通 过动手也对操作系统知识更加深刻。