操作系统课程设计报告474011948_第1页
操作系统课程设计报告474011948_第2页
操作系统课程设计报告474011948_第3页
操作系统课程设计报告474011948_第4页
操作系统课程设计报告474011948_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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和mmap要求尽量考虑效率,比较三种方法的性能

2、。三、 设计思路 实验的主要是提供一个缓冲区,从而供库函数方便进行读写。首先申请一个缓存区,然后把文件的内容读出到缓存区中,通过逆序函数把文件的内容逆序,再把缓存区中的内容写入到原文件中,从而达到逆序的目的。针对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) printf(open %s error!,argv1); exit(

4、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;ij;i+,j-) /逆序函数 temp = bufferi; bufferi = bufferj; bufferj = temp; if(fp=

5、fopen(argv1,w)=NULL) printf(open %s error!,argv1); exit(0); fwrite(buffer,1,filelen,fp); /第二个参数为每次写数据的大小fclose(fp); return 0;2. 使用Unix的I/O函数:open、read、write的设计代码如下:#include#include#include#include#include#include#include#define BUFFSIZE 256*1024;int main(int argc,char *argv) int i,j,n,src;char temp;

6、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)0) perror(open source ); exit(EXIT_FAILURE); if(fstat(src,&statbuf)0) perror(fstat source); exit(EXIT_FAILURE); fz=statbu

7、f.st_size;buffer= (char *)malloc(sizeof(char)*fz);read(n,buffer,fz); lseek(n,0,SEEK_SET); j=fz-1;for(i=0;ij;i+,j-) temp = bufferi; bufferi = bufferj; bufferj = temp;write(n,buffer,fz);close(n);printf(逆序成功!n);return 0;3. 使用open和mmap的设计代码:#include #include #include #include #include #include #include

8、#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) perror(open source ); exit(EXIT_FAILURE); if(fstat(src,&statbu

9、f)0) perror(fstat source); exit(EXIT_FAILURE); fz=statbuf.st_size; buffer = mmap(0,fz,PROT_WRITE,MAP_SHARED|MAP_NORESERVE,src,0);if(MAP_FAILED=buffer) perror(mmap source); exit(EXIT_FAILURE); for(i=0;i0对应相应进程要释放sem_op数目的共享资源;sem_op=0可以用于对共享资源是否已用完的测试;sem_op0相当于进程要申请-sem_op个共享资源。再联想操作的原子性,更不难理解该系统调用何

10、时正常返回,何时睡眠等待。调用返回:成功返回0,否则返回-1。3) int semctl(int semid,int semnum,int cmd,union semun arg)该系统调用实现对信号灯的各种控制操作,参数semid指定信号灯集,参数cmd指定具体的操作类型;参数semnum指定对哪个信号灯操作,只对几个特殊的cmd操作有意义;arg用于设置或返回信号灯信息。该系统调用详细信息请参见其手册页,这里只给出参数cmd所能指定的操作。IPC_STAT获取信号灯信息,信息由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更新所有信号灯的值;同时,更新与本信号

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论