Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Смешанный алгоритм: FIFO+абсолютный приоритет   Найти похожие ветки 

 
sergey_spy   (2005-06-21 14:23) [0]

Как реализовать на Делфи алгоритм ФИФО вместе с абсолютным приоритетом?
Т.е. - первый пришел первый и обработался, но если у пришедшего процесса приоритет выше чем у выполняемого в данный момент, то выполнение процесса прекращается и начинает выполнятся процесс с высшим приоритетом.
P.S. Если можна пример кода.


 
Digitman ©   (2005-06-21 14:26) [1]


> у пришедшего процесса


кто такой "пришедший процесс" ? куда он "ходил", откуда и куда "пришел" ?

у процесса как Win32-объекта есть строгое и четкое терминологическое определение ..

и причем здесь ФИФО ?


 
Eraser ©   (2005-06-21 14:34) [2]

sergey_spy   (21.06.05 14:23)

Возможно тут найдёшь ответ: http://mbo88.narod.ru/ToC.html

Т.е. - первый пришел первый и обработался, но если у пришедшего процесса приоритет выше чем у выполняемого в данный момент, то выполнение процесса прекращается и начинает выполнятся процесс с высшим приоритетом.

Можно только назначить приоритет, а управлением потоками занимается система.


 
Alex*   (2005-06-21 14:37) [3]

Интересно,  а сам смысл FIFO не теряется, если "перепрыгивать" придется?


 
TUser ©   (2005-06-21 14:46) [4]

Так есть FIFO, есть один выполняемый процесс. Когда процесс приходит, то вне зависимости от того, о чем вообще тут идет речь, делаем так
if NewProcess.Priority > CurrentProcess.Priority then
begin
 CurrentProcess.Stop;
 Push(CurrentProcess);
 CurrentProcess:=NewProcess;
end;

Но задача вообще непонятна.


 
Sergey_spy   (2005-06-21 15:31) [5]

|<-------прекращение выполнения-        
           |                               |
           |               n+2 ______      |
           |             |--->|      |     |
           |             | n+1|      |---->|
входн.поток-->(очередь)-->|--->|  ЦП  |
                         |  n |      |----> конец обслужив.
                         |--->|______|

n - приоритет
Что-то вроде этого!!!


 
Digitman ©   (2005-06-21 15:37) [6]


> Sergey_spy   (21.06.05 15:31) [5]


ты ОС что ли пишешь ?)


 
Sergey_spy   (2005-06-21 15:38) [7]


> Но задача вообще непонятна.

           
почему-то все искажает^ - попробую повторить:
.
           |<-------прекращение выполнения--        
           |                                |
           |                n+2 ______      |
           |              |--->|      |     |
           |              | n+1|      |---->|
входн.поток-->(очередь)--> |--->|  ЦП  |
                          |  n |      |----> конец обслужив.
                          |--->|______|

n - приоритет
Что-то вроде этого!!!


 
Sergey_spy   (2005-06-21 15:43) [8]


> Digitman ©   (21.06.05 15:37)


нет ОС непишу.
Мне очень нужен этот алгоритм, нигде не могу его найти!


 
TUser ©   (2005-06-21 15:47) [9]

Запиши свою схему в тегах CODE - кнопочка КОД справа.


 
Sergey_spy   (2005-06-21 16:05) [10]



          |<-------прекращение выполнения--|        
          |                                |
          |                n+2 ______      |
          |              |--->|      |     |
          |              | n+1|      |---->|
входн.поток-->(очередь)-->|--->|  ЦП  |
                         |  n |      |----> конец обслужив.
                         |--->|______|

n - приоритет

Задача с наивысшим приоритетом выполняется в первую очередь и если она не выполнена, а в это время поступили несколько задач с таким же приоритетом, то они становятся в очередь "первый пришел - первый ушел".
Если нет задач с наивысшим приоритетом, то выполняются задачи с низшим приоритетом. Но если в процессе выполнения задачи поступает задача с более высоким приоритетом, то она прекращает выполнятся.

Так понятно?


 
TUser ©   (2005-06-21 16:36) [11]

Организуй отдельную очередь для каждого приоритета.


 
pasha_golub ©   (2005-06-21 16:37) [12]

Ну, я не пойму, почему бы потокам не выставлять нужный приоритет и пусть система разруливает.


 
wal ©   (2005-06-21 16:55) [13]

Создай несколько очередей (столько, сколько градаций приоритета). Складивай в них задания (или что там у тебя) в соответствии с их приоритетом. Очереди просматривай по очереди (во сказанул), начиная с наивысшей по приоритету. В случае прихода нового задания во время обработки: а) склыдируешь его в соответствующую очередь; б) сравниваешь его приоритет с текущим, если <=, то продолжаешь текущее, иначе прерываешь текущее; в) просматриваешь очередь(и) сначала.

С уважением

ЗЫ. Смотри, неприоритетные очереди не переполни.


 
-=XP=- ©   (2005-06-21 17:11) [14]

Как-то так:

TTask = class
public
 procedure Start;
 procedure Stop;
 property Priority: integer;
 property OnFinish: TNotifyEvent;
end;

TExcludeQueue = class
private
 FRunningTask: TTask;
 FTaskList: TList; // Низший приоритет - начало очереди, высший - конец.
 procedure OnTaskFinish(ASender: TObject);
 procedure SetRunningTask(ATask: TTask);
public
 procedure RunTask(ATask: TTask);
 property RunningTask: TTask read FRunningTask write SetRunningTask;
end;

procedure TExcludeQueue.RunTask(ATask: TTask);
var
 i: integer;
 InQueue: TTask;
begin
 ATask.OnFinish := OnTaskFinish;
 if RunningTask = nil then
   RunningTask := ATask
 else
 begin
   if (RunningTask.Priority < ATask.Priority) then
   begin
     InQueue := RunningTask;
     RunningTask := ATask;
   end
   else
     InQueue := ATask;
   for i := 0 to FTaskList.Count - 1 do
     if TTask(FTaskList[i]).Priority > InQueue then
     begin
       FTaskList.Insert(i, InQueue);
       Exit;
     end;
   FTaskLits.Add(InQueue);
 end;
end;

procedure TExcludeQueue.OnTaskFinish(ASender: TObject);
begin
 if FTaskList.Count > 0 then
 begin // Сделующая задача из списка
   RunningTask := FTaskList[FTaskList.Count - 1];
   FTaskList.Remove(RunningTask);
 end;
end;

procedure TExcludeQueue.SetRunningTask(ATask: TTask);
begin
 if FRunningTask <> ATask then
 begin
   if FRunningTask <> nil then
     FRunnigTask.Stop;
   FRunningTask := ATAsk;
   if FRunningsTask <> nil then
     FRunningTask.Start;
 end;
end;


 
-=XP=- ©   (2005-06-21 17:13) [15]

Глюк присутствует


 
Sergey_spy   (2005-06-21 18:15) [16]


> TUser ©


> wal ©


> -=XP=- ©

Большое вам спасибо, я уже нашел решение реализации "этого" для себя!
З.Ы. Супер форум. Спасибо создателям! Но ветку еще не закрывайте - могут еще появится вопросы по этой теме.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.07 c
9-1112119752
new1
2005-03-29 22:09
2005.07.11
Привет! А* в 3D.Допустим есть 3-х мерный массив.Как реализовать А


1-1119612741
stud
2005-06-24 15:32
2005.07.11
подскажите где ошибка в коде?


6-1112683463
doktor
2005-04-05 10:44
2005.07.11
как узнать все IP в локальной сети


14-1118811322
Crow
2005-06-15 08:55
2005.07.11
Темы для диплома


8-1111159617
webpauk
2005-03-18 18:26
2005.07.11
DirectDraw, потеря изображения





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский