华科操作系统实验报告.docx

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

华科操作系统实验报告.docx

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

华科操作系统实验报告.docx

华科操作系统实验报告

课程实验报告

课程名称:

操作系统原理

专业班级:

cs1209

学号:

姓名:

指导教师:

报告日期:

2015年1月5日

计算机科学与技术学院

 

1实验一Linux线程及信号灯..........................................................................1

1.1实验目的与内容....................................................................................1

1.1.1实验目的..........................................................................................1

1.1.2实验内容.........................................................................................1

1.2实验过程................................................................................................1

1.2.1预备知识.........................................................................................1

1.2.2实验测试与结果.............................................................................2

1.3实验总结................................................................................................3

1.4源代码....................................................................................................4

2实验二Linux进程及同步..............................................................................7

2.1实验目的与内容....................................................................................7

2.1.1实验目的.........................................................................................7

2.1.2实验内容.........................................................................................7

2.2实验过程................................................................................................7

2.2.1预备知识.........................................................................................7

2.2.2实验测试与结果.............................................................................8

2.3实验总结................................................................................................9

2.4源代码....................................................................................................9

3实验三Linux文件目录操作.........................................................................13

3.1实验目的与内容...................................................................................13

3.1.1实验目的........................................................................................13

3.1.2实验内容........................................................................................13

3.2实验过程...............................................................................................13

3.2.1预备知识........................................................................................13

3.2.2实验测试与结果............................................................................14

3.3实验总结...............................................................................................15

3.4源代码...................................................................................................15

 

实验一Linux线程及信号灯

1.1实验目的与内容

1.1.1实验目的

1、熟悉Linux线程接口。

2、熟悉Linux信号灯编程。

3、了解Linux进程同步与通信的主要机制,并通过信号灯操作实现进程间的同步与互斥。

1.1.2实验内容

1、编程模拟实现飞机售票:

创建多个售票线程;

使用公用全局变量保存已售票数量;

创建互斥信号灯;

对售票线程临界区实施P、V操作;

2、编程模拟实现双线程单缓冲区的合作

创建一个计算线程与一个输出线程;

创建同步信号灯;

缓冲区用全局公用数组变量;

对计算线程与输出线程实施P、V操作;

1.2实验过程

1.2.1预备知识

Linux下的信号灯及其P、V操作:

表1.1P、V操作定义

voidp(intsemid,intsemno)

{

structsembufsop;

sop.sem_num=semno;

sop.sem_op=-1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

voidv(intsemid,intsemno)

{

structsembufsop;

sop.sem_num=semno;

sop.sem_op=1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

线程:

表1.2线程相关函数

线程创建

pthread_create(pthread_t*thread,pthread_attr_t*attr,

void*(*start_routine)(void*),void*arg);

线程挂起

pthread_join(pthread_tth,void**thread_retrun);

共享内存:

使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法,shmget与shmat系统调用。

进程控制:

fork与execv系统调用;

编译、编辑、调试

表1.3编译、编辑、调试

编译

cc–otest-gtest.c–lpthread

cc–osub1sub1.c

编辑

vi

调试

gdb

1.2.2实验测试与结果

测试结果:

模拟售票

说明(图1.1.1和1.1.2):

共有300张票,有三个线程分别代表三个售票窗口

图1.1.1

图1.1.2

说明(图1.1.3和1.1.4):

每个窗口每次只卖出一张,直到卖完

图1.1.3图1.1.4

测试结果:

双线程单缓冲区的合作

图1.2

1.3实验总结

本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对,运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。

1.4源代码

1:

#include

#include

#include

#include

#include

intticket=300;

intmutex;

voidp(intsemid,intsemno)

{

structsembufsop;

sop.sem_num=semno;

sop.sem_op=-1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

voidv(intsemid,intsemno)

{

structsembufsop;

sop.sem_num=semno;

sop.sem_op=1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

 

voidthread1(void)

{

inti;

p(mutex,0);

printf("窗口1:

本航班共有%d个座位,请问您需要买几张?

\n",ticket);

scanf("%d",&i);

if(i>ticket)

printf("窗口1:

剩余票数不够");

else

ticket=ticket-i;

v(mutex,0);

}

voidthread2(void)

{

inti;

p(mutex,0);

printf("窗口2:

本航班共有%d个座位,请问您需要买几张?

\n",ticket);

scanf("%d",&i);

if(i>ticket)

printf("窗口2:

剩余票数不够");

else

ticket=ticket-i;

v(mutex,0);

}

voidthread3(void)

{

inti;

p(mutex,0);

printf("窗口3:

本航班共有%d个座位,请问您需要买几张?

\n",ticket);

scanf("%d",&i);

if(i>ticket)

printf("窗口3:

剩余票数不够");

else

ticket=ticket-i;

v(mutex,0);

}

 

intmain()

{

pthread_tid1,id2,id3;

intret1,ret2,ret3;

unionsemunarg;

mutex=semget(IPC_PRIVATE,IPC_CREAT);

arg.val=1;

semctl(mutex,0,IPC_RMID,0);

ret1=pthread_create(&id1,NULL,(void*)thread1,NULL);

ret2=pthread_create(&id2,NULL,(void*)thread2,NULL);

ret3=pthread_create(&id3,NULL,(void*)thread3,NULL);

if(ret1!

=0){

printf("Creat1stpthreaderror!

\n");

exit

(1);

}

if(ret2!

=0){

printf("Creat2stpthreaderror!

\n");

exit

(1);

}

if(ret3!

=0){

printf("Creat3stpthreaderror!

\n");

exit

(1);

}

pthread_join(id1,NULL);

pthread_join(id2,NULL);

pthread_join(id3,NULL);

return0;

}

2:

#include

#include

#include

#include

#include

intq[100];

intm;

intw=0;

voidP(intsemid,intsemno)

{

structsembufsop;

sop.sem_num=semno;

sop.sem_op=-1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

voidV(intsemid,intsemno){

structsembufsop;

sop.sem_num=semno;

sop.sem_op=1;

sop.sem_flg=0;

semop(semid,&sop,1);

}

voidpa(){

P(m,1);

w++;

q[w]+=1;

V(m,0);

}

voidpb

(){

P(m,0);

printf("jieguo=%d\n",q[w]);

w--;

V(m,1);

}

intmain(void){

pthread_tid1;

pthread_tid2;

pthread_tid3;

pthread_tid4;

inti,ret1,ret2;

unionsemunarg;

arg.val=0;

m=semget(IPC_PRIVATE,2,IPC_CREAT|066);

semctl(m,0,SETVAL,arg);

arg.val=1;

semctl(m,1,SETVAL,arg);

ret1=pthread_create(&id1,NULL,(void*)pa,NULL);

if(ret1!

=0){

printf("createpthreaderror!

\n");

exit

(1);

}

printf("idis%d\n",id1);

ret2=pthread_create(&id2,NULL,(void*)pb,NULL);

if(ret2!

=0){

printf("createpthreaderror!

\n");

exit

(1);

}

printf("idis%d\n",id2);

 

pthread_join(id1,NULL);

pthread_join(id2,NULL);

 

return0;

}

 

实验二Linux进程及同步

2.1实验目的与内容

2.1.1实验目的

了解并掌握Linux进程及同步

2.2.2实验内容

编程模拟实现誊抄;

创建三个誊抄进程;

基于共享内存建立缓冲区;

创建同步信号灯;

对各誊抄进程施加P、V操作;

2.2实验过程

2.2.1预备知识

①并发程序的誊抄:

get程序:

负责从输入序列f中读取字符并送到缓冲区s中;

copy程序:

把缓冲区s中的数据复制到缓冲区t中去;

put程序:

从缓冲区t中取出数据打印;

②誊抄的实现:

在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有4个信号灯分别为0、1、2、3

在进程中对信号灯的控制可简写为:

get()

{

p(0);

get操作;

v

(2);

}

copy()

{

p

(1);

p

(2);

copy操作;

v(0);

v(3);

}

put()

{

p(3);

put操作;

v

(1);

}

通过设置信号灯0的初值和利用copy对信号灯0做v操作,使得当信号灯0的资源个数>0时,可以进行get操作

通过设置信号灯1、2的初值和利用put对信号灯1做v操作、利用get对信号灯2做v操作,使得当信号灯1和信号灯2的资源个数均>0时,可以进行copy操作

通过设置信号灯3的初值和利用copy对信号灯3做v操作,使得当信号灯3的资源个数>0时,可以进行put操作

 

2.2.2实验测试与结果

运行结果:

图2

使用./main打开程序

2.3实验总结

通过此次实验了解了进程的创建,知道了进程与线程的区别。

编写的程序输出固定的几个字符,功能上没做好,欠佳,有待优化。

2.4源代码

头文件m.h

#include

#include

#include

#include

#include

#include

#include

#include

#defineLOOPS10

#defineIPCKEY(key_t)0x11

#defineSHMKEY1(key_t)0x222

#defineSHMKEY2(key_t)0x333

voidP(intsemid,intindex);

voidV(intsemid,intindex);

intsemid;

voidV(intsemid,intindex)

{

structsembufsem;

sem.sem_num=index;/*信号灯数组灯的一个索引,指明哪个信号灯*/

sem.sem_op=1;/*加到当前信号灯的数值*/

sem.sem_flg=0;

semop(semid,&sem,1);

return;

}

voidP(intsemid,intindex)

{

structsembufsem;

sem.sem_num=index;

sem.sem_op=-1;

sem.sem_flg=0;

semop(semid,&sem,1);

return;

}

Main.c

#include"m.h"

intmain(void)

{

intres,i;

structshmid_ds*buf;

intcmd;

intshmid1,shmid2;

char*s,*t;

pid_tp1,p2,p3;

semid=semget(IPCKEY,4,IPC_CREAT|0666);

res=semctl(semid,0,SETVAL,0);

res=semctl(semid,1,SETVAL,1);

res=semctl(semid,2,SETVAL,0);

res=semctl(semid,3,SETVAL,1);

shmid1=shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);

printf("%d",shmid1);

s=(char*)shmat(shmid1,NULL,NULL);

shmid2=shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666);

t=(char*)shmat(shmid2,NULL,NULL);

if((p1=fork())==0){

execv("./get",NULL);

}

else

{

if((p2=fork())==0){

execv("./copy",NULL);

}

else

{

if((p3=fork())==0){

execv("./put",NULL);

}

}

}

p1=wait(&p1);

p2=wait(&p2);

p3=wait(&p3);

if(semctl(semid,0,IPC_RMID,0)<0)

printf("error");

shmctl(shmid1,IPC_RMID,0);

shmctl(shmid2,IPC_RMID,0);

return0;

}

Get.c

#include"m.h"

intmain(void)

{

inti=0;

intshmid1;

char*s,*t,str[]="linux!

";

semid=semget(IPCKEY,4,IPC_CREAT|0666);

shmid1=shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);

s=(char*)shmat(shmid1,NULL,NULL);

do

{

P(semid,1);

*s=str[i];

printf("get\n");

i++;

V(semid,0);

}while(s[0]!

='\0');

}

Copy.c

#include"m.h"

intmain(void)

{

intj=0;

intshmid1,shmid2;

char*s,*t;

semid=semget(IPCKEY,4,IPC_CREAT|0666);

shmid1=shmget(SHMKEY1,sizeof(char),IPC_CREAT|0666);

s=(char*)shmat(shmid1,NULL,NULL);

shmid2=shmget(SHMKEY2,sizeof(char),IPC_CREAT|0666);

t=(char*)shmat(shmid2,NUL

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

当前位置:首页 > 自然科学 > 物理

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

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