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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2017, 18:53   #11
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Основная задача осепесателя придумать интерфейс для других программистов.
Интерфейс это структуры данных плюс имена функции и их параметры. Вы должны их выбрать так что-бы их имена говорили сами за себя. Само документированный код.

А система потом получиться когда будете делать "прикладное" ПО. Чтобы создать планировщик Вы должны абстрагироваться от задачи, то есть выделить общие элементы. На самом деле за вас уже многое сделали и расживали в задание. Имена функциям за вас придумали имена состояниям тоже. Вам по сути остаётся только закодировать, что написано в задании.

Но в тоже время эта не тупое задание. Вам предстоит ещё придумать алгоритм-планирования. Планирование это составление расписания, то бишь списка. Вам надо всего на всего придумать как у вас будет планироваться выполнение какие задачи первыми какие отложить на потом. Я вам предложил самый тривиальный способ в виде карусели.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.08.2017, 09:16   #12
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вы же должны были сделать очередь потоков, а не отдельно массив потоков и очередь. Да и где здесь функция удаления потока из очереди?
Переписал
Код:
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;

  procedure queadd(x:integer);
  begin
    if (qnext+1) < MAX then
      begin
       que[qnext].id :=x;
       que[qnext].status := random(3);
       inc(qnext);
      end
    else writeln('MecT HeT');
  end;

  function queget:integer;
  begin
   if qindex = qnext then
      begin
       writeln('|7ycTo');
       queget := 0;
      end
   else
       begin
        queget := que[qindex].id;
        inc(qindex);
       end;
  end;

begin
qnext := 0; qindex := qnext;
end.
И зачем собственно говоря удаление? Вторая процедура queget извлекает текущий элемент и при извлекание очередь будет указывать на следующий. Она логический считается удаленным.


К сожалению нас учать по пособиям что является полной чушью, это же не просто объявить массив и найти максимальный элемент. Я не намерен испортить знание по каким то пособиям, а намерен всеми правдами неправдами сделать задание на отмыш. Лучше я книжку почитаю потом по соответствующим темам, а сейчас время поджимает.

Последний раз редактировалось goto ∞; 27.08.2017 в 09:30.
goto ∞ вне форума Ответить с цитированием
Старый 27.08.2017, 11:25   #13
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Очередь из потоков вроде бы правильно сделал. Можно добавить и извлечь, при извлечение элемента извлекаемый элемент удаляется. Удаляется, значит указатель больше не смотрит на извлеченный элемент.
Как двигаться дальше?
goto ∞ вне форума Ответить с цитированием
Старый 27.08.2017, 13:23   #14
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Очередь из потоков вроде бы правильно сделал. Можно добавить и извлечь, при извлечение элемента извлекаемый элемент удаляется. Удаляется, значит указатель больше не смотрит на извлеченный элемент.
Как двигаться дальше?
Возьми и протестируй...

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
И зачем собственно говоря удаление? Вторая процедура queget извлекает текущий элемент и при извлекание очередь будет указывать на следующий.
У тебя же память тут же закончится. А планорвщик просто обязан работать без расхода памяти в бесконечном цикле.

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Вторая процедура queget извлекает текущий элемент и при извлекание очередь будет указывать на следующий. Она логический считается удаленным.
Неа. Семантика слова get предполагает возврат без удаления. Лучше использовать слово Delete или ещё лучше обще принятое dequeue.

С add тоже не всё в порядке, мы же добавляем. а тебя тут генерация!
que[qnext].status := random(3);
Неизвестные значения следует вынести в параметры. И вообще там должно быть дескриптор.

queadd(value:TTheardDescriptor)

Куда деть рендом?
Когда пишешь программу ты должен мысленно разделить её на 3-части. Модель. Ввод/вывод. И управление.
Вот в часть управления ты и должен написать тест для проверки очереди вот туда и следует пометить генерацию.
А Write() тоже следует вынести отдельно. А в модели оставить только код ошибки.
Мы же не знаем как будет сделан вывод в нашей ОС. Толи на консоль, толи в терминал будем выводить или же окошко кидать. А может и вовсе просто выставлять сигнал на тревожную линию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.08.2017, 10:35   #15
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Возьми и протестируй...


У тебя же память тут же закончится. А планорвщик просто обязан работать без расхода памяти в бесконечном цикле.


Неа. Семантика слова get предполагает возврат без удаления. Лучше использовать слово Delete или ещё лучше обще принятое dequeue.

С add тоже не всё в порядке, мы же добавляем. а тебя тут генерация!
que[qnext].status := random(3);
Неизвестные значения следует вынести в параметры. И вообще там должно быть дескриптор.

queadd(value:TTheardDescriptor)

Куда деть рендом?
Когда пишешь программу ты должен мысленно разделить её на 3-части. Модель. Ввод/вывод. И управление.
Вот в часть управления ты и должен написать тест для проверки очереди вот туда и следует пометить генерацию.
А Write() тоже следует вынести отдельно. А в модели оставить только код ошибки.
Мы же не знаем как будет сделан вывод в нашей ОС. Толи на консоль, толи в терминал будем выводить или же окошко кидать. А может и вовсе просто выставлять сигнал на тревожную линию.

В параметрах поменял целочисленный тип на элемент потока.

Насчет get или del, сути она не меняет. Как бы их не назвать он будет делать тоже самое.
Мне не понятно последнее условие задачи, какая еще перестановка при удаление, переменная qindex всегда будет указывать на начало очереди, зачем что то переставлять.

Если очередь из потоков у меня сделан то как реализовать следующие вещи? пункт 2-3 в условиях задачи?

Код:

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);
      end
    else queadd := false;
  end;

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

begin
qnext := 0; qindex := qnext;
end.
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 10:47   #16
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Насчет get или del, сути она не меняет. Как бы их не назвать он будет делать тоже самое.
Да вы шутник...
гет должен "взять" поток, отдать его под управление, например, чтобы дать квант времени и убрать свои ручки от него
а вот делете, должен удали поток, например, если он завершил свою работу

Цитата:
Мне не понятно последнее условие задачи, какая еще перестановка при удаление, переменная qindex всегда будет указывать на начало очереди, зачем что то переставлять.
Затем что при удалении потоков в середине будут возникать дырки.
p51x вне форума Ответить с цитированием
Старый 29.08.2017, 10:51   #17
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Да вы шутник...
гет должен "взять" поток, отдать его под управление, например, чтобы дать квант времени и убрать свои ручки от него
а вот делете, должен удали поток, например, если он завершил свою работу


Затем что при удалении потоков в середине будут возникать дырки.
Какая еще середина потоков? Есть массив записей которая имитирует очередь из потоков, доступ в очередь только по "указателю"(переменная qindex) о чем мы вообще говорим.
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 10:59   #18
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

1. У вас есть планировщик потоков. Прочтите, что это и чем он занимается.
2. У планировщика есть очередь потоков: 1 2 3 4 5
3. В процессе своей работы планировщик может удалить один из потоков из очереди, например, 3 и получить: 1 2 Х 4 5
Видите дырку?
p51x вне форума Ответить с цитированием
Старый 29.08.2017, 11:07   #19
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
1. У вас есть планировщик потоков. Прочтите, что это и чем он занимается.
2. У планировщика есть очередь потоков: 1 2 3 4 5
3. В процессе своей работы планировщик может удалить один из потоков из очереди, например, 3 и получить: 1 2 Х 4 5
Видите дырку?
1.У меня нету планировщика потоков, и я представления не имею как её реализовать программно, поэтому и прошу помощи тут.

Ведь массив записей которая имитирует очередь из потоков(поток в моем понимание это запись с двумя полями, id и статус). Когда планировщик что то хочет сделать то она обращается к очереди и когда она обращается к первому элементу это означает что она выбирает его и перемещает указатель на следующий элемент очереди. Значит пути назад нету, извлекаемый элемент потерян, нельзя просто написать qindex = qindex + 1, логический она противоречить понятию очередь. Иначе это просто массив к которой можно обращаться как угодно. Или я совсем тупой
goto ∞ вне форума Ответить с цитированием
Старый 29.08.2017, 11:35   #20
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Вы точно прочитали, что делает планировщик?
Вы теперь понимаете, что планировщик в простейшем случае берет поток из очереди, дает ему квант и снова отправляет поток в очередь?
Теперь смотрим вашу очередь: *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 видите дырку в вашей очереди?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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