操作系统原理实验报告02

《操作系统原理》实验报告

实验序号: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字】

相关推荐