操作系统实验指导书自编.docx
《操作系统实验指导书自编.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书自编.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统实验指导书自编
《操作系统》
实验指导书
广东商学院信息学院
目录
实验项目一……………………………………………………………3
实验项目二……………………………………………………………13
实验项目三……………………………………………………………16
概述
Linux系统作为一个多用户、多任务的操作系统,因其具有强大的网络服务和网络管理功能,近年来受到网络用户和网络服务提供商的青睐。
为配合《操作系统》课程的教学,使学生深入理解操作系统的分类、基本概念、工作原理以及实现技术,配套三个基于Linux平台的验证型实验。
一、实验安排
实验一Linux综合实验(2学时,第7周)
实验二Linux进程管理(2学时,第9周)
实验三Linux进程通信(2学时,第11周)
二、实验环境
1、软件环境
LinuxRedHat7.1以上;
TurboC2.0。
2、硬件环境
局域网络;
P2以上计算机;
联机投影。
三、实验要求
1、实验前认真作好相关知识准备,明确实验目的,掌握实验方法;
2、利用实验条件认真操作,预测并分析实验结果;
3、实验结束后按照要求撰写实验报告并按时提交。
四、考核办法
可以有几种考核办法:
1、根据实验课的考勤情况、实验结果占平时成绩的20%;
2、在期末试题中体现一定比例的实验内容。
实验项目一Linux综合实验
一、实验目的
1、体会多用户、多任务网络操作系统Linux的工作特点;
2、理解操作系统的分类、相关概念和资源管理功能。
二、预备知识
1、复习操作系统的分类、概念以及基本功能;
2、复习作业与进程管理、处理机调度、存储器管理、文件管理以及设备管理的基础知识,理解相应的调度策略以及分配与回收算法;
3、复习Windows系统的管理功能、DOS命令的使用以及C程序设计语言等。
三、实验内容
熟悉Linux的各种命令,体会操作系统提供给用户的命令接口的操作特点。
(一)使用常识
1、超级用户与普通用户
超级用户是对系统的一切资源均具有访问权限的用户,即系统管理员,用户名为:
root,命令提示符为:
#;
普通用户由超级用户创建和删除,仅具有超级用户指定的访问权限,命令提示符为:
$。
超级用户和普通用户可以相互切换;要养成用普通用户登录、使用系统的习惯。
2、登录
开机启动后,系统提示:
Login:
用户名
Password:
口令
输入超级用户名root,出现提示符:
#;输入普通用户名,出现提示符:
$。
在提示符后就可以输入各种Linux命令了。
3、创建和删除用户
必须在超级用户下完成。
创建新用户:
#useradd用户名
创建/修改口令:
#passwd口令
删除用户:
#userdel–r用户名
4、用户切换
普通用户切换到超级用户:
$su
password:
口令
超级用户切换到普通用户:
#su普通用户名
5、退出
为避免其他用户非法盗用自己的用户名,停止使用系统时要退出。
退出系统有很多方法:
可以在命令提示符下键入exit或logout命令,也可以使用组合键Ctrl+d。
6、关机
普通用户没有关机权限,只有超级用户才能关闭系统。
关机方式有命令方式和组合键Ctrl+Alt+Del两种方式,可以使用halt或shutdown命令:
#halt
(显示Systemhalted时才可以关闭电源)
#shutdown(系统默认2分钟后关机)
shutdown–hnow(系统立即关机)
shutdown–rnow(系统立即重新开机)
shutdown–h20:
25(系统将在20:
25分关机)
shutdown–h+10(系统在10分钟后关机)
(二)基本的常用命令
Linux命令格式说明:
1、Linux的文件名长度不超过256个字符,且不能使用如下字符:
!
@#$^&*()[]{}‘“、/;<>空格
2、Linux文件区分大小写;
3、文件名中如有多个圆点,则最右边一个为分隔符,且多表示文件类型;
4、Linux使用“/”为根目录、目录分隔符和目录与文件的分隔符。
命令介绍:
1、ls命令
功能:
查看指定目录下的文件和目录。
格式:
ls[options][filename/dirname…]
常用选项说明:
-a显示所有文件和目录,包括隐含文件
-l显示文件的完整信息
-f对文件添加一特定后缀字符指出其类型
/子目录
*可执行文件
无普通文件
.开头隐含文件
-r将文件以相反次序显示
-t将文件以建立时间先后列出
-R若目录下有文件,则文件也依序列出
示例:
ls–ltrs*
将当前目录下所有以s开头的文件按建立时间的逆序列出完整信息
ls–lR\bin
将\bin目录下所有目录及文件的详细信息列出
ls–alf
将当前目录下包括隐含文件在内的所有文件信息完整列出,并在文件名后添加特殊后缀以表示文件类型
2、man命令
功能:
查看某个命令的使用方法。
格式:
man命令名
3、clear命令
功能:
清屏。
格式:
clear
4、cat命令
功能:
显示或链接ASCALL文件。
格式:
cat文件名
示例:
cattext
显示text的文件内容
catfile1file2
依次显示file1和file2的内容
catfile1>>file2
将file1的内容附加到file2后面,但file1仍存在
cat>file1
将键盘输入(以Ctrl+c结束)的内容输出到file1
5、pwd命令
功能:
显示当前目录。
格式:
pwd
6、cd命令
功能:
进入或修改指定的目录。
格式:
cd目录名
7、mkdir命令
功能:
建立新的目录。
格式:
mkdir新的目录名
8、rmdir命令
功能:
删除空目录。
格式:
rmdir空目录名
9、rm命令
功能:
删除指定的文件或目录。
格式:
rm[options][filename/dirname…]
常用选项说明:
-i删除前逐一询问确认
-f即使文件属性为只读,也直接删除无需确认
-r将指定目录下的所有文件及子目录一并删除
-v显示指令执行过程
示例:
rm–i*.c
删除C语言程序文件,删除前逐一询问确认
rm–rfinished
删除finished子目录及子目录中的所有文件
10、du命令
功能:
显示当前目录所占用的硬盘空间。
格式:
du–abC目录/文件名称
选项说明:
-a表示要显示所有目录及每个目录所占用的空间,单位是Kb
-b表示显示空间大小的单位是byte
-C表示显示一个目录的总空间的大小
不加任何参数,则显示当前目录下各目录占用的空间及所有文件所占总空间
11、df命令
功能:
查看硬盘目前所剩的空间。
格式:
df
12、cp命令
功能:
复制文件或目录。
格式:
cp–r源文件/目录名目标文件/目录名
示例:
cpfile1.cfile2.doc
将file1.c复制为file2.doc
cp–r/tmp//abc/
将tmp子目录中的文件及下属子目录一同复制到abc子目录
13、mv命令
功能:
移动文件或目录。
格式:
mv源文件/目录名目标文件/目录名
14、more命令
功能:
按页查看指定的文件。
格式:
more[options][filename…]
常用选项说明:
-num一次显示的行数
+num从第num行开始显示
-d在屏幕下方显示提示信息[Pressspacetocontinue,qtoquit.]
-l取消遇见特殊字符^L时会暂停的功能
-f计算行数时按实际的行数,而非自动换行的行数记数
-p不以卷动的方式显示每一页,而是先清屏后显示
-c先显示内容再清除旧资料
-s将连续两行以上的空白行代换为一行空白行
filenames欲显示内容的文件,可为复数个数
示例:
more–stestfile
逐页显示文件testfile的内容,如有连续两行以上空白行则以一行空白行显示
more+20testfile
从第20行开始显示文件testfile的内容
15、find命令
功能:
将符合组合条件expression的文件列出来。
格式:
find[path][expression]
常用参数说明:
命令中第一个“-”之前的部分为path,之后的部分为expression。
如果path是空字符串则使用目前路径,如果expression是空字符串则使用-print为默认expression。
常用expression:
-group<群组名称>查找符合指定之群组名称的文件或目录
-help在线帮助
-print假设find命令的返回值为true,就将文件或目录名称在标准输出设备输出。
格式为每列一个名称,每个名称前皆有“./”字符串
-user<拥有者名称>查找符合指定的拥有者名称的文件或目录
示例:
find.–name“*.c”
将当前目录及其子目录下所有后缀名为c的文件列出
find.–ftypef
将当前目录及其子目录下所有一般文件列出
find.–ctime-20
将当前目录及其子目录下所有最近20分钟内更新过的文件列出
(三)其他命令介绍
1、ps命令
功能:
显示正在执行的进程信息。
格式:
ps[options][pids]
常用选项说明:
-l以长列表的形式列出
-a显示其它用户的进程
-e显示环境
-r只显示正在运行的进程
栏目说明:
UID用户标识符
PID进程标识符
PPID父进程标识符
PRI进程优先级
SIZE虚拟内存大小
RSS驻留空间大小
STAT进程状态:
R—进程正在运行;S—睡眠;D—不可中断睡眠;
T—停止或跟踪;Z—僵尸进程;W—没有驻留页
TTY进程所在的虚拟终端号
TIME该进程已经运行的时间
COMMAND该进程的名称
2、jobs命令
功能:
列出当前正在运行的作业信息。
格式:
jobs
3、kill命令
功能:
终止(或撤消)一个进程(或作业)。
格式:
kill[options]pid/jid
常用选项说明:
-l输出信号名列表
-p指kill只输出已命名pid,而且不送信号给它
-s<信号名>指出欲发出的信号,信号是以信号名或数字给出的
4、nice命令
功能:
通过修改调度优先级来运行一个程序。
格式:
nice[options][COMMAND[arg…]]
常用选项说明:
-n加上由指定的优先级而不是默认值10
--version输出版本信息
5、&命令
功能:
将进程放到后台运行。
格式:
在要运行的命令最后加上“&”符号
示例:
yes>/dev/null&
yes命令标准输出一串无穷尽的“y”;
/dev/null象一个黑洞,任何被送入这个黑洞的数据都会消失
6、前后台作业切换
bg命令
功能:
将前台作业放到后台运行。
格式:
bg%作业号
示例:
bg%2
将2号作业放到后台运行
或者:
用Ctrl+Z终止该作业,在shell提示符下键入命令bg。
fg命令
功能:
将后台作业放到前台运行。
格式:
fg%作业号
示例:
fg%2
将2号作业放到前台运行
7、top命令
功能:
显示系统动态的进程控制和进程调度,还可察看内存动态使用的实时信息。
格式:
top[options]
常用选项说明:
空格键立即更新显示
-i不显示空闲的或僵尸进程信息
-n或#改变显示的进程数量
-q退出top
-r重新调整一个指定进程的优先级
-f或F在显示时加上或移去字段
-o或O改变显示字段的顺序
-m切换内存信息的显示
-t切换进程和CPU状态的显示
(四)常用工具介绍
1、vi编辑器
vi编辑器的三种工作模式:
1命令模式(Commandmode):
控制屏幕光标的移动、字符的插入或删除、字符的移动或复制、进入插入模式或底线命令模式;
2插入模式(Insertmode):
完成字符的输入;
3底线命令模式(Lastlinemode):
存储文件或退出编辑器,也可设置编辑环境。
vi工作模式的切换:
1进入命令模式:
在命令提示符后输入:
vi<文件名>;
2切换到插入模式:
在命令模式下按键i、a、o进入插入模式
i(插入):
在当前光标位置输入字符;
a(增加):
从当前光标的前一个位置开始输入字符;
o(插入新行):
从新行行首开始输入字符。
3切换到命令模式:
在插入模式下按Esc键;
4切换到底线命令模式:
在命令模式下按“:
”进入底线命令模式。
命令模式功能键:
1移动光标
k、j、h、l:
上、下、左、右移动光标;
Ctrl+b:
向后移动一页;
Ctrl+f:
向前移动一页;
Ctrl+u:
向后移动半页;
Ctrl+d:
向前移动半页;
G:
移到文件最后一行;
1G:
移到文件第一行;
$:
移到该行的行尾;
O:
移到该行的行首;
#|:
移到该行的第#个位置。
2删除命令
x:
删除光标所在位置一个字符;
#x:
删除光标所在位置后面#个字符;
X:
删除光标所在位置前一个字符;
#X:
删除光标所在位置前面#个字符
dd:
删除光标所在的行;
#dd:
删除光标所在行后面的#行;?
?
?
?
?
?
?
3修改命令
r:
取代光标所在处的字符;
R:
取代字符直到按Esc键为止;
cw:
更改光标所在处的字符到字尾;
c#w:
更改光标所在处后#的个字符。
4复制命令
yw:
复制光标所在处到字尾的字符;
p:
粘贴yw复制的字符到光标后。
yy:
复制光标所在行;
p:
粘贴yy复制的行到光标后。
#yy:
复制光标所在行后面的#行;
p:
粘贴#yy复制的若干行到光标后。
5跳转命令
Ctrl+g:
列出光标所在行的行号;
#G:
移动光标到第#行行首。
底线命令简介:
1列出行号
:
setnu在每一行前面列出行号;
2跳至某一行
:
#光标跳至第#行;
3查找字符串
/关键词查找指定的关键词,按n继续向下找;
?
关键词查找指定的关键词,按n继续向下找;
4存盘命令
:
wfilename将文件存入指定的文件filename中;
:
#,#wfilename截取文件的某些行存成另一个文件filename;
5退出命令
:
wq按原文件名存盘并退出vi;
:
q!
强制退出并放弃编辑的文件。
2、调试程序gdb
gdb(GNUDeBugger)是GNU的调试器,一般和GCC(GNUCompilerCollection)配搭使用。
要使用GDB进行调试,编译程序时要指定-g或-ggdb的编译选项,这样,gcc就会在生成可执行文件时产生调试信息。
示例:
gcc–gmain.c
-g用于产生一般的调试信息
gcc–ggdbmain.c
-ggdb则用于产生gdb特有的调试信息;使用-ggdb时,可执行文件的尺寸会大大增加
gdb的基本指令:
f(ile):
指定一个可执行文件进行调试,gdb将读取这些文件的调试信息,如fa.exe
l(ist):
列程序出源文件
r(un):
装载完要调试的可执行文件后,可以用run命令运行可执行文件
b(reak):
设置断点(breakpoint),如b25,则在源程序的第25行设置一个断点,当程序执行到第25行时,就会产生中断;也可以使用bfuncname,funcname为函数的名称,当程序调用些函数时,则产生中断
c(ontinue):
c命令可以另中断的程序继续执行,直到下一个中断点或程序结束
p(rint):
输入某个变量的值,如程序定义了一个intaa的就是,paa就会输出aa的当前值
n(ext):
程序执行到断点时中断执行,可以用n指令进行单步执行
s(tep):
程序执行到断点时中断执行,可以用s指令进行单步执行进某一函数
q(uit):
退出gdb
3、编译程序gcc
在提示符下利用工具gcc对c或c++源程序进行编译:
gcc–o目标文件源文件
其中,目标文件为可执行文件,扩展名为.exe;源文件名为c语言文件,扩展名为.c。
4、运行可执行程序
在提示符下输入:
./目标文件名,运行编译后的目标程序。
5、编译命令make
利用命令make编译形成工程文件。
6、在线帮助man
在提示符下输入:
man命令名查看命令详细信息。
四、思考题
1、如何查看文件目录?
如何查看文件内容?
2、如何创建子目录?
进入指定的子目录?
以及删除子目录及其下的文件?
3、如何查看硬盘空间?
4、如何复制或移动文件?
5、如何使用vi编辑器进行源程序的编辑?
如何编译和运行程序?
实验项目二进程管理
一、实验目的
1、加深对进程概念的理解,明确进程与程序的区别;
2、进一步认识并发进程的实质;
3、分析进程竞争资源的现象,学习解决进程互斥的方法;
4、了解Linux系统中进程通信的基本原理。
二、预备知识
1、阅读Linux的sched.c源码文件,加深对进程管理概念的理解;
2、阅读Linux的fork.c源码文件,分析进程的创建过程。
三、实验内容
1、进程的创建
任务:
编写一段程序,利用fork()创建两个子进程,其中父进程显示字符“a”,两个子进程分别显示字符“b”和“c”。
观察和记录屏幕上的显示结果,并分析原因。
程序:
#include
main()
{
intp1,p2,i;
while((p1=fork())==-1);
if(p1==0)
putchar(“b”);
else
{
while((p2=fork())==-1);
if(p2==0)
putchar(“c”);
else
putchar(“a”);
}
}
结果:
bca(有时会出现bac)
分析:
理论分析看,输出bac,acb等情况都有可能。
因为fork()创建进程所需的时间多于输出一个字符需要的时间,故在父进程创建子进程2的同时,子进程1输出了字符“b“;而子进程2和父进程的输出次序是随机的,所以出现上述可能的输出顺序。
2、进程的控制
任务:
将以上程序的输出由一个字符分别改为一句话,观察和分析结果;如果利用系统调用lockf()给每个进程加锁实现进程间的互斥,再观察和分析结果。
程序1:
#include
main()
{
intp1,p2,i;
while((p1=fork())==-1);/*创建子进程p1*/
if(p1==0)/*子进程1创建成功*/
for(i=0;i<5;i++)
printf(“son%d\n”,i);/*输出500个字符串“son“*/
else
{
while((p2=fork())==-1);/*创建子进程p2*/
if(p2==0)/*子进程2创建成功*/
for(i=0;i<5;i++)
printf(“daughter%d\n”,i);/*输出500个字符串“daughter“*/
else
for(i=0;i<5;i++)/*父进程执行*/
printf(“children%d\n”,i);/*输出500个字符串“children“*/
}
}
结果:
son……
daughter……
children……
或
son…
daughter……
….son…
children……
等等
分析:
由于函数printf()输出的字符串之间不会被中断,故字符串内部的顺序不变;但由于进程并发执行时的调度顺序和处理机分配的问题,输出字符串的先后顺序随执行的不同而不同。
程序2:
#include
main()
{
intp1,p2,i;
while((p1=fork())==-1);/*创建子进程p1*/
if(p1==0)/*子进程1创建成功*/
{
lockf(1,1,0);
for(i=0;i<50;i++)printf(“son%d\n”,i);
lockf(1,0,0);
}
else
{
while((p2=fork())==-1);/*创建子进程p2*/
if(p2==0)/*子进程2创建成功*/
{
lockf(1,1,0);
for(i=0;i<50;i++)printf(“daughter%d\n”,i);
lockf(1,0,0);
}
else
{
lockf(1,1,0);
for(i=0;i<50;i++)printf(“children%d\n”,i);
lockf(1,0,0);
}
}
}
结果:
大致与程序1的执行结果相同,但不会出现同一组字符串间隔出现的情形。
分析:
由于lockf()函数锁定标准输出设备屏幕,故不可能出现一个字符串序列还没有显示完,就被其他进程抢占输出的情形;各组字符串的输出顺序可能不同,但必定连续输出500次。
四、思考题
1、系统是怎样创建进程的?
2、当首次调用新创建进程时,其入口在哪里?
3、进程的互斥是如何实现的?
实验项目三进程通信
一、实验目的
1、了解和熟悉管道通信机制;
2、理解消息通信机制的工作原理。
二、预备知识
1、阅读Linux的msg.c、sem.c、shm.c等源码文件;
2、熟悉Linux的几种通信机制的工作原理。
三、实验内容
1、进程的管道通信
任务:
编制程序,实现进程的管道通信:
利用系统调用pipe()创建管道,利用write()向管道写入消息,利用read()从管道读出消息。
两个子进程p1和p2分别向管道各写一句话:
Child1issendingmessage!
Child2issendingmessage!
而父进程则从管道分别读出来自两个子进程的消息并显示。
程序:
#include
#include
#include
main()
{
in