操作系统第一次试验报告.docx
《操作系统第一次试验报告.docx》由会员分享,可在线阅读,更多相关《操作系统第一次试验报告.docx(21页珍藏版)》请在冰豆网上搜索。
操作系统第一次试验报告
北京邮电大学操作系统实验实验报告
班号:
姓名:
学号:
实验日期:
2014.11.16实验名称:
操作系统实验
一、实验目的
1、熟悉LINUX的基本环境,了解LINUX下进程和线程的实现
二、实验内容
1、熟悉UNIX/LINUX的常用基本命令
2、利用fork()生成子进程和clone()生成线程。
3、通过mutex来实现生产者和消费者问题。
三、项目要求及分析
(1)下载并安装LINUX,可以使用FEDORA或Ubuntu.
(2)熟悉UNIX/LINUX的常用基本命令如ls、who、wc、pwd、ps、pstree、top,cat,cd,chgrp,chmod,chown,comm,cmp,cp,rm,diff,mv,rmdir等,了解环境。
(3)比较fork()和clone()的功能,利用fork()生成子进程和clone()生成线程。
(4)利用pthread库,通过其中的mutex来实现生产者和消费者问题。
(5)使用SystemV的信号灯,实现第二类读者-写者问题(写者优先,新来的读者不允许进行写操作)。
四、具体实现
(1):
熟悉UNIX/LINUX的常用基本命令
名称 :
ls
使用权限 :
所有使用者
使用方式 :
ls[-alrtAFR][name...]
说明 :
显示指定工作目录下之内容(列出目前工作目录所含之档案及子目录)。
参数 :
-a显示所有档案及目录(ls内定将档案名或目录名称开头为"."的视为隐藏档,不会列出)
-l除档案名称外,亦将档案型态、权限、拥有者、档案大小等资讯详细列出
-r将档案以相反次序显示(原定依英文字母次序)
-t将档案依建立时间之先后次序列出
-A同-a,但不列出"."(目前目录)及".."(父目录)
-F在列出的档案名称后加一符号;例如可执行档则加"*",目录则加"/"
-R若目录下有档案,则以下之档案亦皆依序列出
名称 :
who
使用权限 :
所有使用者都可使用
使用方式 :
who-[husfV][user]
说明 :
显示系统中有那些使用者正在上面,显示的资料包含了使用者ID,使用的终端机,从哪边连上来的,上限时间,呆滞时间,CPU使用量,动作等等。
参数 :
-h:
不要显示标题列
-u:
不要显示使用者的动作/工作
-s:
使用简短的格式来显示
-f:
不要显示使用者的上线位置
名称 :
wc
功能说明:
计算字数。
语 法:
wc[-clw][--help][--version][文件...]
补充说明:
利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。
参 数:
-c或--bytes或--chars只显示Bytes数。
-l或--lines只显示列数。
-w或--words只显示字数。
--help在线帮助。
--version显示版本信息。
名称 :
pwd
功能说明:
显示工作目录。
语 法:
pwd[--help][--version]
补充说明:
执行pwd指令可立刻得知您目前所在的工作目录的绝对路径名称。
参 数:
--help在线帮助。
--version显示版本信息。
名称:
ps
使用权限:
所有使用者
使用方式:
ps[options][--help]
说明:
显示瞬间行程(process)的动态
参数:
ps的参数非常多,在此仅列出几个常用的参数并大略介绍含义
-A列出所有的行程
-w显示加宽可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的行程
au(x)输出格式:
USERPID%CPU%MEMVSZRSSTTYSTATSTARTTIMECOMMAND
USER:
行程拥有者
PID:
pid
%CPU:
占用的CPU使用率
%MEM:
占用的记忆体使用率
VSZ:
占用的虚拟记忆体大小
RSS:
占用的记忆体大小
TTY:
终端的次要装置号码(minordevicenumberoftty)
STAT:
该行程的状态:
D:
不可中断的静止(通悸□□缜b进行I/O动作)
R:
正在执行中
S:
静止状态
T:
暂停执行
Z:
不存在但暂时无法消除
W:
没有足够的记忆体分页可分配
<:
高优先序的行程
N:
低优先序的行程
L:
有记忆体分页分配并锁在记忆体内(实时系统或捱AI/O)
START:
行程开始时间
TIME:
执行的时间
COMMAND:
所执行的指令
名称:
pstree
使用权限:
所有使用者
使用方式:
pstree[-a][-c][-h|-Hpid][-l][-n][-p][-u][-G|-U][pid|user]
pstree-V
说明:
将所有行程以树状图显示,树状图将会以pid(如果有指定)或是以init这个基本行程为根(root),如果有指定使用者id,则树状图会只显示该使用者所拥有的行程
参数:
-a显示该行程的完整指令及参数,如果是被记忆体置换出去的行程则会加上括号
-c如果有重覆的行程名,则分开列出(预设值是会在前面加上*
名称:
top
使用权限:
所有使用者
使用方式:
top[-][ddelay][q][c][S][s][i][n][b]
说明:
实时显示process的动态
参数:
d:
改变显示的更新速度,或是在交谈式指令列(interactivecommand)按s
q:
没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行
c:
切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S:
累积模式,会将己完成或消失的子行程(deadchildprocess)的CPUtime累积起来
s:
安全模式,将交谈式指令取消,避免潜在的危机
i:
不显示任何闲置(idle)或无用(zombie)的行程
n:
更新的次数,完成后将会退出top
b:
批次档模式,搭配"n"参数一起使用,可以用来将top的结果输出到档案内
名称:
cat
使用权限:
所有使用者
使用方式:
cat[-AbeEnstTuv][--help][--version]fileName
说明:
把档案串连接后传到基本输出(萤幕或加>fileName到另一个档案)
参数:
-n或--number由1开始对所有输出的行数编号
-b或--number-nonblank和-n相似,只不过对于空白行不编号
-s或--squeeze-blank当遇到有连续两行以上的空白行,就代换为一行的空白行
-v或--show-nonprinting
功能说明:
变更文件或目录的所属群组。
语 法:
chgrp[-cfhRv][--help][--version][所属群组][文件或目录...]或chgrp[-cfhRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
补充说明:
在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。
您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。
参 数:
-c或--changes效果类似"-v"参数,但仅回报更改的部分。
-f或--quiet或--silent 不显示错误信息。
-h或--no-dereference 只对符号连接的文件作修改,而不更动其他任何相关文件。
-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--reference=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
--version 显示版本信息。
名称 :
cd
使用权限 :
所有使用者
使用方式 :
cd[dirName]
说明 :
变换工作目录至dirName。
其中dirName表示法可为绝对路径或相对路径。
若目录名称省略,则变换至使用者的homedirectory(也就是刚login时所在的目录)。
另外,"~"也表示为homedirectory的意思,"."则是表示目前所在的目录,".."则表示目前目录位置的上一层目录。
名称 :
chgrp
功能说明:
变更文件或目录的所属群组。
语 法:
chgrp[-cfhRv][--help][--version][所属群组][文件或目录...]或chgrp[-cfhRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]
补充说明:
在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。
您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。
参 数:
-c或--changes效果类似"-v"参数,但仅回报更改的部分。
-f或--quiet或--silent 不显示错误信息。
-h或--no-dereference 只对符号连接的文件作修改,而不更动其他任何相关文件。
-R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-v或--verbose 显示指令执行过程。
--help 在线帮助。
--reference=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
--version 显示版本信息。
指令名称 :
chmod
使用权限 :
所有使用者
使用方式 :
chmod[-cfvR][--help][--version]modefile...
说明 :
Linux/Unix的档案调用权限分为三级:
档案拥有者、群组、其他。
利用chmod可以藉以控制档案如何被他人所调用。
参数 :
mode:
权限设定字串,格式如下:
[ugoa...][[+-=][rwxX]...][,...],其中
u表示该档案的拥有者,g表示与该档案的拥有者属于同一个群体(group)者,o表示其他以外的人,a表示这三者皆是。
+表示增加权限、-表示取消权限、=表示唯一设定权限。
r表示可读取,w表示可写入,x表示可执行,X表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c:
若该档案权限确实已经更改,才显示其更改动作
-f:
若该档案权限无法被更改也不要显示错误讯息
-v:
显示权限变更的详细资料
-R:
对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
--help:
显示辅助说明
--version:
显示版本
指令名称 :
chown
使用权限 :
root
使用方式 :
chmod[-cfhvR][--help][--version]user[:
group]file...
说明 :
Linux/Unix是多人多工操作系统,所有的档案皆有拥有者。
利用chown可以将档案的拥有者加以改变。
一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。
只有系统管理者(root)才有这样的权限。
参数 :
user:
新的档案拥有者的使用者IDgroup:
新的档案拥有者的使用者群体(group)-c:
若该档案拥有者确实已经更改,才显示其更改动作-f:
若该档案拥有者无法被更改也不要显示错误讯息-h:
只对于连结(link)进行变更,而非该link真正指向的档案-v:
显示拥有者变更的详细资料-R:
对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更)--help:
显示辅助说明--version:
显示版本
名称 :
comm
功能说明:
比较两个已排过序的文件。
语 法:
comm[-123][--help][--version][第1个文件][第2个文件]
补充说明:
这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3行显示:
第1行仅是在第1个文件中出现过的列,第2行是仅在第2个文件中出现过的列,第3行则是在第1与第2个文件里都出现过的列。
若给予的文件名称为"-",则comm指令会从标准输入设备读取数据。
参 数:
-1不显示只在第1个文件里出现过的列。
-2不显示只在第2个文件里出现过的列。
-3不显示只在第1和第2个文件里出现过的列。
--help在线帮助。
--version显示版本信息。
名称 :
cmp
功能说明:
比较两个文件是否有差异。
语 法:
cmp[-clsv][-i<字符数目>][--help][第一个文件][第二个文件]
补充说明:
当相互比较的两个文件完全一样时,则该指令不会显示任何信息。
若发现有所差异,预设会标示出第一个不同之处的字符和列数编号。
若不指定任何文件名称或是所给予的文件名为"-",则cmp指令会从标准输入设备读取数据。
参 数:
-c或--print-chars 除了标明差异处的十进制字码之外,一并显示该字符所对应字符。
-i<字符数目>或--ignore-initial=<字符数目> 指定一个数目。
-l或--verbose 标示出所有不一样的地方。
-s或--quiet或--silent 不显示错误信息。
-v或--version 显示版本信息。
--help 在线帮助。
名称:
cp
使用权限:
所有使用者
使用方式:
cp[options]sourcedest
cp[options]source...directory
说明:
将一个档案拷贝至另一档案,或将数个档案拷贝至另一目录。
参数:
-a尽可能将档案状态、权限等资料都照原状予以复制。
-r若source中含有目录名,则将目录下之档案亦皆依序拷贝至目的地。
-f若目的地已经有相同档名的档案存在,则在复制前先予以删除再行复制。
名称:
rm
使用权限:
所有使用者
使用方式:
rm[options]name...
说明:
删除档案及目录。
参数:
-i删除前逐一询问确认。
-f即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r将目录及以下之档案亦逐一删除。
执行命令后文件‘a’消失。
名称:
diff
功能说明:
比较文件的差异。
语 法:
diff[-abBcdefHilnNpPqrstTuvwy][-<行数>][-C<行数>][-D<巨集名称>][-I<字符或字符串>][-S<文件>][-W<宽度>][-x<文件或目录>][-X<文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
补充说明:
diff以逐行的方式,比较文本文件的异同处。
所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
参 数:
-<行数> 指定要显示多少行的文本。
此参数必须与-c或-u参数一并使用。
-a或--text diff预设只会逐行比较文本文件。
-b或--ignore-space-change 不检查空格字符的不同。
-B或--ignore-blank-lines 不检查空白行。
-c 显示全部内文,并标出不同之处。
-C<行数>或--context<行数> 与执行"-c-<行数>"指令相同。
-d或--minimal 使用不同的演算法,以较小的单位来做比较。
-D<巨集名称>或ifdef<巨集名称> 此参数的输出格式可用于前置处理器巨集。
-e或--ed 此参数的输出格式可用于ed的script文件。
-f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或--speed-large-files 比较大文件时,可加快速度。
-l<字符或字符串>或--ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或--ignore-case 不检查大小写的不同。
-l或--paginate 将结果交由pr程序来分页。
-n或--rcs 将比较结果以RCS的格式来显示。
-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Onlyin目录:
文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或--unidirectional-new-file 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或--brief 仅显示有无差异,不显示详细的信息。
-r或--recursive 比较子目录中的文件。
-s或--report-identical-files 若没有发现任何差异,仍然显示信息。
-S<文件>或--starting-file<文件> 在比较目录时,从指定的文件开始比较。
-t或--expand-tabs 在输出时,将tab字符展开。
-T或--initial-tab 在每行前面加上tab字符以便对齐。
-u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。
-v或--version 显示版本信息。
-w或--ignore-all-space 忽略全部的空格字符。
-W<宽度>或--width<宽度> 在使用-y参数时,指定栏宽。
-x<文件名或目录>或--exclude<文件名或目录> 不比较选项中所指定的文件或目录。
-X<文件>或--exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或--side-by-side 以并列的方式显示文件的异同之处。
--help 显示帮助。
--left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
--suppress-common-lines 在使用-y参数时,仅显示不同之处。
名称:
mv
使用权限:
所有使用者
使用方式:
mv[options]sourcedest
mv[options]source...directory
说明:
将一个档案移至另一档案,或将数个档案移至另一目录。
参数:
-i若目的地已有同名档案,则先询问是否覆盖旧档。
执行命令后a中的内容移至b中
名称:
rmdir
使用权限:
于目前目录有适当权限的所有使用者
使用方式:
rmdir[-p]dirName
说明:
删除空的目录。
参数:
-p是当子目录被删除后使它也成为空目录的话,则顺便一并删除。
(1)利用fork()生成子进程。
fork()代码:
编译后生成fork.out文件,执行fork.out后运行结果如下:
(3)利用clone()生成线程
clone代码:
编译后生成clone.out文件,执行clone.out后运行结果如下:
(4)通过mutex来实现生产者和消费者问题。
代码:
编译后生成mutex.out文件,执行mutex.out后运行结果如下:
(5)使用SystemV的信号灯,实现第二类读者-写者问题
代码:
运行结果:
……
……
五、调试运行结果
调试运行结果详见上方截图。
六、所遇问题及解决方法
问题:
在用到头文件#include时,刚开始编译提示错误,有很多的函数表示还未被定义。
解决办法:
在写gcc文件时应在尾部声明一个-lpthread
程序代码详见截图。