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

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

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

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

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

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

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



Я даже не знаю каким образом подступиться к заданию. Допустим напишем в паскале все это дело.
goto ∞ вне форума Ответить с цитированием
Старый 26.08.2017, 08:50   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

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

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

То ли так?
Код:
type
   Descriptor = record;
          id : integer;
     status: integer;
end;
...
var Potop array of Descriptor;
begin
  for i := 0 to N do Potop.id= random(2);  Potop.status := random(3);

end;

То ли не нужно через запись сделать все это дело, а просто через массив целых чисел где индекс ячеек и есть идентификаторы?
goto ∞ вне форума Ответить с цитированием
Старый 26.08.2017, 09:32   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Вам бы теорию почитать.. Идентификатор - это уникально число, по которомы ваш планировщик потом сможет найти опред. поток и проделывать с ним нужные действия. Хотит берите рандомные числа, хотите по порядку нумеруйте, хотите преобразйте хендл от системы.
p51x вне форума Ответить с цитированием
Старый 26.08.2017, 09:41   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
о ли не нужно через запись сделать все это дело, а просто через массив целых чисел где индекс ячеек и есть идентификаторы?
Вам же чётко сказали 2 поля. Зачем спорите с заданием?
id - потока это номер присвоенный потоку при его создании. Он должен быть уникальным. А у вас сейчас они могут случайно совпасть - такого нельзя допускать.
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Вот как мне понять массив дескрипторов с двумя полями?
Да, так.
Только status и state это разные слова.

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
for i := 0 to N do Potop.id= random(2); Potop.status := random(3);
Не работаете на прямую с массивом. Работайте через функции. Инкапсулируйте.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.08.2017, 09:42   #6
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вам бы теорию почитать.. Идентификатор - это уникально число, по которомы ваш планировщик потом сможет найти опред. поток и проделывать с ним нужные действия. Хотит берите рандомные числа, хотите по порядку нумеруйте, хотите преобразйте хендл от системы.
Хорошо, индекс массива и будет идентификатором а значение ячеек будет состоянием. Правильно понял?


Код:
for i := 0 to N do Potop[i] := random(3);
goto ∞ вне форума Ответить с цитированием
Старый 26.08.2017, 09:51   #7
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вам же чётко сказали 2 поля. Зачем спорите с заданием?
id - потока это номер присвоенный потоку при его создании. Он должен быть уникальным. А у вас сейчас они могут случайно совпасть - такого нельзя допускать.

Да, так.
Только status и state это разные слова.


Не работаете на прямую с массивом. Работайте через функции. Инкапсулируйте.

Тогда я понял так :

Код:
type
   Descriptor = record;
          id : integer;
     status: integer;
end;
...
var Potop array of Descriptor;
begin
  for i := 0 to N do pAdd(i);
end;


procedure pAdd(i: integer);
begin
Potop[i].id := i;  Potop[i].status := random(3);
end;
goto ∞ вне форума Ответить с цитированием
Старый 26.08.2017, 11:48   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Ну вот продолжай дальше. Закодируй всё что тут перечислено:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
- массив реализует простейшую очередь со сдвигом элементов при удалении
Сделай на основе статического массива очередь. Все функции которые есть у очереди. Посмотри как очереди сделаны у других.
Затем на основе этих функций сделай следующие:
Цитата:
Сообщение от goto ∞ Посмотреть сообщение
- отрабатываемые события: создание нового потока, завершение активного потока, завершение кванта времени у активного потока, блокирование потока, разблокирование потока
И походу дела тебе потребуется ещё и функции для работы ID.

И если совсем не знаешь с чего начать, начни с определений. Определения сам найдёшь в интернете или в книгах.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 26.08.2017, 17:00   #9
goto ∞
Форумчанин
 
Аватар для goto ∞
 
Регистрация: 21.12.2010
Сообщений: 155
По умолчанию

[QUOTE=Pavia;1696118]Ну вот продолжай дальше. Закодируй всё что тут перечислено:

Сделай на основе статического массива очередь. Все функции которые есть у очереди. Посмотри как очереди сделаны у других.
Затем на основе этих функций сделай следующие:

Ну вот сделал, только я мало чего пока понимаю как это будет работать вместе.

Код:
Program Potok2;

type
    descriptor = record
         id, status : integer;
    end;
const n = 10;
const MAX = 4;


var
         potok : array [0..n-1]of descriptor;
           que : array [0..MAX-1]of integer; //Для очереди
i, qnext, qindex, qlength : integer;           //Для очереди, первый свободный элемент, первый занятый, длина

  procedure queadd(x:integer);               //Добавление элемента 
  begin
    if (qnext+1) < MAX then
      begin
       que[qnext] :=i;
       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];
        inc(qindex);
       end;
  end;


begin
qnext := 0; qindex := qnext;
for i:= 0 to n-1 do begin potok[i].id := i; potok[i].status := random(3) end;

end.

Последний раз редактировалось goto ∞; 26.08.2017 в 17:03.
goto ∞ вне форума Ответить с цитированием
Старый 26.08.2017, 18:29   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от goto ∞ Посмотреть сообщение
Ну вот сделал, только я мало чего пока понимаю как это будет работать вместе.
Вы же должны были сделать очередь потоков, а не отдельно массив потоков и очередь. Да и где здесь функция удаления потока из очереди?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
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