课程实验报告课程名称:操作系统原理专业班级:cs1209学号:姓名:指导教师:报告日期: 2015年1月5日计算机科学与技术学院目录1 实验一Linux线程及信号灯..........................................................................11.1 实验目的与内容................................................................................. (1)1.1.1实验目的................................................................................. (1)1.1.2 实验内容...................................................................................... (1)1.2 实验过程................................................................................................11.2.1 预备知识.........................................................................................11.2.2实验测试与结果.............................................................................2 1.3实验总结................................................................................................31.4 源代码....................................................................................................4 2 实验二Linux进程及同步..............................................................................7 2. 1 实验目的与内容.............................................................................. (7)2.1.1实验目的.........................................................................................72.1.2实验内容...................................................................................... (7)2.2实验过程................................................................................................72.2.1预备知识.........................................................................................72.2.2 实验测试与结果.............................................................................82. 3 实验总结................................................................................................92.4 源代码....................................................................................................9 3实验三Linux文件目录操作................................................................ (13)3.1实验目的与内容...................................................................................133.1.1 实验目的........................................................................................133.1. 2 实验内容........................................................................................133.2 实验过程...............................................................................................13 3.2.1预备知识........................................................................................133.2. 2 实验测试与结果............................................................................14 3.3 实验总结...............................................................................................153.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. 错误!未定义书签。
P、V操作定义线程:表1. 错误!不能识别的开关参数。
线程相关函数共享内存:使用共享内存是运行在同一计算机上的进程进行进程间通信的最快的方法,shmget与shmat 系统调用。
进程控制:fork与execv系统调用;编译、编辑、调试表1. 错误!不能识别的开关参数。
编译、编辑、调试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.21.3 实验总结本次实验刚做的时候用三个线程做依次访问卖几张来卖出,后来老师让我改成每次买一张直到卖完,做出来了,但是我加的循环体加的位置不对,运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。
1.4源代码1:#include <stdio.h>#include<pthread.h>#include<linux/sem.h>#include <sys/types.h>#include<stdlib.h>intticket=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,intsemno){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:剩余票数不够");elseticket=ticket-i;v(mutex,0);}void thread2(void){inti;p(mutex,0);printf("窗口2:本航班共有%d个座位,请问您需要买几张?\n",ticket);scanf("%d",&i);if(i>ticket)printf("窗口2:剩余票数不够");elseticket=ticket-i;v(mutex,0);}void thread3(void){2:#include<sys/types.h>int q[100];int m;int w=0;void P(intsemid,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 pa(){P(m,1);w++;q[w]+=1;V(m,0);}void pb(){P(m,0);printf("jieguo =%d\n",q[w]);w--;V(m,1);}int main(void){pthread_t id1;pthread_t id2;pthread_t id3;pthread_t id4;int i,ret1,ret2;union semun arg;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){实验二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、3get() {p(0); ﻩget操作;v(2); } copy(){ﻩp(1);ﻩp(2);copy操作;v(0);v(3);}put(){p(3);put操作;ﻩv(1);}通过设置信号灯0的初值和利用c opy对信号灯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实验总结通过此次实验了解了进程的创建,知道了进程与线程的区别。