操作系统手册.docx
《操作系统手册.docx》由会员分享,可在线阅读,更多相关《操作系统手册.docx(32页珍藏版)》请在冰豆网上搜索。
操作系统手册
许昌学院
《操作系统》实验指导手册
学号:
姓名:
班级:
成绩:
2013年06月
实验一Linux操作系统的安装
实验时间:
实验地点:
成绩:
【实验目的】
1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。
2.掌握Linux系统的安装方法,特别是如何在虚拟机上安装、配置该操作系统。
3.了解在多操作系统环境下如何本地安装(光盘安装)Linux系统。
4.熟悉Linux系统的文件系统结构。
【实验内容】
1.安装并配置vmware虚拟机,制定运行环境,特别要启动NAT和USB支持。
2.在vmware上安装RedHatLinux9.0,指定最大空间为20G以上(具体视硬盘剩余空间而定)。
当对虚拟磁盘空间分区时,需至少指定10G给“/”(主目录),分区格式为ext3,还需指定与内存容量相同的swap(交换)区。
3.安装完RedHatLinux9.0系统后,需配置硬件(如网卡、显卡等)和软件(如编程开发软件等)。
【实验步骤和结果】
1、启动VMware,点击图中的CreateaNewVirtualMachine图标,会弹出一个对话框,在对话框中勾选Typical点击Next:
2、在弹出如下对话框中勾选最后一项,点击Next,在新弹出的对话框中选择linux,点击Next。
3、在下图对话框中输入虚拟机的名字XX,修改适当的存储位置,然后点击Next即可。
4、弹出如下对话框,并按下图所示为虚拟机分配磁盘空间,单独存储,然后点击Next,在新出现的对话框中点击finish即可。
5、如下选择安装路径
6、在出现下图所示的界面中,单击skip键。
8、之后,会弹出如下界面,
9、单击是之后安装成功。
【实验总结和体会】
通过本实验,我熟悉了Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。
掌握了Linux系统的安装方法,特别是如何在虚拟机上安装、配置该操作系统。
了解了在多操作系统环境下如何本地安装(光盘安装)Linux系统。
熟悉了Linux系统的文件系统结构。
实验二Linux操作系统的使用与管理
实验时间:
实验地点:
成绩:
【实验目的】
1.熟悉Linux系统终端工作方式的使用,掌握常用的Linux命令。
2.熟悉Linux窗口工作方式的使用,掌握GNOME桌面环境的基本操作,
3.学会使用OpenOffice.Org中的套件来完成文档和图片的处理。
4.了解Linux网络管理的知识,掌握在Linux环境下配置Web服务器和ftp服务的方法。
【实验内容】
1.熟悉开机后登录Linux系统和退出系统的过程;
2.熟悉Linux字符界面—虚拟终端窗口和shell以及图形界面—X-Window(如gnome或KDE);练习并掌握常用的Linux操作命令,如ls、cat、ps、df、find、grep、cd、more、cp、rm、kill、at、vi、cc、man、help、control+d/c、等;熟悉常用shell的提示符;熟悉字符窗口与图形界面之间的切换。
3.学习使用Linux的在线求助系统,如man和help命令等。
4.启动OpenOffice.org应用软件,利用其中的套件制作一个图文并茂的个人简历,并保存为不同的格式,掌握OpenOffice.Org相关套件的功能及用法。
5.在Linux系统中配置好网络以及防火墙,安装WEB和FTP服务器软件,并进行测试,体会Linux的网络管理功能。
【实验步骤和结果】
1、登录Linux系统和退出系统的过程。
开机后登录Linux系统后,输入root后,接着输入password(登录密码),进入Linux界面后,可以打开终端,进行查询和编程。
退出系统操作可在界面中操作与windxp环境下相似,或在终端输入命令shutdown系列命令:
-f:
重启系统时不执行fsck。
-F:
重启时执行fsck。
-h:
将系统关闭,在某种程度上功能与halt命令相当。
-k:
只是送出信息给所有用户,但不会真正关机。
-n:
不调用init程序关机,而是由shutdown自己进行(一般关机程序是由shutdown调用init来实现关机动作的),使用此参数将加快关机速度,但是不建议用户使用此种关机方式。
-r:
shutdown之后重新启动系统。
-c:
取消一个shutdown命令。
例如,当执行一个“shutdown-h15:
30”的命令时,只要按“Ctrl+C”组合键就可以中断关机的命令;而执行如“shutdown-h15:
30&”的命令时,就将shutdown转到后台运行了,此时就需要用“shutdown-c”将前一个shutdown命令取消。
-t<秒数>:
送出警告信息和关机信号之间要延迟多少秒。
[时间]:
设置多久后执行shutdown命令。
时间参数有hh:
mm或+m两种模式。
hh:
mm格式表示在几点几分执行shutdown命令。
例如“shutdown16:
50”表示将在16:
50执行shutdown,+m表示m分钟后执行shutdown。
比较特别的用法是以now表示立即执行shutdown。
值得注意的是这部分参数不能省略。
2、以下为Linux下常用操作命令。
(1)Ls命令打印出当前目录下的清单(如根目录root下),Ls-a不隐藏任何以.字符开始的项目,Ls-l使用较长格式列出信息,Ls–la:
Ls–a与Ls–l的功能和:
(2)cd命令切换目录:
(3)Cat显示文本文件的内容,more显示文件内容:
(4)Vi编辑器,可编写C语言程序:
(5)mkdir建立目录rmdir删除目录:
(6)touch建立文件,rm删除文件,rm-rf删除文件或目录的所有内容,mv移动文件/更改文件名,cp复制一个文件到另一个文件下:
(7)grep在文本中查询含有某些字符的字符串:
(8)find查找文件及目录:
(9)Cc显示当前编辑器错误的输出信息:
(10)>重定向命令(覆盖写)
(11)Help的用法:
3、启动OpenOffice.org应用软件,利用其中的套件制作一个图文并茂的个人简历,如下图所示:
4、配置服务器
(1)执行命令:
serviceiptablesstop关闭linux虚拟机中的防火墙。
主机的防火墙也需要关闭。
(2)配置网络:
首先,VM->Settings->NetworkAdaptor,选择Bridged。
如下图所示:
然后,Edit->VirtualNetworkEditor,如下图
(2)所示。
需要添加VMnet0、VMnet1、VMnet8且按其默认设置。
将VMnet1、VMnet8的“UselocalDHCPservicetodistributeaddresstoVMs”前的复选框勾去掉。
再然后,如下图所示,系统设置->网络,出现下图2,选择“编辑”如下图3所示,ip与物理主机的ip在一个网段,且子网掩码、默认网关相同。
保存设置,并点击图2中的“激活(A)”,这些工作完成后,执行命令servicenetworkstart,开启网络功能。
最后执行ping命令测试网络的连通性。
【实验总结和体会】
5.通过本实验,我熟悉了Linux系统终端工作方式的使用,掌握常用的Linux命令。
熟悉了Linux窗口工作方式的使用,掌握GNOME桌面环境的基本操作,学会了使用OpenOffice.Org中的套件来完成文档和图片的处理。
了解Linux网络管理的知识,掌握了在Linux环境下配置Web服务器和ftp服务的方法。
实验三Linux进程管理
实验时间:
实验地点:
成绩:
【实验目的】
1.掌握GCC编译器的用法,学会利用GCC编辑器来编辑C语言程序,学会利用GDB调试器来调试C语言程序。
2.掌握在Linux环境下观察进程运行情况和CPU工作情况的命令
3.了解fork()系统调用,掌握利用fork()创建进程的方法
4.了解Linux系统其他与进程相关的系统调用,如exec、wait和exit等。
5.了解Linux常用的进程通信机制。
【实验内容】
1.利用Linux下的进程管理命令ps观察进程的运行信息。
2.编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“Iamfather”,儿子进程执行时屏幕显示“Iamson”,女儿进程执行时屏幕显示“Iamdaughter”。
3.编写程序模拟实现生产者和消费者问题。
【实验步骤和结果】
1、利用进程管理命令ps观察进程的运行信息。
2、编写一C语言程序,实现在程序运行时通过系统调用fork()创建两个子进程,使父、子三进程并发执行。
可通过桌面方式和命令方式打开编辑器,桌面方式为:
菜单->附件->文本编辑器。
命令方式如下,gedit文件名,编辑界面如下图。
结果显示为:
3、编写程序模拟实现生产者和消费者问题.
程序代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineFIFO"myfifo"
#defineN5
intlock_var;
time_tend_time;
charbuffer[100];
sem_tmutex,full,empty;
intfd;
voidproductor(void*arg);
voidconsumer(void*arg);
intmain()
{
pthread_tid1,id2;
pthread_tmon_th_id;
intret;
end_time=time(NULL)+30;
//创建有名管道
if(mkfifo(FIFO,0777)<0&&(errno!
=EEXIST))
printf("cannotcreatefifoserver\n");
memset(buffer,0,sizeof(buffer));//内存初始化
//打开管道
fd=open(FIFO,O_RDWR|O_NONBLOCK,0);
if(fd==-1)
{
perror("Open");
exit
(1);
}
//初始化信号量
ret=sem_init(&mutex,0,1);
ret=sem_init(&empty,0,N);
ret=sem_init(&full,0,0);
if(ret!
=0)
{
perror("sem_init");
}
//创建线程
ret=pthread_create(&id1,NULL,(void*)productor,NULL);
if(ret!
=0)
{
perror("pthreadcreateid1!
");
}
ret=pthread_create(&id2,NULL,(void*)consumer,NULL);
if(ret!
=0)
{
perror("pthreadcreateid2!
");
}
pthread_join(id1,NULL);
pthread_join(id2,NULL);
return0;
}
//生产者线程
voidproductor(void*arg)
{
intI,nwrite;
while(time(NULL){
sem_wait(&empty);
sem_wait(&mutex);
//生产者写入数据
if((nwrite=write(fd,"hello",5))==-1)
{
if(errno==EAGAIN)
printf("TheFIFOhasnotbeenreadyet,pleasetrylater\n");
}
else
printf("writehellototheFIFO\n");
sem_post(&full);
sem_post(&mutex);
sleep
(1);
}
}
//消费者线程
voidconsumer(void*arg)
{
intnolock=0;
intret,nread;
while(time(NULL){
//P操作信号量
sem_wait(&full);
sem_wait(&mutex);
memset(buffer,0,sizeof(buffer));
if((nread=read(fd,buffer,100))==-1)
{
if(errno==EAGAIN)
printf("Nodatayet!
\n");
}
else
{
printf("read%sfromFIFO.\n",buffer);
}
//V操作信号量
//sem_post(&full);
sem_post(&empty);
sem_post(&mutex);
sleep
(1);
}
}
结果截图为:
【实验总结和体会】
掌握了GCC编译器的用法,学会利用GCC编辑器来编辑C语言程序,学会利用GDB调试器来调试C语言程序。
掌握了在Linux环境下观察进程运行情况和CPU工作情况的命令了解fork()系统调用,掌握了利用fork()创建进程的方法了解Linux系统其他与进程相关的系统调用,如exec、wait和exit等。
了解了Linux常用的进程通信机制。
实验四进程调度模拟程序的设计
实验时间:
实验地点:
成绩:
【实验目的】
1.通过编写程序模拟进程调度算加深学生对处理器调度原理的理解。
2.掌握常用进程调度算法的原理与思想。
【实验内容】
1.在Window下利用C或者C++编写程序实现进程调度调度算法先来先服务、优先级高优先和时间片轮转调度算法。
2.输入数据,输出运行结果
【实验步骤和结果】
1、先来先服务算法的流程图如下:
程序代码如下:
#include"stdio.h"
#include"stdlib.h"
//#include"string"
typedefstructPCB//定义进程控制块
{
charID[3];//进程号
charname[10];//进程名
charstate;//运行状态
intarrivetime;//到达时间
intstarttime;//进程开始时间
intfinishtime;//进程结束时间
intservicetime;//服务时间
floatturnaroundtime;//周转时间
floatweightedturnaroundtime;//带权周转时间
structPCB*next;//指向下个进程
}pcb;
inttime;//计时器
intn;//进程个数
pcb*head=NULL,*p,*q;//进程链表指针
voidrun_fcfs(pcb*p1)//运行未完成的进程
{
time=p1->arrivetime>time?
p1->arrivetime:
time;
p1->starttime=time;
printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);
time+=p1->servicetime;
p1->state='T';
p1->finishtime=time;
p1->turnaroundtime=float(p1->finishtime-p1->arrivetime);
p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime;
printf("ID到达时间开始时间服务时间完成时间周转时间带权周转时间\n");
printf("%s%6d%10d%10d%8d%10.1f%10.2f\n",
p1->ID,p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime,
p1->turnaroundtime,p1->weightedturnaroundtime);
}
voidfcfs()//找到当前未完成的进程
{
inti,j;
p=head;
for(i=0;i{
if(p->state=='F')
{
q=p;//标记当前未完成的进程
run_fcfs(q);
}
p=p->next;
}
}
voidgetInfo()//获得进程信息并创建进程
{
intnum;
printf("\n作业个数:
");
scanf("%d",&n);
for(num=0;num{
p=(pcb*)malloc(sizeof(pcb));
printf("依次输入:
\nID进程名到达时间服务时间\n");
scanf("%s\t%s\t%d\t%d",&p->ID,&p->name,&p->arrivetime,&p->servicetime);
if(head==NULL){head=p;q=p;time=p->arrivetime;}
if(p->arrivetime
q->next=p;
p->starttime=0;
p->finishtime=0;
p->turnaroundtime=0;
p->weightedturnaroundtime=0;
p->next=NULL;
p->state='F';
q=p;
}
}
voidmain()
{
printf("先来先服务算法模拟");
getInfo();
p=head;
fcfs();
}
进程输入如下:
进程执行结果如下:
2、时间片轮转调度算法程序代码:
#include
#include
#include
typedefstructnode
{
charname[10];/*进程名*/
intprio;/*进程优先级*/
intround;/*循环轮转法进程每次轮转的时间片*/
intcputime;/*进程累计消耗的CUP时间*/
intneedtime;/*进程到完成还需要的CUP时间*/
intcount;/*循环轮转法一个时间片内进程运行时间*/
charstate;/*进程的状态:
'R':
运行,'W':
等待,'F':
结束*/
structnode*next;/*指向下一个进程的链指针*/
}PCB;
PCB*finish,*ready,*tail,*run;//tail为就绪队列的队尾指针
intN;/*定义进程的数目*/
voidReadyToRun();//调度就绪队列的第一个进程投入运行;
voidPrint();//打印每执行一次算法后所有的进程的状态信息
voidInsertReady(PCB*q);//在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;
voidRoundInit();//循环轮转法初始化将就绪队列保存为FIFO队列
voidRoundRun();//循环轮转法总算法
intmain()//主函数
{
fflush(stdin);
printf("\tR.循环轮转算法模拟\n\n");
RoundInit();
RoundRun();
return0;
}
voidReadyToRun()//调度就绪队列的第一个进程投入运行;
{
run=ready;
ready=ready->next;
run->state='R';
run->next=NULL;
}
voidPrint()//打印每执行一次算法后就绪进程的状态信息
{
PCB*p;
printf("namecputimeneedtimecountroundstate\n");
p=ready;
while(p!
=NULL)
{
printf("%s\t%d\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->count,p->round,p->state);
p=p->next;
}
if(ready==NULL)
p=run;
while(p!
=NULL)
{printf("%s\t%d\t%d\t%d\t%d\t%c\n",p->name,p->cputime,p->needtime,p->count,p->round,p->state);
p=p->next;
}
}
voidInsertReady(PCB*q)//在轮转法中,将执行了一个时间片单位(为2),但尚未完成的进程的PCB,插到就绪队列的队尾;
{
tail->next=q;
tail=q;
q->next=NULL;
}
voidRoundInit()/*循环轮转法初始化将就绪队列保存为FIFO队列*/
{
PCB*p;
inti,time;
charna[10];
ready=NULL;
finish=NULL;
run=NULL;
//printf("\t\t循环轮转算法模拟全过程\n\n");
printf("输入进程的个数N:
\n");
scanf("%d",&N);
for(i=0;i{
p=(PCB*)malloc(sizeof(PCB));
printf("输入第%d个进程名\n",i+1);
scanf("%s",na);
strcpy(p->name,na);
printf("完成进程需要的时间片数\n");
scanf("%d"