1 / 15
文档名称:

操作系统实验报告.doc

格式:doc   大小:315KB   页数:15页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

操作系统实验报告.doc

上传人:s0012230 2018/7/9 文件大小:315 KB

下载得到文件列表

操作系统实验报告.doc

文档介绍

文档介绍:课程实验报告
课程名称: 操作系统原理
专业班级:
学号:
姓名:
指导教师:
石柯
报告日期:
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
硬件:台式机
源程序
#include <>
#include <>
#include <>
#include <sys/>
#include <sys/>
#include <sys/>
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;
= index;
= -1;
= 0;
semop(semid,&sem,1);
}
void V(int semid,int index)
//V操作
{
struct sembuf sem;
= index;
= 1;
= 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_CREAT|0666);//创建信号量集
=1;
=0;
semctl(semid,0,SETVAL,semctlarg1);//初始化信号量集
semctl(semid,1,SETVAL,semctlarg2);
ret1=pthread_create(&id1,NULL,thread1,NULL); //创建线程
ret2=pthread_create(&id2,NULL,thread2,NULL);
pthread_join(id1,NULL);
pthread_join(id2,NULL);//等待线程结束
}
实验结果
实验结果见图1-1和图1-2:
图1-1 实验结果
图1-2 实验结果
三、实验心得
本次实验是在Linux系统下实现线程的同步问题,这算是第一次用c语言写多线程并行程序。创建二个线程这本身并不难,但是实验是否成功的关键在于对线程同步的控制,这当然就需要P、V操作了。所以难点就出现在如何用c代码实现P、V操作