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

下载本文档

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

文档简介

...........专业..交通大学实验报告操作系统实验报告21305051332130505133计算机36班操作系统实验实验一:用户接口实验实验目的理解面向操作命令的接口Shell。学会简单的shell编码。理解操作系统调用的运行机制。掌握创立系统调用的方法。操作系统给用户提供了命令接口和程序接口〔系统调用〕两种操作方式。用户接口实验也因此而分为两大局部。首先要熟悉Linux的根本操作命令,并在此根底上学会简单的shell编程方法。然后通过想Linux核添加一个自己设计的系统调用,来理解系统调用的实现方法和运行机制。在本次实验中,最具有吸引力的地方是:通过核编译,将一组源代码变成操作系统的核,并由此重新引导系统,这对我们初步了解操作系统的生成过程极为有利。实验容控制台命令接口实验该实验是通过"几种操作系统的控制台命令〞、"终端处理程序〞、"命令解释程序〞和"Linux操作系统的bash〞来让实验者理解面向操作命令的接口shell和进展简单的shell编程。查看bash版本。在shell提示符下输入:$echo$BASH_VERSION我们的版本是4.3.42(1)-release〔2〕建立bash脚本,输出Helloword在编辑器中输入以下容#!/bin/bashechoHelloWorld!执行脚本使用指令:$./script编写bash脚本,统计/my目录下c语言文件的个数通过bash脚本,可以有多种方式实现这个功能,而使用函数是其中个一个选择。在使用函数之前,必须先定义函数。进入自己的工作目录,编写名为count的文件脚本程序:#!/bin/bashfunction count{echo –n "Numberofmatchesfor$1:" #接收程序的第一个参数ls $1|wc–l #对子程序的第一个参数所在的目录进展操作}将count文件复制到当前目录下,然后在当前目录下建立文件夹,在my目录下建立几个c文件,以便用来进展测试系统调用实验该实验是通过实验者对"Linux操作系统的系统调用机制〞的进一步了解来理解操作系统调用的运行机制;同时通过"自己创立一个系统调用mycall〔〕〞和"编程调用自己创立的系统调用〞进一步掌握创立和调用系统调用的方法。编程调用一个系统调用fork〔〕,观察结果。在应用程序中调用系统调用fork〔〕非常简单,下面的程序可以很清楚的显示出有fork〔〕系统调用生成了子进程,而产生的分叉作用:#include<stdio.h>intmain(){ intiUid; iUid=fork(); if(iUid==0) for(;;){printf("Thisischildprocess.\n");sleep(1); } if(iUid>0) for(;;){ printf("Thisisparentprocess.\n"); sleep(1); } if(iUid<0)printf("Cannotusesystemcall.\n"); return0;}程序运行结果:编程调用创立的系统调用foo〔〕,观察结果。在核源码中添加如下代码:asmlinkageintsys_foo〔intx〕{ printf〔"%d\n〞,x〕;}编程调用创立的系统调用foo〔〕,观察结果。#include<stdio.h>#include<linux/unistd.h>_syscall1(char*,foo,int,ret)main(){intI,J;I=100;J=0;J=foo(I);printf("Thisistheresultofnewkernel\n");printf("%d",j);}重新编译核,编译成功后的核版本如下:自己创立一个系统调用mycall〔〕,实现功能:显示字符串到屏幕上。在核源码中添加如下代码:#include<linux/linkage.h>asmlinkagelongsys_newcall(inti){//printk("thisisasystemcallmadebyyourself\n");return(i*10);}测试新的System_callCODE: vitest.c编程调用自己创立的系统调用。测试:CODE:./test实验体会:通过本次实验,我们理解了面向操作命令的接口Shell,学会了简单的shell编码,理解了操作系统调用的运行机制,掌握了创立系统调用的方法。本次实验通过核编译,将一组源代码变成操作系统的核,并由此重新引导系统,这让我们初步了解了操作系统的生成过程。实验二:进程管理实验实验目的加深对进程概念的理解,明确进程和程序的区别。进一步认识并发执行的实质。分析进程争用资源的现象,学习解决进程互斥的方法。了解Linux系统中进程通信的根本原理。进程是操作系统中最重要的概念,贯穿始终,也是学习现代操作系统的关键。通过本次实验,要求理解进程的实质和进程管理的机制。在Linux系统下实现进程从创立到终止的全过程,从中体会进程的创立过程、父进程和子进程的关系、进程状态的变化、进程之间的同步机制、进程调度的原理和以信号和管道为代表的进程间通信方式的实现。实验容编制实现软中断通信的程序1.实验原理:使用系统调用fork()创立两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号〔即按delete键〕,当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17软中断信号,子进程获得对应软中断信号,然后分别输出以下信息后终止:Childprocess1iskilledbyparent!!Childprocess2iskilledbyparent!!父进程调用wait()函数等待两个子进程终止后,输入以下信息,完毕进程执行:Parentprocessiskilled!!2.实验源码:#include<stdio.h>#include<signal.h>#include<unistd.h>#include<sys/types.h>intwait_flag;voidstop();main(){intpid1,pid2; //定义两个进程号变量signal(3,stop); //或者signal(14,stop);while((pid1=fork())==-1); //假设创立子进程1不成功,那么空循环if(pid1>0){ //子进程创立成功,pid1为进程号while((pid2=fork())==-1); //创立子进程2if(pid2>0){wait_flag=1;sleep(5); //父进程等待5秒kill(pid1,16); //杀死进程1kill(pid2,17); //杀死进程2wait(0); //等待第1个子进程1完毕的信号wait(0); //等待第2个子进程2完毕的信号printf("\nParentprocessiskilled!!\n");exit(0); //父进程完毕}else{wait_flag=1;signal(17,stop); //等待进程2被杀死的中断号17printf("\nChildprocess2iskilledbyparent!!\n");exit(0);}}else{wait_flag=1;signal(16,stop); //等待进程1被杀死的中断号16printf("\nChildprocess1iskilledbyparent!!\n");exit(0);}}voidstop(){wait_flag=0;}3.程序运行结果:或者屡次运行,并且Delete键后,会出现如下结果:4.简要原因分析:上述结果中"Childprocess1iskilledbyparent!!〞和"Childprocess2iskilledbyparent!!〞相继出现,当运行几次后,谁在前谁在后是随机的。这是因为:从进程调度的角度看,子进程被创立后处于就绪态。此时,父进程和子进程作为两个独立的进程,共享同一个代码段,分别参加调度、执行,直至进程完毕。但是谁会先被调度程序选中执行,那么与系统的调度策略和系统当前的资源状态有关,是不确定的。因此,谁先从fork()函数中返回继续执行后面的语句也是不确定的。编制实现进程的管道通信的程序1.实验原理:使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话:Childprocess1issendingamessage!Childprocess2issendingamessage!而父进程那么从管道中读出来自于两个子进程的信息,显示在屏幕上。要求:父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。2.程序源码:#include<unistd.h>#include<signal.h>#include<stdio.h>intpid1,pid2;//定义两个进程变量main(){intfd[2];charOutPipe[100],InPipe[100]; //定义两个字符数组pipe(fd); //创立管道while((pid1=fork())==-1); //如果进程1创立不成功,那么空循环if(pid1==0){//如果子进程1创立成功,pid1为进程号lockf(fd[1],1,0); //锁定管道sprintf(OutPipe,"\nChildprocess1issendingmessage!\n");//给Outpipe赋值write(fd[1],OutPipe,50); //向管道写入数据sleep(5); //等待读进程读出数据lockf(fd[1],0,0); //解除管道的锁定exit(0); //完毕进程1}else{while((pid2=fork())==-1); //假设进程2创立不成功,那么空循环if(pid2==0){lockf(fd[1],1,0);sprintf(OutPipe,"\nChildprocess2issendingmessage!\n");write(fd[1],OutPipe,50);sleep(5);lockf(fd[1],0,0);exit(0);}else{wait(0); //等待子进程1完毕read(fd[0],InPipe,50); //从管道中读出数据printf("%s\n",InPipe); //显示读出的数据wait(0); //等待子进程2完毕read(fd[0],InPipe,50);printf("%s\n",InPipe);exit(0); //父进程完毕}}}3.运行结果截图:4.简要分析管道,是指用于连接一个读进程和一个写进程,以实现它们之间信息的共享文件又称pipe文件。向管道〔共享文件〕提供输入的发送进程〔即写进程〕,以字符流形式将大量的数据送入管道;而接收管道输送的接收进程〔读进程〕,可以从管道中接收数据。为了协调双方的通信,管道通信机制必须提供以下3方面的协调能力:互斥。当一个进程正在对pipe进程读/写操作时,另一进程必须等待,程序中使用lock(fd[1],1,0)函数实现对管道的加锁操作,用lock(fd[1],0,0)解除管道的锁定。同步。当写进程把一定数量的数据写入pipe后,便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程试图从一空管道中读取数据时,也应睡眠等待,直至写进程将数据写入管道后,才将其唤醒。判断对方是否存在。只有确定写进程和读进程都存在的情况下,才能通过管道进展通信。5〕实验体会:通过次验我理了进的质进管的机程操系中最要的概念是代作统键验我在nux系统下现程创立到止的过体会进的程父进和进的系进程态变、程间的步进程度原和信和管为表进间信方的现。实验三存储器管理实验实验目的理解存页面调度的机理掌握几种理论页面置换算法的实现方法了解HASH数据构造的使用通过实验比拟几种调度算法的性能优劣页面置换算法是虚拟存储管理实现的关键,通过本次实验理解存页面调度的机制,在模拟实现FIFO、LRU、NRU和OPT几种经典页面置换算法的根底上,比拟各种页面置换算法的效率及优缺点,从而了解虚拟存储实现的过程。准备知识C++、指针、构造

温馨提示

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

评论

0/150

提交评论