操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 操作,如何创建线程以及如何实现线程的同步,所以说本次实验还是收获很大的。