您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北京邮电大学操作系统实验-(2)
操作系统班级:2011211302学号:2011211168姓名:康雅微目录实验5.1进程通信观察实验实验6.3I/O系统编程实验实验7.1文件管理系统管理实验代码分析实验5.1观察实验1、实验目的与内容在Linux下,用ipcs()命令观察进程通信情况,了解Linux基本通信机制。2、实验原理LinuxIPC继承了UnixSystemV及DSD等,共有6种机制:信号(signal)、管道(pipe和命名管道(namedpiped)、消息队列(messagequeues)、共享内存(sharedmemorysegments)、信号量(semaphore)、套接字(socket)。本实验中用到的几种进程间通信方式:(1)共享内存段(sharedmemorysegments)方式–将2个进程的虚拟地址映射到同一内存物理地址,实现内存共享–对共享内存的访问同步需由用户进程自身或其它IPC机制实现(如信号量)–用户空间内实现,访问速度最快。–Linux利用shmid_ds结构描述所有的共享内存对象。(2)信号量(semaphore)方式–实现进程间的同步与互斥–P/V操作,Signal/wait操作–Linux利用semid_ds结构表示IPC信号量(3)消息队列(messagequeues)方式–消息组成的链表,进程可从中读写消息。–Linux维护消息队列向量表msgque,向量表中的每个元素都有一个指向msqid_ds结构的指针,每个msqid_ds结构完整描述一个消息队列LINUX系统提供的IPC函数有:msgget(关键字,方式):创建或打开一个消息队列msgsnd(消息队列标志符,消息体指针,消息体大小,消息类型):向队列传递消息msgrcv(消息队列标志符,消息体指针,消息体大小,消息类型):从队列中取消息msgctl(消息队列标志符,获取/设置/删除,maqid_ds缓冲区指针):获取或设置某个队列信息,或删除某消息队列Linux系统中,内核,I/O任务,服务器进程和用户进程之间采用消息队列方式,许多微内核OS中,内核和各组件间的基本通信也采用消息队列方式.3、实验结果实验6.3编程实验1、实验目的编写一个daemon进程,该进程定时执行ps命令,然后将该命令的输出写至文件F1尾部。通过此实验,掌握LinuxI/O系统相关内容。2、实验原理在这个程序中,首先fork一个子程序,然后,关闭父进程,这样,新生成的子进程被交给init进程接管,并在后台执行。新生成的子进程里,使用system系统调用,将ps的输出重定向,输入到f1.txt里面。3、实验步骤编写daemon.c代码如下:#includestdio.h#includestdlib.hintmain(intargc,char*argv[]){inti,p;p=fork();if(p0){exit(0);}elseif(p==0){for(i=0;i100;i++){sleep(100);system(psf1.txt);}}else{perror(Createnewprocess!);}return1;}}编译程序#gcc-odaemondaemon.c执行程序#./daemon5、实验结果及分析程序sleep(100)后会在当前目录生成一个文件f1.txt,内容如下:PIDTTYTIMECMD1258pts/000:00:00bash2729pts/000:00:00daemon2801pts/000:00:00sh2802pts/000:00:00ps再sleep(100),此文件会更新。重复执行100次。实验7.1代码分析1、实验目的了解与文件管理有关的Linux内核模块的代码结构。2、实验内容阅读Linux/Minix中有关文件模块的调用主线,并写出分析报告,包括文件建立模块,即系统调用create()文件删除模块,即系统调用rm()读/写模块,即read/write3、分析报告示例A.创建文件模块分析5780/*creatsystemcall*/5781Creat()5782{5783resister*ip;5784externuchar;57855786ip=namei(&uchar,1);5787if(ip==NULL){5788if(u.u_error)5789return;5790ip=maknode(u.u_arg[1]&07777&(~ISVTX));5791if(ip==NULL)5792return;5793open1(ip,FWRITE,2);5794}else5795open1(ip,FWRITE,1);5796}第5786:“namei”(7518)将一路径名变换成一个“inode”指针。“uchar”是一个过程的名字,它从用户程序数据区一个字符一个字符地取得文件路径名。5787:一个空“inode”指针表示出了一个错,或者并没有具有给定路径名的文件存在。5788:对于出错的各种条件,请见UPM的CREAT(II)。5790:“maknode”(7455)调用“ialloc”创建一内存“inode”,然后对其赋初值,并使其进入适当的目录。注意,显式地清除了“粘住”位(ISVTX)。B.删除文件rm模块分析3510unlink()3511{3512resister*ip,*pp;3513externuchar;35143515pp=namei(&uchar,2);3516if(pp==NULL)3517return;3518prele(pp);3519ip=iset(pp-dev,u.u_dent.u_ino);3520if(ip==NULL)3521panic(*unlink–iset*);3522if((ip-i_mode%IFMT)==IFDIR&&!suser())3523gotoout;3524u.u_offset[1]=-DIRSIZ+2;3525u.ubase=&u.u_dent;3526u.ucount=DIRSIZE+2;3527u.u_dent.u_ino=0;3528writei(pp);3529ip-i_nlink--;3530ip-i_flag=!IUPD;35313532out:3533iput(pp);3534iput(ip);3535}新文件作为永久文件自动进入文件目录。关闭文件不会自动地造成文件被删除。当内存“inode”项中的“i_nlink”字段值为0并且相应文件未被打开时,将删除该文件。在创建文件时,该字段由“maknode”赋初值为1。系统调用“link”(5941)可将其值加1,系统调用“unlink”(3529)则可将其值减1。创建临时“工作文件”的程序应当在其终止前执行“unlink”系统调用将这些文件删除。注意,“unlink”系统调用本身并没有删除文件。当引用计数(i_count)被减为0时(7350、7362),才删除该文件。为了减少在程序或系统崩溃时遗留下来的临时文件所带来的问题,程序员应当遵守下列约定:(1)在打开临时文件后立即对其执行“unlink”操作。(2)应在“tmp”目录下创建临时文件。在文件名中包括进程标识数就可构成一惟一文件名C读/写模块,即read/write分析/**linux/fs/minix/file.c**Copyright(C)1991,1992LinusTorvalds**minixregularfilehandlingprimitives*/#includeasm/segment.h#includeasm/system.h#includelinux/sched.h#includelinux/minix_fs.h#includelinux/kernel.h#includelinux/errno.h#includelinux/fcntl.h#includelinux/stat.h#includelinux/locks.h#defineNBUF32#defineMIN(a,b)(((a)(b))?(a):(b))#include#includestaticintext2_file_read(structinode*,structfile*,char*,int);staticintext2_file_write(structinode*,structfile*,char*,int);staticvoidext2_release_file(structinode*,structfile*);/**WehavemostlyNULL'shere:thecurrentdefaultsareokfor*theext2filesystem.*/staticstructfile_operationsext2_file_operations={NULL,/*lseek-default*/ext2_file_read,/*read*/ext2_file_write,/*write*/NULL,/*readdir-bad*/NULL,/*select-default*/ext2_ioctl,/*ioctl*/generic_mmap,/*mmap*/NULL,/*nospecialopenisneeded*/ext2_release_file,/*release*/ext2_sync_file/*fsync*/};structinode_operationsext2_file_inode_operations={&ext2_file_operations,/*defaultfileoperations*/NULL,/*create*/NULL,/*lookup*/NULL,/*link*/NULL,/*unlink*/NULL,/*symlink*/NULL,/*mkdir*/NULL,/*rmdir*/NULL,/*mknod*/NULL,/*rename*/NULL,/*readlink*/NULL,/*follow_link*/ext2_bmap,/*bmap*/ext2_truncate,/*truncate*/ext2_permission/*permission*/};staticintext2_file_read(structinode*inode,structfile*filp,char*buf,intcount){intread,left,chars;intblock,blocks,offset;intbhrequest,uptodate;structbuffer_head**bhb,**bhe;structbuffer_head*bhreq[NBUF];structbuffer_head*buflist[NBUF];structsuper_block*sb;unsignedintsize;interr;if(!inode){printk(ext2_file_read:inode=NULL\n);return-EINVAL;}sb=inode-i_sb;if(!S_ISREG(inode-i_mode)){ext2_warning(sb,ext2_file_read,mode=%07o,inode-i_mode);return-EINVAL;}offset=filp-f_pos;size=inode-i_size;if(offsetsize)left=0;elseleft=size-offset;if(leftcount)left=count;if(leftEXT2_BLOCK_SIZE_BITS(sb);offset&=(sb-s_blocksize-1);size=(size+sb-s_blocksize-1)EXT2_BLOCK_SIZE_BITS(sb);blocks=(left+offset+sb-s_blocksize-1)EXT
本文标题:北京邮电大学操作系统实验-(2)
链接地址:https://www.777doc.com/doc-2401028 .html