Консультация № 182890
19.04.2011, 17:02
43.78 руб.
0 8 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь с программой:
Модель преобразования виртуального адреса в физический адрес
1. Исходные данные:
• организация виртуальной памяти - страничная;
• разрядность виртуального адреса - 32 бита;
• максимальное число работающих процессов не более восьми;
• количество физических страниц в таблице страниц процесса не более четырех;
• объем оперативной памяти - 32 физических страницы;
• заполнение таблицы страниц - с использованием датчика случайных чисел;
• виртуальный адрес вводится с клавиатуры.
2. Результаты работы модели, отображаемые на дисплее должны включать в себя:
• виртуальный адрес;
• номер процесса;
• содержимое таблицы страниц данного процесса;
• физический адрес.
Инструменты: ABC-Pascal, Turbo-Pascal, Delphi-7.
Дополнительно 200 рублей переводом на РФПРО-счет (возможно обсуждение суммы).
Спасибо.

Обсуждение

давно
Академик
320937
2216
19.04.2011, 17:03
общий
Добрый день, уважаемые коллеги! Сообщите, пожалуйста, в мини-форум, кто возьмется.
Неизвестный
19.04.2011, 19:10
общий
Я мог бы написать на fasm_е, с паскалем сложновато.
И ещё вопросы:
    [1]какие сроки?

    [2]программа должна работать под какой нибудь ОС (DOS,Windows) или как загрузчик?

давно
Академик
320937
2216
19.04.2011, 19:40
общий
Добрый вечер!
Инструменты: ABC-Pascal, Turbo-Pascal, Delphi-7.
давно
Старший Модератор
31795
6196
21.04.2011, 18:43
общий
Адресаты:
Сам механизм простой:

Из логического адреса биты:
00:11 = смещение в физической странице;
12:21 = номер записи в таблице РТЕ(рис 2б);
22:31 = номер записи в таблице PDE(рис 2а);

Записи в таблицах имеют следующий формат:

PDE(а), РТЕ(б);

Но есть уточняющие вопросы:
виртуальный адрес вводится с клавиатуры. = какая система счисления вводимых данных(2х,10х или 16х)?
объем оперативной памяти - 32 физических страницы = одна страница 4Кб, т.е. получается всего 128 Кб?
Есть 1024-е записи в таблице PDE (одна запись - 4 байта), которые определяют 1024 таблиц РТЕ, каждая из них содержит 1024 записи о физических страницах. Получается: 4*1024*(1024+1)=4'198'400, чуть больше 4-х "метров" только на организацию таблиц. В ТР это точно не сделать, там только 640Кб кучи. Можно конечно урезать число 1024, к примеру 16-ти.
максимальное число работающих процессов не более восьми;
количество физических страниц в таблице страниц процесса не более четырех;

Т.е. нужно ещё и менеджер распределения памяти делать и имитировать работу системы и "приложений"?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Академик
320937
2216
21.04.2011, 21:07
общий
Адресаты:
Добрый вечер, Константин Николаевич! Спасибо, что откликнулись. Задам вопрос студенту. С уважением.
давно
Старший Модератор
31795
6196
21.04.2011, 21:30
общий
Адресаты:
Ещё посоветуйте студенту скачать книги:
Операционные системы: Вильям Столлингс
Современные операционные системы: Эндрю Таненбаум
Операционные системы. Разработка и реализация: Эндрю Таненбаум

В книгах можно найти информацию, как организовывается страничная память, как обслуживаются процессы, потоки, распределяются ресурсы и т.д.
Первая книга, это обзор по всем существующим основным системам(правда качество её никакое сами смотрите).
windows:

*-nix:
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
10.05.2011, 14:22
общий
это ответ
Здравствуйте, lamed!

Код в приложении, написан под АВС 3.х.
Программма моделирует двухуровневую страничную организацию памяти для некоторого процессора имеющего только однобайтные машинные команды. Для каждого процесса в памяти формируются два физических блока по 4Кб, под таблицы PDE и PTE. Также они отображаются на экране(pde - таблица каталогов: pde[номер в таблице]:=физический адрес таблицы страниц и pte - таблица страниц: pte[номер в таблице]:=физический адрес исполняемого блока). Виртуальным адресом является счетчик комманд, для текущего активного процесса он увеличивается на "1" и проверяется выход значния за рамки одного физического блока рамером 4Кб(на экране отображается ввиде:phis - физический адрес выполняемой команды.). Взависимости от результата, процесс может быть продолжен и приостановлен, для загрузки следующего необходимого блока памяти. Текущий блок переводится в состояние выгрузки и занимаемый им блок памяти освобождается. Одновременно с этим процессу выделяется один из свободных блоков, который переводится в состояние загружаемого. После загрузки этот блок переводится в состояние готового к выполнению. Теущий процесс может быть приостановлен, ещё когда обнулится счетчик текущего количества выполненых комманд(Procces[ i ].step). Приостановленный процесс передает управление любому другому, готовому к выполнению процессу. Таким образом реализуется многозадачность.

вопросы задавайте в мини-форум.
Удачи!

Приложение:
uses
Crt,
GraphABC;
const
{задание}
PhisPage=31;{0..31=32}
szPage=4095;{0..4095=4096}
NumRec=1023;{0..4095=4096}
ActiveProcces=8;{количество активных процессов}
SysPage=3;{номер физической страницы системы}
PdePage=(SysPage+1)mod(PhisPage+1);{}
ipData=10000;{переменная для генерации указателя команд}
stepData=400;{переменная для генерации счетчиков команд}
{}
BitJob=8;{бит работы}
BitActive=4;{бит готовности}
BitGlobal=2;{бит невыгружаемости}
BitPresent=1;{наличия в памяти}
{for screan}
xBegin=10;{смещение от верхнего-левого угла экрана}
yBegin=10;
szScrean=700;{размер окна вывода}
{цветовая гамма для вывода состаяний отображаемых блоков}
colorFree=clGray;
colorSystem=clRed;
colorPTE=clNavy;
colorPDE=clBlue;
colorCode=clGreen;
colorUnLoad=clAqua;
colorLoad=clYellow;
colorJob=clLime;
type
tOne = array[0..NumRec]of longint;{один физический блок размером 4Кб}
pOne=^tOne;{ссылка на логический блок}
{заголовок процесса}
tProcces=record
id:longint;{идентификатор процесса}
ip:longint;{виртуальный указатель текущей комманды}
pPDE:longint;{номер физичекого блока таблицы PDE}
pPTE:longint;{номер физического блока таблицы РТЕ}
TimeOut:word;{счетчик выполненых команд и времменная задержка загрузки выгрузки}
status:word;{флаг состояния процесса}
step:word;{квант кода-количество комманд выполяемых процессов за один раз}
PTE:pOne;{ссылка на таблицу PTE}
PDE:pOne{ссылка на таблицу PDE}
end;
{заголовок блока физической памяти}
tMemory=record
id:longint;{идентификатор владельца блока памяти}
am:integer;{статус блока памяти}
end;
var
i,j:integer;
dXpx,dYpx:integer;
Memory:array[0..PhisPage]of tMemory;{}
Procces:array[0..ActiveProcces]of tProcces;{}
{получение РТЕ}
function PTE(a:longint):longint;
begin
PTE:=(Procces[Memory[a].id].ip div(szPage+1))mod(NumRec+1)
end;
{получение PDE}
function PDE(a:longint):longint;
begin
PDE:=Procces[Memory[a].id].ip div((szPage+1)*(NumRec+1))
end;
{поиск первой свободной страницы}
function CheckPage(var a:integer):boolean;
begin
a:=PhisPage;
while(Memory[a].id>=0)and(a>=0)do dec(a);
CheckPage:=a>=0
end;
{перевод 16-ю систему}
function bin2hex(a:longint):string;
const
HEX:string='0123456789ABCDEF';
var
b:string;
begin
b:='';
while a>0 do
begin
b:=Hex[1+(a mod 16)]+b;{в строку записываем символьное представление остатка от деления}
a:=a div 16{убираем проверенную цифру}
end;
while length(b)<8 do b:='0'+b;{выравниваем до восьми символов}
bin2hex:=b{результат}
end;
{отображение информации физического блока}
procedure ShowData(a:integer);
var
b:integer;
d:string;
begin
{выбор цвета рисуемого блока}
case Memory[a].am of
0:b:=colorFree;
1:b:=colorSystem;
2:b:=colorPTE;
3:b:=colorPDE;
4:b:=colorCode;
5:b:=colorUnLoad;
6:b:=colorLoad;
7:b:=colorJob;
else b:=clWhite
end;
SetBrushColor(b);{устанавливаем кисть}
FillRect(xBegin,a*dXpx+yBegin+1,xBegin+60,(a+1)*dXpx+yBegin-1);{рисуем блок}
SetBrushColor(clWhite);{сбрасываем кисть}
d:=' mem:'+bin2hex(a*(szPage+1))+' id:'+bin2hex(Memory[a].id);{формируем сообщение}
{выбор надписи}
case Memory[a].am of
1 :;{системный блок}
2 :d:=d+' pte['+bin2hex(PTE(a))+ ']:='+{номер записи таблицы PТE}
bin2hex(Procces[Memory[a].id].PTE^[PTE(a)]);{значение поля таблицы PTE}
3 :d:=d+' pde['+bin2hex(PDE(a))+ ']:='+{номер записи таблицы PDE}
bin2hex(Procces[Memory[a].id].PDE^[PDE(a)]);{значение поля таблицы PDE}
4,{процесс в памяти}
5,{процесс выгружается}
6 :d:=d+' ip:'+bin2hex(procces[Memory[a].id].ip);{процесс загружается}
7 :d:=d+' ip:'+bin2hex(procces[Memory[a].id].ip)+{виртуальный адрес}
' phis:'+bin2hex(Procces[Memory[a].id].PTE^[PTE(a)]+(Procces[Memory[a].id].ip mod(szPage+1)));{физический адрес}
else d:=''
end;
{выравниваем строку и выводим сообщение}
while length(d)<80 do d:=d + ' ';
TextOut(xBegin+80,a*dYpx+yBegin,d);
{действия ОСи}
case Memory[a].am of
4:if(Procces[Memory[a].id].status and BitJob)>0 then Memory[a].am:=7;{процесс в памяти готов к работе}
5:begin{выгружаем процесс}
dec(Procces[Memory[a].id].TimeOut);{уменьшаем счетчик}
if Procces[Memory[a].id].TimeOut=0 then
begin
Memory[a].am:=0;{помечаем как свободный}
Procces[Memory[a].id].TimeOut:=Procces[Memory[a].id].step;{востанавливаем счетчик}
Memory[a].id:=-1;{освобождаем блок}
end
end;
6:begin{загружаем блок}
dec(Procces[Memory[a].id].TimeOut);{умеьшаем счетчик}
if Procces[Memory[a].id].TimeOut=0 then
begin
Memory[a].am:=4;{в памяти}
Procces[Memory[a].id].TimeOut:=Procces[Memory[a].id].step;{востанавливаем счетчик}
end
end;
7:if(Procces[Memory[a].id].status and BitJob)>0 then{процесс в памяти активный}
begin
dec(Procces[Memory[a].id].TimeOut);{уменьшаем счетчик команд}
inc(Procces[Memory[a].id].ip);{увеличиваем указатель на следующую команду}
if Procces[Memory[a].id].ip mod(szPage+1)=0 then{достигли конца страницы}
begin
Memory[a].am:=5;{помечаем блок как вызружаемый}
Procces[Memory[a].id].status:=Procces[Memory[a].id].status xor BitJob;{снимаем активность процесса}
Procces[Memory[a].id].TimeOut:=Procces[Memory[a].id].step;{востанавливаем счетчик команд}
if CheckPage(b) then{выбираем свободный блок физичейской памяти}
begin
Memory[b].am:=6;{статус загружаемый процесс}
Memory[b].id:=Memory[a].id;{передаем владельца}
Procces[Memory[b].id].PTE^[PTE(a)]:=b*(szPage+1);{новая запись в таблице РТЕ}
if PTE(a)=0 then{достигли конца РТЕ}
begin
Memory[Procces[Memory[a].id].pPTE].am:=5;{помечаем блок как выгружаемый}
if CheckPage(b) then{выбираем сврбодный блок физичейской памяти}
begin
Memory[b].am:=2;{выбираем свободный блок физичейской памяти}
Memory[b].id:=Memory[a].id;{передаем владельца}
Procces[Memory[b].id].PDE^[PDE(a)]:=b*(szPage+1);{новая запись в таблице РDЕ}
Procces[Memory[a].id].pPTE:=b{запоминаем в заголовке процесса}
end
end;
repeat
b:=1+random(ActiveProcces){ищем очередной процеес}
until Procces[b].id<>Memory[a].id;
Procces[b].status:=Procces[b].status or BitJob;{помечаем его как активный}
Procces[b].timeOut:=Procces[Memory[a].id].step{востанавливаем счетчик}
end
end
else
if Procces[Memory[a].id].TimeOut=0 then{выполнили все положенные команды}
begin
Procces[Memory[a].id].status:=Procces[Memory[a].id].status xor BitJob;{снимаем активность}
repeat
b:=1+random(ActiveProcces){новый активный процесс}
until b<>Memory[a].id;
Procces[b].status:=Procces[b].status or BitJob;{устанавливаем активность}
Memory[a].am:=4;{процесс в памяти и готов к работе}
Procces[Memory[a].id].TimeOut:=Procces[Memory[a].id].step{востанавливаем счетчик}
end
end
end
end;
begin{main}
Randomize;
SetWindowCaption('virtual memory model');{заголовок окна}
SetWindowSize(szScrean,szScrean);{размер окна}
dXpx:=szScrean div(PhisPage+1);dYpx:=szScrean div(PhisPage+1);
for i:=0 to PhisPage do Memory[i].id:=-1;{освобождаем физическую память}
Memory[SysPage].id:=0;{системная страница}
Memory[SysPage].am:=1;{тип физического блока}
for i:=1 to ActiveProcces do
begin
Procces[i].id:=i;{идентификатор процесса}
Procces[i].ip:=random(ipData)+1000*ipData;{генерируем указатель на команду}
Procces[5].ip:=4190000;{контроль переключений таблиц}
Procces[i].status:=BitActive or BitPresent;{????}
Procces[i].step:=random(stepData)+stepData;{генерируем квант команд}
New(Procces[i].PTE);{резервируем место под таблицу РТЕ}
New(Procces[i].PDE);{резервируем место под таблицу PDE}
if CheckPage(j) then{выбираем свободный блок физической памяти}
begin
Memory[j].id:=i;{владелец блока памяти}
Memory[j].am:=2;{in memory color PTE}
Procces[i].pPTE:=j;{запоминаем в заголовок процесса}
Procces[i].PDE^[PDE(j)]:=j*(szPage+1){записываем физический адрес в таблицу PDE}
end;
if CheckPage(j) then{выбираем свободный блок физической памяти}
begin
Memory[j].id:=i;{владелец блока памяти}
Memory[j].am:=3;{таблица PDE}
Procces[i].pPDE:=j{запоминаем в заголовке процесса}
end;
if CheckPage(j) then{выбираем свободный блок физический памяти}
begin
Memory[j].id:=i;{владелец блока памяти}
Memory[j].am:=4;{блок кода программы}
Procces[i].TimeOut:=Procces[i].step;{устанавливаем счетчик}
Procces[i].PTE^[PTE(j)]:=j*(szPage+1){записываем физический адрес в таблицу РТЕ}
end
end;
j:=1+random(ActiveProcces);{выбираем случайно активный процесс}
Procces[j].status:=Procces[j].status or BitJob;{устанавливаем бит активности}
while true do for i:=0 to PhisPage do ShowData(i);{выводим информоцию об одном физическом блоке в цикле}
ReadKey;
end.{main}
5
Качественная и солидная работа. Большое спасибо. С уважением.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404003
1
02.05.2020, 19:28
общий
02.05.2020, 19:48
Адресаты:
Здравствуйте уважаемые эксперты. Прошу вас помогите с решением данного задания.

Модель преобразования виртуального адреса в физический адрес.
1. Исходные данные:
o организация виртуальной памяти – двухуровневая страничная,
o разрядность виртуального адреса – 28 бит,
o размер физической страницы – 4 Кбайт,
o количество физических страниц в таблице страниц второго уровня – 256,
o объем оперативной памяти – 64 физических страницы,
o заполнение таблицы страниц – с использованием датчика случайных чисел,
o виртуальный адрес вводится с клавиатуры.
2. Результаты работы модели должны включать:
• виртуальный адрес,
• физический адрес,
• содержимое таблиц страниц первого и второго уровней.

Заранее прошу прощения за беспокойство.
Форма ответа