操作系统实验报告

时间:2024.4.7

操作系统实验报告书

     

实验一:巡回置换算法(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();

}

更多相关推荐:
操作系统实验报告 完全版

《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows2000的结构。通过创建进程、观察正在运行的进…

操作系统实验报告

操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月5日实验报告日期20xx年12月5日一实验名称理解UNIXLINUXShell及...

操作系统实验报告

目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验七LRU页面置换算法14实验八磁盘调度18实验一进程的创建1一实验目的编写一段程...

操作系统实验报告

操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行的现象实验原理fork建立子进程子进程得到父进程地址空间的一个复制返回值成功时该...

计算机操作系统课程设计报告

《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.........................................…

操作系统课程设计实验报告

操作系统课程设计实验报告姓名学号班级地点20xx年月日任务说明共完成四个任务任务一IO系统调用开销比较任务二实现一个简单的shell任务三进程线程同步任务四文件内容的并行搜索其中任务一完成了标准c和unix下的...

操作系统实验报告

郑州航空工业管理学院计算机科学与应用系课程设计报告操作系统原理操作系统课程设计目录1题目简述22需求分析221设计思想222要求323任务324运行环境325开发工具33概要设计与详细设计331系统流程图332...

操作系统上实验报告3

操作系统实验三报告实验题目进程管理及进程通信实验环境虚拟机Linux操作系统实验目的1利用Linux提供的系统调用设计程序加深对进程概念的理解2体会系统进程调度的方法和效果3了解进程之间的通信方式以及各种通信方...

操作系统实验报告

一实验内容模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序二实验目的现代计算机系统的硬件部分都设有中断机构它是实现多道程序设计的基础中断机构能发现中断事件且当发现中断事件后迫使正在处理器上执行的进程...

操作系统实验报告

操作系统实验报告,内容附图。

操作系统实验报告

武汉理工大学学生实验报告书实验课程名称操作系统开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级20xx20xx学年第一学期实验课程名称操作系统实验课程名称操作系统实验课程名称操作系统实验课程名称操作...

操作系统实验报告

实验一Windows线程的创建与撤销一实验目的1熟悉Windows系统提供的线程创建与撤销系统调用2掌握Windows系统环境下线程的创建与撤销方法二实验内容正确使用CreateThreadExitThread...

操作系统实验报告(38篇)