搜档网
当前位置:搜档网 › 操作系统实验_实验1分析

操作系统实验_实验1分析

操作系统实验_实验1分析
操作系统实验_实验1分析

广州大学学生实验报告

1、实验目的

1.1、掌握进程的概念,明确进程的含义

1.2、认识并了解并发执行的实质

2.1、掌握进程另外的创建方法

2.2、熟悉进程的睡眠、同步、撤消等进程控制方法

3.1、进一步认识并发执行的实质

3.2、分析进程竞争资源的现象,学习解决进程互斥的方法

4.1、了解守护进程

5.1、了解什么是信号

5.2、INUX系统中进程之间软中断通信的基本原理

6.1、了解什么是管道

6.2、熟悉UNIX/LINUX支持的管道通信方式

7.1、了解什么是消息

7.2、熟悉消息传送的机理

8.1、了解和熟悉共享存储机制

二、实验内容

1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统

中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。

1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及

'son ……',父进程显示'parent ……',观察结果,分析原因。

2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容

2.2、利用wait( )来控制进程执行顺序

3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥

3.2、观察并分析出现的现象

4.1、写一个使用守护进程(daemon)的程序,来实现:

创建一个日志文件/var/log/Mydaemon.log ;

每分钟都向其中写入一个时间戳(使用time_t的格式) ;

5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:

Child process1 is killed by parent!

Child process2 is killed by parent!

父进程等待两个子进程终止后,输出如下的信息后终止:

Parent process is killed!

5.2、用软中断通信实现进程同步的机理

6.1、编写程序实现进程的管道通信。用系统调用pipe( )建立一管道,二个子进程P1和P2分别向管道各写一句话:

Child 1 is sending a message!

Child 2 is sending a message!

父进程从管道中读出二个来自子进程的信息并显示(要求先接收P1,后P2)。

7.1、消息的创建、发送和接收。使用系统调用msgget( ),msgsnd( ),msgrev( ),及msgctl( )编制一长度为1k的消息发送和接收的程序。

8.1、编制一长度为1k的共享存储区发送和接收的程序。

三、实验原理

1、程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。一个进程

实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。每个

区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进

程。

2、进程是进程映像的执行过程,也就是正在执行的进程实体。

3、fork( )返回值意义如下:

0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。

>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。

4、NIX/LINUX中fork( )是一个非常有用的系统调用,但在UNIX/LINUX中建立进程

除了fork( )之外,也可用与fork( ) 配合使用的exec( )。

5、lockf(files,function,size)用作锁定文件的某些段或者整个文件。

6、每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头

文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用

于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查

是否有信号到达。若有,便中断正在执行的程序,转向与该信号相对应的处理程

序,以完成对该事件的处理;处理结束后再返回到原来的断点继续执行。实质

上,信号机制是对中断机制的一种模拟,故在早期的UNIX版本中又把它称为软

中断。

7、信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。如果目

标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程就此结

束。一个进程可能在其信号域中有多个位被置位,代表有多种类型的信号到达,

但对于一类信号,进程却只能记住其中的某一个。

8、当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核心态返

回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心态时,即

使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断信号。

9、管道,是指能够连接一个写进程和一个读进程的、并允许它们以生产者—消费者

方式进行通信的一个共享文件,又称为pipe文件。

10、消息机制允许由一个进程给其它任意的进程发送一个消息。

11、该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个

进程的虚地址空间中。

四、实验设备

Linux系统

五、实验程序

1、创建子进程相关代码

#include

#include

int main( )

{

int p1,p2;

while((p1=fork( ))==-1); /*创建子进程p1*/

if (p1==0) putchar('b');

else

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2==0) putchar('c');

else putchar('a');

}

}

修改后:

#include

#include

int main( )

{

int p1,p2,i;

while((p1=fork( ))== -1); /*创建子进程p1*/

if (p1==0)

for(i=0;i<10;i++)

printf("daughter %d\n",i);

else

{

while((p2=fork( ))== -1); /*创建子进程p2*/ if(p2==0)

for(i=0;i<10;i++)

printf("son %d\n",i);

else

for(i=0;i<10;i++)

printf("parent %d\n",i);

}

}

2、exec,wait相关代码

#include

#include

#include

#include

void main( )

{

int pid;

pid=fork( ); /*创建子进程*/

switch(pid)

{

case -1: /*创建失败*/

printf("fork fail!\n");

exit(1);

case 0: /*子进程*/

execl("/bin/ls","ls","-1","-color",NULL);

printf("exec fail!\n");

exit(1);

default: /*父进程*/

wait(NULL); /*同步*/

printf("ls completed !\n");

exit(0);

}

}

3、lockf相关代码

#include

#include

#include

int main( )

{

int p1,p2,i;

while((p1=fork( ))==-1); /*创建子进程p1*/

if (p1==0)

{

lockf(1,1,0); /*加锁,这里第一个参数为stdout(标准输出设备的描述符)*/

for(i=0;i<10;i++)

printf("daughter %d\n",i);

lockf(1,0,0); /*解锁*/

}

else

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if (p2==0)

{

lockf(1,1,0); /*加锁*/

for(i=0;i<10;i++)

printf("son %d\n",i);

lockf(1,0,0); /*解锁*/

}

else

{

lockf(1,1,0); /*加锁*/

for(i=0;i<10;i++)

printf("parent %d\n",i);

lockf(1,0,0); /*解锁*/

}

}

}

4、守护神程序:

#include

#include

#include

#include

#include

int main(){

time_t t;

FILE *fp;

fp=fopen("/var/log/Mydaemon.log","a");

pid_t pid;

pid=fork();

if(pid>0){

printf("Daemon on duty!\n");

exit(0);

}

else if(pid<0){

printf("Can't fork!\n");

exit(-1);

}

while(1){

if(fp>=0){

sleep(60);

printf("Daemon on duty!\n");

t=time(0);

fprintf(fp,"The current time is %s\n",asctime(localtime(&t)));

}

}

fclose(fp);

}

5、通信中断关代码

#include

#include

#include

#include

#include

void waiting( ),stop( );

int wait_mark;

int main( )

{

int p1,p2,stdout;

while((p1=fork( ))==-1); /*创建子进程p1*/

if(p1>0)

{

while((p2=fork( ))==-1); /*创建子进程p2*/

if(p2>0)

{

wait_mark=1;

signal(SIGINT,stop); /*接收到^c信号,转stop*/

waiting( );

kill(p1,16); /*向p1发软中断信号16*/

kill(p2,17); /*向p2发软中断信号17*/

wait(0); /*同步*/

wait(0);

printf("Parent process is killed!\n");

exit(0);

}

else

{

wait_mark=1;

signal(17,stop); /*接收到软中断信号17,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 2 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(16,stop); /*接收到软中断信号16,转stop*/

waiting( );

lockf(stdout,1,0);

printf("Child process 1 is killed by parent!\n");

lockf(stdout,0,0);

exit(0);

}

}

void waiting( )

{

while(wait_mark!=0);

}

void stop( )

{

wait_mark=0;

}

6、管道相关代码:

#include

#include

#include

#include

#include

int pid1,pid2;

int main( )

{

int fd[2];

char outpipe[100],inpipe[100];

pipe(fd); /*创建一个管道*/

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

if(pid1==0)

{

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

sprintf(outpipe,"child 1 process is sending message!");

/*把串放入数组outpipe中*/

write(fd[1],outpipe,50); /*向管道写长为50字节的串*/

sleep(5); /*自我阻塞5秒*/

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

exit(0);

}

else

{

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

if(pid2==0)

{lockf(fd[1],1,0); /*互斥*/

sprintf(outpipe,"child 2 process is sending message!"); write(fd[1],outpipe,50);

sleep(5);

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

exit(0);

}

else

{

wait(0); /*同步*/

read(fd[0],inpipe,50); /*从管道中读长为50字节的串*/ printf("%s\n",inpipe);

wait(0);

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

printf("%s\n",inpipe);

exit(0);

}

}

}

7、消息的相关代码:

lient.c

#include

#include

#include

#include

#include

#define MSGKEY 75

struct msgform

{

long mtype;

char mtext[1000];

}msg;

int msgqid;

void client()

{

int i;

msgqid=msgget(MSGKEY,0777);

for(i=10;i>=1;i--)

{

msg.mtype=i;

printf("(client)sent\n");

msgsnd(msgqid,&msg,1024,0);

}

exit(0);

}

int main( )

{

client( );

}

server.c

#include

#include

#include

#include

#include

#define MSGKEY 75

struct msgform

{

long mtype;

char mtext[1000];

}msg;

int msgqid;

void server( )

{

msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*创建75#消息队列*/ do

{

msgrcv(msgqid,&msg,1030,0,0); /*接收消息*/

printf("(server)received\n");

}while(msg.mtype!=1);

msgctl(msgqid,IPC_RMID,0); /*删除消息队列,归还资源*/

exit(0);

}

int main( )

{

server( );

}

8、共享存储机制的相关代码

#include

#include

#include

#include

#include

#include

#include

#include

#define SHMKEY 75

#define SHMSZ 128

int shmid,i;

int *addr;

void client( )

{

int i;

shmid=shmget(SHMKEY,1024,0777); /*打开共享存储区*/

addr=shmat(shmid,0,0); /*获得共享存储区首地址*/

for (i=9;i>=0;i--)

{

while (*addr!=-1);

printf("(client) sent\n");

*addr=i;

}

exit(0);

}

void server( )

{

shmid=shmget(SHMKEY,1024,0777|IPC_CREAT); /*创建共享存储区*/ addr=shmat(shmid,0,0); /*获取首地址*/

do

{

*addr=-1;

while (*addr==-1);

printf("(server) received\n");

}while (*addr);

shmctl(shmid,IPC_RMID,0); /*撤消共享存储区,归还资源*/ exit(0);

}

int main( )

{

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

if(!i)

server( );

system("ipcs -m");

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

if(!i)

client( );

wait(0);

wait(0);

}

六、实验结果

实验1.1

本来从进程并发执行来看,各种情况都有可能。上面的三个进程没有同步措施,父进程与子进程的输出内容会叠加在一起。输出次序带有随机性。

实验1.2

由实验1.1可知各种情况都有可能由于函数,而且printf( )在输出字符串时不会被中断,因此,字符串内部字符顺序输出不变。但由于进程并发执行的调度顺序和父子进程抢占处理

机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。

实验2.1~2.2

程序在调用fork( )建立一个子进程后,马上调用wait( ),使父进程在子进程结束之前,一直处于睡眠状态。子进程用exec( )装入命令ls ,exec( )后,子进程的代码被ls的代码取代,这时子进程的PC指向ls的第1条语句,开始执行ls的命令代码。wait( )给我们提供了一种实现进程同步的简单方法。

实验3.1~3.2

加锁和没加锁还是有区别的。没加锁,子进程的for循环会被“打断”,也就是说,10个daughter和10个son会互相穿插。而加锁以后,尽管10个son和10个daughter会或先或后出现,但是不会互相穿插,以10个10个这样的完整形式输出。这是因为加锁以后,屏幕输出要等解锁指令发出后,才会让第二个进程执行输出,在第一个进程没有解锁前,其余进程不能输出。

实验4.1

终端:

日志:

fprintf(fp,"The current time is %s\n",asctime(localtime(&t)))只是把当前时间输入到缓冲区,并没有写到Mydaemon.log文件里面,所以并不会输出时间。唯有在fprintf最后写上fflush(fp)才能强制输出时间戳到Mydaemon.log文件里面。

实验5.1~5.2

屏幕上无反应,按下^C后,显示Parent process is killed!

上述程序中,signal( )都放在一段程序的前面部位,而不是在其他接收信号处。这是因为signal( )的执行只是为进程指定信号值16或17的作用,以及分配相应的与stop( )过程链接的指针。因而,signal( )函数必须在程序前面部分执行。

实验6.1

延迟5秒后显示:child 1 process is sending message!

再延迟5秒:child 2 process is sending message!

实验7.1

应当是每当client发送一个消息后,server接收该消息,client再发送下一条。也就是说“(client)sent”和“(server)received”的字样应该在屏幕上交替出现。实际的结果大多是,先由client发送了两条消息,然后server接收一条消息。此后client 、server交替发送和接收消息。最后server一次接收两条消息。client 和server 分别发送和接收了10条消息,与预期设想一致。

实验8.1

在运行过程中,发现每当client发送一次数据后,server要等待大约0.1秒才有响应。同样,之后client又需要等待大约0.1秒才发送下一个数据。

七、问题回答分析

(1.1)系统是怎样创建进程的?

答:系统通过fork()系统调用来创建父进程对应的子进程,创建成功将返回一个值“0”

给子进程,父进程会被返回子进程的id值(大于0),若创建失败返回“-1”。

(1.2)当首次调用新创建进程时,其入口在哪里?

答:入口就是fork()返回给创建的子进程的pid值。

(2.1)可执行文件加载时进行了哪些处理?

答:获得目录下所有文件的信息,然后把目录倒序,再加载到子进程中。

(2.2)什么是进程同步?wait( )是如何实现进程同步的?

答:进程同步就是不同进程按照一定的顺序先后执行,而不是没有顺序的或先或后执行。Wait()是要等待子进程中exit()返回正常软中断的信号时才结束等待,执行父进程wait()后面的代码。Wait和exit是配合使用的,在进程的同步上面,一般wait 放在父进程中用来等待子进程的exit返回值。

(3)无习题。

答:略。

(4)无习题。

答:略。

(5.1)该程序段前面部分用了两个wait(0),它们起什么作用?

答:等待两个子进程exit()的返回值再继续执行下面代码。

(5.2)该程序段中每个进程退出时都用了语句exit(0),为什么?

答:子进程正常退出时,返回值给wait(),再执行父进程。

(5.3)为何预期的结果并未显示出?

答:由于父子进程都同时接收到^c中断信号,所以两个子进程在创建之后,signal就得到中断信号,子进程正常中止,并没有执行signal之后的代码,返回正常中止的信号给wait(0),父进程得到子进程正常中止的信号后就执行后面的代码,输出“Parent process is killed!”。

(5.4)程序该如何修改才能得到正确结果?

答:在终端发送指令给父进程,或着更换成如下代码:

#include

#include

#include

#include

#include

void waiting( ),stop( ),nye( );

int wait_mark;

int main( )

{

int p1,p2,stdout;

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

if (p1>0)

{

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

if(p2>0)

{

wait_mark=1;

signal(SIGINT,stop);

waiting( );

kill(p1,16);

kill(p2,17);

wait(0); /*同步*/

wait(0);

printf("Parent process is killed!\n");

exit(0);

}

else

{

wait_mark=1;

signal(SIGINT,nye);

signal(17,stop);

waiting( );

lockf(stdout,1,0);

printf("Child process 2 is killed by parent!\n"); lockf(stdout,0,0);

exit(0);

}

}

else

{

wait_mark=1;

signal(SIGINT,nye);

signal(16,stop);

waiting( );

lockf(stdout,1,0);

printf("Child process 1 is killed by parent!\n"); lockf(stdout,0,0);

exit(0);

}

}

void waiting( )

{

while(wait_mark!=0);

}

void stop( )

{

wait_mark=0;

}

void nye( )

{

}

(6.1)程序中的sleep(5)起什么作用?

答:sleep(5)的作用是延长子进程占用管道的时间,并没有让子进程1先输出子进程2后输出的作用。

(6.2)子进程1和2为什么也能对管道进行操作?

答:因为该pipe管道属于无名管道,调用pipe( )的父进程及其子孙进程均能识别此文件描述符,能利用该文件(管道)进行通信。

(7.1)无习题。

答:略c

(8.1)比较两种消息通信机制中数据传输的时间。

答:由于两种机制实现的机理和用处都不一样,难以直接进行时间上的比较。如果比较其性能,应更加全面的分析。

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

(2)当消息队列和共享区建立好后,共享区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而消息传递,由软件进行控制和实现,需要消耗一定的cpu的资源。

从这个意义上讲,共享区更适合频繁和大量的数据传输。

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

操作系统实验报告一

重庆大学 学生实验报告 实验课程名称操作系统原理 开课实验室DS1501 学院软件学院年级2013专业班软件工程2 班学生姓名胡其友学号20131802 开课时间2015至2016学年第一学期 总成绩 教师签名洪明坚 软件学院制

《操作系统原理》实验报告 开课实验室:年月日学院软件学院年级、专业、班2013级软件工 程2班 姓名胡其友成绩 课程名称操作系统原理 实验项目 名称 指导教师洪明坚 教师 评语教师签名:洪明坚年月日 1.实验目的: ?进入实验环境 –双击expenv/setvars.bat ?检出(checkout)EPOS的源代码 –svn checkout https://www.sodocs.net/doc/2910739140.html,/svn/epos ?编译及运行 –cd epos/app –make run ?清除所有的临时文件 –make clean ?调试 –make debug ?在“Bochs Enhanced Debugger”中,输入“quit”退出调试 –调试指令,请看附录A 2.实验内容: ?编写系统调用“time_t time(time_t *loc)” –功能描述 ?返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc 非NULL,则返回值也被填到loc所指向的内存位置 –数据类型time_t其实就是long ?typedef long time_t; 3.实验步骤: ?Kernel space –K1、在machdep.c中,编写系统调用的实现函数“time_t sys_time()”,计算用户秒数。需要用到 ?变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1午夜的秒数 ?变量g_timer_ticks

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

管理信息系统实验报告分析报告

实验报告 课程:管理信息系统 一、实验目的 验证有关概念和理论,加深对概念和知识的理解和认识;熟悉和掌握Visual Basic 6.0 软件的使用方法;初步具备信息管理知识和制作数据字典、系统数据流程图的能力。运用课程讲授的管理信息系统的系统分析方法、模块化系统设计方法以及系统的调试方法进行人事档案管理信息系统的分析、设计、开发、实现与调试。 二、实验方法 面向对象法 三、实验环境及开发工具 1.硬件环境 在最低配置的情况下,系统的性能往往不尽如人意,但现在的硬件性能已经相当的出色,而且价格便宜,因此通常给服务器的配置高性能的硬件。 处理器:Interl Pentium II 266 MX 或更高 内存:64M 硬盘空间:2 GB 显卡:SVGA 显示适配器 显示器:液晶17寸 2.软件环境 操作系统:Windows/98/ME/2000/XP或更高版本 数据库:Microsoft Access 2000

3.实验开发工具:Visual Bisic 6.0程序系统 四、实验内容 (一)、系统分析 1、系统数据流程图 2、数据字典

3、系统中所有实体(包括实体的属性)以及实体之间的联系类型分析 人员的个人资料经过专业的处理部门的处理形成个人档案。档案包括自然情况,工作情况,简历,政治情况等各方面信息,内容比较庞大复杂。将档案信息传送到人员信息库。同时还综合考虑档案管理工作的性质,总结归纳出所需实现的功能。为人事档案进行服务,对人事的变动、人事资料、以及人事资料的查询,统计等功能。总体上说具有编辑,查询,用户管理,图表统计等功能。然后将最终结果提交到人力资源管理部门,由人力资源管理人员进行审查,以便于对职工的调配。 4、典型处理的表达 档案完整添加用户档案到档案库 个人信息成功添加到档案库 修改用户档案信息 档案不完整失败退回用户档案

操作系统实验报告4

《操作系统》实验报告 实验序号: 4 实验项目名称:进程控制

Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜ 修改后: #include #include int main(VOID) { STARTUPINFO si; PROCESS_INFORMA TION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(!CreateProcess(NULL, "c:\\WINDOWS\\system32\\mspaint.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) { fprintf(stderr,"Creat Process Failed"); return -1; } WaitForSingleObject(pi.hProcess,INFINITE); printf("child Complete"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } 在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:C:\ >CL 4-1.cpp

实验任务:写出程序的运行结果。 4.正在运行的进程 (2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。 #include #include

操作系统实验_实验1

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include main( ) { int p1,p2; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) putchar('b'); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) putchar('c'); else putchar('a'); } } 运行结果:

bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include main( ) { int p1,p2,i; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) for(i=0;i<10;i++) printf("daughter %d\n",i); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) for(i=0;i<10;i++) printf("son %d\n",i); else for(i=0;i<10;i++) printf("parent %d\n",i); } } 结果:

操作系统实验报告

实验四进程与线程实验目的(1)理解进程的独立空间;(2)理解线程的相关概念。实验内容与要求1、掌握进程创建和构造的相关知识和线程创建和构造的相关知识,2、了解C 语言程序编写的相关知识;3、理解进程的独立空间的实验内容及步骤4、理解线程的实验步骤5、对整个实验过程进行分析总结,给出详细步骤;实验过程1、进程的与线程的创建和构造进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位。新的进程通过克隆旧的程序(当前进程)而建立。fork() clone()(对于线程)系统调用可用来建立新的进程。2、理解进程的独立空间流程图如下所示:(1)编写一个程序,在其main()函数中定义一个变量shared,对其进行循环加/减操作,并输出每次操作后的结果源程序如下所示: #include int main() intshared=1; shared++; shared fork()ERROR 输出shared 操作输出shared 操作pid printf("%d\n",shared); shared--; printf("%d\n", shared); shared++; printf("%d\n", shared); shared--; printf shared);return (2)使用系统调用fork()创建子进程,观察该变量的变化(3)修改程序把shared 变量定义到main()函数之外,重复第(2)步操作,观察该变量的变化。(4)当把shared 放到主函数之外时,运行结果和内部时相比,并未发生变化。 一. 实验目的及实验环境 (一)实验环境 Linux 操作系统

操作系统实验报告

操作系统教程 实 验 指 导 书 姓名: 学号: 班级:软124班 指导老师:郭玉华 2014年12月10日

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序: E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : 有可能是因为DOS下路径的问题 (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 因为程序是个死循环程序 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环: 屏蔽j循环: _______________________________________________________________________________调整循环变量i的循环次数:

操作系统实验报告心得体会

操作系统实验报告心得体会 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。 不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,

慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

操作系统实验一

本科实验报告 课程名称:操作系统 学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院

实验(实验一) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。 【操作要求】安装Linux操作系统,版本不限。 Linux发行版本: Linux内核版本:

【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机 4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标

【操作步骤2】主菜单 【操作步骤3】个人用户主目录 【操作步骤4】启动字符终端

操作系统-Linux课程实验报告材料

实验1.1、1.2 Linux Ubuntu的安装、创建新的虚拟机VMWare

实验1.3 Shell编程 1.实验目的与内容 通过本实验,了解Linux系统的shell机制,掌握简单的shell编程技巧。 编制简单的Shell程序,该程序在用户登录时自动执行,显示某些提示信息,如“Welcome to Linux”, 并在命令提示符中包含当前时间、当前目录和当前用户名等基本信息。 2.程序源代码清单 #include #include int main(){ printf("Hello Linux\n"); int pid; int state; int pfd[2]; pipe(pfd); if (fork()==0){ printf("In the grep progress\n"); dup2(pfd[0],0); close(pfd[0]); close(pfd[1]); execlp("grep","grep","sh",0); perror("exelp grep error");

} esle if(fork()==0){ printf("In the ps progress\n"); dup2(pfd[1],1); close(pfd[0]); close(pfd[1]); execlp("ps","ps","-ef",0); perror("execlp ps -ef"); } close(pfd[1]); close(pfd[0]); wait(&state); wait(&state); } 实验2.3 内核模块 实验步骤: (1).编写内核模块 文件中主要包含init_clock(),exit_clock(),read_clock()三个函数。其中init_clock(),exit_clock()负责将模块从系统中加载或卸载,以及增加或删除模块在/proc中的入口。read_clock()负责产生/proc/clock被读时的动作。(2).编译内核模块Makefile文件 # Makefile under 2.6.25

操作系统实验报告

操作系统实验报告 实验名称: 系统的引导 所在班级: 指导老师: 老师 实验日期: 2014年3 月29 日

一、实验目的 ◆熟悉hit-oslab实验环境; ◆建立对操作系统引导过程的深入认识; ◆掌握操作系统的基本开发过程; ◆能对操作系统代码进行简单的控制,揭开操作系统的神秘面纱。 二、实验容 1. 阅读《Linux核完全注释》的第6章引导启动程序,对计算机和Linux 0.11的引导过程进行初步的了解。 2. 按照下面的要求改写0.11的引导程序bootsect.s。 3. 有兴趣同学可以做做进入保护模式前的设置程序setup.s。 4. 修改build.c,以便可以使用make BootImage命令 5. 改写bootsect.s主要完成如下功能: bootsect.s能在屏幕上打印一段提示信息XXX is booting...,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等。 6. 改写setup.s主要完成如下功能: bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s 向屏幕输出一行"Now we are in SETUP"。setup.s能获取至少一个基本的硬件参数(如存参数、显卡参数、硬盘参数等),将其存放在存的特定地址,并输出到屏幕上。setup.s不再加载Linux核,保持上述信息显示在屏幕上即可。 三、实验环境

本实验使用的系统是windows系统或者是Linux系统,需要的材料是osexp。 四、实验步骤 1. 修改bootsect.s中的提示信息及相关代码; 到osexp\Linux-0.11\boot目录下会看到图1所示的三个文件夹,使用UtraEdit 打开该文件。将文档中的98行的mov cx,#24修改为mov cx,#80。同时修改文档中的第246行为图2所示的情形。 图1图2 图3 2. 在目录linux-0.11\boot下,分别用命令as86 -0 -a -o bootsect.obootsect.s和 ld86 -0 -s -obootsectbootsect.o编译和bootsect.s,生成bootsect文件; 在\osexp目录下点击MinGW32.bat依此输入下面的命令: cd linux-0.11 cd boot as86 -0 -a -o bootsect.obootsect.s ld86 -0 -s -o bootsectbootsect.o

系统分析与设计实验报告

鞋店进销存管理系统 一.项目背景 随着计算机技术的不断发展, 它已经成为人们工作和生活中不可缺少的工具。早在1954年,银行、大公司和大企业纷纷采用计算机进行账户和账目管理、生产管理、库存管理、销售管理、统计报表等。从数据的收集、存储、整理到检索统计,应用的范围日益扩大,使计算机的应用很快超过科学计算,成为最大的计算机应用领域。 鞋店管理的特点是信息处理量比较大,所存的鞋种类多,而且由于进货单、销售单、需求单等单据发行量特别大,关联信息多,查询和统计的方式各不相同等原因,因此在管理上实现起来有一定困难。在管理的过程中经常会出现信息的重复传递,单据报表种类繁多,各个部门管理规格不统一等问题。 在本系统的设计过程中,为了克服这些困难,满足计算机管理的需要,我们采取了下面的一些原则: 1、统一各种原始单据的格式,统一账目和报表的格式。 2、删除不必要的管理冗余,实现管理规范化、科学化。 3、程序代码标准化,软件统一化,确保软件的可维护性和实用性。 4、界面尽量简单化,做到实用,方便,尽量满足书店中不同层次员工 的需要。 二.定义 “鞋店进销存管理系统”为用户提供添加、修改、查询、退货操作等服务。用户在登陆界面输入用户名,密码后系统核对正确进入系统内部。系统就要求用户选择事务类型(添加、修改、查询、退货等),直至用户选择退出应用服务,询问用户是否退出应用服务,如果用户选择结束,系统重回登陆界面。用户进入添加界面后,首先可以输入的数字必须大于等于100),否则系统显示输入有误。用户点击确认后,由系统查询,判断该取值是否超出库存量,如果没有,则系统会显示确认界面,用户单点击“确认”后,系统自动生成账单,并在后台进行工作,系统进行清

操作系统实验报告

操作系统教程实验报告 专业班级 学号 姓名 指导教师

实验一WINDOWS进程初识 1、实验目的 (1)学会使用VC编写基本的Win32 Consol Application(控制台应用程序)。 (2)掌握WINDOWS API的使用方法。 (3)编写测试程序,理解用户态运行和核心态运行。 2、实验内容和步骤 (1)编写基本的Win32 Consol Application 步骤1:登录进入Windows,启动VC++ 6.0。 步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。创建一个新的控制台应用程序工程。 步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。 步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。 步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows “命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:E:\课程\os课\os实验\程序\os11\debug>hello.exe 运行结果 (如果运行不成功,则可能的原因是什么?) : (2)计算进程在核心态运行和用户态运行的时间 步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。 步骤2:在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。 步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。 E:\课程\os课\os实验\程序\os12\debug>time TEST.exe 步骤4:运行结果 (如果运行不成功,则可能的原因是什么?) : 步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。 屏蔽i循环:

操作系统实验报告

操作系统实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的启动和退出方 法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装,期间完成网络 信息、用户信息、文件系统和硬盘分区等配置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装,并通过LILO或 者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结构,并列举出 Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示: 2、点击下一步,选择经典型,点击下一步在选择客户机页面选择 Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小 10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM (IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点 击“浏览”,找到Linux的镜像文件,如图所示:

操作系统实验报告.

学生学号0121210680225 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称操作系统 开课学院计算机科学与技术学院 指导老师姓名刘军 学生姓名李安福 学生专业班级软件sy1201 2014 — 2015 学年第一学期

《操作系统》实验教学大纲 课程编号: 课程名称:操作系统/Operating System 实验总学时数:12学时 适应专业:计算机科学与技术、软件工程 承担实验室:计算机科学与技术学院实验中心 一、实验教学的目的和任务 通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。 二、实验项目及学时分配 序号实验项目名称实验学时实验类型开出要求 01 Linux键盘命令和vi 2 设计必开 02 Linux下C编程 2 设计必开 03 SHELL编程和后台批处理 2 设计必开 04 Linux系统调用(time) 2 设计必开 05 Linux进程控制(fork) 4 设计必开 三、每项实验的内容和要求: 1、Linux键盘命令和vi 要求:掌握Linux系统键盘命令的使用方法。 内容:见教材p4, p9, p40, p49-53, p89, p100 2、Linux下的C编程 要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。 内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。 3、SHELL编程和后台批处理 要求:掌握Linux系统的SHELL编程方法和后台批处理方法。 内容:(1) 将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。 (2) 将上面SHELLL程序后台运行。观察原C程序运行时输入输出情况。 (3) 修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键 盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容, 然后输出到屏幕。 4、Linux系统调用使用方法。

操作系统实验心得(精选多篇)

操作系统实验心得 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。

大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域 3)其他 例如: <1>定义了指针后记得初始化,在使用的时候记得判断是否为 null <2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等 <3>在变量处理的时候变量的格式控制是否合理等

操作系统实验一实验报告

操作系统实验一实验报告 基本信息 1.1 实验题目 进程控制实验 1.2完成人 王召德 1.3报告日期 2015-4-8 实验内容简要描述 2.1实验目标 加深对于进程并发执行概念的理解。实践并发进程的创建和控制方法。观察和 体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过 程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux 系统中 进程创建与控制有关的系统调用的编程和调试技术。 2.2实验要求 参考以上示例程序中建立并发进程的方法,编写一个多进程并发执行程序。父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps 命令总在ls 命令之前执行。 2.3实验的软硬件环境

Ubuntu14.04 intelPC 报告的主要内容 3.1实验的思路 按照上面的实例,先生成一个子进程让其等待,然后生成第二个子进程,父进程等待其执行ps命令后唤醒第一个子进程执行ls即可。 3.2实验模型的描述 无 3.3主要数据结构的分析说明 无 3.4主要算法代码的分析说明 无 3.5项目管理文件的说明 无 实验过程和结果 4.1实验投入的实际学时数 1学时 4.2调试排错过程的记录 曾尝试让第二个子进程激活第一个子进程,结果发现当运行ps后,后面的代码将不再执行,所以不可行。 4.3多种方式测试结果的记录

实验结果: 父进程启动 (12239) ls子进程启动 (12240) ps子进程启动 (12241) PID TTY TIME CMD 12239 pts/27 00:00:00 born 12240 pts/27 00:00:00 born 12241 pts/27 00:00:00 ps ps子进程结束 (12241) 唤醒ls子进程 (12240) 键盘中断信号产生... ls子进程被唤醒 (12240) . born born.c~ hello.c pctl pctl.c~ pctl.o .. born.c helelo.h~ hello.c~ pctl.c pctl.h ls子进程结束 (12240) 父进程结束 (12239) 4.4实验结果的分析综合 无 实验的总结 父进程可以通过fork()函数生成子进程,子进程会从fork()函数开始执行原来的代码,当

操作系统实验报告

操作系统实验报告 银行家算法 班级:计算机()班 姓名:李君益 学号:(号) 提交日期: 指导老师: 林穗 一、设计题目 加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。 二、设计要求

内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 要求: (1)下列状态是否安全?(三个进程共享个同类资源) 进程已分配资源数最大需求数 (状态) (状态) (2)考虑下列系统状态 分配矩阵最大需求矩阵可用资源矩阵 问系统是否安全?若安全就给出所有的安全序列。若进程请求(),可否立即分配? 三、设计分析 一.关于操作系统的死锁 .死锁的产生 计算机系统中有许多独占资源,他们在任一时刻只能被一个进程使用,如磁带机,绘图仪等独占型外围设备,或进程表,临界区等软件资源。两个进程同时向一台打印机输出将导致一片混乱,两个进程同时进入临界区将导致数据库错误乃至程序崩溃。正因为这些原因,所有操作系统都具有授权一个进程独立访问某一辞源的能力。一个进程需要使用独占型资源必须通过以下的次序: ●申请资源 ●使用资源 ●归还资源 若申请施资源不可用,则申请进程进入等待状态。对于不同的独占资源,进程等待的方式是有差别的,如申请打印机资源、临界区资源时,申请失败将一位这阻塞申请进程;而申请打开文件文件资源时,申请失败将返回一个错误码,由申请进程等待一段时间之后重试。只得指出的是,不同的操作系统对于同一种资源采取的等待方式也是有差异的。 在许多应用中,一个进程需要独占访问多个资源,而操作系统允许多个进程并发执行共享系统资源时,此时可能会出现进程永远被阻塞的现象。这种现象称为“死锁”。 2.死锁的定义 一组进程处于死锁状态是指:如果在一个进程集合中的每个进程都在等待只能由该集合中的其他一个进程才能引发的时间,则称一组进程或系统此时发生了死锁。 .死锁的防止 .死锁产生的条件: ●互斥条件

操作系统实验3答案

实验三操作系统进程管理 一、实验目的 1) 掌握系统进程的概念,加深对Linux / UNIX进程管理的理解。 2) 学会使用ps命令和选项。 3) 列出当前shell中的进程。 4) 列出运行在系统中的所有进程。 5) 根据命令名搜索特定的进程。 6) 使用kill命令终止进程。 7) 根据用户名查找和终止进程。 二、实验内容和相应的答案截图,三、实验结果分析 步骤1:创建一个普通用户(参见实验二),以普通用户身份登录进入GNOME。 步骤2:打开一个“终端”窗口(参见实验二)。 步骤3:回顾系统进程概念,完成以下填空: 1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的__PID__进程标识符,用于跟踪从进程启动到进程结束。 2) 当启动新进程的时候,内核也给它们分配系统资源,如__内存_和__CPU_。 3) 永远不向父进程返回输出的进程叫做__僵进程__。 4) 由父进程派生出来的进程叫做____子___进程。 5) ___父_进程是一个派生另一个进程的进程。 6) 运行用于提供服务的Linux系统进程是_______________。 7) 如果父进程在子进程之前结束,它创建了一个______________进程。 步骤4:回顾ps命令和信息。基本的ps命令显示当前shell中的进程信息,用户只能够查看当前终端窗口中初始化的进程。输入ps命令,将结果填入表3-3中。 表3-3 实验记录 下面,在当前终端窗口中,练习使用给出的每个选项的ps命令。

输入ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-4中。 表3-4 实验记录 步骤5:列出系统中运行的所有进程。 输入ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f 命令的输出结果对照,一致吗?有何不同? 答:不一致,后者显示了所有进程的完全可用信息,多了很多。 分析当前终端窗口中的输出结果,记录下来用于写实验报告。 a. 显示了多少个进程?答:59 b. 进程ID的PID是什么? c. 启动进程的命令(CMD) 是什么?答:sched d. 请观察,什么命令的PID号是1?答:init[5] e. 执行ps –ef >aaa命令,将ps命令的输出送到文本文件aaa。再次运行cat aaa | wc命令,计算进程的数目。其中,cat是显示文本文件命令。“|”是管道命令,就是将前一个命令的输出作为后一个命令的输入。wc 命令用来计算文本的行数,第一个数字显示的是行的数目,可以用来计算进程的数目。计算出进程数目并做记录。 执行man ps命令,可以打开Linux用户命令手册。了解ps命令的用法。输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何? 答:Man ps时出现

操作系统实验报告 实验一 进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5));

相关主题