操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(39页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
年级
专业
计算机科学与技术
班级
组号
实验室
日期
实验
名称
操作系统实验
实
验
内
容
分项内容
实验级别
实验一操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)
实验二进程控制
实验三进程同步与通信管理
实验四虚拟内存管理
实验五文件系统与磁盘管理
小组成员
姓名
学号
组内分工
自我评分
教师评分
实验1,4
10
10
实验3,4
10
10
实验4,5
10
小
组
成
绩
评
定
教师签名:
年月日
实验分项1
操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)
实
验
目
的
熟悉操作系统实验环境
实
验
要
求
具体题目:
Linux常用命令的使用(操作系统使用级)
Linux系统基本操作(启动与退出、文件和目录操作、文档备份与压缩、联机帮助等)
Vi/Emacs等编辑软件的使用(操作系统使用级)
cc、gcc、g++、gdb命令的使用(开发调试环境)(操作系统使用级)
系统平台:
Linux
实
验
原
理
步
骤
(
算
法
流
程
)
login
1.作用
login的作用是登录系统,它的使用权限是所有用户。
2.格式
login[name][-p][-h主机名称]
3.主要参数
-p:
通知login保持现在的环境参数。
-h:
用来向远程登录的之间传输用户名。
mkdir [options] 目录名
3.[options]主要参数
-m, --mode=模式:
设定权限<模式>,与chmod类似。
-p, --parents:
需要时创建上层目录;如果目录早已存在,则不当作错误。
-v, --verbose:
每次创建新目录都显示信息。
--version:
显示版本信息后离开。
$ mkdir -m 777 tsk
grep
1.作用
grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
dd
1.作用
dd命令用来复制文件,并根据参数将数据转换和格式化。
2.格式
dd [options]
find命令的作用是在目录中搜索文件,它的使用权限是所有用户。
2.格式
find [path][options][expression]
path指定目录路径,系统从这里开始沿着目录树向下查找文件。
它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。
find命令查找文件的几种方法:
(1)根据文件名查找
例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令:
find / -name lilo.conf
find命令后的“/”表示搜索整个硬盘。
(3)根据部分文件名查找方法
find / -name '*abvd*'
(4) 使用混合查找方式查找文件
find /etc -size +500000c -and -mtime +1
mv
1.作用
mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。
该命令如同DOS命令中的ren和move的组合。
2.格式
mv[options] 源文件或目录 目标文件或目录
3.[options]主要参数
-i:
交互方式操作。
如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。
-f:
禁止交互操作。
mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。
4.应用实例
(1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中:
$ mv /usr/cbu/ * .
(2)将文件cjh.txt重命名为wjz.txt:
$ mv cjh.txt wjz.txt
ls
1.作用
ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。
2.格式
ls [options][filename]
Diff
命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。
cmp
1.作用
cmp
(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。
2.格式
cmp[options] 文件名
3.[options]主要参数
cat
1.作用
cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。
2.格式
cat [options] 文件1 文件2……
3.[options]主要参数
-n:
由第一行开始对所有输出的行数编号。
-b:
和-n相似,只不过对于空白行不编号。
-s:
当遇到有连续两行以上的空白行时,就代换为一行的空白行。
$ cat -b /etc/named.conf
ln
1.作用
ln命令用来在文件之间创建链接,它的使用权限是所有用户。
2.格式
ln [options] 源文件 [链接名]
实
验
结
果
及
分
析
部分实验截图如下:
心
得
体
会
通过本次试验熟悉了linux下的常用的命令,了解了基本的shell命令的用法和作用,能够在linux下操作文件,目录。
了解了VI的基本命令,插入,粘贴,复制等命令。
了解了linux下文件目录的基本结构,文件的属性,用户的属性,能够较熟练的操作图形界面。
总之算是对linux有个基本的了解。
实验分项2
实验二进程控制
实
验
目
的
熟悉linux和windows下进程的管理,包括创建,睡眠,销毁等。
实
验
要
求
具体题目
1Linux系统常用进程管理命令的使用(操作系统观察级)
2Linux系统常用进程创建与管理的系统调用(原码阅读与系统编程级)
3Windows平台常用进线程控制API(原码阅读与系统编程级)
系统平台
LinuxWindows
实
验
原
理
步
骤
(
算
法
流
程
)
1.exec系列系统调用
exec系统调用(实际上是一系列系统调用)可以将二进制文件的程序映像载入内存,替换原来进程的地址空间,并开始运行它。
#include
intexecl(constchar*path,constchar*arg,…)
对execl()的调用会将path所指路径的映像载入内存,替换当前进程的映像。
注意:
参数列表必须以NULL结尾
2.fork()系统调用
fork()系统调用可以创建一个和当前进程映像一样的进程。
#include
#include
pid_tfork(void)
成功调用fork()会创建一个新的进程,它几乎与调用fork()的进程一模一样。
这两个进程都会同时运行,调用者从fork()返回以后,就好像没有什么特别的事情发生过。
新进程称为原来进程的子进程,原来进程自然就是父进程,在子进程中,成功的fork()调用会返回0,在父进程中fork()返回子进程的pid.
3.wait()函数调用
#include
#include
pid_twait(int*status)
进程一旦调用了wait,就立即阻塞了自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁后返回;如果没有找到这样的一个子进程,wait就会一直阻塞在这里,直到一个出现为止。
参数status用来保存被收集的进程退出时的一些状态,它是一个指向int类型的指针
4.sleep()函数调用
#include
unsignedintsleep(unsignedintsecond)
该函数使得进程挂起一个指定的时间,直到知道时间用完或收到信号。
如果挂起时间到了,就返回0;如果该函数被信号打断,则返回剩余挂起的时间数
Fork3.c
#include
#include
#include
voidmain()
{
intp1;
while((p1=fork())==-1);
if(p1>0)//如果是从父进程返回
{
wait(0);//等待子进程结束
printf("hereisparent,theforkreturnp1is%d\n",p1);
}
else
{
printf("hereisthesonthetheforkreturnp1is%d",p1);
exit(0);//结束子进程
}
}
Fork4.c
#include
#include
#include
#include
voidmain()
{
intp1=-1;
intp2=-1;
intson1=0,son2=0;//分别标识两个子进程
while((p1=fork())==-1);
if(p1==0){son1=1;}//标识第一个子进程
if(p1>0){while((p2=fork())==-1);}
if(p2==0){son2=1;}//标识第二个子进程
if(p1>0&&p2>0)//父进程执行
{
wait(0);
printf("hereisparent,theforkreturnp1andp2is%d,%d",p1,p2);
printf("son1%d,son2%d\n",son1,son2);
}
elseif(son1)//第一个子进程执行的代码
{//获得进程ID打印出子进程ID
printf("hereisthefirstsonthethepidis%d",getpid());
printf("son1%dson2%d\n",son1,son2);
exit(0);
}
elseif(son2)//第二个子进程执行的代码
{
printf("hereisthesecondsonthepidis%d",getpid());
printf("son1%d,son2%d",son1,son2);
exit
(1);
}
}
windowsprocessCreate.cpp
//---------------------------------------------------------------------------
#include
#pragmahdrstop
//---------------------------------------------------------------------------
#pragmaargsused
#include"iostream.h"
intAPIWinExec();
intAPIShellExecute();
intCreateProcess();
//---------------------------------------------------------------------------
intmain(intargc,char*argv[])
{
APIWinExec();
APIShellExecute();
CreateProcess();
cin.get();
return0;
}
intAPIWinExec()
{
cin.get();
cout<<"WinExec(\"NotePad\",SW_RESTORE)"<WinExec("NotePad",SW_RESTORE);
cin.get();
cout<<"WinExec(\"NotePad\.\\test.txt\",SW_RESTORE)"<WinExec("NotePad\.\\test.txt",SW_RESTORE);
cin.get();
cout<<"WinExec(\"Calc\",SW_RESTORE)"<WinExec("Calc",SW_RESTORE);
cin.get();
cout<<"WinExec(\"Rundll32.exeshell32.dll,Control_RunDLLtimedate.cpl\",SW_RESTORE)"<WinExec("Rundll32.exeshell32.dll,Control_RunDLLtimedate.cpl",SW_RESTORE);
}
//---------------------------------------------------------------------------
intAPIShellExecute()
{
cin.get();
cout<<"ShellExecute(NULL,\"open\",\"NotePad\",NULL,NULL,SW_RESTORE)"<ShellExecute(NULL,"open","NotePad",NULL,NULL,SW_RESTORE);
cin.get();
cout<<"ShellExecute(NULL,\"open\",\"\.\\test.txt\",NULL,NULL,SW_RESTORE)"<ShellExecute(NULL,"open","\.\\test.txt",NULL,NULL,SW_RESTORE);
cin.get();
cout<<"ShellExecute(NULL,\"open\",\"Calc\",NULL,NULL,SW_RESTORE)"<ShellExecute(NULL,"open","Calc",NULL,NULL,SW_RESTORE);
cin.get();
cout<<"ShellExecute(NULL,\"explore\",\"D:
\",NULL,NULL,SW_RESTORE)"<ShellExecute(NULL,"explore","D:
",NULL,NULL,SW_RESTORE);
}
//---------------------------------------------------------------------------
/*BOOLCreateProcess(
LPCTSTRlpApplicationName,//pointertonameofexecutablemodule
LPTSTRlpCommandLine,//pointertocommandlinestring
LPSECURITY_ATTRIBUTESlpProcessAttributes,//pointertoprocesssecurityattributes
LPSECURITY_ATTRIBUTESlpThreadAttributes,//pointertothreadsecurityattributes
BOOLbInheritHandles,//handleinheritanceflag
DWORDdwCreationFlags,//creationflags
LPVOIDlpEnvironment,//pointertonewenvironmentblock
LPCTSTRlpCurrentDirectory,//pointertocurrentdirectoryname
LPSTARTUPINFOlpStartupInfo,//pointertoSTARTUPINFO
LPPROCESS_INFORMATIONlpProcessInformation//pointertoPROCESS_INFORMATION
);
*/
intCreateProcess()
{
cin.get();
cout<<"CreateProcess"<STARTUPINFOsi;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
PROCESS_INFORMATIONpi;
BOOLfCreated=CreateProcess("C:
\\ProgramFiles\\MicrosoftOffice\\OFFICE11\\WinWord.exe",
NULL,
NULL,
NULL,
FALSE,
CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
&si,
&pi
);
}
实
验
结
果
及
分
析
Fork3.运行如下:
Fork4.c运行如下:
心
得
体
会
通过本次试验,了解了linux下进程控制块的基本结构,对linux的进程和线程的区别和联系有个比较清楚的认识,能够在终端管理进程。
对父进程和子进程之间的关系也有了比较清楚的认识,能够在linux下用c语言创建进程,子进程,销毁进程等。
对进程的同步互斥有一定的理解。
Windos下和linux下的进程在结构上也有相似的地方。
实验分项3
实验三进程同步与通信管理
实
验
目
的
熟悉掌握进程的通信管理
实
验
要
求
进程同步与互斥控制(读者写者、一家人吃苹果桔子、哲学家吃饭)
简单进程通信(管道、消息缓冲、邮件槽等)(原码阅读与系统编程级)
实
验
原
理
步
骤
(
算
法
流
程
)
信号量实现进程同步
#include
#include
#include
intk1;
voidint_fun1(intsig)
{
k1=0;
}
main()
{
intk,p1;
while(p1=fork()==-1);
if(p1>0)
{
for(k=0;k<4;k++)
{printf("Howareyou!
\n");
sleep
(1);
}
kill(p1,12);
wait(0);
printf("OK!
\n");
exit(0);
}
else{
signal(12,int_fun1);//通过改变信号量实现进程同步先父进程再进程
k1=1;
while(k1==1){
printf("Ianchild\n");
sleep
(1);
}
printf("childexited!
\n");
exit(0);
}
}
fd.c
#include
#include
#include
#include
main()
{
intp1,fd[2];
charoutpipe[50];
charinpipe[50]="thisisamessage!
";
pipe(fd);
while((p1=fork())==-1);
if(p1==0)
{
printf("%d",fd[1]);
write(fd[1],inpipe,50);
printf("childwrite:
%s",inpipe);
exit(0);
}
else{
wait(0);
printf("%d",fd[0]);
read(fd[0],outpipe,50);
printf("parentread:
%s\n",outpipe);
printf("exit\n");
exit(0);
}
}
rcvfile.c
#include
#include
#include
#include
#include
#include
#defineMaxMsg512
structmy_msg
{
longintmy_msg_type;
charsome_text[MaxMsg];
}msg;
main()
{
intmsgid;
longintmsg_to_receive=0;
msgid=msgget(1234,0666|IPC_CREAT);
while
(1)
{
msgrcv(msgid,&msg,BUFSIZ,msg_to_receive,0);
printf("youwrote:
%s",msg.some_text);
if(strncmp(msg.some_text,"end",3)==0)
break;
}
msgctl(msgid,IPC_RMID,0);
exit(0);
}
Sndfile.c
#include
#include
#include
#include
#include
#include
#defineMaxMsg512
structmy_ms