操作系统实验报告书
实验一:巡回置换算法(2学时). 2
实验二:生产者与消费者问题(4学时). 3
实验三:存储管理(4学时). 7
实验一:巡回置换算法(2学时)
实验内容
巡回置换指k属于[1:n]时,k=p[…p[k]…]的置换。
设i=1,2,3,4,5,6,7;
p[i]=4,7,3,1,2,5,6;
p[i]的巡回置换算法描述:
begin
local x,k; //x,k为局部变量//
k=1;
while k<=7 do
x=k;
repeat print(x);
x=p[x];
until x==k;
k++;
od
end
要求通过程序设计得出其运算结果。
实验过程及分析
clc,clear;
p=[4 7 3 2 1 5 6];
k=1;
while k<=7
b=[];
x=k;
b=[b x];
x=p(k);
while x~=k;
b=[b x];
x=p(x);
end
k=k+1;
b
end
4、实验小结:懂得了循环控制
实验二:生产者与消费者问题(4学时)
实验过程及分析
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "pthread.h"
#include "semaphore.h"
#ifndef _OSCONFIG_
#define _OSCONFIG_
#ifdef _WIN32
#include <windows.h>
#define CLOCK(t) t=clock()
#define SLEEP(millisecond) Sleep(millisecond)
#pragma comment(lib, "pthreadVC2.lib")
#else
#include <sys/time.h>
#include <unistd.h>
timeval a;
#define CLOCK(t) gettimeofday(&a,0),t=(a.tv_sec*1000+a.tv_usec/1000)
#define SLEEP(millisecond) usleep((millisecond)*1000)
#endif
#endif
#ifndef _BUFFER_
#define _BUFFER_
typedef int buffer_item;
#define BUFFER_SIZE 5
buffer_item buffer[BUFFER_SIZE];
int currentSize=0;
int currentIndex=0;
int insert_item(buffer_item item)
{
return currentSize<BUFFER_SIZE
? (buffer[(currentIndex+currentSize++)%BUFFER_SIZE]=item, 1) : 0;
}
int remove_item(buffer_item* item)
{
return (currentSize && buffer[currentIndex]==*item)
? (--currentSize, currentIndex=(currentIndex+1)%BUFFER_SIZE, 1) : 0;
}
#endif
pthread_mutex_t mutex;
sem_t full;
sem_t empty;
clock_t threadStart;
#define PTIMESPANMAX 5000
void* producer(void* params)
{
int id=*(int *)params;
while(true)
{
SLEEP(rand()%PTIMESPANMAX);
buffer_item rnd=rand();
long begin, end;
CLOCK(begin);
printf("%ld:\t Producer %d\t produced %d\n", (long)(begin-threadStart), id, rnd);
sem_wait(&empty);
pthread_mutex_lock(&mutex);
(CLOCK(end), insert_item(rnd))
? printf("%ld:\t Producer %d\t have put %d\t after %d\t milliseconds\n",end-threadStart, id, rnd, end-begin)
: printf("%ld:\t Producer %d\t Report Error!\n", end-threadStart, id);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
#define CTIMESPANMAX 5000
void * consumer(void* params)
{
int id=*(int *)params;
while(true)
{
SLEEP(rand()%CTIMESPANMAX);
long begin, end;
CLOCK(begin);
printf("%ld:\t Consumer %d\t want to consume\n", begin-threadStart, id);
sem_wait(&full);
pthread_mutex_lock(&mutex);
buffer_item item=buffer[currentIndex];
(CLOCK(end), remove_item(&item))
? printf("%ld:\t Consumer %d\t consumed %d\t after %d\t milliseconds\n", end-threadStart, id, item, end-begin)
: printf("%ld:\t Consumer %d\t Report Error!\n", end-threadStart, id);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
int main(int argc, char* argv[])
{
srand(time(0));
pthread_mutex_init(&mutex, NULL);
sem_init(&full, 0, BUFFER_SIZE);
sem_init(&empty, 0, BUFFER_SIZE);
int i=0;
for(i=0; i<BUFFER_SIZE; i++)
sem_wait(&full);
int sleepTime=0;
int producerCount=0;
int consumerCount=0;
if(argc==4)
{
sscanf(argv[1], "%d", &sleepTime);
sscanf(argv[2], "%d", &producerCount);
sscanf(argv[3], "%d", &consumerCount);
}
else
{
printf("How long to sleep before terminating: "); scanf("%d", &sleepTime);
printf("The number of producer threads: "); scanf("%d", &producerCount);
printf("The number of consumer threads: "); scanf("%d", &consumerCount);
}
CLOCK(threadStart);
for(i=0; i<producerCount; i++)
{
pthread_t pid;
pthread_create(&pid, NULL, producer, (void *)&i);
SLEEP(1);
}
for(i=0; i<consumerCount; i++)
{
pthread_t pid;
pthread_create(&pid, NULL, consumer, (void *)&i);
SLEEP(1);
}
SLEEP(sleepTime);
printf("End of time\n");
return 0;
}
关于解决pthread.h找不到的问题:
1.在你班的位置,找到include文件夹,把里面的三个头文件复制到"C:\Program Files\Microsoft Visual Studio\VC98\Include"位置。
2. 在你班的位置,找到lib文件夹,把里面的所有文件复制到"C:\Program Files\Microsoft Visual Studio\VC98\lib"位置.
3.在你班的位置,找到lib文件夹,找到pthreadvc2.dll,复制到"C:\WINDOWS\system32"位置,只有这样,你的程序才能够正确运行。
4、实验小结:
实验三:存储管理(4学时)
页面置换算法程序代码:
#include<stdio.h>
#include<string.h>
#include<iostream.h>
const int MAXSIZE=1000;
const int MAXQUEUE=3;
typedef struct node
{ int loaded; int hit;
}page;
page pages[MAXQUEUE];
int queue[MAXSIZE];
int quantity;
void initial()
{
int i;
for(i=0;i<MAXQUEUE;i++)
{
pages[i].loaded=-1;
pages[i].hit=0; }
for(i=0;i<MAXSIZE;i++)
{
queue[i]=-1;
}
quantity=0;
}
void init()
{
int i;
for(i=0;i<MAXQUEUE;i++)
{
pages[i].loaded=-1;
pages[i].hit=0;
}
}
void readData()
{
FILE *fp;
char fname[20];
int i;
cout<<"请输入页面流文件名:";
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名";
}
else
{
while(!feof(fp))
{
fscanf(fp,"%d ",&queue[quantity]);
quantity++;
}
}
cout<<"读入的页面流:";
for(i=0;i<quantity;i++)
{
cout<<queue[i]<<" ";
}
}
void FIFO()
{
int i,j,p,flag;
int absence=0;
p=0;
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"先进先出调度算法(FIFO)页面调出流:";
for(i=0;i<quantity;i++)
{ flag=0;
for(j=0;j<MAXQUEUE;j++)
{
if(pages[j].loaded==queue[i])
{ flag=1; }
}
if(flag==0)
{
if(absence>=MAXQUEUE)
{ cout<<pages[p].loaded<<" "; }
pages[p].loaded=queue[i];
p=(p+1)%MAXQUEUE;
absence++;
}
}
absence-=MAXQUEUE;
cout<<endl<<"总缺页数:"<<absence<<endl; }
void LRU()
{
int absence=0;
int i,j;
int flag;
for(i=0;i<MAXQUEUE;i++)
{ pages[i].loaded=queue[i]; }
cout<<endl<<"----------------------------------------------------"<<endl;
cout<<"最近最少使用调度算法(LRU)页面流:";
for(i=MAXQUEUE;i<quantity;i++)
{ flag=-1;
for(j=0;j<MAXQUEUE;j++)
{
if(queue[i]==pages[j].loaded)
{ flag=j; }
}
if(flag==-1)
{
cout<<pages[0].loaded<<" ";
for(j=0;j<MAXQUEUE-1;j++)
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1].loaded=queue[i];
absence++; }
else
{
pages[quantity]=pages[flag];
for(j=flag;j<MAXQUEUE-1;j++)
{
pages[j]=pages[j+1];
}
pages[MAXQUEUE-1]=pages[quantity];
}
}
cout<<endl<<"总缺页数:"<<absence<<endl;
}
void version()
{
cout<<" /*******************虚拟存储管理器的页面调度****************/"<<endl;
cout<<endl;
}
void main()
{
version();
initial();
readData();
FIFO();
init();
LRU();
init();
init();
}