brcAAA操作系统实验报告_第1页
brcAAA操作系统实验报告_第2页
brcAAA操作系统实验报告_第3页
brcAAA操作系统实验报告_第4页
brcAAA操作系统实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

学 生 实 验 报 告姓名: 黄维津 年级专业班级 计科141班 学号 201415210137 成绩 课程名称操作系统实验名称实验1 操作系统界面【实验目的、要求】1. 熟悉Linux字符操作界面;2. 熟悉常用的Shell命令;3. 熟悉Linux文本编辑方法;4. 掌握利用GCC编译器在Linux环境下编译C程序的能力【实验内容】1. Linux字符操作界面;2. Shell操作命令;3. VIM编辑器的使用方法;4. Linux下的C程序开发。【实验环境】(含主要设计设备、器材、软件等)计算机 C语言编程软件 redhat操作系统 VM虚拟机【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1. 同时按住“Ctrl+Alt+Shift+F2”键进入字符操作界面;2. 熟悉常用的Shell操作命令 (1)查看系统分区情况:fdisk -l (2)查看当前运行级别:runlevel可知,当前运行级别为:5 (3)将当前运行级别改变为3:init 3运行后的结果如下图:输入命令runlevel查看当前运行级别可知为3 (4)新建文件:touch 文件名这里创建了一个文件名为test.txt的文件 (5)删除文件:rm 要删除的文件名这里我删除了刚新建的test.txt文件,输入ls命令已查看不到test.txt文件了,证明已删除成功。 (6)查看文件权限:ls -l可知hello.c文件的权限是644 (7)更改文件权限:chmod 文件权限 文件名这里将hello.c文件的权限更改为755,即rwxr-xr-x3. VIM编辑器的使用方法 (1)一般模式:以vi打开一个文件就直接进入一般模式了(这是默认的模式)。 (2)编辑模式:在一般模式中可以进行删除、复制、粘贴等的操作,但是却无法编辑文件的内容,只有当到你按下【i, I, o, O, a, A, r, R】等任何一个字母之后才会进入编辑模式。按下【Esc】即可退出编辑模式 (3)命令行模式:输入【 : / ? 】三个中的任何一个,就可以将光标移动到最底下那一行。在命令行模式下,可选用以下指令离开vi:q! 退出,不保存;:wq 保存退出;4. Linux下的C程序开发 (1)使用touch命令创建c文件hello.c; (2)使用vi hello.c命令编辑c文件: #include int main() printf(“hello,word”); return 0; (3)按esc键 进入命令模式 (4)输入:“:wq!”保存退出; (5)编译程序:gcc -o hello hello.c (6)运行程序:./hello (7)运行结果:输出hello,word 2016年 11月 20日 【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见)在实验的过程中,我用的是VM虚拟机和redhat操作系统(linux系统中的一种),学会了如何在虚拟机上安装并运行linux操作系统,也熟悉了Linux字符操作界面和常用的shell命令。虽然我一开始从图形操作界面转到命令行操作界面多少有些不适应,但随着对命令行的熟悉应用,发现也没那么难,只是命令行太多了会记不住。与此同时,第一次在linux系统下编写c程序,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。不过此次实验要求掌握编写并运行一个简单的c程序,我就直接输出一句话就好了,所以不需要怎么调试了,直接用gcc编译并运行。在这实验的过程中,加深了对一些术语的理解,也让我学到了新的知识。要说到实验的改进意见,我想最大要改进的地方就是要提高虚拟机运行的流畅度,不能在使用虚拟机中的操作系统时出现运行卡顿等的情况,以保住实验的流畅进行。 指导教师签名: 20 年 月 日【备注】学 生 实 验 报 告姓名: 黄维津 年级专业班级 计科141 学号 201415210137 成绩 课程名称操作系统实验名称实验2 进程管理【实验目的、要求】1熟悉进程与程序的区别,加深对进程概念的理解;2了解并发进程的执行过程;3掌握解决进程互斥使用资源的方法。【实验内容】1. 编写一段程序,实现进程的管理;2. 编写一段程序实现进程的通信。【实验环境】(含主要设计设备、器材、软件等)信息楼505机房Linux环境【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1. 编写一个程序,创建两个子进程,然后分别在父、子进程中显示它们的进程号,以及对于的父进程号(1)思路:使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“A”,子进程分别显示字符“b”和“c”。(2)程序关键代码#includemain()int p1,p2;if(p1=fork()/*子进程创建成功,如果失败fork函数会返回一个负值*/putchar(b);elseif(p2=fork()/*子进程创建成功,如果失败fork函数会返回一个负值*/putchar(c);else putchar(A);/*父进程执行*/ (3)运行结果:Abc任意的排序(4)结果分析:从进程执行并发来看,输出Abc的排列都是有可能的。fork()函数创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不一定是顺序的,所以输出Abc的排列都是有可能的。2. 写一个程序,实现父子进程之间的通信用管道实现:pipe_named_write.c/ 向管道文件写信息#include#include#includeint main() FILE * out_file;int count = 1;char buf80;out_file = fopen(“mypipe”,”w”);if (out_file=NULL) printf(“Error opening pipe”); exit(1);sprintf(buf, ”this is the test data for the named pipe example n”);fwrite(buf,1,88,out_file);fclose(out_file);pipe_named_read.c/ 从管道文件读信息int main() FILE *in_file; int count = 1; char buf80; in_file = fopen(“mypipe”, “r”); if (in_file = NULL) printf(“Error in fopen. n”); exit(1);while ( (count = fread(buf,1,80,in_file)0) printf(“received from pipe: %s n”,buf);fclose()in_file;使用FIFO实现进程间的通信。用mkfifo函数创建管道文件my_fifo,然后从Data.txt文件中读取数据,并写入管道文件my_fifo中;在从管道文件my_fifo中读取数据,写入DataFromFIFO.txt文件中。整个过程用两个C程序来实现:fifowrite.c文件实现管道文件的创建,以及将Data.txt文件中的数据读入管道文件中;fiforead.c文件实现从管道文件中读取数据,并写入DataFromFIFO.txt文件中。fifowrite.c的源代码如下:#include #include #include #include #include #include #include #include int main() const char *fifo_name = /home/c/my_fifo; int pipe_fd = -1; int data_fd = -1; int res = 0; const int open_mode = O_WRONLY; int bytes_sent = 0; char bufferPIPE_BUF + 1; if(access(fifo_name, F_OK) = -1) / 管道文件不存在 / 创建命名管道 res = mkfifo(fifo_name, 0777); if(res != 0) fprintf(stderr, Could not create fifo %sn, fifo_name); exit(EXIT_FAILURE); printf(Process %d opening FIFO O_WRONLYn, getpid(); / 以只写阻塞方式打开FIFO文件,以只读方式打开数据文件 pipe_fd = open(fifo_name, open_mode); data_fd = open(Data.txt, O_RDONLY); printf(Process %d result %dn, getpid(), pipe_fd); if(pipe_fd != -1) int bytes_read = 0; / 向数据文件读取数据 bytes_read = read(data_fd, buffer, PIPE_BUF); bufferbytes_read = 0; while(bytes_read 0) / 向FIFO文件写数据 res = write(pipe_fd, buffer, bytes_read); if(res = -1) fprintf(stderr, Write error on pipen); exit(EXIT_FAILURE); / 累加写的字节数,并继续读取数据 bytes_sent += res; bytes_read = read(data_fd, buffer, PIPE_BUF); bufferbytes_read = 0; close(pipe_fd); close(data_fd); else exit(EXIT_FAILURE); printf(Process %d finishedn, getpid(); exit(EXIT_SUCCESS); 源文件fiforead.c的代码如下:#include #include #include #include #include #include #include #include int main() const char *fifo_name = /home/c/my_fifo; int pipe_fd = -1; int data_fd = -1; int res = 0; int open_mode = O_RDONLY; char bufferPIPE_BUF + 1; int bytes_read = 0; int bytes_write = 0; / 清空缓冲数组 memset(buffer, 0, sizeof(buffer); printf(Process %d opening FIFO O_RDONLYn, getpid(); / 以只读阻塞方式打开管道文件,注意与fifowrite.c文件中的FIFO同名 pipe_fd = open(fifo_name, open_mode); / 以只写方式创建保存数据的文件 data_fd = open(DataFormFIFO.txt, O_WRONLY|O_CREAT, 0644); printf(Process %d result %dn,getpid(), pipe_fd); if(pipe_fd != -1) do / 读取FIFO中的数据,并把它保存在文件DataFormFIFO.txt文件中 res = read(pipe_fd, buffer, PIPE_BUF); bytes_write = write(data_fd, buffer, res); bytes_read += res; while(res 0); close(pipe_fd); close(data_fd); else exit(EXIT_FAILURE); printf(Process %d finished, %d bytes readn, getpid(), bytes_read); exit(EXIT_SUCCESS); 运行结果如下: 2016 年 11 月 26 日 【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见) 在查询了资料后逐渐懂得怎么下手完成这个实验,在实验过程中逐渐理解了进程的概念,并进一步了解了进程的管理机制,同时也明白了什么是管道通信,怎样加锁和解锁,对课本上的知识理解得更加深入了。同时也让我认识到自己的不足,操作系统的有些知识,我知道的还不多,没有掌握好,还需要多多学学,不断提升自己的能力。 指导教师签名: 年 月 日【备注】学 生 实 验 报 告姓名: 黄维津 年级专业班级 计科141 学号 201415210137 成绩 课程名称操作系统实验名称实验3 存储管理【实验目的、要求】1. 了解虚拟存储管理技术的原理与特点;2. 掌握请求页式存储管理的页面设置算法。【实验内容】1. 编写一个程序模拟存储管理过程。【实验环境】(含主要设计设备、器材、软件等)计算机 C语言编程软件【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)页式虚拟存储管理程序模拟(1)设计思路根据模拟的页式管理设计,在页式存储管理中有三种最基本的页面调度算法:最佳置换算法(OPT)、先进先出置换算法(FIFO)、最近最久未使用置换算法(LRU),但在三种算法中均要求在调度程序中产生的页面序列是随机产生的,而不是人为的输入,在执行时只需改变页面的大小及内存容量就可以得到不同的页面序列,另外还需要说明随机的性能和其性能可能对算法的影响,并对随机性要有一定的参数控制能力。此次实验将使用两种方法实现,分别是先进先出(FIFO)页面置换和最近最久未使用(LRU)置换。(2) 程序流程图输入内存分配页数开始初始化第一列值是否有请求访问页复制前一页内容内存是否已存在内存是否有空页直接插入替换内存中将来不出现或离当前最远的页输出全部页面变化情况结束YYNNYN(3)关键代码function FIFO()PageList = 6 2 1 0 3 4 2 0 4 5 9 3 1 2 0 5 3 1 8; / 初始化:NumofPage = length(PageList);NumofPosition = M;SMatrixNumofPosition2 = -1; / 将其初始化为-1for( i=0; iNumofPage;i+) pos = findPositionFIFO(SMatrix,PageListi); if (pos=-1) continue; / 在SMatrix中找到页面已经存在 for (j=0;j0) SMatrixi2 = SMatrixi2 + 1; SMatrixpos1 = PageListi; if (SMatrixpos2 =-1) SMatrixpos2 = 1function pos = findPositionFIFO(SMatrix,Pageid) NumofPosition = length(SMatrix); lastPeriod = SMatrix02;value = SMatrix01;for (i=0; i lastPeriod) pos = i; lastPeriod = SMatrixi2;function LRU()PageList = 6 2 1 0 3 4 2 0 4 5 9 3 1 2 0 5 3 1 8; / 初始化:NumofPage = length(PageList);NumofPosition = M;SMatrix = arrayNumofPosition2; / 将其初始化为-1for( i=0; iNumofPage;i+) pos isIn = findPositionLRU(SMatrix,PageListi); if (pos=-1) / 在SMatrix中找到页面已经存在SMatrixi2 = 1; continue; for (j=0;j0) SMatrixi2 = SMatrixi2 + 1; SMatrixpos1 = PageListi; if (SMatrixpos2 =-1) SMatrixpos2 = 1function pos isIn = findPositionLRU(SMatrix,Pageid) NumofPosition = length(SMatrix); lastPeriod = SMatrix02;value = SMatrix01;isIn = 0;for (i=0; i lastPeriod) pos = i; lastPeriod = SMatrixi2; 2016 年 11 月 26 日 【实验结果或总结】(对实验结果进行相应分析,或总结实验的心得体会,并提出实验的改进意见) 由于知识有限,只能大概地完成这次实验。通过完成这个实验,让我反复地琢磨着课本上的知识点,努力将其弄懂,这样才有思路来完成实验。从理论到实践可以学到很多的东西,同时也可以巩固老师在课堂上讲过的知识,也学到了很多在书本上学不到的知识。通过这次实验使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的。 指导教师签名: 20 年 月 日【备注】学 生 实 验 报 告姓名: 黄维津 年级专业班级 计科141 学号 201415210137 成绩 课程名称操作系统实验名称实验4 文件管理【实验目的、要求】1. 了解文件系统的功能和内部实现;2. 熟悉文件系统的系统调用;【实验内容】1. 使用有关文件系统的系统调用create()、open()、close()、read()和write()将file1.c和file2.c合并为file3.c;【实验环境】(含主要设计设备、器材、软件等)计算机 C语言编程软件【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等) (1)了解函数 create()函数: 功能描述:创建一个文件并以只写的方式打开 函数原型:int creat(const char * pathname, mode_t mode) 参数说明:pathname:指向欲建立的文件路径字符串 mode_t mode:表示新建文件的权限 返回值:成功:返回文件描述符 失败:返回-1 open()函数: 功能描述:用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数。 函数原型:int open(const char *pathname,int flags,int perms) 参数说明:pathname:被打开的文件名(可包括路径名如dev/ttyS0) flags:文件打开方式 perms:被打开文件的存取权限 返回值: 成功:返回文件描述符 失败:返回-1 close()函数: 功能描述:用于关闭一个被打开的的文件 函数原型:int close(int fd) 参数说明:fd文件描述符 函数返回值:0成功,-1出错 read()函数 功能描述: 从文件读取数据 函数原型:ssize_t read(int fd, void *buf, size_t count) 参数说明:fd: 将要读取数据的文件描述词 buf:指缓冲区,即读取的数据会被放到这个缓冲区中去 count: 表示调用一次read操作,应该读多少数量的字符 返回值:返回所读取的字节数;0(读到EOF);-1(出错) write()函数 功能描述: 向文件写入数据 函数原型:ssize_t write(int fd, void *buf, size_t count) 返回值:写入文件的字节数(成功);-1(出错) (2)关键代码#include#include#includevoid main()char s1filename20,s2filename20,dfilename20;FILE *s1fp,*s2fp,*dfp;int num=0;/*得到第一个文件的文件名*/ printf(Please input source1 filename:n); gets(s1filename); /*得到另一个文件的文件名*/ printf(Please input source2 filename:n); gets(s2filename); /*得到要目标文件的文件名*/printf(Please input destination filename:n);gets(dfilename);/*输出信息合并前的文件的内容*/if(s1fp=fopen(s1filename,r)=0)printf(Cant open the file :%sn,s1filename);exit(0);if(s2fp=fopen(s2filename,r)=0)printf(Cant open the file :%sn,s2filename);exit(0);if(dfp=fopen(dfilename,w+)=0) printf(Cant open or create the file :%sn,dfilename); exit(0); /*输出信息合并前文件的内容*/ printf(nThe text of the file %s before merging :n,s1filename);OutputFile(s1fp);printf(nThe text of the file %s before merging :n,s2filename); OutputFile(s2fp); fseek(s2fp,0L,SEEK_SET); fseek(s1fp,0L,SEEK_SET); /*信息合并*/ MergeFile(s1fp,s2fp,dfp,&num); /*输出信息合并后文件的内容*/ printf(nThe text of the file %s after merging :n,dfilena

温馨提示

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

最新文档

评论

0/150

提交评论