Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> программа Менеджер страничной памяти Помогите раз 
:(
    Опции темы
lasenas
Дата 30.12.2010, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.12.2010

Репутация: нет
Всего: нет



Код программы

#include <windows.h>
#include <conio.h>
#include <stdio.h>

#define MSZ 10240
#define PSZ 1024
#define PCNT 18
#define RPCNT 8

char memory[MSZ]; // массив с памятью

struct sPages
{
    char id[PCNT]; // просто id странички
    char rwCnt[PCNT]; // количество обращений к странице, если -1, то это не занятая страница
    char pos[PCNT]; // позиция в памяти
};

struct sAllocated
{
    char data[PCNT][PCNT]; // табличка для хранения списка страниц для пользователя (по id набора)
};

struct sPage
{
    char data[PSZ]; // просто данные
};

sPages* info; // указатель на список
sPage* tData; // временная страница (для обмена с файлами местами)
sAllocated* alc; // указатель но таблицу с наборами страниц

void fr(char* data,int num) // чтение файла странички по её id
{
    char name[3] = "c/"; // все странички в папке "c"
    name[2] = (char)(num + 97); // с именем по номеру буквы в алфавите
    FILE * pFile;
    pFile = fopen(name,"r");
    if(pFile==NULL)return;
    fgets(data,PSZ,pFile);
    fclose(pFile);
}

void fw(char* data,int num) // запись файла странички по её id
{
    char name[3] = "c/";
    name[2] = (char)(num + 97);
    FILE * pFile;
    pFile = fopen(name,"a");
    if(pFile==NULL)return;
    fputs(data,pFile);
    fclose(pFile);
}

int getPageFromSmallRwCnt() // получить страничку в оперативной памяти, у которой минимальный счётчик обращений
{
    int id,rwCnt,pos;
    
    id = info->id[0];
    rwCnt = 255;
    pos = 0;

    int i;
    i = PCNT;
    while(i--)
    {
        if(info->rwCnt[i] < rwCnt && info->pos[i] < RPCNT/* && info->rwCnt[i] != -1*/)
        {
            rwCnt = info->rwCnt[i];
            id = info->id[i];
            pos = i;
        }
    }

    return pos;
}

sPage* getPageForReadOrWrite(char id) // получить указатель на страничку для чтения или записи туда (функция сама должна перемещать страницу в оперативную память по надобности и прибавлять счётчик обращений)
{
    sPage* tmp;
    
    char idtmp,rwtmp;
    
    int i;
    int cpage = -1;
    i = PCNT;
    while(i--) // ищем по id
    {
        if(info->id[i] == id)
        {
            cpage = i;
            i = 0;
        }
    }
    if(info->pos[cpage] < RPCNT) // если страничка и так в оперативной памяти, то всё хорошо
    {
        info->rwCnt[cpage] ++; // прибавим счётчик
        return (sPage*)(&memory[info->pos[cpage] * PSZ]); // просто вернём её адрес
    }else // если нет... =(
    {
        int rampage = getPageFromSmallRwCnt();
        //printf("%d\n\n",rampage);///////////////////////////////////////////////////////////////////////////////////////////////////////////////
        
        fr((char*)tData,info->pos[cpage]); // читаем страничку в буфер
        tmp = (sPage*)(&memory[info->pos[rampage] * PSZ]);
        fw((char*)tmp,info->pos[cpage]); // пишем образ странички из оперативной памяти на диск
        for(int z = 0;z < PSZ;z ++)
            tmp->data[z] = tData->data[z]; // копируем буфер в оперативную память
        // далее меняем местами параметры странички
        idtmp = info->id[rampage];
        rwtmp = info->rwCnt[rampage];
        info->id[rampage] = info->id[cpage];
        info->rwCnt[rampage] = info->rwCnt[cpage];
        info->id[cpage] = idtmp;
        info->rwCnt[cpage] = rwtmp;
        
        info->rwCnt[rampage] ++; // прибавим счётчик
        return (sPage*)(&memory[info->pos[rampage] * PSZ]); // вернём адрес
    }
} // лучше ничего не менять в этой функции. главное работает
char getPagePosById(char id)
{
    int i = 0;
    for(i = 0;i < PCNT;i ++)
    {
        if(info->id[i] == id)return info->pos[i];
    }
}
void dump(int a = 0) // отладочная информация
{
    int i = 0;
    int j = 0;
    if(a)
    {
        printf("ID\tPOS\tRWCNT\n\n");
     for(i = 0;i < PCNT;i ++)
     {
         printf("%d\t%d\t%d\n",info->id[i],info->pos[i],info->rwCnt[i]);
     }
     printf("\n\n");
     for(i = 0;i < PCNT;i ++)
     {
            printf("\n");
         for(j = 0;j < PCNT;j ++)
             printf("%d ",alc->data[i][j]);
     }
    }
    printf("BLOCK_ID\tPAGES\n");
    for(i = 0;i < PCNT;i ++)
    {
        if(alc->data[i][0] == -1)continue;
        if(i < 10)
            printf("%d.........\t",i);
        else
            printf("%d........\t",i);    
        for(j = 0;j < PCNT;j ++)
        {
            if(alc->data[i][j] != -1)printf("%d ",getPagePosById(alc->data[i][j]));
        }
        printf("\n");
    }
}

int alloc(int size) // занять кусок памяти размером size
{
    int i = 0;
    
    int n = 0;
    int m = 0;
    
    int tblid = 0;
    while(alc->data[tblid][0] != -1) 
    {
        tblid ++;
    }
    if(tblid > PCNT)return -1;
    while(size > 0)
    {
        size -= PSZ;
        i = PCNT;
        m = -1;
        while(i--)
        {
            if(info->rwCnt[i] == -1) 
            {
                m = info->id[i];
                info->rwCnt[i] = 0;
                i = 0;
            }
        }
        if(m == -1)return -1;
        alc->data[tblid][n] = m; 
        n ++;
    }
    return tblid;
}

void setById(int id,int rwCnt) // установщик rwCnt по id
{
    int i =0;
    while(info->id[i] != id) // ищем
    {
        i ++;
    }
    info->rwCnt[i] = rwCnt; // устанавливаем
}

void free(int id) // высвобождение по id
{
    for(int i = 0;i < PCNT;i ++)
    {
        if(alc->data[id][i] != -1)setById(alc->data[id][i],-1);
        alc->data[id][i] = -1;
    }
}

void write(int id,int size,int offset,char* data) // пишем
{
    sPage* tmp;
    
    int start = offset / PSZ; 
    int start_offset = offset - start * PSZ; 
    
    int cur = 0; 
    int sp = start_offset; // позиция для записи
    int pp = start; // номер страницы
    
    if(alc->data[id][pp] != -1)
        tmp = getPageForReadOrWrite(alc->data[id][pp]);
    else
        return;
    
    while(size--)
    {
        if(sp >= PSZ)
        {
            sp = 0;
            pp ++;
            if(alc->data[id][pp] != -1)
                tmp = getPageForReadOrWrite(alc->data[id][pp]); // получаем адрес страницы
            else
                return;
        }
        if(pp >= PCNT)return;
        //
        tmp->data[sp] = data[cur]; 
        cur++;
        //
        sp ++;
    }
}

void read(int id,int size,int offset,char* data) // чтение (абсолютно аналогично записи)
{
    sPage* tmp;
    
    int start = offset / PSZ;
    int start_offset = offset - start * PSZ;
    
    int cur = 0;
    int sp = start_offset;
    int pp = start;
    
    if(alc->data[id][pp] != -1)
        tmp = getPageForReadOrWrite(alc->data[id][pp]);
    else
        return;
    
    while(size--)
    {
        if(sp >= PSZ)
        {
            sp = 0;
            pp ++;
            if(alc->data[id][pp] != -1)
                tmp = getPageForReadOrWrite(alc->data[id][pp]);
            else
                return;
        }
        if(pp >= PCNT)return;
        //
        data[cur] = tmp->data[sp]; // только в этой строке отличие
        cur++;
        //
        sp ++;
    }
}

void init() // инициализация
{
    int i;
    for(i = 0;i < MSZ;i ++)memory[i] = 0x00; // память ноликами
    info = (sPages*)(&memory[MSZ - PSZ]); // указатели
    tData = (sPage*)(&memory[MSZ - PSZ * 2]); // ...
    alc = (sAllocated*)(&memory[MSZ - PSZ / 2]); // ...
    for(i = 0;i < PCNT;i ++)
    {
        info->id[i] = i;
        info->rwCnt[i] = -1;
        info->pos[i] = i;
        if(i > RPCNT)fw(memory,i); // файлики
        for(int j = 0;j < PCNT;j ++)
            alc->data[i][j] = -1;
    }
}

int main()
{
    init();
    //dump(1);
    char tmp0[5000] = "teststring0teststring0teststring0teststring0teststring0teststring0teststring0";
    char tmp1[5000] = "samplestring1samplestring1samplestring1samplestring1samplestring1samplestring1";
    char tmp2[5000] = "helloworld2helloworld2helloworld2helloworld2helloworld2helloworld2";
    char tmp3[5000] = "smileystring3smileystring3smileystring3smileystring3smileystring3smileystring3smileystring3";
    int id0,id1,id2,id3,id4,id5;
    
    //dump();
    id0 = alloc(2048);
    id1 = alloc(2048);
    id2 = alloc(1024);
    id3 = alloc(12288);
    id4 = alloc(1024);
    dump();
    write(id1,10,1400,tmp0);
    dump();
    write(id1,10,400,tmp1);
    dump();
    write(id3,100,7*1024,tmp2);
    dump();
    write(id0,200,100,tmp3);
    dump();s
    //read(id1,10,400,tmp0);
    //printf("\n\n\n%s\n\n\n",tmp0);
    getch();
    return 0;
}


PM MAIL   Вверх
Игорь1024
Дата 30.12.2010, 08:46 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



1) Есть тег код.
2) Грубо говоря просто работа со статическим массивом.
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
xvr
Дата 31.12.2010, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



'Помогите раз', 'Помогите два'  smile Вопрос то в чем?

А вот это что должно было делать?
Код

    char name[3] = "c/"; // все странички в папке "c"
    name[2] = (char)(num + 97); // с именем по номеру буквы в алфавите
Пока явно видно, что не то, что делает. А делает оно имя со случайным содержимым  smile (Массивы в С индексируются с 0, а name[2] - это последний элемент массива, где лежит завершающий строку 0)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.