《操作系统原理》实验报告
实验序号:2 实验项目名称:Windows基本进程管理
《操作系统原理》实验报告
备注:电子版本发送到OSCourse@163.com. 禁止发到收课件邮箱!
邮件主题注明:OS实验报告-姓名-班级
一、实验内容 【本节分1,2,3条写出实验内容或要求,篇幅200-400字】
设计一个虚拟存储区和内存工作区,并使用下列算法计算访问命中率。
(1) 进先出的算法(FIFO)
(2) 最近最少使用的算法(LRU)
(3) 最佳淘汰算法(OPT)
命中率=(1-页面失效次数)/页地址流长度
二、实验原理 【本节简要介绍每个实验内容的理论背景,篇幅400-600字】
三、实验用到的主要函数或库 【本节简要介绍每个实验涉及到的重要函数或库,篇幅200-400字】
第一题:1.key_t ftok(char *pathname,char proj)
返回文件名对应的键值(把消息队列当作文件处理)
头文件:#include <sys/types.h> #include <sys/ipc.h>
pathname:文件名
proj:项目名(不为0即可)
2.int msgget(key_t key,int msgflg)
打开或创建消息队列
头文件:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
key:键值,由ftok获得
msgflg:标志位(
IPC_CREAT,如果不存在,创建新的消息队列
IPC_EXCL,与IPC_CREAT一起使用,表示如果消息队列已存在,则返回错误
IPC_NOWAIT,读写消息队列要求无法得到满足时,不阻塞)
返回值:与键值key相对应的消息队列描述字,出错时返回-1
**在以下两种情况下,将创建一个新的消息队列:
a)如果没有与键值key相对应的消息队列,并且msgflg参数中包含了IPC_CREAT标志位
b)key参数为IPC_PRIVATE
3.int msgsnd(int msqid,struct msgbuf *msgp,int msgsz,int msgflg)
向消息队列中发送一条消息
头文件:#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h>
msqid:消息队列id(消息队列的描述字)
msgp:存放消息的结构(格式为:
struct msgbuf
{
int mtype;/*消息类型 > 0*/
char mtex[1];/*消息数据,字符数组*/
};
)
msgsz:消息数据长度
msgflg:发送标志,有意义的msgflg标志为IPC_NOWAIT,指明消息队列中没有足够空间容纳要发送的消息时,msgsnd是否等待,0表示等待
返回值:发生错误时返回-1
4.int msgrcv(int msqid,struct msgbuf *msgp,int msgsz,long msgtyp,int msgflg)
从消息队列msqid中读取一个msgtyp类型的消息,并把消息存储在msgp指向的msgbuf结构体中。(在成功读取后,队列中的这条消息将被删除)
5.int msgctl (int msqid, int cmd, struct msqid_ds *buf)
消息队列属性控制
msqid:消息队列的标识符。
cmd:执行的控制命令,即要执行的操作。(包括以下选项:
IPC_STAT:读取消息队列属性。取得此队列的msqid_ds 结构,并将其存放在buf指向的结构中。
IPC_SET :设置消息队列属性。
IPC_RMID:删除消息队列。
IPC_INFO:读取消息队列基本情况。此命令等同于 ipcs 命令。
第二题:WaitForSingleObject()
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
Declare Function ReleaseMutex Lib "kernel32" Alias "ReleaseMutex" (ByVal hMutex )
说明
ReleaseMutex()
释放由线程拥有的一个互斥体的控制权
MSDN原文:This function releases ownership of the specified mutex object.
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
hMutex :Long,指定一个互斥体的句柄。
注解
通过为互斥体调用一个等待函数,一个线程可获得该互斥体的所有权
第三题:同第二题
四、编程环境和开发工具 【简要介绍每个实验内容操作系统,版本,开发工具的名称和版本,以及开发环境的配置等,篇幅300-500字】
Windows7的vs2010开发。
五、实验步骤 【本节介绍每个实验内容的程序流程或思路分析和运行界,文字的篇幅2 -3页,图不算篇幅】
第一题:消息队列可分为发送消息机制,和接受消息两部分。消息队列首先需要检测是否创建成功。
msqid=msgget(MSGKEY,IPC_EXCL); /*检查消息队列是否存在*/
if(msqid < 0){
msqid = msgget(MSGKEY,IPC_CREAT|0666);/*创建消息队列*/
if(msqid <0){
printf("failed to create msq | errno=%d [%s]\n",errno,strerror(errno));
exit(-1);
}
}
若失败则返回,若是成功,则接收信息,然后发送消息。发送消息可利用
ret_value = msgsnd(msqid,&msgs,sizeof(struct msgstru),IPC_NOWAIT);
此部分完整代码如下:
printf("input message type(end:0):");
scanf("%d",&msg_type);
if (msg_type == 0)
break;
printf("input message to be sent:");
scanf ("%s",str);
msgs.msgtype = msg_type;
strcpy(msgs.msgtext, str);
/* 发送消息队列 */
ret_value = msgsnd(msqid,&msgs,sizeof(struct msgstru),IPC_NOWAIT);
if ( ret_value < 0 ) {
printf("msgsnd() write msg failed,errno=%d[%s]\n",errno,strerror(errno));
exit(-1);
然后需要编写接受端代码,接收端结构体与发射端相同。同样先检测是否存在
msgid = msgget(MSGKEY,IPC_EXCL );/*检查消息队列是否存在 */
if(msgid < 0){
printf("msq not existed! errno=%d [%s]\n",errno,strerror(errno));
sleep(2);
为了表明接收到,将结果输出
ret_value = msgrcv(msgid,&msgs,sizeof(struct msgstru),0,0);
printf("text=[%s] pid=[%d]\n",msgs.msgtext,getpid());
第二题:生产者与消费者问题关键在于线程的同步与互斥。
首先需要定义各个互斥量,和各种常量,变量名含义在后面注释。
const unsigned short SIZE_OF_BUFFER = 5; //缓o冲?区?长¡è度¨¨
unsigned short ProductID = 0; //产¨²品¡¤号?
unsigned short ConsumeID = 0; //将?被À?消?耗?的Ì?产¨²品¡¤号?
unsigned short in = 0; //产¨²品¡¤进?缓o冲?区?时º¡À的Ì?缓o冲?区?下?标À¨º
unsigned short out = 0; //产¨²品¡¤出?缓o冲?区?时º¡À的Ì?缓o冲?区?下?标À¨º
int g_buffer[SIZE_OF_BUFFER]; //缓o冲?区?是º?个?循-环¡¤队¨®列¢D
bool g_continue = true; //控?制?程¨¬序¨°结¨¢束º?
HANDLE g_hMutex; //用®?于®¨²线?程¨¬间?的Ì?互£¤斥a
HANDLE g_hFullSemaphore; //当Ì¡À缓o冲?区?满¨²时º¡À迫¨¨使º1生¦¨²产¨²者?等̨¨待äy
HANDLE g_hEmptySemaphore; //当Ì¡À缓o冲?区?空?时º¡À迫¨¨使º1消?费¤?者?等̨¨待äy
DWORD WINAPI Producer(LPVOID); //生¦¨²产¨²者?线?程¨¬
DWORD WINAPI Consumer(LPVOID); //消?费¤?者?线?程¨¬
const unsigned short PRODUCERS_COUNT = 5; //生¦¨²产¨²者?的Ì?个?数ºy
const unsigned short CONSUMERS_COUNT = 5; //消?费¤?者?的Ì?个?数ºy
//总Á¨¹的Ì?线?程¨¬数ºy
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hThreads[PRODUCERS_COUNT]; //各¡Â线?程¨¬的Ì?handle
DWORD producerID[CONSUMERS_COUNT]; //生¦¨²产¨²者?线?程¨¬的Ì?标À¨º识º?符¤?
DWORD consumerID[THREADS_COUNT]; //消?费¤?者?线?程¨¬的Ì?标À¨º识º?符¤?
接下来创建消费者和生产者的线程
for (int i=0;i<PRODUCERS_COUNT;++i){
hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);
if (hThreads[i]==NULL) return -1;
}
//创ä¡ä建¡§消?费¤?者?线?程¨¬
for (int j=0; j<CONSUMERS_COUNT; ++j){
hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[j]);
if (hThreads[j]==NULL) return -1;
}
六、结论和收获 【描述实验的异常现象,收获等,篇幅100-200字】
键入文字课程名称学院专业班姓名学号指导教师XX学校实验报告20xx年3月目录实验1进程管理3一实验目的3二实验内容3三实验要求3四…
操作系统原理实验报告一课程设计的题目根据操作系统原理课程的课堂教学内容结合自己的知识积累情况题目可从下述拟题中选择亦可自定二实验设…
计算机科学与技术系实验报告实验名称班级计算机082学号08034050217姓名XXXX20xx年03月23日实验二进程管理一实验…
操作系统原理课程实验指导书适用于网络工程专业网络工程系辽宁工程技术大学软件学院年月日目录实验一进程同步与互斥1实验二实验三实验四实…
键入文字课程名称学院专业班姓名学号指导教师XX学校实验报告20xx年3月目录实验1进程管理3一实验目的3二实验内容3三实验要求3四…
计算机科学与技术系实验报告课程名称操作系统原理与linux实验名称银行家算法20xx年04月6日实验三银行家算法一实验目的1进一步…
计算机科学与技术系实验报告实验名称班级计算机082学号08034050217姓名XXXX20xx年03月23日实验二进程管理一实验…
《操作系统原理》课程实验指导书编写人:郭伟李建东软件工程系辽宁工程技术大学软件学院2008年10月10日目录实验一进程同步与互斥.…