操作系统实验指导书Word文件下载.docx

上传人:b****4 文档编号:6302786 上传时间:2023-05-06 格式:DOCX 页数:43 大小:32.87KB
下载 相关 举报
操作系统实验指导书Word文件下载.docx_第1页
第1页 / 共43页
操作系统实验指导书Word文件下载.docx_第2页
第2页 / 共43页
操作系统实验指导书Word文件下载.docx_第3页
第3页 / 共43页
操作系统实验指导书Word文件下载.docx_第4页
第4页 / 共43页
操作系统实验指导书Word文件下载.docx_第5页
第5页 / 共43页
操作系统实验指导书Word文件下载.docx_第6页
第6页 / 共43页
操作系统实验指导书Word文件下载.docx_第7页
第7页 / 共43页
操作系统实验指导书Word文件下载.docx_第8页
第8页 / 共43页
操作系统实验指导书Word文件下载.docx_第9页
第9页 / 共43页
操作系统实验指导书Word文件下载.docx_第10页
第10页 / 共43页
操作系统实验指导书Word文件下载.docx_第11页
第11页 / 共43页
操作系统实验指导书Word文件下载.docx_第12页
第12页 / 共43页
操作系统实验指导书Word文件下载.docx_第13页
第13页 / 共43页
操作系统实验指导书Word文件下载.docx_第14页
第14页 / 共43页
操作系统实验指导书Word文件下载.docx_第15页
第15页 / 共43页
操作系统实验指导书Word文件下载.docx_第16页
第16页 / 共43页
操作系统实验指导书Word文件下载.docx_第17页
第17页 / 共43页
操作系统实验指导书Word文件下载.docx_第18页
第18页 / 共43页
操作系统实验指导书Word文件下载.docx_第19页
第19页 / 共43页
操作系统实验指导书Word文件下载.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验指导书Word文件下载.docx

《操作系统实验指导书Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书Word文件下载.docx(43页珍藏版)》请在冰点文库上搜索。

操作系统实验指导书Word文件下载.docx

more;

less;

file;

du;

df;

mount;

umount;

chmod;

chown;

pwd;

which。

3、系统管理基本命令

Linux是真正的多用户多任务操作系统,任何人使用Linux系统时都要以用某个帐号先进行登陆,帐号名就是用户名。

用户的管理必须在root用户权限下进行操作,请务必小心!

参考背景资料或利用man命令,熟悉掌握以下命的使用方法:

useradd;

userdel;

passwd;

finger;

groupadd;

groupdel;

ps;

nice;

renice;

kill;

top;

freecal;

date;

uname;

login;

logout;

exit;

halt;

shutdown。

(五)实验报告

认真记录实验数据或显示结果,包括每个命令的作用及其执行结果。

如实填写实验报告。

实验二熟悉Linux开发环境(验证性)

(一)实验目的

1、学会使用vi编辑器的使用

2、熟悉Linux开发环境

1、熟悉LINUX平台下C语言程序设计方法;

2、编写hello程序;

3、掌握vi编辑器,gdb调试器,gcc编译器

1、vi编辑器的使用

vi是visualinterface的简称,它是Linux上一个最常用的全屏幕文本编辑器,vi几乎与Unix的历史一样悠久,vi几乎存在于所有的类Unix操作系统中,使用vi就如同使用Linux命令一样方便。

vi功能强大,有非常丰富的操作命令,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑器所没有的。

我们既可以利用其强大的功能进行非常灵活的个性化操作,又可以只掌握几个简单的命令来完成基本的编辑操作。

Linux下还有很多的编辑器,如行文本编辑器ex和ed,全屏幕编辑器joe和mc,还有视窗环境下的编辑器Gedit,GNUEmacs、XEmacs和Kate等,或是使用KDevelop,它是在Linux中的XWindow下执行的C/C++集成开发环境。

大家可以选择自己喜欢的编辑器来完成C语言程序的编辑工作,本实验只介绍vi编辑器的简单使用方法。

a)、进入vi

在系统提示符($)后输入vi及文件名称后,就进入vi全屏幕编辑画面:

$vimyfile↙

此时vi处于命令模式,命令模式下有许多操作命令,如“x”删除光标所在位置的字符,“dd”删除光标所在位置的一行,“i”进入插入模式等等。

我们只需掌握在命令模式下按i键进入插入模式即可。

在插入模式下就可以进行基本的编辑操作,用方向键移动光标,用“←”键或“Delete”键删除光标前或光标后的内容,用“Enter”键换行。

b)、退出vi及保存文件

在插入模式下按ESC键就进入行底模式,底行模式下也有许多命令,如“q”是退出,“q!

”是强制不存盘退出等等,需要注意的是,在底行模式下要先按“:

”键,然后在冒号后再输入要操作的命令,最后按回车键来执行命令。

我们需要掌握的底行模式基本命令有:

“w”(只存盘不退出vi);

“wfilename”(将内容以指定的文件名filename保存);

“wq”(存盘并退出vi);

“q!

”(不存盘强制退出vi)。

上述vi基本操作可简单总结如下:

2、Linux下C语言程序的编译过程

a、在用户主目录下用vi编辑C语言源程序(源程序已附后),如:

$vihello.c。

b、用gcc编译C语言源程序:

$gcc./hello.c-oexample

这里gcc是Linux下的C语言程序编译器,./hello.c表示待编译的源文件是当前工作目录下的hello.c,-oexample表示编译后产生的目标代码文件名为example。

c、若编译不正确,则进入vi修改源程序,否则,运行目标代码:

$./example

注意:

a、如果用户shell的环境变量设置得当,可省略“./”。

b、这只是gcc最最基本的用法。

c、若源程序用C++编写,则应有以下语句:

……

usingnamespacestd;

intmain()

同时,编译时将gcc换成g++即可。

(五)、实验报告

请问hello.c的功能是什么?

附:

hello.c源程序

#include<

stdio.h>

main()

{

intn,a[200],carry,temp,i,j,digit=1;

printf("

Pleaseinputn:

"

);

scanf("

%d"

&

n);

a[0]=1;

for(i=2;

i<

=n;

++i)

{

for(j=1,carry=0;

j<

=digit;

++j)

{

temp=a[j-1]*i+carry;

a[j-1]=temp%10;

carry=temp/10;

}while(carry)

{a[++digit-1]=carry%10;

carry/=10;

}

Resultis:

\n%d!

="

n);

for(i=digit;

i>

=1;

--i)

printf("

a[i-1]);

\n"

 

实验三Linux进程创建和控制(设计性)

1、加深对进程概念的理解,明确进程和程序的区别;

2、观察并发执行的现象,进一步认识并发执行的实质。

3、进一步熟悉Linux的基本命令和开发环境。

1、熟悉UNIX平台下C语言程序设计方法;

2、编写进程的创建程序;

3、观察进程的执行情况,掌握fork()系统调用。

PC兼容机、交换机、RedHatLinux9.0、gcc编译器。

(四)实验内容

1、用4个基本系统调用实现进程的创建、执行和自我终止:

①fork()。

创建一个子进程。

用它创建的子进程是fork调用者进程(即父进程)的复制品,即进程映象。

除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。

如果创建进程失败,则fork()返回值为-1:

若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是0,返回值在R0。

m=fork()。

②wait()。

父进程处于阻塞(或等待)状态,等待子进程执行完成终止后继续工作。

其返回值R0为等待子进程的子进程号。

n=wait()。

③exit()。

子进程自我终止,释放所占资源,通知父进程可以删除自己。

此时它的状态变成P_state=SZOMB。

④getpid()。

获得进程的标识数(进程号),一般是正整数。

P=getpid()。

〈程序设计〉

1.编写一个程序,父进程生成一个子进程,父进程等待子进程wait(),子进程执行完成后自我终止exit(),并唤醒父进程。

父、子进程执行时打印有关信息。

2.编写一个程序,输入两个整数并求和输出,然后创建一个子进程,当进程调度程序调度到父进程或子进程时特输出不同的信息。

认真记录实验数据或显示结果,跟踪和调试程序,观察、记录并分析屏幕上进程调度的情况。

附:

1.参考程序

main()

{inti,j,k;

if(i=fork())//非零值

{j=wait();

printf(“Parentprocess!

\n”);

printf(“i=%dk=%d\n,i,k);

}

else{k=getpid();

printf(“Childprocess!

}

2.参考程序例

{inti,j,k,sum;

scanf(“%d%d”,&

j,&

k);

sum=j+k;

printf(“sum=%d\n”,sum);

while((i=jork())==-1)

printf(“i=%d\n,i);

if(i)printf(“Itisparentprocess!

elseprintf(“ItisChildprocess!

实验四进程的软中断通信和管道通信(设计性)

1、进一步加深对进程概念的理解。

2、了解Linux系统中进程通信的基本原理。

1、熟悉Linux平台下C语言程序设计方法;

2、编写进程通信程序;

3、观察进程的执行情况,掌握pipe()系统调用。

1、进程的“软中断”通信

它可用于同一用户的进程之间通信。

其方式是:

一个进程通过系统调用kill(pid,sig)向同一用户的其它进程pid发送一个软中断信号:

另一进程通过系统调用signal(sig,func)捕捉到信号sig后,执行予先约定的动作func,从而实现这两个进程间的通信。

①发送信号kill(pid,sig),本进程将指定信号sig发送给指定进程pid,其中参数为pid进程号,pid与sig均为整数值。

②接收信号signal(sig,func),本进程接收到其它进程发送给它的信号后,完成指定的功能func。

func一般是函数。

〈程序设计〉

编写一个程序,父进程生成子进程,父进程发送信号并等待,子进程接收信号并完成某种功能,然后自我终止并唤醒父进程。

2、进程管道的通信

建立进程间的管道,格式为:

pipe(fd);

intfd[2];

其中,fd[1]是写端,向管道中写入;

fd[0]是读端,从管道中读出;

本质上将其当作文件处理。

进程间可通过管道,用write与read来传递数据,但write与read不可以同时进行,在管道中只能有4096字节的数据被缓冲。

编写一个程序,建立一个pipe,同时父进程产生一个子进程,子进程向pipe中写入一个字符串,父进程从中读出该字符串,并每隔3秒种输出打印一次。

认真记录实验数据或显示结果,跟踪和调试程序,观察、记录并分析屏幕上进程通讯的情况。

1.参考程序

intfunc();

{inti,j:

signal(17,func);

if(i=fork())

{printf(“Parent:

Signal17willbesendtoChild!

\n”);

kill(i,17);

wait(0);

printf(“Parent:

finished!

\n”)”

}

else{sleep(10);

printf(“Child:

AsignalfrommyParentisreceived!

\n”)

exit();

func()

{printf(“Itissignal17processingfunction!

\n”;

执行结果如下:

Parent:

Itissignal17processingfunction!

Child:

Parent:

2.参考程序

{intx,fd{2};

charS[30];

pipe(fd);

for(;

;

{x=fork();

if(x==0)

{sprintf(S,”Good-night!

write(fd[1],S,20);

sleep(3);

exit(0);

else{wait(0);

read(fd[0],S,20);

printf(“**********\n”,S);

实验五进程间通信(设计性)

了解和熟悉Linux支持的消息通信机制和共享存储区通信机制

1、利用msgget()、msgsnd()、msgrev()、msgctl()等系统调用编写消息的发送和接收的程序;

2、利用shmget()、sgmat()、smgdt()、shmctl()等系统调用编写消息的发送和接收的程序。

(三)主要仪器设备及器材

1、消息的创建,发送和接收

〈任务〉

使用系统调用msgget(),megsnd(),msgrev()及msgctl()编制一长度为1K的消息发送和接收的程序。

(1)为了便于操作和观察结果,用一个程序为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。

(2)SERVER端建立一个Key为75的消息队列,等待其他进程发来的消息。

当遇到类型为1的消息,则作为结束信号,取消该队列,并退出SERVER。

SERVER每接收到一个消息后显示一句“(server)received”。

(3)CLIENT端使用Key为75的消息队列,先后发送类型从10到1的消息,然后退出。

最后的一个消息,既是SERVER端需要的结束信号。

CLIENT每发送一条消息后显示一句“(client)sent”。

(4)父进程在SERVER和CLIENT均退出后结束。

2、共享存储区的创建,附接和断接

<

任务>

使用系统调用shmget(),sgmat(),smgdt(),shmctl()编制一个与上述功能相同的程序.

程序设计>

(1)为了便于操作和观察结果,用一个程序为“引子”,先后fork()两个子进程,SERVER和CLIENT,进行通信。

(2)SERVER端建立一个KEY为75的共享区,并将第一个字节置为-1.作为数据空的标志.等待其他进程发来的消息.当该字节的值发生变化时,表示收到了该消息,进行处理.然后再次把它的值设为-1.如果遇到的值为0,则视为结束信号,取消该队列,并退出SERVER.SERVER每接收到一次数据后显示”(server)received”.

(3)CLIENT端建立一个为75的共享区,当共享取得第一个字节为-1时,Server端空闲,可发送请求.CLIENT随即填入9到0.期间等待Server端再次空闲.进行完这些操作后,CLIENT退出.CLIENT每发送一次数据后显示”(client)sent”.

(4)父进程在SERVER和CLIENT均退出后结束.

认真记录实验数据或显示结果,跟踪和调试程序,观察、记录并分析屏幕上进程间通讯的情况。

1.参考程序

#include<

sys/types.h>

sys/msg.h>

sys/ipc.h>

#defineMSGKEY75/*定义关键词MEGKEY*/

structmsgform/*消息结构*/

longmtype;

charmtexe[1030];

/*文本长度*/

}msg;

intmsgqid,i;

voidCLIENT()

inti;

msgqid=msgget(MSGKEY,0777);

for(i=10;

i>

i--)

{

msg.mtype=i;

printf("

(client)sent\n"

msgsnd(msgqid,&

msg,1024,0);

/*发送消息msg入msgid消息队列*/

voidSERVER()

msgqid=msgget(MSGKEY,0777|IPC_CREAT);

/*由关键字获得消息队列*/

do

msgrcv(msgqid,&

msg,1030,0,0);

/*从队列msgid接受消息msg*/

(server)receive\n"

}while(msg.mtype!

=1);

/*消息类型为1时,释放队列*/

msgctl(msgqid,IPC_RMID,0);

if(fork())SERVER();

elseCLIENT();

wait(0);

结果>

从理想的结果来说,应当是每当Client发送一个消息后,server接收该消息,Client再发送下一条。

也就是说“(Client)sent”和“(server)received”的字样应该在屏幕上交替出现。

实际的结果大多是,先由Client发送两条消息,然后Server接收一条消息。

此后Client

Server交替发送和接收消息.最后一次接收两条消息.Client和Server分别发送和接收了10条消息,与预期设想一致

<

分析>

message的传送和控制并不保证完全同步,当一个程序不再激活状态的时候,它完全可能继续睡眠,造成上面现象,在多次sendmessage后才receivemessage.这一点有助于理解消息转送的实现机理.

#include<

#defineSHMKEY75/*定义共享区关键词*/

intshmid,i;

int*addr;

CLIENT()

shmid=shmget(SHMKEY,1024,0777);

/*获取共享区,长度1024,关键词SHMKEY*/

addr=shmat(shmid,0,0);

/*共享区起始地址为addr*/

for(i=9;

=0;

i--)

{

while(*addr!

=-1);

/*打印(client)sent*/

*addr=i;

/*把i赋给addr*/

}

SERVER()

{

shmid=shmget(SHMKEY,1024,0777|IPC_CREAT);

/*创建共享区*/

do

*addr=-1;

while(*addr==-1);

(server)received\n"

/*服务进程使用共享区*/

while(*addr);

shmctl(shmid,IPC_RMID,0);

main()

if(fork())SERVER();

if(fork())CLIENT();

结果〉

运行的结果和预想的完全一样。

但在运行的过程中,发现每当client发送一次数据后,server要等大约0.1秒才有响应。

同样,之后client又需要等待大约0.1秒才发送下一个数据。

分析〉

出现上述的应答延迟的现象是程序设计的问题。

当client端发送了数据后,并没有任何措施通知server端数据已经发出,需要由client的查询才能感知。

此时,client端并没有放弃系统的控制权,仍然占用CPU的时间片。

只有当系统进行调度时,切换到了server进程,再进行应答。

这个问题,也同样存在于server端到client的应答过程之中。

3比较两种消息通信机制中的数据传输的时间

由于两种机制实现的机理和用处都不一样,难以直接进行时间上的比较。

如果比较其性能,应更加全面的分析。

(1)消息队列的建立比共享区的设立消耗的资源少.前者只是一个软件上设定的问题,后者需要对硬件操作,实现内存的映像,当然控制起来比前者复杂.如果每次都重新进行队列或共享的建立,共享区的设立没有什么优势。

(2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件的支持,不耗费多余的资源;

而消息传递,由软件进行控制和实现,需要消耗一定的CPU资源.从这个意义上讲,共享区更适合频繁和大量的数据传输.

(3)消息的传递,自身就带有同步的控制.当等到消息的时候,进程进入睡眠状态,不再消耗CPU资源.而共享队列如果不借助其他机制进行同步,接受数据的一方必须进行不断的查询,白白浪费了大量的CPU资源.可见消息方式的使用更加灵活.

实验六存储管理(设计性)

通过请求页式存储管理页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理页面置换算法。

1、设计一个虚拟存储区和内存工作区;

2、计算FIFO、LRU、OPT、LFU、NUR算法的访问命中率;

3、根

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2