华科操作系统实验报告综述
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告课程名称:操作系统原理
专业班级: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. 1 P、V操作定义
void p(int semid,int semno) {
struct sembuf sop;
sop.sem_num=semno;
sop.sem_op=-1;
sop.sem_flg=0;
semop(semid,&sop,1);
}
void v(int semid,int semno) {
struct sembuf sop;
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_t th, void **thread_retrun);
共享内存:
使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法,shmget与shmat 系统调用。
进程控制:
fork与execv系统调用;
编译、编辑、调试
表1. 3 编译、编辑、调试
编译cc –o test -g test.c –lpthread
cc –o sub1 sub1.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
int ticket=300;
int mutex;
void p(int semid,int semno)
{
struct sembuf sop;
sop.sem_num=semno;
sop.sem_op=-1;
sop.sem_flg=0;
semop(semid,&sop,1);
}
void v(int semid,int semno)
{
struct sembuf sop;
sop.sem_num=semno;
sop.sem_op=1;
sop.sem_flg=0;
semop(semid,&sop,1);
}
void thread1(void)
{
int i;
p(mutex,0);
printf("窗口1:本航班共有%d个座位,请问您需要买几张?\n",ticket);
scanf("%d",&i);
if(i>ticket)
printf("窗口1:剩余票数不够");
else
ticket=ticket-i;
v(mutex,0);
}
void thread2(void)
{