计算机操作系统实验报告 2.docx
- 文档编号:2776301
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:44
- 大小:255.12KB
计算机操作系统实验报告 2.docx
《计算机操作系统实验报告 2.docx》由会员分享,可在线阅读,更多相关《计算机操作系统实验报告 2.docx(44页珍藏版)》请在冰点文库上搜索。
计算机操作系统实验报告2
中南民族大学
学生实验报告
院系:
计算机科学学院
专业:
计算机科学与技术
年级:
2010
课程名称:
计算机操作系统
******************
学号:
********************************
姓名:
苏涛涛谢玉锋杜旻翔傅小纯
2013年6月1日
年级
2010
专业
计算机科学与技术
班级
计科2班
组号
12
实验室
9#205
日期
2013.5.30
实验
名称
计算机操作系统实验
实
验
内
容
分项内容
实验级别
实验一操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)
操作系统使用级
实验二进程控制
操作系统观察级原码阅读与系统编程级
实验三进程同步与通信管理
操作系统使用级
实验四虚拟内存管理
操作系统观察级
实验五文件系统与磁盘管理
操作系统管理级原码阅读与系统编程级
小组成员
姓名
学号
组内分工
自我评分
教师评分
谢玉锋
10061045
实验操作,过程分析以及实验过程演示
90
杜旻翔
10061047
实验操作,过程分析以及实验过程演示
90
苏涛涛
10061053
实验操作,过程分析以及实验过程演示
90
傅小纯
09061180
实验结果记录和分析
85
小
组
成
绩
评
定
教师签名:
年月日
实验分项1
操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)
实
验
目
的
1、熟练掌握linux系统下的常用命令。
2、windows平台下IDE中API的使用。
实
验
要
求
具体题目
实验一操作系统实验环境熟悉(Linux操作命令、Linux/Windows平台编程工具)
系统平台
Linux/Windows平台编程工具
实
验
原
理
步
骤
(
算
法
流
程
)
实
验
原
理
步
骤
(
算
法
流
程
)
Linux基本操作介绍:
(1)Linux系统基本操作(启动与退出、文件和目录操作、文档备份与压缩、联机帮助等)
pwd命令:
此命令显示出当前工作目录的绝对路径,cd命令:
改变工作目录。
mkdir命令:
创建一个目录。
rmdir命令:
删除空目录。
cat命令:
将文件的内容打印输出到显示器或终端窗口上。
cp命令:
将给出的文件或目录拷贝到另一文件或目录中。
mv命令:
为文件或目录改名或将文件由一个目录移入另一个目录中。
rm命令:
删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。
ls命令:
列出目录的内容。
chmod命令:
用于改变文件或目录的访问权限。
sort命令:
对文件中的各行进行排序。
gzip命令:
对文件进行压缩。
unzip命令:
用于解扩展名为.zip的压缩文件。
tar命令:
为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
(2)gcc的使用:
gcc是linux系统的C编译器,将C/C++源程序和目标程序编译并调用链接程序ld生成可执行文件。
例如:
gcc–ohellohello.c#生成可执行文件hello
g++命令的使用:
完成C++程序的编译和链接,可以自动的完成目标代码与C++库的链
接并生成可执行程序。
例如:
g++hello.C#hello.C是一个C++文件,生成可执行程序a.out
3)gdb命令的使用:
gdb是linux系统的调试工具,是用来调试C或C++程序的功能强大的调试器,它使用户能在程序运行的时候观察程序的内部结构和内存的使用情况,它提供了一些功能:
(1)监视或修改程序中变量的值;
(2)设置断点,使程序指定的代码行上暂停执行;(3)单步执行或程序跟踪。
例如:
1.编译时使用调试参数-gcc–g–omypf1.cf2.cf3.c
2.启动gdb:
gdbmyp
3.设置断点:
(gdb)break7#在第七行设置断点
4.开始执行:
(gdb)run
5.程序继续执行直到结束:
(gdb)continue
6.退出gdb:
(gdb)quit
实
验
结
果
及
分
析
译时使用调试参数
启动gdb
设置断点
开始执行
.程序继续执行直到结束
退出gdb
心
得
体
会
1.因为有linux操作系统课程,本次实验内容比较轻松;
2.复习了linux常用的指令,对shell也进一步熟悉;
3.在对文件操作过程中出现较多问题,主要是在路径和文件命名上;
4.掌握了linux的文件系统的基本结构。
实验分项2
实验二进程控制
实
验
目
的
熟悉linux和windows下进程的管理,包括创建,睡眠,销毁等。
实
验
要
求
具体题目
1Linux系统常用进程管理命令的使用(操作系统观察级)
2Linux系统常用进程创建与管理的系统调用(原码阅读与系统编程级)
3Windows平台常用进线程控制API(原码阅读与系统编程级)
系统平台
LinuxWindows
实
验
原
理
步
骤
(
算
法
流
程
)
实
验
原
理
步
骤
(
算
法
流
程
)
#include
#include
#include
#include
intmain()
{
pid_tret;
intstatus,i,role=-1;
ret=fork();
if(ret>0)
{printf("Parent:
thisistheparentprocess(pid%d)\n",getpid());
for(i=0;i<6;i++)
{printf("Parent:
Atcount%d\n",i);
sleep
(2);
}
ret=wait(&status);
role=0;
}
elseif(ret==0)
{printf("Child:
thisistheChildprocess(pid%d)\n",getpid());
for(i=0;i<6;i++)
{printf("Child:
Atcount%d\n",i);
sleep
(2);
}
role=1;
}
else
{printf("Parent:
Errortryingtofork()(%d)\n",errno);
}
printf("%s:
Exiting...\n",((role==0)?
"Parent":
"Child"));
ntmain(intargc,char*argv[])
{
//用来存放快照进程信息的一个结构体
PROCESSENTRY32pe32;//如果想进一步了解可以查看API文档
pe32.dwSize=sizeof(pe32);
//给系统内的所有进程拍照
HANDLEhProcessSnap=:
:
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
//快照中包含进程列表
if(hProcessSnap==INVALID_HANDLE_VALUE)
{
printf("CreateToolhelp32Snapshot调用失败!
\n");
return-1;
}
//遍历进程快照,轮流显示每个进程信息
BOOLbMore=:
:
Process32First(hProcessSnap,&pe32);//从第一个开始
while(bMore)
{
printf("进程ID为:
%u",pe32.th32ProcessID);
printf("进程名称为:
%s\n",pe32.szExeFile);
bMore=:
:
Process32Next(hProcessSnap,&pe32);//遍历下一个
}
:
:
CloseHandle(hProcessSnap);//清除snapshot对象
cin.get();
return0;
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 ); } 实 验 结 果 及 分 析 进程调用和创建 Window系统下的API 当一个进程调用了fork以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID和父进程ID,其他的都是一样.就象符进程克隆(clone)自己一样.当然创建两个一模一样的进程是没有意义的.为了区分父进程和子进 程,我们必须跟踪fork的返回值.当fork掉用失败的时候(内存不足或者是用户的最大进程数已到)fork返回-1,否则fork的返回值有重要的作用.对于父进程fork返回子进程的ID,而对于fork子进程返回0.我们就是根据这个返回值来区分父子进程的.父进程为什么要创建子进程呢? 前面我们已经说过了Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时进程为了早一点完成任务就创建子进程来争夺资源.一旦子进程被创建,父子进程一起从fork处继续执行,相互竞争系统的资源.有时候我们希望子进程继续执行,而父进程阻塞直到子进程完成任务.这个时候我们可以调用wait或者waitpid系统调用 心 得 体 会 1.了解PCB的基本结构和使用方法; 2.分析清楚线程和进程之间的区别,也了解父进程和子进程之间的调用关系 3.同时也复习了gcc和gdb指令的使用; 4.了解掌握在linux系统中近程的创建和销毁。 实验分项3 实验三进程同步与通信管理 实 验 目 的 1.了解掌握进程同步和互斥原理 2.掌握简单进程通信原理 实 验 要 求 具体题目 读者写者问题,哲学家进餐,管道 系统平台 Windows平台,Linux平台 实 验 原 理 步 骤 ( 算 法 流 程 ) 实 验 原 理 步 骤 ( 算 法 流 程 ) 实 验 原 理 步 骤 ( 算 法 流 程 ) 实 验 原 理 步 骤 ( 算 法 流 程 ) 实 验 原 理 步 骤 ( 算 法 流 程 ) 实 验 原 理 步 骤 ( 算 法 流 程 ) intmain(intargc,char*argv[]) { HANDLErMutex;//用于互斥访问count的信号量 HANDLEwMutex;//用于读写互斥和写写互斥的信号量 rMutex=CreateMutex(NULL,false,"rMutex"); cout<<"首先创建用于互斥访问count的信号量."< Sleep(2000);//2秒后创建wMutex信号量 wMutex=CreateMutex(NULL,false,"wMutex"); cout<<"接着创建用于读写互斥和写写互斥的信号量."< Sleep(2000);//2秒后创建读写进程 cout<<"准备创建读写进程."< Sleep(2000); STARTUPINFOsReader,sWriter; PROCESS_INFORMATIONpReader,pWriter; BOOLfCreated; cout<<"创建读者进程! ! "< ZeroMemory(&sReader,sizeof(STARTUPINFO)); sReader.cb=sizeof(STARTUPINFO); fCreated=CreateProcess(".\\Reader.exe", NULL,NULL,NULL, FALSE,CREATE_NEW_CONSOLE, NULL,NULL, &sReader,&pReader); cout<<"创建写者进程! ! "< ZeroMemory(&sWriter,sizeof(STARTUPINFO)); sWriter.cb=sizeof(STARTUPINFO); fCreated=CreateProcess(".\\Writer.exe", NULL,NULL,NULL, FALSE,CREATE_NEW_CONSOLE, NULL,NULL, &sWriter,&pWriter); cin.get(); return0;} //哲学家进餐 DWORDThread1ID,Thread2ID,Thread3ID,Thread4ID,Thread5ID;//用来保存线程ID。 HANDLEh_Mutex1,h_Mutex2,h_Mutex3,h_Mutex4,h_Mutex5;//用来保存互斥对象句柄。 HANDLEComman_Mutex; DWORDWINAPIThread1(PVOIDpvParam)//第1个线程函数 { //for(intk=0;k<5;++k) //AfxMessageBox("MyThread1"); WPARAMwparam;//发送哪个哲学家 LPARAMlparam;//发送哪个筷子。 如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。 while (1) { Sleep(1000); WaitForSingleObject(h_Mutex5,INFINITE); //AfxMessageBox("哲学家1拿到筷子5,等待筷子1"); wparam=1; lparam=5; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); WaitForSingleObject(h_Mutex1,INFINITE); //AfxMessageBox("哲学家1拿到筷子1,开始进餐"); wparam=1; lparam=1; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); Sleep(5000); wparam=1; lparam=0; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex5); ReleaseMutex(h_Mutex1); //AfxMessageBox("哲学家1用餐完毕,放下筷子5和1"); } return0; } DWORDWINAPIThread2(PVOIDpvParam)//第2个线程函数 { WPARAMwparam;//发送哪个哲学家 LPARAMlparam;//发送哪个筷子。 如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。 while (1) { Sleep(1000); WaitForSingleObject(h_Mutex2,INFINITE); //AfxMessageBox("哲学家2拿到筷子2,等待筷子1"); wparam=2; lparam=2; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); WaitForSingleObject(h_Mutex1,INFINITE); //AfxMessageBox("哲学家2拿到筷子1,开始进餐"); wparam=2; lparam=1; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); Sleep(5000); //AfxMessageBox("哲学家2用餐完毕,放下筷子2和1"); wparam=2; lparam=0; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex2); ReleaseMutex(h_Mutex1); } return0; } DWORDWINAPIThread3(PVOIDpvParam)//第3个线程函数 { WPARAMwparam;//发送哪个哲学家 LPARAMlparam;//发送哪个筷子。 如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。 while (1) { Sleep(1000); WaitForSingleObject(h_Mutex2,INFINITE); //AfxMessageBox("哲学家3拿到筷子2,等待筷子3"); wparam=3; lparam=2; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); WaitForSingleObject(h_Mutex3,INFINITE); //AfxMessageBox("哲学家3拿到筷子3,开始进餐"); wparam=3; lparam=3; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); Sleep(5000); //AfxMessageBox("哲学家3用餐完毕,放下筷子2和3"); wparam=3; lparam=0; : : PostMessage(main_window,WM_MYMSG,wparam,lparam); ReleaseMutex(h_Mutex2); ReleaseMutex(h_Mutex3); } return0; } DWORDWINAPIThread4(PVOIDpvParam)//第4个线程函数 { WPARAMwparam;//发送哪个哲学家 LPARAMlparam;//发送哪个筷子。 如果非0,则是筷子,如果是0,那么说明哲学家放下两边的筷子。 while (1) { Sleep(1000); WaitFo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机操作系统实验报告 计算机 操作系统 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)