操作系统实验报告.docx
- 文档编号:7424002
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:39
- 大小:476.63KB
操作系统实验报告.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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 报告