Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
eremeeva14
-3 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 14
#1

Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов - C++

18.12.2012, 06:36. Просмотров 1034. Ответов 16
Метки нет (Все метки)

Всем доброго времени суток! я уже полмесяца не могу разобраться с этой задачей, может кто-нибудь в курсе как реализовать, задание такое:
1. Разработать 2 рабочих процесса, имитирующих обработку некоторой информации с обращением к сегментированному массиву данных.
2. Реализовать диспетчер памяти с сегментным или страничным способом размещения в памяти с имитацией нехватки физического пространства для размещения всего массива.
3. Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов.
4. В качестве стратегии размещения и замещения выбрать следующий вариант:
а) стратегия размещения (только для сегментов) - поиск свободного места в ОП для подгрузки нового сегмента
- первый подходящий
- наиболее подходящий
- наименее подходящий
Программу нужно реализовать в Visual Studio 2008 в консольном приложении)))

Добавлено через 1 час 15 минут
помогите кто нить!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2012, 06:36     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов
Посмотрите здесь:

C++ Найти сумму тех членов ряда, модуль которых больше или равен заданному ε
Найти сумму тех членов ряда, модуль которых больше или равен заданному е C++
C++ Объектный модуль. Он всегда один или их может быть несколько после компиляции? От чего это зависит?
C++ Как узнать Handle или PID процесса, зная его имя и класс?
C++ Реализация планировщика с тремя состояниями, где величина кванта зависит от приоритета процесса, приоритет можно повысить или понизить
C++ Найти суму тех членов ряда, модуль которых больше или равен заданному е
Разработать модуль, содержащий операции обработки односвязного списка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
18.12.2012, 08:06     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #2
Цитата Сообщение от eremeeva14 Посмотреть сообщение
1. Разработать 2 рабочих процесса, имитирующих обработку некоторой информации с обращением к сегментированному массиву данных.
непонятно

Цитата Сообщение от eremeeva14 Посмотреть сообщение
2. Реализовать диспетчер памяти с сегментным или страничным способом размещения в памяти с имитацией нехватки физического пространства для размещения всего массива.
Сегментная модель - есть сегмент памяти, размер которого - константа., допустим 64 КБ. Обращение к памяти происходит так
сегмент:смещение. Если смещение превышает размер сегмента - исключение.
Страничная модель - если по минимому, то должна быть хотя бы одна таблица страниц, которая содержит указатели на страницы. Страница - кусока памяти размером, например, 64 КБ. Если не по простому, то каталог стрниц -> таблица страниц -> страница (или каталог каталогов (PML4) -> каталог страниц -> таблица страниц -> страница). При этом адрес делится на 3 (4) части, например адрес перменной 0x12345678 - это 0х12 - адрес + флаги таблицы страниц в каталоге, 0х34 - адрес + флаги страницы в таблице страниц, 0х5678 - смещение на странице. Указатель на каталог верхнего уровня хрянится где-нибудь в отведенной памяти (например для porotected, compatibility и long mode он хранится в регистре CR3, но в случае имитации можно просто создать переменную для этого). Под флаги (которые в адресах каталогов/страниц) отводится несколько бит, они могут означать например доступность чтения/записи/исполнения и т.д. Если происходит нарушение прав доступа или катлог/таблица/станица не мапирована (не отображена) - исключение (процессор кидает исключение #PF (page fault)). Вот, как-то так.

Цитата Сообщение от eremeeva14 Посмотреть сообщение
3. Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов.
В адресах каталогов/таблиц есть флаг присутствия страницы в памяти. Если этот флаг не выставлен, то происходит исключение и в обработчике исключения страница подкачивается, если подкачка не возможно, то еще одно исключение. Короче в твоем случае нужно сделать этот флаг, рандомно выставлять его и имитировать подкачку.
Цитата Сообщение от eremeeva14 Посмотреть сообщение
. В качестве стратегии размещения и замещения выбрать следующий вариант:
а) стратегия размещения (только для сегментов) - поиск свободного места в ОП для подгрузки нового сегмента
- первый подходящий
- наиболее подходящий
- наименее подходящий
Не совсем понятно, похоже ОП тоже нужно имитировать. Подходящий, неподходящий думаю зависит от того, выровнен ли кусок памяти, его расположение относительно сегмента и т.д. Думаю у тебя есть методичка в которой описаны эти критерии.
eremeeva14
-3 / 0 / 0
Регистрация: 18.12.2012
Сообщений: 14
18.12.2012, 09:14  [ТС]     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #3
мне код нужен на С++
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
18.12.2012, 09:39     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #4
Цитата Сообщение от eremeeva14 Посмотреть сообщение
мне код нужен на С++
так изначально вопрос стоял вот так
Цитата Сообщение от eremeeva14 Посмотреть сообщение
может кто-нибудь в курсе как реализовать,
в курсе, о чем и написал выше.

По поводу кода - тут работы на целый день, если все грамотно делать (ну может на пол дня, если все сразу заработает ). Поэтому думаю есть смысл переместить тему во фриланс.
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
18.12.2012, 17:56     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #5
Переместить во ФЛИРАНС, как это сделать??

Добавлено через 3 часа 21 минуту
Есть еще кто-нибудь, кто сможет помочь в написании кода???
Памирыч
Почетный модератор
20558 / 8610 / 1028
Регистрация: 11.04.2010
Сообщений: 11,009
18.12.2012, 18:38     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #6
Цитата Сообщение от kirya Посмотреть сообщение
Переместить во ФЛИРАНС
Если Вы не знаете, что такое Фриланс - лучше подумайте еще раз.
Это платный раздел, где Вам решают задачи практически любой сложности, но учтите, что за это Вам придется платить деньги, и, скорее всего, 500 рублями Вы не отделаетесь
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
20.12.2012, 12:15     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #7
Кто-нибудь может еще что-то подсказать???
Здесь не нужна суперпрограмма, а небольшой код, всего лишь d консольном приложении Visual Studio 2008. Просто показать как работает механизм виртуальной памяти.

Добавлено через 23 часа 55 минут
Есть ли кто-нибудь знающий данный материал???
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
20.12.2012, 13:15     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #8
Цитата Сообщение от kirya Посмотреть сообщение
Есть ли кто-нибудь знающий данный материал???
Что именно интересует?
kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
20.12.2012, 14:03     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #9
Интересует конкретно реализация на C++ в Visual Studio 2008 в консольном приложении, не знаю как написать код...
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
20.12.2012, 15:28     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #10
Цитата Сообщение от kirya Посмотреть сообщение
Интересует конкретно реализация на C++ в Visual Studio 2008 в консольном приложении, не знаю как написать код...
Всмысле объяснить как создавать, компилировать и запускать консольные приложения в Visual Studio 2008 ?
vxg
20.12.2012, 15:45
  #11

Не по теме:

*ишь, Kastaneda, как тонко измывается *

kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
20.12.2012, 16:08     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #12
в смысле конкретно код программы написать и его объяснить)))
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
20.12.2012, 19:01     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #13

Не по теме:

Если на выходных будет время и желаение - может что-нибудь напишу, но пока ни чего не обещаю.


По подобным вопросам советую сайт, в частности раздел paging.

Добавлено через 11 минут

Не по теме:

Блин, залез на нашу википедию по этому вопросу, пришлось страницу немного подправить

kirya
-9 / 2 / 0
Регистрация: 01.06.2012
Сообщений: 87
21.12.2012, 12:08     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #14
Kastaneda, будем очень благодарны тебе если ты поможешь нам написать код)))
Там сильно замудренного ничего такого не нужно, просто в консольном приложении VS 2008 на цифрах все это показать как нибудь)))
Kastaneda
21.12.2012, 13:08
  #15

Не по теме:

Цитата Сообщение от kirya Посмотреть сообщение
Там сильно замудренного ничего такого не нужно
Там не "замудрено" не получится

easybudda
Эксперт С++
9455 / 5468 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
21.12.2012, 18:09     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #16
Цитата Сообщение от kirya Посмотреть сообщение
Здесь не нужна суперпрограмма, а небольшой код, всего лишь d консольном приложении Visual Studio 2008. Просто показать как работает механизм виртуальной памяти.
А "суперпрограмма" - это когда с окошками и красивыми кнопочками?

Цитата Сообщение от Kastaneda Посмотреть сообщение
По поводу кода - тут работы на целый день, если все грамотно делать (ну может на пол дня, если все сразу заработает ).
Круто! Я бы значительно дольше провозился, хотя честно говоря раньше этим и не занимался, просто примерно в курсе, как оно бывает. Но учитывая объём и сложность работы, думаю, однокурсники этим чуть-ли не с 1 сентября озадачивались. Так, что, заказать во фрилансе - видимо лучший выход. Вас же двое, ну скиньтесь - дешевле выйдет. При всём уважении к Kastaneda, убивать просто так на это задание целый выходной (а то и два, если сразу не заработает ) - какое-то сомнительное удовольствие...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 13:37     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов
Еще ссылки по теме:

C++ Найти сумму тех членов ряда,модуль которых больше или равен заданому е
C++ Найти сумму члена ряда, модуль которых больше или равен заданной эпсиле
C++ Найти сумму тех членов ряда, модуль которых больше или равен заданному е
C++ Разработать программный модуль "Авиакасса"
C++ Разработать программную систему для имитации процесса обслуживания заданий в вычислительных системах

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
22.12.2012, 13:37     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов #17
Короче вот что-то набросал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
 
// следующие typedef'ы лучше реализовать через структуры с битовыми полями
// но для простоты сделаем так
typedef unsigned char byte;
typedef unsigned short word; // при условии, что sizeof(short) == 2
typedef unsigned int dword; // при условии, что sizeof(int) == 4
typedef long long unsigned int qword; //при условии, что sizeof(long long int) == 8;
 
class Page
{
public:
    unsigned char& operator[] (int idx)
    {
        return page[idx];
    }
 
private:
    static const int pageSize = 4 * 1024; // размер страницы 4 КБ (бывают и другие, добавить при необходимости)
    unsigned char page[pageSize];
};
 
class PGEntries
{
public:
    static const int tableSize = 1024; // в случае использования PAE или имитации х86_64 размер будет равен 512
 
    virtual ~PGEntries() {}
 
protected:
   // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
};
 
class PTE : public PGEntries
{
public:
    PTE()
    {
        table = new Page*[tableSize];
 
        for (int i = 0; i < tableSize; i++)
        {
            table[i] = new Page;
        }
    }
 
    ~PTE() {/* освободить память */}
 
    Page* operator [] (int idx)
    {
        return table[idx];
    }
 
private:
    Page **table;
    // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
    // так же добавить маску флага присутствия страницы в памяти, для имитации исключени Page Fault
};
 
class PDE : public PGEntries
{
public:
    PDE()
    {
        table = new PTE*[tableSize];
 
        for (int i = 0; i < tableSize; i++)
        {
            table[i] = new PTE;
        }
    }
 
    ~PDE() { /* освободить память */}
 
    PTE* operator[] (int idx)
    {
        return table[idx];
    }
 
private:
    PTE **table;
 
    // добавить маски флагов для проверки различных вещей, например разрешение на чтение/запись
};
 
// реализовать при необходимости
// class PDPTE : public PGEntries{};// для имитации использования PAE (PDPTE содержит 4 указателя на PDE (в protected mode) или 512 в х86_64
// class PML4 : public PGEntries{}; // Page Map Level 4 - для имитации пэйджинга x86_64
 
 
class Descriptor {}; // реализовать
class GDT {}; // реализвать
// GDT - global description table - главная табилца дескрипторов
 
typedef int Selector;
 
// на самом деле полный адрес определяется путем сложения базы десктриптора (который опеределяется селектором) плюс адрес
// но уже лень это все реализовывать. Там нужно сделать проверку на лимит и т.д. Так же там есть всякие флаги, которые тоже можно имитировать
class VAddress
{
public:
    VAddress(Selector sel, dword addr)  :  _addr(addr), _sel(sel), PDEmask(0xFFC00000), PTEmask(0x3FF000), pageOffsetMask(0xFFF) {}
    // перегрузить конструктор для 64 битных адресов
 
    int getPDEIndex() const
    {
        return _addr & PDEmask;
    }
 
    int getPTEIndex() const
    {
        return _addr & PTEmask;
    }
 
    int getOffset() const
    {
        return _addr & pageOffsetMask;
    }
 
private:
    Selector _sel;
    dword _addr; // _addr можно сделать как union{qword, dword} для хранения 64 битных адресов
    dword PDEmask;
    dword PTEmask;
    dword pageOffsetMask;
 
    // добавить при необходимости
    // unsigned int PDPTEmask;
    // unsigned int PML4mask;
};
 
class VMemmory
{
public:
    VMemmory(PGEntries *mainTbl) : CR3(mainTbl) {}
 
    // для всех слещующих методов сделать разную реализацию в зависимости от модели paging'а
    // например можно добавить в класс члены bool _paeIsUsed и _pml4IsUsed и инициализировать их в конструкторе
    void setByte (const VAddress &addr, byte val)
    {
        PTE *pte = (*(dynamic_cast<PDE*> (CR3))) [addr.getPDEIndex()];
        Page *page = (*pte)[addr.getPTEIndex()];
        (*page)[addr.getOffset()] = val;
    }
 
    void setWord (const VAddress &addr, word val) { /*реализвать*/}
    void setDword (const VAddress &addr, dword val) { /*реализвать*/}
    void setQword (const VAddress &addr, qword val) { /*реализвать*/}
 
    byte getByte (const VAddress &addr)
    {
        PTE *pte = (*(dynamic_cast<PDE*> (CR3))) [addr.getPDEIndex()];
        Page *page = (*pte)[addr.getPTEIndex()];
 
        return (*page)[addr.getOffset()];
    }
 
    word getWord (const VAddress&) { return 0;/*реализвать*/}
    dword getDword (const VAddress&) { return 0;/*реализвать*/}
    qword getQword (const VAddress&) { return 0;/*реализвать*/}
private:
    PGEntries *CR3; // в процессоре регистр CR3 содержит адрес таблицы верхнего уровня
};
 
int main ()
{
    PDE *pde = new PDE;
    VMemmory mem (pde);
 
    VAddress addr (123 /*это типа селктор, но нужно сделать по другому*/, 0x12345678); // просто для примера
 
    mem.setByte(addr, 0xAB);
 
    std::cout << "Our byte = " << mem.getByte(addr) << std::endl;
 
    return 0;
}
небольшое пояснение - здесь реализовано процентов 10 от того, что реально нужно сделать. Это только самая общая модель (и то не полная без дескрипторов) paging'a. То, что написано в коментариях - это далеко не полный список того, что нужно добавить. Если нужно я могу написать все, что нужно сделать, просто это не пару строк текста, поэтому без надобности писать неохото.

Цитата Сообщение от easybudda Посмотреть сообщение
Я бы значительно дольше провозился
Ага, я что-то про день/полдня неподумав сказал. Реально если делать все как следует, с реализацие всего всего, то пару дней надо (с учетом понимания paging'a). И это только на реализацию модели paging'a, а плюс еще сами задания.

Цитата Сообщение от easybudda Посмотреть сообщение
убивать просто так на это задание целый выходной (а то и два, если сразу не заработает ) - какое-то сомнительное удовольствие...
Да, просидел часа полтора, потом плюнул, даже дескрипторы не стал делать, просто в коментариях отметил

Короче совет - во фриланс! Только вот стоить это будет (как уже писали выше) далеко не 500 рублей.

P.S. не пытайтесь запускать этот код, я там не подумав мапировал все 4 ГБ памяти (как это на самом деле бывает), только вот я эти 4 ГБ из кучи беру, поэтому программа (и ОС) просто зависнут Поэтому нужно подумать - либо обрезать размер памяти, либо мапировать только используемую таблицу -> страницу по запросу.
Yandex
Объявления
22.12.2012, 13:37     Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru