A操作系统课程设计

发布 2022-10-05 11:57:28 阅读 1843

燕山大学课程设计说明书。

课程设计名称:操作系统。

题目:多道程序缓冲区协调操作。

班级:10级计算机应用2班。

开发小组名称:酷狗小队。

课题负责人:邓凯。

课题组成员:

姓名:邓凯学号:100104010067 班级:计算机应用2班自评成绩:a

姓名:张聪慧学号班级:计算机应用2班自评成绩:b

课题开发日期:2024年1月7日。

通过编写一个生产者消费者的实例,了解多线程的创建,运行原理,通过信号量机制的运用了解各线程间的协调工作机制;通过实现界面编程,了解mfc编程思想。

如下图所示,有多个put操作要不断循环地向buffer1送字符数据,有move1操作不断地将buffer1的数据取到buffer2,move2操作不断地将buffer2的数据取到buffer3,有多个get操作要不断地从buffer3中取数据。put、 move、 get每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个buffer每次只能接受一个put或一个move或一个get,多个操作不能同时操作同一buffer。设计一个多道程序完成上述操作。

图1 buffer操作。

1) 可以随机产生字符数据,由put操作放入buff1,buffer中容量单位是字符。

2)提供良好图形界面,显示buffer的操作过程。

(3) 可以设定各buffer的容量、put、get、move操作的个数;

4) 可以设定put、get、move操作的速度;

5) 实时显示每个buffer中数据的个数和数据的内容,空闲buffer的空间的个数;

6) 实时显示线程、进程所处于等待(阻塞)状态的个数。

7)程序运行结束,显示汇总数据:

总的运行时间;

buffer中数据的个数;

已放入buffer的数据个数;

已放已取的数据个数;

平均每个buffer中的数据个数。

语言:c++

开发环境:visual studio 2008及其开发环境下的mfc平台。

1.4 解决的主要问题。

1)mfc界面设计。

2)模拟生产者消费者的互斥操作。

3)各信号量的使用。

mfc是windows下程序设计的最流行的一个类库,它合理的封装了win32 api函数,并设计了一套方便的消息映射机制。

在mfc的框架结构下,可以进行消息处理的类的头文件里面都会含有declare_message_map()宏,这里主要进行消息映射和消息处理函数的声明。

所有能够进行消息处理的类都是基于ccmdtarget类的,也就是说ccmdtarget类是所有可以进行消息处理类的父类。ccmdtarget类是mfc处理命令消息的基础和核心。

线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作。

信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务。

确定基本技术路线为面向对象程序设计,使用mfc编写程序,建立基本对话框。

在对话框中设立生产者、move、消费者板块,各板块内的按钮能控制各自线程的建立、暂停以及相关数据的设定。

通过创建生产者线程往buffer1中投放随机产生的字符,创建move1线程将buffer1中的字符移动到buffer2中,创建move2线程将buffer2中的字符移动到buffer3中,创建消费者线程从buffer3中取出字符消费。

建立信号量,因为生产者线程和move1线程共同使用临界资源buffer1,所以用mutex信号量来协调生产者线程和move1线程;因为move1线程和move2线程共同使用临界资源buffer2,所以用mutex1信号量来协调move1线程和move2线程,因为move2线程和消费者线程共同使用临界资源buffer3,所以用mutex3信号量来协调move2线程和消费者线程。

typedef struct threadinfo{

clistbox *plist;

thread,*lpthread;

此结构体用来保存**程建立时往线程中传送的参数信息(如该线程指定的操作控件),以供在本线程中使用。

分别声明生产者、move1、move2、消费者函数,格式为:dword winapi threadfifo(lpvoid lparam);

/声明3个不同的生产者线程,主要区别是能分别输出该生产的字符是哪个生产者生产的。

dword winapi productor1(lpvoid pthread)

dword winapi productor2(lpvoid pthread)

dword winapi productor3(lpvoid pthread)

/声明move1线程。

dword winapi move1(lpvoid pthread)

/声明move2线程。

dword winapi move2(lpvoid pthread)

/声明3个不同的消费者线程,主要区别是能分别输出该消费的字符是哪个消费者消费的。

dword winapi consumer1(lpvoid pthread)

dword winapi consumer2(lpvoid pthread)

dword winapi consumer3(lpvoid pthread)

/3个生产者线程。

hthread1=createthread(null,0,productor1,&thread1,0,&producterid);

hthread2=createthread(null,0,productor2,&thread1,0,&producterid);

hthread7=createthread(null,0,productor3,&thread1,0,&producterid);

/3个move1线程。

hthread5=createthread(null,0,move1,&thread3,0,&moveid[0]);

hthread9=createthread(null,0,move1,&thread3,0,&moveid[0]);

hthread10=createthread(null,0,move1,&thread3,0,&moveid[0]);

/3个move2线程。

hthread6=createthread(null,0,move2,&thread4,0,&moveid[1]);

hthread11=createthread(null,0,move2,&thread4,0,&moveid[1]);

hthread12=createthread(null,0,move2,&thread4,0,&moveid[1]);

mutex = createmutex(null,false,null);

mutex1 = createmutex(null,false,null);

mutex2 = createmutex(null,false,null);

bufferfull = createsemaphore(null,buffer_size1,buffer_size1,null);

bufferempty = createsemaphore(null,0,buffer_size1,null);/

buffer1full = createsemaphore(null,buffer_size1,buffer_size1,null);

buffer1empty = createsemaphore(null,0,buffer_size1,null);

buffer2full = createsemaphore(null,buffer_size1,buffer_size1,null);

buffer2empty = createsemaphore(null,0,buffer_size1,null);

生产者线程函数接口:

dword winapi productor1(lpvoid pthread)

lpthread temp=(lpthread)pthread;

cstring str=_t("生产者:")

while(control){

waitforsingleobject(bufferfull,infinite);

waitforsingleobject(mutex,infinite);

buffer[in%buffer_size1]=(char)('z'-rand()%26

temp->plist->addstring(str+buffer[in%buffer_size1]);

c_ in=in+1;

sleep(t1);

releasemutex(mutex

releasesemaphore(bufferempty,1,null);

操作系统课程设计

课程设计 河北大学工商学院。装。订。线。操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专 操作系统课程设计。题目 操作系统课程设计 学院工商学院 学部信息科学与工程 专业计算机类 学号 姓名。指导教师。年 6 月 24 日。设备管理 2 2.1设计任务2 2.2设计要求...

操作系统课程设计

银行家算法模拟。系别 班级 组员 银行家算法模拟。1.课程设计目的。通过本次课程设计,加深对最经典的避免死锁的银行家算法的理解,掌握死锁形成必要条件 安全状态等概念的理解,通过用c语言编程模拟该算法,并在windows平台上实现,更好地掌握操作系统的原理及实现方法。2.任务及要求。设n为系统进程的个...

操作系统课程设计

学生实习实训报告。实习类型 操作系统课程设计 学号 0901110005 学生姓名 田兴杰 指导教师 曹春梅 专业班级 信息安全技术0901班 院 部 电子信息系 2011年 1 月 7日。实习实训成绩评定表。目录。目录3 摘要4关键字4 1.1虚拟机简介5 1.1.1 一般意义的虚拟机5 1.1....