操作系统实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程实验报告课程名称:操作系统原理

专业班级:

学号:

姓名:

指导教师:石柯

报告日期:2016-1-2

计算机科学与技术学院

目录

实验一:线程的同步 (1)

一、实验目的 (1)

二、实验内容 (1)

三、实验心得 (4)

实验二:誊抄问题的进程实现 (5)

一、实验目的 (5)

二、实验内容 (5)

三、实验心得 (9)

实验三:Linux文件目录操作 (11)

一、实验目的 (11)

二、实验内容 (11)

三、实验心得 (13)

实验一:线程的同步

一、实验目的

1、掌握Linux系统用户界面中键盘命令的使用。

2、学会一种Linux下的编程环境。

3、掌握Linux下线程的概念。

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

二、实验内容

1、程序要求

两个线程,共享公共变量a

线程1负责计算(+10)

线程2负责打印

2、运行环境

软件配置:Ubuntu 10.04

硬件:台式机

3、源程序

#include

#include

#include

#include

#include

#include

int semid;

int a=0;

typedef union senum

{

int val;

struct semid_ds *buf;

unsigned short *array;

struct seminfo *_buf;

}SEM_CTL_UN;

void P(int semid,int index) //P操作

{

struct sembuf sem;

sem.sem_num = index;

sem.sem_op = -1;

sem.sem_flg = 0;

semop(semid,&sem,1);

}

void V(int semid,int index)

//V操作

{

struct sembuf sem;

sem.sem_num = index;

sem.sem_op = 1;

sem.sem_flg = 0;

semop(semid,&sem,1);

}

void* thread1(void *arg)

//线程1运行函数

{

int i=0;

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

{

P(semid,0);

printf("thread1 is adding\n");

a=a+10; //每次加10

printf("a=%d\n",a);

V(semid,1);

}

}

void* thread2(void *arg)

//线程2运行函数

{

int i=0;

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

{

P(semid,1);

printf("thread2 is printing\n");

printf("a=%d\n",a);//打印结果

V(semid,0);

}

}

int main()

{

pthread_t id1,id2; //线程id号

int ret1,ret2;

key_t key;

SEM_CTL_UN semctlarg1;

SEM_CTL_UN semctlarg2;

key=1;

semid=semget(key,2,IPC_CREA T|0666);//创建信号量集

semctlarg1.val=1;

semctlarg2.val=0;

semctl(semid,0,SETV AL,semctlarg1);//初始化信号量集

semctl(semid,1,SETV AL,semctlarg2);

ret1=pthread_create(&id1,NULL,thread1,NULL); //创建线程ret2=pthread_create(&id2,NULL,thread2,NULL);

pthread_join(id1,NULL);

pthread_join(id2,NULL);//等待线程结束

}

4、实验结果

实验结果见图1-1和图1-2:

图1-1 实验结果

图1-2 实验结果

三、实验心得

本次实验是在Linux系统下实现线程的同步问题,这算是第一次用c语言写多线程并行程序。创建二个线程这本身并不难,但是实验是否成功的关键在于对线程同步的控制,这当然就需要P、V操作了。所以难点就出现在如何用c代码实现P、V操作。

老师提供了很多的函数来实现P,V操作,函数毫无疑问是复杂的,由于其参数过于复杂,所以使用起来并不是十分愉快,总是出现参数类型不对的情况。一旦用代码实现了P、V操作,实验就很容易成功了。

通过本次实验我基本熟悉了Linux下的编程环境,并知道了如何实现P、V 操作,如何创建线程以及如何实现线程的同步,所以说本次实验还是收获很大的。

相关文档
最新文档