操作系统实验报告Word下载.docx

上传人:b****1 文档编号:1393578 上传时间:2023-04-30 格式:DOCX 页数:14 大小:225.03KB
下载 相关 举报
操作系统实验报告Word下载.docx_第1页
第1页 / 共14页
操作系统实验报告Word下载.docx_第2页
第2页 / 共14页
操作系统实验报告Word下载.docx_第3页
第3页 / 共14页
操作系统实验报告Word下载.docx_第4页
第4页 / 共14页
操作系统实验报告Word下载.docx_第5页
第5页 / 共14页
操作系统实验报告Word下载.docx_第6页
第6页 / 共14页
操作系统实验报告Word下载.docx_第7页
第7页 / 共14页
操作系统实验报告Word下载.docx_第8页
第8页 / 共14页
操作系统实验报告Word下载.docx_第9页
第9页 / 共14页
操作系统实验报告Word下载.docx_第10页
第10页 / 共14页
操作系统实验报告Word下载.docx_第11页
第11页 / 共14页
操作系统实验报告Word下载.docx_第12页
第12页 / 共14页
操作系统实验报告Word下载.docx_第13页
第13页 / 共14页
操作系统实验报告Word下载.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验报告Word下载.docx

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

操作系统实验报告Word下载.docx

操作系统向用户提供一组控制台命令,用户可以通过终端输入命令的方式获得操作系统的服务,并由此来控制自己作业的运行。

一般来讲,控制台命令应该包含:

一组命令、终端处理程序以及命令解释程序。

1)bash的由来

当登录Linux或者打开一个xterm时,当前默认的shell就是bash。

Bash是GNUProject的shell。

GNUProject是自由软件基金会(FreeSoftwareFoundation)的一部分。

它对Linux下的许多编程工具负责。

Bash(BourneAgainShell)是自由软件基金会发布的Bourneshell的兼容程序。

它包含了其他有些shell的许多良好的特性,功能非常的全面。

很多Linux版本都供bash。

2)bash的大致原理

bash处理自己的脚本时,先找到需要处理的命令名称,进而在当前用户的默认命令目录中找到对应的命令,这些默认目录一般是/usr/bin、/bin或/sbin。

在执行这些命令时,先使用进程创建系统调用fork(),在使用exex()来执行这些命令。

2.系统调用

系统调用是操作系统为程序员提供的接口服务。

使用系统调用,程序员可以更充分的利用计算机资源,使编写的程序更加灵活,功能更加强大。

程序员在对系统充分了解的情况下甚至可以订做系统调用,实现那些非专业程序员所难以实现的功能。

四.实验步骤

1.控制台命令接口实验指导

1)查看bash版本

在shell提示符下输入:

$echo$BASH_VERSION

显示如下结果:

2)编写bash脚本:

统计/my目录下c语言文件的个数

通过bash脚本,可以有多种方式实现这个功能,而使用函数是其中个一个选择。

在使用函数之前,必须先定义函数。

(1)进入自己的工作目录,用vi编写名为count的文件

cd/home/student#在home/student目录下编程

vicount

下面是脚本程序:

#!

/bin/bash

functioncount

{

echo–n"

Numberofmatchesfor$1:

"

#接收程序的第一个参数

ls$1|wc–l#对子程序的第一个参数所在的目录进行操作

}

(2)执行

将count文件复制到当前目录下,然后在当前目录下建立文件夹my:

mkdirmy

3)cdmy

vi1.c#在my目录下建立几个c文件,以便用来进行测试

...

cd...

chmod+xcount

count./my/*.c

2.系统调用实验指导

1)编程调用一个系统调用fork()

在应用程序中调用系统调用fork()非常简单,下面的程序可以很清楚的显示出有fork()系统调用生成了子进程,而产生的分叉作用:

#include<

stdio.h>

intmain()

intiUid;

iUid=fork();

if(iUid==0)

for(;

;

){printf("

Thisisparent.\n"

);

sleep

(1);

}

if(iUid>

0)

){

printf("

Thisischild.\n"

sleep

(1);

}

if(iUid<

0)printf("

Cannotusesystemcall.\n"

return0;

}

下面是可能得到的一种结果:

thisischild.

thisisparent.

thisischild.

thisischild.

执行结果:

五.实验结果分析:

1.学会了基本的文件操作以及函数执行,验证了结果;

2.父进程与子进程交替执行系统调用,由于完成系统调用后都会睡眠,所以其他进程可以执行,得到上述结果。

六.实验总结:

本次实验通过内核编译的方式来了解操作系统的具体调用方式。

在此过程中主要是熟悉Linux系统的几种终端命令上。

通过此次操作系统实验,我对Linux操作系统内核有了初步的了解。

实验二:

进程管理实验

a)加深对进程概念的理解,明确进程和程序的区别。

b)进一步认识并发执行的实质。

c)分析进程争用资源的现象,学习解决进程互斥的方法。

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

1.编制实现软中断通信的程序

使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上发出的中断信号(即按delete键),当父进程接收到这两个软中断的某一个后,父进程用系统调用kill()向两个子进程分别发出整数值为16和17软中断信号,子进程获得对应软中断信号,然后分别输出下列信息后终止:

Childprocess1iskilledbyparent!

!

Childprocess2iskilledbyparent!

父进程调用wait()函数等待两个子进程终止后,输入以下信息,结束进程执行:

Parentprocessiskilled!

多运行几次编写的程序,简略分析出现不同结果的原因。

2.编制实现进程的管道通信的程序

使用系统调用pipe()建立一条管道线,两个子进程分别向管道写一句话:

Childprocess1issendingamessage!

Childprocess2issendingamessage!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

要求:

父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。

1.进程的软中断通信

(1)算法流程图

(2)源程序如下(旁边有加补充注释):

#include<

signal.h>

unistd.h>

sys/types.h>

intwait_flag;

voidstop();

main(){

intpid1,pid2;

//定义两个进程号变量

signal(3,stop);

//或者signal(14,stop);

while((pid1=fork())==-1);

//若创建子进程1不成功,则空循环

if(pid1>

0){//子进程创建成功,pid1为进程号

while((pid2=fork())==-1);

//创建子进程2

if(pid2>

0){

wait_flag=1;

sleep(5);

//父进程等待5秒

kill(pid1,16);

//杀死进程1

kill(pid2,17);

//杀死进程2

wait(0);

//等待第1个子进程1结束的信号

//等待第2个子进程2结束的信号

printf("

\nParentprocessiskilled!

\n"

exit(0);

//父进程结束

else{

signal(17,stop);

//等待进程2被杀死的中断号17

\nChildprocess2iskilledbyparent!

exit(0);

else{

signal(16,stop);

//等待进程1被杀死的中断号16

\nChildprocess1iskilledbyparent!

voidstop(){

wait_flag=0;

2、进程的管道通信

(2)参考程序源代码

intpid1,pid2;

//定义两个进程变量

main(){

intfd[2];

charOutPipe[100],InPipe[100];

//定义两个字符数组

pipe(fd);

//创建管道

while((pid1=fork())==-1);

//如果进程1创建不成功,则空循环

if(pid1==0){//如果子进程1创建成功,pid1为进程号

lockf(fd[1],1,0);

//锁定管道

sprintf(OutPipe,"

\nChildprocess1issendingmessage!

//给Outpipe赋值

write(fd[1],OutPipe,50);

//向管道写入数据

sleep(5);

//等待读进程读出数据

lockf(fd[1],0,0);

//解除管道的锁定

//结束进程1

while((pid2=fork())==-1);

//若进程2创建不成功,则空循环

if(pid2==0){

\nChildprocess2issendingmessage!

wait(0);

//等待子进程1结束

read(fd[0],InPipe,50);

//从管道中读出数据

%s\n"

InPipe);

//显示读出的数据

//等待子进程2结束

read(fd[0],InPipe,50);

四.实验过程:

1.编写程序;

2.执行并分析结果

五.实验结果:

1.进程的软中断通信:

实验结果:

2.进程的管道通信:

六.实验结果分析:

现象:

运行结果中

“Childprocess1iskilledbyparent!

“Childprocess2iskilledbyparent!

第一次运行结果中,以上两语句相继出现,但是多次运行之后,此两条语句出现的先后顺序可能颠倒。

根据进程调度原理,父子进程被创建之后,均处在就绪状态,且此两个进程共享同一个代码段,分别参加调度、执行,直到运行结束。

但是无法明确调用的先后顺序。

故父子进程哪一个先从fork()函数中返回继续执行语句的顺序也是不确定,会随着系统调用策略以及资源的分配状态而改变。

2.进程的管道通信:

1)互斥:

当一个进程正在对pipe进程读/写操作时,另一进程必须等待,程序中使用lock(fd[1],1,0)函数实现对管道的加锁操作,用lock(fd[1],0,0)解除管道的锁定。

2)同步:

当写进程把一定数量的数据写入pipe后,便去睡眠等待,直到读进程取走数据后,再把它唤醒。

当读进程试图从一空管道中读取数据时,也应睡眠等待,直至写进程将数据写入管道后,才将其唤醒。

3)判断对方是否存在:

只有确定写进程和读进程都存在的情况下,才能通过管道进行通信。

管道用于连接一个读进程和一个写进程,以实现它们之间信息的共享文件又称pipe文件。

向管道(共享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数据送入管道;

而接收管道输送的接收进程(读进程),可以从管道中接收数据。

为了协调双方的通信,管道通信机制必须提供上述3方面的协调能力。

七.实验总结:

通过上述实验,我对操作系统进程的调用与管道的应用有了更为深刻的印象,从而加快了理论知识的实践化,在上机的过程中碰到了一些难题,通过询问老师以及查阅资料最终得到了解决。

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

当前位置:首页 > 人文社科 > 法律资料

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

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