操作系统实验报告

更新时间:2024-05-22 00:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《操作系统原理》

实 验 报 告 书

班级: 学号: 姓名: 指导教师:

2013-2014 学年 第 一 学期

1

实验名称: LINUX 用户界面 实验时间: 2013 年 10 月 16 日 第 7 周 星期 三 一、实验目的 1.熟悉Linux字符操作界面,熟练掌握常用Shell命令。 2.熟悉Linux中文本编辑方法,学会编辑软件vi的使用。 3.了解Linux编绎器gcc的功能,掌握基于Linux平台的C程序开发。 二、实验预习(预备知识的问题及回答) 1.为什么在Linux系统中,诸如光盘、U盘等要先挂载而后才能使用?如何获得U盘的设备名?装载点在文件系统中的位置是什么? 由于文件系统的差异,Linux在默认情况下并不支持软盘、光盘和U盘,所以需要通过装载相应盘片才可以访问其中的数据。 装载点是挂载文件系统的目录位置。 2.从虚拟机界面退出进入Windows OS界面的操作是 Ctrl + Alt ,从Windows OS界面进入虚拟机界面的方法是 鼠标点击虚拟界面 。 3.权限的含义是什么?如何使用数字法设定文件的权限? (1)权限的含义 Linux系统中的每个文件和目录都有相应的访问许可权限,访问权限分为只读(r),可写(w)和可执行三种。有三种不同类型的用户可对文件或目录进行访问,分别是文件所有者(u),同组用户(g)和其他用户(o)。所有的文件和目录都被创建它们的人所“拥有”,只要你是这个文件的所有者或你登录为根用户,你就拥有了改变所有者、组群和其他人权限的权利。 (2)使用数字法改变权限 命令格式 chmod 权限数值 文件名 说明:给指定文件赋予数值所规定的权限。 在数字设定法中,每种权限设置均可用数值来代表,其中0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,这些值之和便可用来设立特定权限。所以数字属性的格式应为3个0~7的八进制数,3个数表示的次序为u、g和o。 2 4.什么过滤操作?在Linux中如何实现? 过滤操作:将一个命令(或程序)的输出作为另一个命令(或程序)的输入Linux实现的命令格式:命令 | 命令 5.在Linux中挂载u盘并能显示其文档的中文信息,所使用的挂载命令是: 命令格式 mount /dev/sda1 /mnt/usb 。 6.什么是vi? 其三种操作模式的含义是什么?给出三种工作模式间的转换图。 vi有3种基本工作模式: 命令模式(Command Mode):vi启动后的默认模式,控制光标的移动、复制删除文字、进入输入模式和末行模式 输入模式(Insert Mode):进行文字输入 末行模式(Last Line Mode):保存文件、退出vi vi 文件名 命令模式 按冒号“:” Esc键 Esc键 按i、o、e等键 末行模式 退出 输入模式 三种模式之间转换 三、实验内容(包含实验所用命令或相关程序源代码) 1.shell操作命令(给出每题所用的Shell命令或命令结果) (1)创建名为stu1、stu2的2个用户,设置密码分别为student1和student2 ,并将它们设为组group1中的成员。 # groupadd group1 # useradd stu1 –g group1 # su stu1 $passwd stu1回车后敲入密码student1 $exit 3 # useradd stu2 –g group1 # su stu2 $passwd stu2回车后敲入密码student1 $exit (2)在每个用户的主目录下建立2个目录,分别命名为dir1和dir2。 # su stu1 $ cd ~ $mkdir dir1 $exit # su stu2 $ cd ~ $mkdir dir2 $exit (3)查找stu1用户主目录、下属各子目录的默认存取权限,并给出结论。 # su stu1 $cd .. $ ls –l 用户主目录权限为:drwx------,即目录的用户可读、写、执行,同组和其他用户无任何权限。 # su stu1 $ cd ~ $ ls –l dir1目录权限为: drwxr-xr-x,即目录的用户可读、写、执行,同组用户可读、执行,其他用户可读、执行。 (4)调试pwd和cd命令,回答下列关于Linux文件系统中目录的有关问题。 ① 用户主目录的绝对路径如何表示? /home/stu1 , /home/stu2 ② 根目录如何表示? /root ③.和..分别表示什么目录? 子目录 ,父目录 ④~表示什么目录? 用户主目录 ⑤当前目录如何表示? cd~ (5)新建用户stu3,设置其密码为student3,并将其设置为group2中成员。尔后,以stu3登录,在其主目录下建立名为text的目录,在text目录下再建立名为dir1的子目录,并使其成为当前目录。 4 # groupadd group2 # useradd stu3 –g group2 # su stu3 $passwd 回车后敲入密码student3 $ cd ~ $ mkdir text $ mkdir dir1 $ cd text/dir1 (6)使用cat>sneakers.txt命令,分析命令行cat sneakers.txt的显示结果。 $ cat>sneakers.txt buy some sneakers then go to the coffee shop then buy some coff ^D $cat sneakers.txt 从键盘中创建一个名为sneakers.txt文件,文件内容为:buy some sneakers then go to the coffee shop then buy some coff (7)使用上题的方法,在dir1目录中建立home.txt文件,其内容为: bring the coffee home take off shoes put on sneakers make some coffee relax! 如下: $cd /home/stu1/dir1 $cat > home.txt bring the coffee home take off shoes put on sneakers make some coffee relax! [ctrl+D] (8)试写出实现下列功能的shell命令: ① 将home.txt文件移至其上级目录中(即text目录下)。 $mv ./home.txt ② 将home.txt添加到sneakers.txt尾部形成新的文件saturday.txt。 $cat sneakers.txt > saturday.txt $cat home.txt >> Saturday.txt ③ 将text目录树从stu3用户主目录下移至stu2主目录下。 【使用特权用户方法】 su mv /home/stu3/text /home/stu2 5

【修改目录权限方法】 #cp/home/stu3/text/home/stu2 (9) 试画出上述命令后,用户stu1、stu2和stu3主目录中的目录树(3棵子树)。 stu1 stu2 dir1 dir2 Saturday.txt dir1 dir2 text stu3 dir1 home.txt dir1 dir2 text Saturday.txt Sneakers.txt dir1 home.txt Saturday.txt Sneakers.txt 2. Linux C程序开发 (1)编写Linux C程序,把一个文件的内容复制到另一个文件中,即实现简单的copy功能。要求:程序输入的第一个参数是源文件,第二个参数是目标文件。 【源程序】 #include #include int main(int argc ,char *argv[]) { FILE *in, *out; char ch ; if(argc!=3) { printf(“You forgot to enter a filename\\n”); exit(0); } if((in=fopen(argv[1],“r”))==NULL) { printf(“can not open infile\\n”); exit(0); } 6 if((out=fopen(argv[2],“w”))==NULL) { printf(“can not open outfile\\n”); exit(0); } while(!feof(in))fputc(fgetc(in),out); fclose(in); fclose(out); 【运行命令】 #gcc –o test copy.c #./test file1.c file2.c (2)编写Linux C程序,列出stu2主目录中的文件信息,并将其中saturday.txt文件的权限设置为文件所有者可读可写、同组用户只读、其他用户无权限。 【源程序】 #include #include #include #include int main(int argc ,char *argv[]) { DIR *dp; struct dirent *dirp; int n=0; if(argc!=2) { printf(“a single argment is required”); exit(0); } if((dp=opendir(argv[1]))==NULL) { printf(“can not open %s”,argv[1]); exit(0); } while(((dirp=readdir(dp))!=NULL)&&(n<=50)) { if(n%1==0)printf(“”); n++; printf(“s\\n”,dirp->d_name); } system(“chmod 640 /home/stu2/text/dir1/saturday.txt”); } 【运行命令】 #gcc –o test list.c #./test /home/stu2 7 实验名称: SHELL程序设计 实验时间: 2013 年 10 月 23 日 第 8 周 星期 三 一、实验目的 1.熟悉Shell脚本编程的步骤,掌握基于Bash的Shell脚本开发。 2.掌握Shell脚本中变量、条件测试的使用。 3.掌握Shell脚本中的控制流结构和函数的使用。 二、实验预习(预备知识的问题及回答) 1. Linux系统默认的shell语言是什么?欲查看该shell的版本,应使用什么命令? Linux系统默认的shell语言是Bash shell。 欲查看该shell的版本,应使用的命令是: $echo $BASH_VERSION 2. 预习shell有关变量和参数的相关知识,回答下列问题。 (1)假设用户进行了如下的赋值操作: $ person=jenny 试给出下面命令的输出结果。 1) echo person person 2) echo $person jenny 3) echo ?$person? $person 4) echo “$person” jenny (2)填充下列与环境变量、位置变量和预定义变量相关的表格。 Shell变量 HOME PATH 定义 用于保存用户注册目录的绝对路径 保存用冒号分隔的目录路径,shell将按PATH变量中给出的顺序搜索这些目录,找到第一个与命令名一致的可执行文件将被执行。 PWD 当前工作目录的绝对路径名,该变量取值随cd命令的使用而变化。 PS1 主提示符,默认特权用户为#,普通用户为$。 $0 表示当前shell程序的文件名。 8 $# $? $$ xpr index “value” ?a? 表示位置参数的个数。 表示位置参数的个数。 当前进程的pid。 3.写出下列expr命令的输出: (1) e(2) expr “value” : ?v.*u? (3) expr “aaa” : ?a\\+? (4) expr “aaa” : ?a\\?? (5) expr 2+3 (6) expr 2 + 3 (7) expr 2 \\* 3 (8) expr 5 + `expr 2 + 3` (9) expr length “operating system” (10) expr substr linux 2 3 答:(1)2 (2)4 (3)3 (4)1 (5)2+3 (6)5 (7)6 (8)non-numeric argument (9)16 (10)inu 三、实验内容 1.编写Shell脚本,从命令行中接收一个二元算术表达式并计算其结果。 【源程序】 #!/bin/bash if test $#=3 then case $2 in +) let z=$1+$3; ; -) let z=$1-$3; ; /) let z=$1/$3; ; x|X) let z=$1*$3; ; *) echo “Warning -$2 invalid operator!” exit; ; esac echo “Answer is $z” else echo “Usage - $0 Value1 operator value2” fi 【运行】 chmod a+x jisuan ./jisuan 2 +3 9 2.编写一个以文件列表作为输入的过滤器程序,要求文件名含有以句点“.”分隔的后缀,过滤器输出每个文件的不带句点和后缀的文件名。 【源程序】 read flag while test “$flag” != “#” #输入的文件列表以井号结束 do location=`expr “$flag” : “.*\\.” ` location=`expr $location – 1` basename=`expr substr “$flag” 1 $location` echo $basename read flag done 【运行】 chmod a+x letter ./letter 3.将下面的shell脚本命名为myscript,分析其功能: count=$# cmd=echo while [ $count –gt 0 ] do cmd=\ \\$$count\ count=`expr $count - 1` done eval $cmd 【命令行输入】 chmod a+x myscript ./myscript first second third 【运行结果】 third second first 【脚本功能分析】 将命令行输入的参数倒序显示 4.设计一个程序cuts,它从标准输入读入数据,获取由第一个参数n 和第二个参数m所限定范围的数据(包括这两个字符),n和m都是整数。例如: $ cuts 11 14 This is a test of cuts program (输入) test (显示结果) 【源程序】 #! /bin/bash read aline echo $aline | cut –c $1-$2 10

附加题 3.学习下面共享存储区的内容,并用共享存储区的方式实现“观察者——报告者”问题(共享的count变量存于共享存储区),并验证“与时间有关的错误”。 共享存储操作使得两个或两个以上的进程可以共用一段物理内存(一般情况下,两个进程的数据区是完全独立的,父进程用fork创建子进程后,子进程会复制父进程数据到自己的数据区)。 (1)创建共享内存 #include int shmget(key_t key,size_t size, int permflags); 参数key是共享内存的标识,size是共享内存段的最小字节数,permflags是访问权限,值的设置同semget一样。 (2)共享内存的控制 #include int shmctl(int shmid, int command, struct shmid_ds *shm_stat); command可设为IPC_STAT,IPC_SET,IPC_RMID。参数shm_stat指向存放属性的结构体,具体内容请参考手册。 (3)共享内存的附接和断开 #include void *shmat(int shmid, const void *addr, int shmflags); int shmdt(const void *addr); 由于两个函数需指出进程地址空间中的地址,因此比较复杂。简化的方法是将shmat中的地址设为NULL。 【源程序】 【运行与测试】 16 实验名称: 虚拟存储 实验时间: 2013 年 10 月 30 日 第 9 周 星期 三 一、实验目的 1. 掌握虚拟存储器的概念,理解实现虚拟存储器的基本方法。 2. 体会请求分页存储管理中,页面置换的过程,进一步掌握请求分页的基本原理。 3.进一步认识多种页面置换算法的实现机制,通过实验对各算法进行评价。 二、实验预习(预备知识的问题及回答) 1.描述请求分页的地址转换过程。 程序请求访问第一页 开始 缺页中断处理 保留 CPU 现场 是 页号>页表长度? 否 从外存中找到缺页 CPU检索快表 否 内存满否 是 页表在快表中? 是 选择一页换出 否 访问该表 否 该页被修改否 产生缺页中断 页在内存? 是 请求调页 是 将该页写回外存 修改快表 OS命令CPU从外存读缺页 修改访问位和修改位 启动I/O硬件 形成物理地址 将第一页从外存转入内存 地址变换结束 越界中断 修改页表 17 2.解释FIFO页面置换算法所产生的Belady现象。 答:Belady现象是指当进程分配的内存块数增加时,进程缺页率反而上升的现象。FIFO算法在页面置换时,总是淘汰先进入主存的页面,而先进入主存的页面并不一定是以后用不到的页面,如果这些页面以后需要访问,则将产生缺页,因此即使分配的内存块数增加,缺页率仍然有可能上升,这是由于使用的页面置换算法不合理导致的。 三、实验内容 1.计算并输出下列页面置换算法在不同内存容量(4页至32 页)下的命中率. (1)最佳置换算法(OPT) (2)先进先出算法(FIFO) (3)最近最久未用页面置换算法(LRU) 具体要求如下: (1)通过随机函数产生一个指令序列,共320条指令.指令地址的生成原则如下: 1)50%的指令是顺序执行的; 2)25%的指令是均匀分布在前地址部分; 3)25%的指令是均匀分布在后地址部分; 程序中的具体实施方法是: 1)在[0,319]的指令地址之间随机选取一起点地址m; 2)顺序执行一条指令,即执行地址为m+1的指令; 3)在前地址[0,m+1]中随机执行一条指令,该指令的地址为m’; 4)顺序执行一条指令,即执行地址为m’+1的指令; 5)在后地址[m’+2,319]中随机执行一条指令; 重复上述步骤(1)?(5),直到执行320条指令为止. 将指令序列变换成为页地址流: 设:页面大小为1k,用户内存容量为4页逐步增加到32页,用户虚存容量为32k. 假定在用户虚存中,每页存放10 条指令,即320条指令在虚存中的存放方法为: 第0条?第9条指令在第0页; 第10条?第19条指令在第1页; ?? 第310条?第319条指令在第31页. 按以上方式用户指令共组成32页.据此可得出指令地址m和页面号page以及页内位移量offset之间的计算公式为:page=m/10,offset=m. 页地址流长度为320。 【源程序】 #include #include #include #include int page_stream[320]; 18 int b[32]; Void ran() //生成页地址流 { int instruct[320]; int i,j,m,m1.m2; srand(getpid()); // 生成随机数种子 i=0; while(i<320) { m=rand()20; instruct[i]=m; i++; if((m+1)<320) { instruct[i]=m+1; i++; } m1=rand()%(m+1); instruct[i]=m1; i++; if((m1+1)<320) { instruct[i]=m1+1; i++; } if((m1+2)<320) { m2=m1+2 + rand()%(320-m1-2); instruct[i]=m2; i++; } } page_stream[i]=instruct[i]/10; } int in_block(int page,int block_count) //页面在内存块中,返回1 { int flag,k; flag=0; for(k=0;kmax) { max=d[k]; s=k;} b[s]=page_stream[j]; page_interrupt++; } } Printf(“\\n When it has %d blocks, the page_interrupt rate in OPT algorithm is%f\\n”,i,page_interrupt/320.0); } } Void fifo() { int i,j,k,t,page_interrupt; for(i=4;i<32;i++) { for(k=0;k<32;k++) b[k]=-1; j=0; for(k=0;k

} Printf(“\\n When it has %d blocks, the page_interrupt rate in FIFO algorithm is%f\\n”,i,page_interrupt/320.0); } } void lru() { int i,j,k,t,s,min,d[32],page_interrupt; for(i=4;i<32;i++) { for(k=0;k<32;k++) b[k]=-1; j=0; for(k=0;k=0;t--) if(page_stream[t]==b[k]) {d[k]=t; break;} } min=i; for(k=0;k

本文来源:https://www.bwwdw.com/article/7d27.html

Top