Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2008, 23:41   #1
r1p88
 
Регистрация: 27.04.2008
Сообщений: 4
По умолчанию Имитация операционной системы на Delphi

Вобщем ща проходим курс СПО(системное программное обеспечение). И дали задание сделать имитацию того как процессы поступают на обработку к CPU и реалезация нескольких методов. Так вот у меня вопрос:
есть метод SJF («кратчайшее задание—первым»). Тоесть есть очередь готовых процессов и они ждут того когда попадут на выполнение в CPU. Но у каждого процесса есть "время выполнения"(BurstTime).Так вот если оно меньше чем у впереди стоящего в очереди процесса, то они соответственно меняются местами и на выполнение идёт тот у которого BurstTime меньше.
Я вот не понимаю как там с указателями работать!

Вот код программы на Delphi:

Код:
unit OcheredCPU;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, process;

type
TLinkNote=^TNode;
 TNode=record
 p:TProcess;
 next:TLinkNote;
end;

TOcheredCPU=class
 _out:TLinkNote;
 _in:TLinkNote;
 num:word;
 constructor create;
 destructor destroy; override;
 function qEmpty:Boolean;
 procedure qClear;
 procedure qAdd (PCB:TProcess);
 procedure qDel (var PCB:Tprocess);
 procedure view(m:TMemo);
end;


implementation
constructor TOcheredCPU.create;
begin
 _in:=nil;
 _out:=nil;
 num:=0;
end;

function TOcheredCPU.qEmpty;
begin
qEmpty:=_out=nil;
end;

procedure TOcheredCPU.qAdd;
var r:TLinkNote;
//PCB:TProcess;
begin
 new(r);
 r^.p:=PCB;
 r^.next:=nil;
 if qEmpty then
  begin
   _in:=r;
   _out:=r;
  end
 else
  begin
   _in^.next:=r;
   _in:=r;
  end;
  end;

procedure TOcheredCPU.qDel;
var r:TlinkNote;
begin
 r:=_out;
 if not qEmpty then
  begin
   PCB:=r^.p;
   _out:=_out^.next;
   dispose(r);
  end;
 if _out=nil then _in:=nil;
end;

procedure TOcheredCPU.qClear;
var r:TProcess;
begin
 while not qEmpty do
 qDel(r);
end;

destructor TOcheredCPU.destroy;
begin
 qClear;
 inherited destroy;
end;

procedure TOcheredCPU.view;
var cur:TLinkNote;
begin
 m.Lines.Clear;
 cur:=_out;
 while cur<>nil do
  begin
   m.Lines.Add(cur^.p.name);
   cur:=cur^.next;
  end;
  end;

end.
Если кто может помогите.
r1p88 вне форума Ответить с цитированием
Старый 26.05.2008, 05:26   #2
Vedrus
ИСККОНный хакер
Форумчанин
 
Аватар для Vedrus
 
Регистрация: 08.11.2007
Сообщений: 195
По умолчанию

Твой пример - просто очередь. Можно её процессором назвать. Тебе осталось планировщик написать, который эту очередь использовать будет.
#define QUESTION bb || !bb
Vedrus вне форума Ответить с цитированием
Старый 26.05.2008, 08:14   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
идёт тот у которого BurstTime меньше.
Это всмысле приоритет? Ну попробуй сортировать с вновь прибывшем процессом.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2008, 08:27   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от r1p88 Посмотреть сообщение
... Тоесть есть очередь готовых процессов и они ждут того когда попадут на выполнение в CPU. Но у каждого процесса есть "время выполнения"(BurstTime).Так вот если оно меньше чем у впереди стоящего в очереди процесса, то они соответственно меняются местами и на выполнение идёт тот у которого BurstTime меньше.
Я вот не понимаю как там с указателями работать!
Может просто переписать метод qAdd;
Процесс должен ставиться в очередь не первым, а перед процессом с бОльшим BurstTime. Тогда очередь всегда останется отсортированной по BurstTime и на выполнение будут выбираться процессы с наименьшим временем.
alexBlack вне форума Ответить с цитированием
Старый 26.05.2008, 09:03   #5
r1p88
 
Регистрация: 27.04.2008
Сообщений: 4
По умолчанию

ну это всё я понимаю что переписать Qadd, но суть в том что я не очень шарю с указателями.
как это должно выглядеть? Вот мой пример, но я знаю что он не рабочий((

if r.p.BurstTime < (вот сдесь как задать чем BurstTime предыдущего?) then
(поменять их местами тоже незнаю как)
_in^.next:=r;
r1p88 вне форума Ответить с цитированием
Старый 26.05.2008, 09:05   #6
r1p88
 
Регистрация: 27.04.2008
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Vedrus Посмотреть сообщение
Твой пример - просто очередь. Можно её процессором назвать. Тебе осталось планировщик написать, который эту очередь использовать будет.
планировщик есть! у меня есть все модули которые нужны. Мне осталось реалезовать работу памяти и в процессах сделать вот эту штуку и упорядоченность списка через t тактов.+Вытеснения. Просто в этом примере, я чего прошу помощи? потому что не очень разбираюсь с указателями.
r1p88 вне форума Ответить с цитированием
Старый 26.05.2008, 10:43   #7
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от r1p88 Посмотреть сообщение
ну это всё я понимаю что переписать Qadd, но суть в том что я не очень шарю с указателями.
как это должно выглядеть? Вот мой пример, но я знаю что он не рабочий((

if r.p.BurstTime < (вот сдесь как задать чем BurstTime предыдущего?) then
(поменять их местами тоже незнаю как)
_in^.next:=r;
Я не понял, что у Вас является началом очереди. Если _in, то примерно так:

Код:
procedure TOcheredCPU.qAdd;
var r:TLinkNote;
begin
   new(r);
   r^.p    := PCB;
   r^.next := nil;
   if qEmpty then begin // первый элемент просто добавляется в начало очереди
      _in:=r;
      _out:=r;
   end else begin
      p1 := _in; // Начало списка
      lp := nil; // Предыдущий элемент
      // Ищем элемент с большим BurstTime
      while (p1 <> nil) and (PCB.BurstTime <= p1.BurstTime) do begin
         lp := p1;
         p1 := p1^.next;
      end;
      // Теперь перед p1 нужно вставить элемент r
      // lp - указатель на предыдущий элемент
      if lp = nil then begin // он может быть = nil - добавляем в начало очереди
         _in := r;
         r^.next := p1
      end else begin
         lp^.next := r;
         r^.next := p1;
      end;
   end;
end;
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 00:04   #8
r1p88
 
Регистрация: 27.04.2008
Сообщений: 4
По умолчанию

спасибо за помощь
r1p88 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
До проги не доходит сигнал выгрузки операционной системы Altera Общие вопросы Delphi 6 30.08.2008 18:03
Какая программа подходит лучше всего для написании операционной системы? Briz Операционные системы общие вопросы 6 26.10.2007 11:12
Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с SERGOO Общие вопросы Delphi 5 25.05.2007 19:02
Разработка тестирующей системы в DELPHI noodles Общие вопросы Delphi 5 09.02.2007 08:52