实验二 读者写者问题实验报告..

实验二  读者写者问题实验报告..
实验二  读者写者问题实验报告..

实验二读者写者问题实验报告

一、实验目的

Windows2000/XP提供了互斥量(mutex)、信号量(semapore)、事件(event)等三种同步对象和相应的系统调用,用于线程的互斥与同步。通过对读者写者问题的调试,了解Windows2000/XP中的同步机制。

二、实验内容及实验步骤

利用Windows2000/XP信号量机制,实现读者写者问题。

在Windows 2000环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。

读者-写者问题的读写操作限制(包括读者优先和写者优先):

写-写互斥,即不能有两个写者同时进行写操作。

读-写互斥,即不能同时有一个线程在读,而另一个线程在写。

读-读允许,即可以有一个或多个读者在读。

读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。

写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。

运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结果读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。

三、实验结果及分析

图2.1 选择界面

第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建

后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:

1 R 3 5

2 W 4 5

3 R 5 2

4 R 6 5

5 W 5.1 3

测试结果如下:

图2.2 读者优先运行结果

图2.3 写者优先运行结果

分析如下:

将所有的读者和所有的写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。

读者优先:

如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录当前的读者数目,用于确定是否释放写者线程,(当readcout=0 时,说明所有的读者都已经读完,释放一个写者线程),每个读者开始读之前都要修改readcount,为了互斥的实现对readcount 的修改,需要一个互斥对象Mutex来实现互斥。

另外,为了实现写-写互斥,需要一个临界区对象write,当写者发出写的请求时,必须先得到临界区对象的所有权。通过这种方法,可以实现读写互斥,当readcount=1 时,(即第一个读者的到来时,),读者线程也必须申请临界区对象的所有权.

当读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount==1 后,其余的读者由于等待对readcount的判断,阻塞在Mutex上!

写者优先:

写者优先和读者优先有相同之处,不同的地方在:一旦有一个写者到来时,应该尽快让写者进行写,如果有一个写者在等待,则新到的读者操作不能读操作,为此添加一个整型变量writecount,记录写者的数目,当writecount=0时才可以释放读者进行读操作!

为了实现对全局变量writecount的互斥访问,设置了一个互斥对象Mutex3。

为了实现写者优先,设置一个临界区对象read,当有写者在写或等待时,读者必须阻塞在临界区对象read上。

读者除了要一个全局变量readcount实现操作上的互斥外,还需要一个互斥对象对阻塞在read这一个过程实现互斥,这两个互斥对象分别为mutex1和mutex2。

附:

源代码如下:

#include "windows.h"

#include

#include

#include

#include

#include

#include

#define READER 'R' // 读者

#define WRITER 'W' // 写者

#define INTE_PER_SEC 1000 // 每秒时钟中断数目。

#define MAX_THREAD_NUM 64 // 最大线程数目

#define MAX_FILE_NUM 32 // 最大数据文件数目

#define MAX_STR_LEN 32 // 字符串长度

int readcount=0; // 读者数目

int writecount=0; // 写者数目

CRITICAL_SECTION RP_Write; //临界区

CRITICAL_SECTION cs_Write;

CRITICAL_SECTION cs_Read;

struct ThreadInfo

{

int serial; // 线程序号

char entity; //线程类别(判断读者线程还是写者线程)

double delay;

double persist;

};

///////////////////////////////////////////////////////////////////////////

// 读者优先--读者线程

//p:读者线程信息

void RP_ReaderThread(void* p)

{

//互斥变量

HANDLE h_Mutex;

h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_readcount");

DWORD wait_for_mutex; //等待互斥变量所有权DWORD m_delay; // 延迟时间

DWORD m_persist; // 读文件持续时间

int m_serial; //线程序号

//从参数中获得信息

m_serial=((ThreadInfo*)(p))->serial;

m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);

m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC);

Sleep(m_delay); //延迟等待

printf("Reader thread %d sents the reading require.\n",m_serial);

// 等待互斥信号,保证对readcount的访问、修改互斥

wait_for_mutex=WaitForSingleObject(h_Mutex,-1);

//读者数目增加

Readcount++;

if(readcount==1)

{

//第一个读者,等待资源

EnterCriticalSection(&RP_Write);

}

ReleaseMutex(h_Mutex); //释放互斥信号

//读文件

printf("Reader thread %d begins to read file.\n",m_serial);

Sleep(m_persist);

// 退出线程

printf("Reader thread %d finished reading file.\n",m_serial);

//等待互斥信号,保证对readcount的访问、修改互斥

wait_for_mutex=WaitForSingleObject(h_Mutex,-1);

//读者数目减少

readcount--;

if(readcount==0)

{

//如果所有读者读完,唤醒写者

LeaveCriticalSection(&RP_Write);

}

ReleaseMutex(h_Mutex); //释放互斥信号

}

///////////////////////////////////////////////////////////////////////////

// 读者优先--写者线程

//p:写者线程信息

void RP_WriterThread(void* p)

{

DWORD m_delay; // 延迟时间DWORD m_persist; // 写文件持续时间int m_serial; //线程序号

//从参数中获得信息

m_serial=((ThreadInfo*)(p))->serial;

m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);

m_persist=(DWORD)(((ThreadInfo*)(p)) ->persist*INTE_PER_SEC); Sleep(m_delay); //延迟等待

printf("Writer thread %d sents the writing require.\n",m_serial);

// 等待资源

EnterCriticalSection(&RP_Write);

//写文件

printf("Writer thread %d begins to Write to the file.\n",m_serial);

Sleep(m_persist);

// 退出线程

printf("Writer thread %d finished Writing to the file.\n",m_serial);

//释放资源

LeaveCriticalSection(&RP_Write);

}

///////////////////////////////////////////////////////////////////////////

// 读者优先处理函数

//file:文件名

void ReaderPriority(char* file)

{

DWORD n_thread=0; //线程数目

DWORD thread_ID; //线程ID

DWORD wait_for_all; //等待所有线程结束

//互斥对象

HANDLE h_Mutex;

h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_readcount");

//线程对象的数组

HANDLE h_Thread[MAX_THREAD_NUM];

ThreadInfo thread_info[MAX_THREAD_NUM];

readcount=0; // 初始化readcount

InitializeCriticalSection(&RP_Write); //初始化临界区

ifstream inFile;

inFile.open(file); //打开文件

printf("Reader Priority:\n\n");

while(inFile)

{

//读入每一个读者、写者的信息

inFile>>thread_info[n_thread].serial;

inFile>>thread_info[n_thread].entity;

inFile>>thread_info[n_thread].delay;

inFile>>thread_info[n_thread++].persist;

inFile.get( );

}

for(int i=0;i< (int)(n_thread);i++)

{

if(thread_info[i].entity==READER || thread_info[i].entity=='R')

{

h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),&thread_info[i],0,&t hread_ID); //创建读者线程

}

else{

//创建写者线程

h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_info[i],0,&th read_ID);

}

}

//等待所有线程结束

wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);

printf("All reader and writer have finished operating.\n");

}

///////////////////////////////////////////////////////////////////////////

// 写者优先--读者线程

//p:读者线程信息

void WP_ReaderThread(void* p)

{

//互斥变量

HANDLE h_Mutex1;

h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1"); HANDLE h_Mutex2;

h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");

DWORD wait_for_mutex1; //等待互斥变量所有权DWORD wait_for_mutex2;

DWORD m_delay; // 延迟时间

DWORD m_persist; // 读文件持续时间

int m_serial; //线程序号

//从参数中获得信息

m_serial=((ThreadInfo*)(p))->serial;

m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);

m_persist=(DWORD)(((ThreadInfo*)(p)) ->persist*INTE_PER_SEC);

Sleep(m_delay); //延迟等待

printf("Reader thread %d sents the reading require.\n",m_serial);

wait_for_mutex1= WaitForSingleObject(h_Mutex1,-1);

//进入读者临界区

EnterCriticalSection(&cs_Read);

// 阻塞互斥对象mutex2,保证对readcount的访问、修改互斥

wait_for_mutex2= WaitForSingleObject(h_Mutex2,-1);

//修改读者数目

readcount++;

if(readcount==1)

{

//如果是第一个读者,等待写者写完

EnterCriticalSection(&cs_Write);

}

ReleaseMutex(h_Mutex2); //释放互斥信号mutex2 // 让其他读者进入临界区

LeaveCriticalSection(&cs_Write);

ReleaseMutex(h_Mutex1);

//读文件

printf("Reader thread %d begins to read file.\n",m_serial);

Sleep(m_persist);

// 退出线程

printf("Reader thread %d finished reading file.\n",m_serial);

// 阻塞互斥对象mutex2,保证对readcount的访问、修改互斥

wait_for_mutex2= WaitForSingleObject(h_Mutex2,-1);

readcount--;

if(readcount==0)

{

// 最后一个读者,唤醒写者

LeaveCriticalSection(&cs_Write);

}

ReleaseMutex(h_Mutex2); //释放互斥信号

}

///////////////////////////////////////////////////////////////////////////

// 写者优先--写者线程

//p:写者线程信息

void WP_WriterThread(void* p)

{

DWORD m_delay; // 延迟时间DWORD m_persist; // 写文件持续时间int m_serial; //线程序号DWORD wait_for_mutex3;

//互斥对象

HANDLE h_Mutex3;

h_Mutex3= OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");

//从参数中获得信息

m_serial=((ThreadInfo*)(p))->serial;

m_delay=(DWORD)(((ThreadInfo*)(p))->delay*INTE_PER_SEC);

m_persist=(DWORD)(((ThreadInfo*)(p))->persist*INTE_PER_SEC); Sleep(m_delay); //延迟等待

printf("Writer thread %d sents the writing require.\n",m_serial);

// 阻塞互斥对象mutex3,保证对writecount的访问、修改互斥

wait_for_mutex3= WaitForSingleObject(h_Mutex3,-1);

writecount++; //修改读者数目

if(writecount==1)

{

//第一个写者,等待读者读完

EnterCriticalSection(&cs_Read);

}

ReleaseMutex(h_Mutex3);

//进入写者临界区

EnterCriticalSection(&cs_Write);

//写文件

printf("Writer thread %d begins to Write to the file.\n",m_serial);

Sleep(m_persist);

// 退出线程

printf("Writer thread %d finishing Writing to the file.\n",m_serial);

//离开临界区

LeaveCriticalSection(&cs_Write);

// 阻塞互斥对象mutex3,保证对writecount的访问、修改互斥wait_for_mutex3= WaitForSingleObject(h_Mutex3,-1);

writecount--; //修改读者数目

if(writecount==0)

{

//写者写完,读者可以读

LeaveCriticalSection(&cs_Read);

}

ReleaseMutex(h_Mutex3);

}

///////////////////////////////////////////////////////////////////////////

// 写者优先处理函数

//file:文件名

void WriterPriority(char* file)

{

DWORD n_thread=0; //线程数目DWORD thread_ID; //线程ID DWORD wait_for_all; //等待所有线程结束

//互斥对象

HANDLE h_Mutex1;

h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");

HANDLE h_Mutex2;

h_Mutex2=CreateMutex(NULL,FALSE,"mutex2");

HANDLE h_Mutex3;

h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");

//线程对象

HANDLE h_Thread[MAX_THREAD_NUM];

ThreadInfo thread_info[MAX_THREAD_NUM];

readcount=0; // 初始化readcount writecount=0; // 初始化writecount InitializeCriticalSection(&cs_Write); //初始化临界区InitializeCriticalSection(&cs_Read);

ifstream inFile;

inFile.open(file); //打开文件

printf("Writer Priority:\n\n");

while(inFile)

{

//读入每一个读者、写者的信息

inFile>>thread_info[n_thread].serial;

inFile>>thread_info[n_thread].entity;

inFile>>thread_info[n_thread].delay;

inFile>>thread_info[n_thread++].persist;

inFile.get( );

}

for(int i=0;i< (int)(n_thread);i++)

{

if (thread_info[i].entity==READER || thread_info[i].entity=='R')

{

//创建读者线程

h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_info[i],0,&th read_ID);

}

else{

//创建写者线程

h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),&thread_info[i],0,&t hread_ID);

}

}

//等待所有线程结束

wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);

printf("All reader and writer have finished operating.\n");

}

///////////////////////////////////////////////////////////////////////////////

//主函数

int main(int argc,char* argv[])

{

char ch;

while (true)

{

//打印提示信息

printf("************************************************\n");

printf(" 1:Reader Priority\n");

printf(" 2:Writer Priority\n");

printf(" 3:Exit Priority\n");

printf("************************************************\n");

printf("Enter your choice(1,2 or 3): ");

//如果输入信息不正确,继续输入

do{

ch=(char)_getch( );

}while(ch != '1' &&ch != '2' && ch != '3');

system("cls");

//选择3,返回

if(ch=='3')

return 0;

//选择1,读者优先

else if(ch=='1')

ReaderPriority("thread.dat");

//选择2,写者优先

else

WriterPriority("thread.dat");

//结束

printf("\nPress Any Key To Continue: ");

_getch( );

system("cls");

}

return 0;

}

病理生理实验报告

实验一组织晶体渗透压改变在水肿发 生中的作用(水肿) 实验目的:通过实验了解组织晶体渗透压的改变在水肿发生中的意义,加深对水肿发生机理的理解。 实验动物:蟾蜍2只,要求体重、大小相仿。 器材与药品: 200克电子天平1台,盛水玻璃缸2个,2m1注射器连4号针头2支,脱脂棉球、纱布块适量。0.65%氯化钠液和20%氯化钠液各10ml。实验方法: 1. 取蟾蜍2只分别称重,注意观察背部外形。 2. 向一只蟾蜍背部淋巴囊内注入0.65%氯化钠液(即蛙生理盐水)2 m1,向另一只蟾蜍背部淋巴囊内注入20%氯化钠液2ml(蟾蜍皮下淋巴囊分布见图2-1),然后分别放入装有水的玻璃缸内。 3.1小时后由水中取出蟾蜍,擦掉体表浮水后分别称重,同时仔细观察背部外形改变。 4. 解剖蟾蜍:由椎骨孔破坏神经系统。重点观察背部淋巴囊的变化。解剖观察其它脏器和解剖结构。 实验结果:将观测到的各种实验结果记入下表内 注前体重注前背部外 形注后体重注后背部外 形 注0.65%氯 化钠 141.2g 正常平坦146.3g 正常平坦

注20%氯化 141.8g 正常平坦169.5g 变肥 钠 结果分析:实验中这两只蟾蜍分别注射了不同浓度的氯化钠溶液,组织晶体渗透压升高,两只都有一定的吸水能力,注射低浓度氯化钠溶液的青蛙吸水较少,体重只有轻微的增长,体型无明显变化;注射高浓度氯化钠溶液的青蛙吸水较多,体重有大幅度的增长,体型出现明显变化。结果表明晶体在体内的浓度越高,吸水性越强。 心得:

实验二缺氧 实验目的:通过复制外呼吸性缺氧、血液性缺氧及组织中毒性缺氧的动物模型。 实验动物:成年小白鼠4只. 器材与药品: 1.外呼吸性缺氧:带有橡皮塞的250毫升广口瓶1只(见图3—1),搪瓷盘1只、镊子、剪子各2把,100g电子天平1台。钠石灰(NaOH.CaO)10g,凡士林1瓶。 2.血液性缺氧:带有管道瓶塞的250m1广口瓶和三角烧瓶各2只,酒精灯1盏,三角架3个,充满一氧化碳的皮球胆1只,弹簧夹4个,lml注射器1支。甲酸、浓硫酸各300ml,2%亚硝酸钠溶液10ml 3.组织中毒性缺氧:1 m1注射器1支。0.04%氰化钾溶液。 实验方法: 一、外呼吸性缺氧 1.取小白鼠重只称重后放入广口瓶内,瓶内预先加入钠石灰5g。观察动物一般状况,如呼吸频率、呼吸状态,皮肤、粘膜色彩、精神状态等。 2.旋紧瓶塞,用弹簧夹夹闭通气胶管,防止漏气。记录时间,观察上述各项指标的变化,直至动物死亡。待本次实验内容全部完成之后,一起剖检动物,对比观察血液颜色的改变和其它变化(以下皆同)。 二、血液性缺氧 (一)一氧化碳中毒

读者和写者问题

学 号: 课 程 设 计 2014——2015学年 第1学期 课程名称 操作系统 学 院 计算机科学与技术学院 专 业 软件工程专业 班 级 姓 名 指导教师

目录 目录 .................................................................................................................................... 错误!未定义书签。 1 设计概述 (3) 1.1问题描述: (3) 1.2问题解读及规则制定 (3) 2课程设计目的及功能 (3) 2.1 设计目的 (3) 2.2 设计功能 (3) 3模块介绍 (3) 3.1函数原型 (3) 3.2 PV操作代码 (4) 4测试用例,运行结果与运行情况分析 (6) 4.1测试用例 (6) 4.2运行结果 (7) 4.3运行情况分析 (9) 5自我评价与总结 (9) 6 参考文献 (10) 7 附录:(完整代码) (10)

实现读者写者(Reader-Writer Problem)问题 1 设计概述 1.1问题描述: 通过研究Linux的线程机制和信号量实现读者写者(Reader-Writer)问题并发控制。 1.2问题解读及规则制定 一个数据文件或记录可被多个进程所共享,我们将其中只要求读该文件的进程称为读者,其他进程称为写者.多个读者和多个写者进程在某个时间段内对该文件资源进行异步操作,也就是说允许多个进程同时读一个共享对象,但不允许一个写进程和其他读进程或写进程同时访问共享对象,因此,所谓"读者--写者问题"就是指必须保证一个写进程和其他进程(写进程或者读进程)互斥地访问共享对象的同步问题.两者的读写操作限制规则如下: (1)写--写互斥,即不允许多个写着同时对文件进行写操作 (2)读--写互斥,即不允许读者和写者同时对文件分别进行读写操作 (3)读—读允许,即允许多个读者同时对文件进行读操作 2课程设计目的及功能 2.1 设计目的 通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下: 1)掌握基本的同步互斥算法,理解读者和写者模型 2)了解多线程的并发执行机制,线程间的同步和互斥 2.2 设计功能: 利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉及的进程的同步与互斥。 3模块介绍 3.1函数原型 读者和写者进程由11个函数组成,分别如下: (附件包含全部具体实现) void P_write(int); void write(int); void V_write(int); void P_radd(int);

实验二 读者写者问题实验报告..

实验二读者写者问题实验报告 一、实验目的 Windows2000/XP提供了互斥量(mutex)、信号量(semapore)、事件(event)等三种同步对象和相应的系统调用,用于线程的互斥与同步。通过对读者写者问题的调试,了解Windows2000/XP中的同步机制。 二、实验内容及实验步骤 利用Windows2000/XP信号量机制,实现读者写者问题。 在Windows 2000环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先): 写-写互斥,即不能有两个写者同时进行写操作。 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。 读-读允许,即可以有一个或多个读者在读。 读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结果读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 三、实验结果及分析 图2.1 选择界面 第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建

后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子: 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3 测试结果如下: 图2.2 读者优先运行结果

病理生理实验报告

实验一组织晶体渗透压改变在水肿发生中 的作用(水肿) 实验目的:通过实验了解组织晶体渗透压的改变在水肿发生中的意义,加深对水肿发生机理的理解。 实验动物:蟾蜍2只,要求体重、大小相仿。 器材与药品: 200克电子天平1台,盛水玻璃缸2个,2m1注射器连4号针头2支,脱脂棉球、纱布块适量。0.65%氯化钠液和20%氯化钠液各10ml。 实验方法: 1. 取蟾蜍2只分别称重,注意观察背部外形。 2. 向一只蟾蜍背部淋巴囊内注入0.65%氯化钠液(即蛙生理盐水)2 m1,向另一只蟾蜍背部淋巴囊内注入20%氯化钠液2ml(蟾蜍皮下淋巴囊分布见图2-1),然后分别放入装有水的玻璃缸内。 3.1小时后由水中取出蟾蜍,擦掉体表浮水后分别称重,同时仔细观察背部外形改变。 4. 解剖蟾蜍:由椎骨孔破坏神经系统。重点观察背部淋巴囊的变化。解剖观察其它脏器和解剖结构。 实验结果:将观测到的各种实验结果记入下表内 注前体重注前背部外 形注后体重注后背部外 形 注0.65%氯 化钠 141.2g 正常平坦146.3g 正常平坦

注20%氯化 141.8g 正常平坦169.5g 变肥 钠 结果分析:实验中这两只蟾蜍分别注射了不同浓度的氯化钠溶液,组织晶体渗透压升高,两只都有一定的吸水能力,注射低浓度氯化钠溶液的青蛙吸水较少,体重只有轻微的增长,体型无明显变化;注射高浓度氯化钠溶液的青蛙吸水较多,体重有大幅度的增长,体型出现明显变化。结果表明晶体在体内的浓度越高,吸水性越强。 心得:

实验二缺氧 实验目的:通过复制外呼吸性缺氧、血液性缺氧及组织中毒性缺氧的动物模型。 实验动物:成年小白鼠4只. 器材与药品: 1.外呼吸性缺氧:带有橡皮塞的250毫升广口瓶1只(见图3—1),搪瓷盘1只、镊子、剪子各2把,100g电子天平1台。钠石灰(NaOH.CaO)10g,凡士林1瓶。 2.血液性缺氧:带有管道瓶塞的250m1广口瓶和三角烧瓶各2只,酒精灯1盏,三角架3个,充满一氧化碳的皮球胆1只,弹簧夹4个,lml注射器1支。甲酸、浓硫酸各300ml,2%亚硝酸钠溶液10ml 3.组织中毒性缺氧:1 m1注射器1支。0.04%氰化钾溶液。 实验方法: 一、外呼吸性缺氧 1.取小白鼠重只称重后放入广口瓶内,瓶内预先加入钠石灰5g。观察动物一般状况,如呼吸频率、呼吸状态,皮肤、粘膜色彩、精神状态等。 2.旋紧瓶塞,用弹簧夹夹闭通气胶管,防止漏气。记录时间,观察上述各项指标的变化,直至动物死亡。待本次实验内容全部完成之后,一起剖检动物,对比观察血液颜色的改变和其它变化(以下皆同)。 二、血液性缺氧 (一)一氧化碳中毒

普通植物病理学实验指导(王海光)

中国农业大学自编教材 普通植物病理学实验指导 (农学专业用) 王海光编 二零一一年

前言 《普通植物病理学实验》本来是《普通植物病理学》的实验教学部分,作为《普通植物病理学》的一部分,不是单独一门课。学校对本科生教学计划调整之后,《普通植物病理学》的实验教学部分独立作为一门必修课,由原来的18学时,调整为32学时。该课程的教学目的是使学生从感性上认识植物病害的症状、病害发生规律、主要病原真菌、细菌、病毒、线虫的形态特征等相关知识,掌握植物病害诊断、病原分离、纯化、接种、鉴定等植物病理学研究的常规方法和技术,提高学生的实验能力和实际动手能力,同时,结合实验课程内容培养学生科学的思维方法。 《普通植物病理学实验》根据教学计划、教学要求、实验条件等,共设置了8个实验,每个实验4个学时。实验材料可能根据实际情况有所调整,实验内容安排顺序也可能根据田间病害发生情况和实验材料的准备情况进行临时性调整。 本实验指导是在去年教学的基础上整理修改编写的,在编写过程中,参考了以往的一些实验指导书和网上的教学资源,在此一并感谢!本实验指导尚显单薄,内容尚欠丰富,在今后的教学中将日臻完善。 编者 2011年8月

实验课注意事项 1.实验课前必须通过实验指导或通过教学网络平台下载课件了解课堂实验内容,明确实验 目的,了解操作步骤。 2.按时参加实验课教学,不准迟到。上课期间注意课堂纪律,严禁喧哗、随意走动等扰乱 教学的行为发生。 3.注意实验室安全。实验时,要严格按照教师要求操作,爱护实验仪器和材料。遇到仪器 发生故障,必须及时报告教师,损坏仪器或用具必须登记。按照学校有关规定处理或赔偿。 4.实验报告一律用铅笔书写,必须使用学校统一印制的实验报告纸,按时交实验报告。 5.绘图一定认真,不许虚构或艺术加工。绘图时选用硬度合适的铅笔,笔尖要保持圆滑。 所绘图形的一切特征用线条和圆点表示,线条要光滑、粗细一致,用圆点疏密表示色泽深浅,严禁涂抹,圆点要求大小一致。图形要求大小适中,各部分结构比例合理,细微部分需放大表示时,可单独绘制。图形中各部分名称一律用虚线引出标注在图形右侧,图名写在图形下方,并在图名下面注明放大倍数。 6.实验结束后,整理好自己的物品,将所用仪器或材料整理好放在适当的位置,如有需要, 应做好使用情况登记。 7.轮流值日,保持实验室整洁。

操作系统课程设计(采用读写平等策略的读者写者问题)完整版--内含代码

淮北师范大学 课程设计 采用读写平等策略的读者写者问题 学号: 姓名: 专业: 指导教师: 日期:

目录 第1部分课设简介 (3) 1.1 课程设计题目 (3) 1.2 课程设计目的.................. 错误!未定义书签。 1.3 课程设计内容 (3) 1.4 课程设计要求 (4) 1.5 时间安排 (4) 第2部分实验原理分析 (4) 2.1问题描述 (4) 2.2算法思想 (5) 2.3主要功能模块流程图 (5) 第3部分主要的功能模块 (6) 3.1数据结构 (6) 3.2测试用例及运行结果 (7) 第4部分源代码 (7) 第5部分总结及参考文献 (22) 5.1 总结 (22) 5.2 参考文献 (23)

第1部分课设简介 1.1 课程设计题目 采用读写平等策略的读者写者问题 1.2课程设计目的 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 1)进一步巩固和复习操作系统的基础知识。 2)培养学生结构化程序、模块化程序设计的方法和能力。 3)提高学生调试程序的技巧和软件设计的能力。 4)提高学生分析问题、解决问题以及综合利用C语言进行课程设计的能力。 1.3课程设计内容 用高级语言编写和调试一个采用“读写平等”策略的“读者-- 写者”问题的模拟程序。 1.4课程设计要求 1)读者与写者至少包括ID、进入内存时间、读写时间三项内容,可在界面上进行输入。

2) 读者与写者均有两个以上,可在程序运行期间进行动态增加 读者与写者。 3)可读取样例数据(要求存放在外部文件中),进行读者/写者、 进入内存时间、读写时间的初始化。 4) 要求将运行过程用可视化界面动态显示,可随时暂停,查看 阅览室中读者/写者数目、读者等待队列、读写时间、等待时间。 5) 读写策略:读写互斥、写写互斥、读写平等(严格按照读 者与写者到达的顺序进入阅览室,有写着到达,则阻塞后续到 达的读者;有读者到达,则阻塞后续到达的写者)。 1.5时间安排 1)分析设计贮备阶段(1 天) 2)编程调试阶段(7 天) 3)写课程设计报告、考核(2 天) 第2部分实验原理分析2.1问题描述 有一个被许多进程共享的数据区,这个数据区可以是一个文件,或者主存的一块空间,甚至可以是一组处理器寄存器。有一些只读取这个数据区的进程reader和一些只往数据区中写数据的进程writer 以下假设共享数据区是文件。这些读者和写者对数据区的操作必须满

操作系统读者写者实验报告

《操作系统》上机实验报告 实验项目读者写者 学院(部)信息学院 专业计算机科学与技术班级 学生姓名 学号

读者写者问题 一.实验目的: 1.熟悉读者优先和写者优先的过程。 2.更好地理解进程同步的概念及其实现方法。 二.实验要求: 分别实现读者优先和写者优先。 “读-写”互斥,即不能同时有一个读者在读,同时去有一个写者在写; “写-写”互斥,即不能有两个写者同时进行写操作; “读-读”允许,即可以有两个以上的读者同时进行读操作。 三.实验内容: 读者优先: 如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount 记录当前的读者数目,用于确定是否释放写者线程,(当readcout=0 时,说明所有的读者都已经读完,释放一个写者线程),每个读者开始读之前都要修改readcount,为了互斥的实现对readcount 的修改,需要一个互斥对象Mutex来实现互斥。 另外,为了实现写-写互斥,需要一个临界区对象write,当写者发出写的请求时,必须先得到临界区对象的所有权。通过这种方法,可以实现读写互斥,当readcount=1 时,(即第一个读者的到来时,),读者线程也必须申请临界区对象的所有权. 当读者拥有临界区的所有权,写者都阻塞在临界区对象write上。当写者拥有临界区对象所有权时,第一个判断完readcount==1 后,其余的读者由于等待对readcount的判断,阻塞在Mutex上! 写者优先: 写者优先和读者优先有相同之处,不同的地方在:一旦有一个写者到来时,应该尽快让写者进行写,如果有一个写者在等待,则新到的读者操作不能读操作,为此添加一个整型变量writecount,记录写者的数目,当writecount=0时才可以释放读者进行读操作!为了实现对全局变量writecount的互斥访问,设置了一个互斥对象Mutex3。 为了实现写者优先,设置一个临界区对象read,当有写者在写或等待时,读者必须阻塞在临界区对象read上。 读者除了要一个全局变量readcount实现操作上的互斥外,还需要一个互斥对象对阻塞在read这一个过程实现互斥,这两个互斥对象分别为mutex1和mutex2。

操作系统课程设计--读者-写者问题

操作系统课程设计报告 一、操作系统课程设计任务书 读者- 写者问题实现 1设计目的通过实现经典的读者写者问题,巩固对线程及其同步机制的学习效果,加深对相关基本概念的理解,并学习如何将基本原理和实际设计有机的结合。 2设计要求 在Windows 2000/XP 环境下,使用多线程和信号量机制实现经典的读者写者问题,每个线程代表一个读者或一个写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者- 写者问题。 读者-写者问题的读写操作限制: (1)写-写互斥,即不能有两个写者同时进行写操作 (2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写 (3)读-读允许,即可以有二个以上的读者同时读读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。 3测试数据文件格式 测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时

操作系统课程设计-读者写者问题

操作系统课程设计报告

一、开题报告 (一)该项课程设计的意义; 1.更加深入的了解读者写者问题的算法; 2.加深对线程,进程的理解; 3.加深对“线程同步”概念的理解,理解并应用“信号量机制”; 4.熟悉计算机对处理机的管理,了解临界资源的访问方式; 5.了解C++中线程的实现方式,研读API。 (二)课程设计的任务 多进程/线程编程:读者-写者问题。 ●设置两类进程/线程,一类为读者,一类为写者; ●随机启动读者或写者; ●显示读者或写者执行状态; ●随着进程/线程的执行,更新显示; (三)相关原理及算法描述; 整体概况: 该程序从大体上来分只有两个模块,即“读者优先”和“写者优先”模块. 读者优先: 如果没有写者正在操作,则读者不需要等待,用一个整型变量readcount记录读者数目,用于确定是否释放读者线程,readcount的初值为0.当线程开始调入时. 每个读者准备读. 等待互斥信号,保证对readcount 的访问,修改互斥.即readcount++. 而当读者线程进行读操作时,则读者数目减少(readcount--).当readcout=0 时,说明所 有的读者都已经读完,离开临界区唤醒写者(LeaveCriticalSection(&RP_Write);), 释 放互斥信号(ReleaseMutex(h_Mutex)). 还需要一个互斥对象mutex来实现对全局变量Read_count修改时的互斥. 另外,为了实现写-写互斥,需要增加一个临界区对象Write。当写者发出写请求时, 必须申请临界区对象的所有权。通过这种方法,可以实现读-写互斥,当 Read_count=1时(即第一个读者到来时),读者线程也必须申请临界区对象的所有 权 写者优先: 写者优先与读者不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当填加 一个整形变量write_count,用于记录正在等待的写者的数目,write_count的初值 为0.当线程开始调入时.只允许一个写者准备读. 等待互斥信号,保证对write_count 的访问,修改互斥.即write_count++.而当写者线程进行读操作时,则相应写者数目减 少(write_count--).当write_count=0 时,说明所有的读者都已经读完,离开临界区唤 醒读者,释放互斥信号. 为了实现写者优先,应当填加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上。

普通植物病理学

《普通植物病理学Ⅰ》课程教学大纲 课程编号:02003 英文名称:General PhytopathologyⅠ 一、课程说明 1.课程类别 学科基础课程 2.适用专业及课程性质 植物保护专业必修 3.课程的目 普通植物病理学是研究植物病害发生原因、侵染性病害发生发展规律、病害防治原理及防治方法、病害研究的方法与技术的科学。它既是理论科学,又是一门对农业有巨大实践意义的应用科学。 (1)通过本课程的本学期教学环节,在基本理论和基本知识方面要达到以下要求:掌握植物病原真菌的分类原则、分类方法;掌握植物病原真菌主要类群的形态特征、生物学特性及其致病特点;了解寄主植物与病原物真菌之间的互作关系,病原物真菌的致病机理及寄主植物对病原物的抗性反应。 (2)通过学习本课程,应具备以下基本技能:了解病原物的鉴定程式,着重掌握植物病原真菌的分类原则和鉴定方法,植物病害一般诊断方法;掌握病原真菌的分离培养、纯化和接种方法,掌握生物显微镜的使用、显微计测、显微描绘与显微摄影技术。 4.学分与学时 学分为2.学时为44 5.建议先修课程 化学、物理学、微生物学、植物学、植物生理学、生物化学、遗传学、分子生物学、作物栽培学、土壤学、农业气象学、园艺学等 6.推荐教材或参考书目 推荐教材: (1)植物病理学原理(第二版).宗兆锋、康振生主编.中国农业出版社.2009年 参考书目: (1)普通植物病理学(第四版).许志刚主编,高等教育出版社.2009年 (2)普通植物病理学.谢联辉主编.科学出版社.2006年 (3)普通真菌学.邢来君主编.高等教育出版社.1999年 (4)Plant Pathology (5 ed).Agrios, G. N..Academic Press.2005 7.教学方法与手段 (1)普通植物病理学课程采用课堂教学与实践教学相结合的教学方法,课堂教学与实验课并重(2)课堂教学以多媒体教学为主,尽可能采用英汉双语进行课堂授课 8.考核及成绩评定 考试方式:考试 成绩评定: (1)考试成绩占70%,期末闭卷考试,试题类型包括:名词解释、拉丁文、识图题、选择题、填空题、判断题、简答题和论述题等 (2)实验成绩占30%,根据实验完成情况评分 9.课外自学要求

读者写者问题写者优先代码

读者写者问题-写者优先代码 #include<stdio.h> #include<stdlib.h> int rcount=0;//正在读的读者数量 int wcount=0;//写者队列中等待写操作的写者数量 int rid=0;//读进程号 int wid=0;//写进程号 int w=1;//读写互斥信号量 char temp[300] = {'\0'}; int sign; //标识temp空的信号量0表示temp空 void WFwakeup(); void RFwakeup(); struct rqueue{//读者等待队列 int readers[200]; int index; }rq; struct wqueue{//写者等待队列 int writers[200]; int index; }wq; void read(){ int i = 0; rid++; if(rcount == 0){//当前没有读进程在读可能有写进程在写可能CPU空闲if(w==1) {//如果CPU空闲,读者拿到CPU w--;// 相当于一个P操作 rcount++; if(temp[0] == '\0'){ sign = 0; rq.readers[rq.index++]=rid;//将读者进程加入等待队列 WFwakeup(); return; }//if printf("读者%d正在读\n",rid);

for(i = 0;i < 300;i++){//读取temp内容即写者写的内容 if(temp[i] == '\0'){ printf("\n"); return; }//if printf("%c",temp[i]); }//for }//if else{//写者线程正在执行 printf("有写者在写不能读!\n"); rq.readers[rq.index++]=rid;//将读者进程加入等待队列 }//else }//if else{//rcount !=1 则知道当前已经有读者在读,读读不互斥,则这个读者可以直接进来了读 printf("读者%d正在读\n",rid); for(i = 0;i < 300;i++){ if(temp[i] == '\0'){ printf("\n"); return; } printf("%c",temp[i]); }//for }//else } //***************************写进程写操作 void write(){ wid++; if(w == 0){ if(rcount != 0 ){//有读者进程在执行 printf("有读者在读不能写!\n"); wq.writers[wq.index++]=wid;//将写者进程加入等待队列 wcount++; return; } if(rcount == 0 ){//rcount == 0则当前无读者,但w = 0,所以有写者在写 printf("有写者在写不能写!\n"); wq.writers[wq.index++]=wid;//将写者进程加入等待队列 wcount++; return; } }

读者写者问题

一设计概述 所谓读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。 读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者必写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。 信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者问题则是这一机制的一个经典范例。 与记录型信号量解决读者—写者问题不同,信号量机制它增加了一个限制,即最多允许RN个读者同时读。为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait(L,1,1)操作,来控制读者的数目,每当有一个读者进入时,就要执行wait(L,1,1)操作,使L的值减1。当有RN个读者进入读后,L便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。对利用信号量来解决读者—写者问题的描述如下: Var RN integer;L,mx:semaphore: =RN,1; Begin Parbegin Reader :begin Repeat Swait(L,1,1); Swait(mx,1,0); . Perform reader operation; Ssignal(L,1); Until false; End

Writer :begin Repeat Swait(mx ,1,1,l,RN,0); Perform writer operation; Ssignal(mx,1); Until false; End Parend End 其中,Swait(mx,1,0)语句起着开关作用,只要无Writer进程进入些,mx=1,reader进程就都可以进入读。但是要一旦有Writer进程进入写时,其MX=0,则任何reader进程就都无法进入读。Swait(mx ,1,1,l,RN,0)语句表示仅当既无Write 进程在写(mx=1),又无reader进程在读(L=RN)时,writer进程才能进入临界区写。 本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模拟演示,形象地阐述记录型信号量机制的工作原理。 二设计目的与内容 一实验目的 l. 用信号量来实现读者写者问题。 2. 理解和运用信号量、PV原语、进程间的同步互斥关系等基本知识。二、二实验内容 读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:(1)任意多个读进程可以同时读这个文件; (2)一次只有一个写进程可以往文件中写; (3)如果一个写进程正在进行操作,禁止任何读进程度文件。

农业植物病理学实习总结报告

农业植物病理学实习总结报告

《农业植物病理学》实习总结报告 姓名: 学号:2011 年级专业班级:11植物保护安检1班 2013年10月

目录 一前言:目的与意义 (1) 二实习内容与方法 (1) 三实习结果与分析 (1) 1 实习地点概述 (1) 2 农作物病害采集及鉴定统计 (2) 豆科作物病害 (2) 水稻病害 (4) 旱粮作物病害 (4) 香蕉病害 (6) 其他果树病害 (8) 茄科和葫芦科病害 (9) 油料作物病害 (14) 甘蔗病害 (14) 花卉病害 (16) 蔬菜病害 (20) 其他病害 (25) 发病症状 (26) 3主要农作物病害发生与为害程度调查 (37) 四收获与体会 (40) 五问题与建议 (41) 六主要参考文献 (41)

一、前言:目的与意义 1、巩固《农业植物病理学》的基础理论知识; 2、进一步熟练掌握植物病理学,特别是农业植物病理学的基本技能; 3、通过田间调查和室内镜检等,学会诊断本地区主要植物病害,学会病害调查的基本方法; 4、加强理论联系实际,在实践中不断的提高分析问题和解决问题的能力。 二、实习内容与方法 1. 农作物病害标本采集与鉴定 以组为单位采集、鉴定和制作一定数量的病害标本,然后进行病害标本室内处理:症状识别、显微镜检、病原鉴定。 2. 主要农作物病害发生与为害程度调查 对主要农作物病害的田间发生与为害程度进行调查,掌握田间调查取样方法、取样方式、取样数量和取样单位等,并实地进行病害发生情况及为程度调查,详细记载相关数据,认真进行分析、总结。 3. 实习总结并提交实习总结报告 实习结束后,要求以组为单位制作PPT,进行实习总结报告。每位同学按实习报告规定格式撰写、提交实习报告、综合性实验报告各一份,主要内容包括此次实习的主要内容、工作成绩、收获、建议及意见。 三、实习结果与分析 1.实习地点概述 ①东莞香蕉蔬菜研究所:香蕉、茄子、豆角、玉米等。 ②增城宁西教学科研基地:玉米、水稻、火龙果、各种瓜类等。 ③广州太和镇大田:驳骨丹、双带剑兰、糖胶树、木棉、蜘蛛兰等。 ④广州市桥钟村农场:生菜、白菜、姜、花生、葱等。 ⑤学校农场:玉米、水稻、菜心、甘蓝、甘蔗、辣椒、甘薯等。

读者写者问题课程设计说明书

-- 数学与计算机学院 课程设计说明书 课程名称: 操作系统原理-课程设计课程代码: 题目:读者写者问题 年级/专业/班: 学生姓名: 学号: 开始时间:2011 年12月05日完成时间:2011 年12月25 日课程设计成绩: 学习态度及平时成绩(30) 技术水平与实际 能力(20) 创新(5)说明书撰写质量(45) 总分 (100) 指导教师签名:年月日

目录 1 引言?错误!未定义书签。 1.1问题的提出?错误!未定义书签。 1.2任务于分析?错误!未定义书签。 2程序的主要功能?错误!未定义书签。 2.1测试文本录入功能.................................... 错误!未定义书签。 2.2读者优先判断功能.................................... 错误!未定义书签。2.3写者优先判断功能.................................. 错误!未定义书签。 3 程序运行平台........................................... 错误!未定义书签。 4 总体设计............................................... 错误!未定义书签。5模块分析 ............................................... 错误!未定义书签。 5.1测试文本录入模块.................................... 错误!未定义书签。 5.2读者优先判断模块.................................... 错误!未定义书签。 5.3写者优先判断模块.................................... 错误!未定义书签。6系统测试............................................. 错误!未定义书签。 7 结论................................................................. 8致谢.................................................. 错误!未定义书签。参考文献 (10)

北理工操作系统实验二读者写者问题

本科实验报告 实验名称:操作系统原理实验(读者写者问题) 课程名称:操作系统原理实验时间:2015.10.30 任课教师:王耀威实验地点:10#102 实验教师:苏京霞 实验类型: 原理验证□综合设计□自主创新 学生姓名:孙嘉明 学号/班级:1120121474/05611202 组号:学院:信息与电子学院同组搭档:专业:信息对抗技术成绩:

实验二:读者写者问题 一、实验目的 1.通过编写和调试程序以加深对进程、线程管理方案的理解; 2.熟悉Windows多线程程序设计方法; 二、实验要求 在Windows环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先问题。 读者-写者问题的读写操作限制(包括读者优先和写者优先) 1)写-写互斥:不能有两个写者同时进行写操作 2)读-写互斥:不能同时有一个线程在读,而另一个线程在写。 3)读-读允许:可以有一个或多个读者在读。 读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 测试数据文件包括 n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,每个字段间用空格分隔。第1个字段为正整数,表示线程的序号。第2个字段表示线程的角色,R表示读者,W表示写者。第3个字段为一个正数,表示读写开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第4个字段为一个正数,表示读写操作的延迟时间。当线程读写申请成功后,开始对共享资源进行读写操作,该操作持续相应时间后结束,释放该资源。 下面是一个测试数据文件的例子(在记事本手工录入数据): 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5.1 3

操作系统实验 读者写者问题

《计算机操作系统》实验报告 题目读者写者问题 学院(部)信息学院 专业计算机科学与技术 班级 学生姓名 学号 指导教师(签字)

一、问题描述 一个数据文件或者记录,可以被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程”。允许多个进程同时读一个共享对象,因为读操作不会是数据文件混乱。但不允许一个Writer进程和其他Reader进程或者Writer进程同时访问共享对象,因为这种访问将会引起混乱。所谓“读者——写着问题(Reader—Writer Problem)”是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题 二、解决问题 为实现Reader与Writer进程间在读或写是的互斥而设置了一个互斥的信号量Wmutex。另外,在设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer去写。因此,仅当Readercount=0时,表示尚无Reader进程在读时,Reader进程才需要进行Wait(wmutex)操作。若Wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。同理,仅当Reader进程在执行了Readercount-1操作后其值为0时,才执行Signal(Wmutex)操作,以便让Writer进程写。又因为Readercount是一个可被多个Reader进程访问的临界资源,因此也应该为它设置一个互斥信号量rmutex。 三、代码实现 1、读者优先 #include #include using namespace std; CRITICAL_SECTION rmutex,wmutex; int wr; int readernum; DWORD WINAPI reader(LPVOID IpParamter){ cout<<"读者申请\n"; wr++; EnterCriticalSection(&rmutex); if(readernum==0) EnterCriticalSection(&wmutex); readernum++; cout<<"读者进入成功正在读取\n"; LeaveCriticalSection(&rmutex); Sleep(2000); EnterCriticalSection(&rmutex); readernum--; cout<<"读者退出\n"; wr--;

病理学实验教案

病理学实验目的 病理学实验是病理学教学中重要的组成部分。通过实验课观察大体标本,病理切片的形态变化和动物实验,尸体解剖等,使理论密切联系实际,更好地理解和掌握基本理论内容并培养科学思维方法,分析综合能力和基本操作技能的必要训练。 (一)大体标本 实习中观察的大体标本是取自尸体解剖或手术切除材料,用固定液(通常用10%中性福尔马林)封存在标本瓶中的标本。观察大体标本时,首先要辨认是何种器官或组织,然后与正常器官进行比较(大小,外形,色泽,质地等),找出病变之所在。分析,判断病变性质。并思考其发生,发展和结局。 (二)病理切片 实习用的病理切片是从病变处或并便于正常交界处取下的组织,经过切片(通常为石蜡切片)和染色(一般用苏木素-伊红染色)制作而成。首先用肉眼观察切片外形及染色情况,有时可初步判定是何种组织及病变部位(如溃疡等)。然后,在低倍镜全面观察切片,实质器官由外(被膜侧)向内,空腔器官由内向外逐层观察。为了进一步观察某些病变的微细结构变化则用高倍镜观察(一般不需要用油镜观察)。 观察病理切片时应与大标本病变联系一并思考。 (三)动物实验 动物实验是在动物身上人工地造成各种病理过程中,注意观察动物的变化,记录试验结果,并写出实验报告。实验报告的内容包括实验题目,实验目的,实验方法,实验结果,讨论和结论等。 (四)病理模型及电化教学 实习课中可安排观看病理模型,幻灯片,显微投影,录像,电影等。可以根据各校实际情况自行安排。 (五)实体解剖见习 三实验注意事项 1.实验前必须复习与本次实习内容有关的理论知识,预习与指导,了解实习内容与要求。 2.实验时严肃认真,在教师指导和帮助下按实习指导仔细观察标本,课后及时书写实验报告。

读者写者问题

操作系统实验报告 实验:读者-写者问题 姓名:张金志 学号:U201313788 班级:通信1306班

一、实验目的: 1、熟练使用VC++6.0编译环境,调试并正确运行程序。 2、理解阅读者和写入者中出现的问题,进而掌握信号量的使用。 3、理解源程序中管理阅读者和写入者权限的算法,及相关窗口操作。 4、阅读演示程序源代码,熟悉阅读者写入者问题流程; 5、写出ReaderThread()和WriterThread()函数伪码; 二、实验原理: 1、问题描述: 有一个公用的数据集,有很多人需要访问,其中一些需要阅读其中的信息,一些需要修改其中的消息。阅读者可以同时访问数据集,而写入者只能互斥的访问数据集,不能与任何的进程一起访问数据区。 2、源程序算法实现调度说明: 要求(书上): (1)允许多个读者同时对文件进行读操作 (2)只允许一个写者对文件进行写操作 (3)任何写者完成操作前,不允许其他读者或者写者进行操作 (4)写者在进行写操作前,要让所有的读者或者写者全部退出 3、在本程序中用于表现的图形界面说明: 在程序编译运行后会出现中间一个大的圆圈表示公用的资源,上面一排五个矩形表示5个读者,下面的五个矩形表示五个写入者。每个读者和写入者都有3种状态,休息,等待和操作(读入或者写入)分别用黑颜色,绿颜色,红颜色表示休息,等待和操作。一旦操作者获得资源,可以进行读或者写,我们就划一条从操作者中心到资源中心的线,表示开始操作。

三、实验伪码 ReadThread() { i=0 While(true) { Rreadstate[i]=waiting; P(mutex); Readercount++; i++; If(readcount==1) P(write); V(mutex); Resourcestate[i]=read; Resourcestate[i]=reading; P(mutex); Readcount--; If(readcount==0) v(writeblock); V(mutex) Readerstate[i]=resting; Readersource[i]=unused; } } WriteThread(){ Writerstate[i]=resting; While(1) { writerstate[i]=waiting; P(write); Writerstate[i]=writing; Resourcestate[i]=wirte; v(writeblock);

相关文档
最新文档