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

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

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2017, 12:03   #21
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы точно прочитали, что делает планировщик?
Вы теперь понимаете, что планировщик в простейшем случае берет поток из очереди, дает ему квант и снова отправляет поток в очередь?
Теперь смотрим вашу очередь: *1 2 3 4 -> 1 *2 3 4 -> 1 2 *3 4 и т.д., т.к. это массив то мы можем просто двигать индекс-указатель не ворочая элементы.
Теперь (по заданию! надо обработать завершение текущего потока):
*1 2 3 4 -> 1 *2X 3 4 -> 1 X *3 4 -> 1 X 3 *4 = *4 1 X 3 видите дырку в вашей очереди?
Да знаю я что такое дырки, вы просто окончательно запутали сказав что можно перемещаться по очереди как по обычному массиву

Вот выдержка из википедии

Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.

Последний раз редактировалось goto ∞; 29.08.2017 в 12:05.
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 12:06   #22
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А где я говорил о выборке не из начала?
p51x на форуме Ответить с цитированием
Старый 29.08.2017, 12:18   #23
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А где я говорил о выборке не из начала?
Дырка не может образоваться при последовательном доступе в очередь.
Вообщем я так понял мы никак не сможем придти к соглашению с определениями что дальнейший диалог бесполдный
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 12:22   #24
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Дырка не может образоваться при последовательном доступе в очередь.
Ну вот же образовалась: *1 2 3 4 -> 1 *2X 3 4 -> 1 X *3 4 -> 1 X 3 *4 = *4 1 X 3

Цитата:
Вообщем я так понял мы никак не сможем придти к соглашению с определениями что дальнейший диалог бесполдный
Может вам стоит все-таки прочитать, что значат термины указанные в условии вашего задания?
p51x на форуме Ответить с цитированием
Старый 29.08.2017, 12:26   #25
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Ну вот же образовалась: *1 2 3 4 -> 1 *2X 3 4 -> 1 X *3 4 -> 1 X 3 *4 = *4 1 X 3
Нет не может, потому что

Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 12:29   #26
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

goto ∞
Вот смотри твой код не работает. Делаем проверку и твоя очередь переполнятся. Хотя не должна так, как я добавляю и тут же удаляю. Поэтому очередь и надо делать со смещением.
Код:
...
Procedure IqueInit;
begin
qnext := 0; qindex := qnext;
end;

function TestMemOut:Boolean;
var ck1,ck2:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to 100 do
  begin
  ck1:=queadd(Thead);
  ck2:=quedel;
  if (ck1=False) or (ck2=false) then result:=False;
  end;

end;
begin
if (TestMemOut=False) then WriteLn('Error');
end.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.08.2017, 12:34   #27
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Покажите, где мой пример противоречит цитате? Если вы идиот, давайте разжуем:
1. Есть очередь на 4 элемента: *1 2 3 4. Звездочка - наш указатель на начало очереди.
2. Взяли элемент 1 из очереди, поработали с ним и вернули взад: 1 *2 3 4. Начало очереди элемент 2.
3. Завершили работу активного потока, т.е. "удалили" его. 1 Х *3 4. Пока еще все более-менее нормально, ведь фактически очередь у нас 3 4 1 X
4. Теперь следующий шаг 1 X 3 *4
p51x на форуме Ответить с цитированием
Старый 29.08.2017, 12:39   #28
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

goto ∞p51x
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
перемещаться по очереди как по обычному массиву
Очередь только с 2 функциями добавление и извлечение с удалением не очень удобна практически. Поэтому обычно не так строго к этому придерживаются.
Если очередь делается на основе массива, то она может наследовать все её функции. Например так сделано в очереди QT и Си#.

p51x
Но я считаю что для выполнения данного задания достаточно 2-х классических методов очереди. Дело в том что при удаление потока ресурсы не могут быть освобождены мгновенно. А следовательно поток должен быть перемещён в "чистилище" до освобождения от всех связей. При таком подходе и с учётом карусели полное удаление потока произойдёт когда карусель повернёт очередь так что поток будет в конце очереди и когда поток избавиться от связей которые его удерживают от полного уничтожения.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 29.08.2017 в 12:46.
Pavia вне форума Ответить с цитированием
Старый 29.08.2017, 15:04   #29
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Циклический очередь
Код:
Program Potok2;

type
    descriptor = record
         id, status : integer;
    end;

const MAX = 4;


var
           que : array [0..MAX-1]of descriptor;
i, qnext, qindex, qlength : integer;

  function queadd(eque : descriptor):boolean;
  begin
    queadd := true;
    if qnext + 1 <> MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
	   if qnext = MAX then qnext := 0;
      end
    else queadd := false;
  end;

  function quedel(eque : descriptor):boolean;
  begin
    if qindex = MAX then
       qindex := 0;
   
	if qindex = qnext then
		quedel := false;
	end
		else
		  begin
		    quedel := true;
			inc(qindex);
		  end;
	
  end;

begin
qnext := 0; qindex := qnext;
end.
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 15:49   #30
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Циклический очередь
Вы код-то тестировали? Хотя знаю, он не компилируется значит не тестировали. Мола написать программу, надо ещё доказать её корректность или хотя бы протестировать.

Вот ваш код я его немного протестировал.
Код:
type
    descriptor = record
         id, status : integer;
    end;

const MAX = 4;


var
           que : array [0..MAX-1]of descriptor;
i, qnext, qindex, qlength : integer;

  function queadd(eque : descriptor):boolean;
  begin
    queadd := true;
    if qnext + 1 <> MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
	   if qnext = MAX then qnext := 0;
      end
    else queadd := false;
  end;

  function quedel(var eque : descriptor):boolean;
  begin
    if qindex = MAX then
       qindex := 0;
   
	if qindex = qnext then
		quedel := false
		else
		  begin
		    quedel := true;
			inc(qindex);
		  end;
	
  end;

Procedure IqueInit;
begin
qnext := 0; qindex := qnext;
qlength:=0;
end;

function TestMemLeak:Boolean;
var ck1,ck2:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to 100 do
  begin
  ck1:=queadd(Thead);
  ck2:=quedel(Thead);
  if (ck1=False) or (ck2=false) then result:=False;
  end;
if (qlength<>0) then result:=False;
end;

function TestPost_queadd_True:Boolean;
var ck1:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to Max-1 do
  begin
  ck1:=queadd(Thead);
  if Ck1=False then result:=False;
  end;
end;

function TestPost_queadd_False:Boolean;
var ck1:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to Max-1 do
  begin
  ck1:=queadd(Thead);
  if Ck1=False then result:=False;
  end;
  for i:=0 to 2*Max-1 do
     begin
     ck1:=queadd(Thead);
     if Ck1=true then result:=False;
     end;
end;

function TestPost_quedel_True:Boolean;
var ck1:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to Max-1 do
  begin
  ck1:=queadd(Thead);
  if Ck1=False then result:=False;
  end;
for i:=0 to Max-1 do
  begin
  ck1:=quedel(Thead);
  if Ck1=False then result:=False;
  end;
end;

function TestPost_quedel_False:Boolean;
var ck1:Boolean;
Thead:descriptor;
begin
Result:=True;
IqueInit;
for i:=0 to Max-1 do
  begin
  ck1:=queadd(Thead);
  if Ck1=False then result:=False;
  end;
for i:=0 to Max-1 do
  begin
  ck1:=quedel(Thead);
  if Ck1=False then result:=False;
  end;
for i:=0 to 2*Max-1 do
  begin
  ck1:=quedel(Thead);
  if Ck1=true then result:=False;
  end;
end;

begin
if (TestMemLeak=False) then WriteLn('Error - MemLeak');
if (TestPost_queadd_True=False) then WriteLn('Error - TestPost_queadd_True');
if (TestPost_queadd_False=False) then WriteLn('Error - TestPost_queadd_False');
if (TestPost_quedel_True=False) then WriteLn('Error - TestPost_quedel_True');
if (TestPost_quedel_False=False) then WriteLn('Error - TestPost_quedel_False');
end.
Он не одного теста не прошёл
Цитата:
Error - MemLeak
Error - TestPost_queadd_True
Error - TestPost_queadd_False
Error - TestPost_quedel_True
Error - TestPost_quedel_False
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многократное использование потоков(пул потоков) ProgrammistRT Общие вопросы Delphi 10 06.04.2014 13:42
FTP планировщик Zloy_Doomer Операционные системы общие вопросы 0 21.05.2013 00:08
Планировщик KolinRol Помощь студентам 1 15.04.2013 05:13
Планировщик на ассемблере Spartiat Помощь студентам 0 04.06.2009 18:43
Планировщик процессов. Артин Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.05.2009 23:21