Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Runinterface
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
1

Программная реализация простого бесприоритетного планировщика потоков

01.09.2017, 00:13. Просмотров 1121. Ответов 48
Метки нет (Все метки)

Программная реализация простого бесприоритетного планировщика потоков.

Исходные данные:
- возможные состояния потоков: выполнение, ожидание, блокировка
- отрабатываемые события: создание нового потока, завершение активного потока, завершение кванта времени у активного потока, блокирование потока, разблокирование потока
- основная структура данных: массив дескрипторов потоков с двумя полями - идентификатор потока, состояние потока
- массив реализует простейшую очередь со сдвигом элементов при удалении
- язык реализации - любой по выбору: C/C++, C#, Java, Pascal/Delphi

Я прислал преподу код: с реальным созданием потоков.

Вот что ответил перепод:
"Нет, это совсем не то что требуется. Реальные потоки создавать не надо, достаточно продемонстрировать работу основной структуры - очереди потоков на основе массива. Программа должна отрабатывать с помощью простейшего меню все 5 событий, показывая состояние очереди после отработки каждого события. "

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

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2017, 00:13
Ответы с готовыми решениями:

Программная реализация очереди
Друзья, подскажите, почему не правильно работает программа, ругается на функцию...

Программная реализация номограммы
Сейчас пишу одну модель программно, в нее входят разные формулы для ее расчета,...

Программная реализация древесной сортировки
Программная реализация древесной сортировки Указания: - использовать...

Программная реализация алгоритма Khufu
Люди,не могу найти программную реализацию по алгоритму khufu мб знает кто как...

Программная реализация задач на множествах
Здравствуйте! помогите пожалуйста написать задачу в С++ на тему :Программная...

48
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 00:39 2
О, еще один. С пояснениями преподавателя я кажется понял пропасть между тем что под "планировщиком потоков" понимаю я и что понимает автор задачи. Ну, судя по тому что эту задачу тут уже минимум в третий раз поминают, не я один не врубаюсь что там в условиях понаписали. Перевод с авторского на человеческий:

Есть у нас некоторые воображаемые потоки, которые могут запускаться, завершаться и приостанавливаться по истечению кванта времени. Обрабатывает их столь же воображаемый планировщик потоков. Сделайте программу которая показывает в каком состоянии будут потоки после того как их запустили, завершили, приостановили, etc. Ну и меню в котором можно выбрать что с потоками приключилось.
0
Runinterface
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
01.09.2017, 00:42  [ТС] 3
Я если честно вообще фиг знает, как это реализовать, можешь помочь написать?
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 00:48 4
Дальше сами. И да, то что нужно именно это - лишь моя догадка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
struct Thread
{
    Thread(int _ID,const std::string&_status):ID(_ID),status(_status){}
    int ID;
    std::string status;
};
 
int main()
{
    int freeID=0;
    std::vector<Thread> threadList;
    while(true)
    {
        for(auto&thread:threadList)
            std::cout<<thread.ID<<" "<<thread.status<<std::endl;
        std::cout<<std::endl;
 
        int x;
        std::cin>>x;
        switch(x)
        {
        case 0:
            threadList.emplace_back(freeID++,"запущен");
            break;
        }
    }
    return 0;
}
1
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 10:55 5
Runinterface, У меня тоже такая же бредовая задача, в точь в точь

Вот подобие имитации, а вот как эмулировать Создание потока, Завершение кваната, вообще не понятно.
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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;
        ck1,ck2:Boolean;
        Thead:descriptor;
        
        
        Procedure IqueInit;
begin
qnext := 0; qindex := qnext;
qlength:=0;
end;
 
  function queadd(eque : descriptor):boolean;
  begin
    queadd := true;
    if qlength <> MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
       inc(qlength);
       if qnext = MAX then qnext := 0;
      end
    else queadd := false;
  end;
 
  function quedel(eque : descriptor):boolean;
  begin
    if qlength > 0 then
     begin
       inc(qindex);
       if qindex = MAX then qindex := 0;
       dec(qlength);
       quedel := true;
     end else quedel := false;
  end;
 
 
begin
qnext := 0; qindex := qnext;
qlength := 0;
end.
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 11:44 6
Цитата Сообщение от EpicSR Посмотреть сообщение
Вот подобие имитации, а вот как эмулировать Создание потока, Завершение кваната, вообще не понятно.
Создание потока - по нажатию кнопочки "создать поток", добавляем в массив запись о новом потоке. Все.
Завершение кванта - по нажатию кнопочки "квант завершен" берем запись о активном потоке и меняем статус на "неактивен". А следующему в списке потоку ставим статус "активен".
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 11:58 7
Цитата Сообщение от Renji Посмотреть сообщение
Создание потока - по нажатию кнопочки "создать поток", добавляем в массив запись о новом потоке.
То есть она добавляется новый поток в очередь из потоков основанный на массиве? А если место в очереди(в массиве) нету место то не добавляет?
Попробую расписать в паскале, потом отпишусь тут
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 12:06 8
Цитата Сообщение от EpicSR Посмотреть сообщение
То есть она добавляется новый поток в очередь из потоков основанный на массиве? А если место в очереди(в массиве) нету место то не добавляет?
Ну, у Винды действительно стоит ограничение на 2048 потоков. Кто хочет больше - идет лесом. Можно вместо этого взять "резиновые" массивы типа вектора, но зачем?
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 12:28 9
У меня тут опять непонятки возникли. Чем отличается завершение потока и завершение кванта у активного потока. В реальном времени нельзя же отследить сколько у него времени осталось
Думаю нужно цикл открывать, и если во время цикла нажать кнопку "отобрать квант времени" то завершить цикл. Ну такой бред задание..
0
Runinterface
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
01.09.2017, 12:38  [ТС] 10
Скинь пожалуйста код который у тебя получится.
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 12:43 11
Цитата Сообщение от EpicSR Посмотреть сообщение
У меня тут опять непонятки возникли. Чем отличается завершение потока и завершение кванта у активного потока. В реальном времени нельзя же отследить сколько у него времени осталось
Вам как работает многозадачность вообще объясняли?
Завершение потока - поток все что ему надо посчитал и домой пошел. Больше он место в очереди не занимает.
Завершение кванта времени - у планировщика зазвенел будильник и он выгнал активный поток в конец очереди. Поток все еще в очереди, но уже ничего не считает, очереди ждет. Вот собственно здесь IRL и нужны прерывания. На них "будильник" висит.
Есть еще третий вариант - поток стоит в сторонке и ждет события "когда Петька придет". Но от вас такое моделировать не требуют.
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 12:56 12
Цитата Сообщение от Renji Посмотреть сообщение
Завершение потока - поток все что ему надо посчитал и домой пошел. Больше он место в очереди не занимает.
Завершение кванта времени - у планировщика зазвенел будильник и он выгнал активный поток в конец очереди. Поток все еще в очереди, но уже ничего не считает, очереди ждет. Вот собственно здесь IRL и нужны прерывания. На них "будильник" висит.
Есть еще третий вариант - поток стоит в сторонке и ждет события "когда Петька придет". Но от вас такое моделировать не требуют.
Я об этом и говорю, что бы эмулировть квант времени нужно цикл открывать
1
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 20:22 13
Лучший ответ Сообщение было отмечено Runinterface как решение

Решение

Написал я свой индуский код, который эмулирует асбтрактный поток
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Program Potok2;
 
  type
    descriptor = record
         id : integer;
         status : integer;  {0 - runs, 1 - wait,  2 - blok}
    end;
 
const MAX = 4;
const kvant = 5000;
const astat : array [0..2] of string = ('runs', 'wait', 'blok');
 
 
var
        que : array [0..MAX-1]of descriptor;
        i, qnext, qindex, qlength : integer;
        Thead:descriptor;
        func : integer;
        id : integer;
    point : integer;
    temp : integer;
    ch : integer;
 
    Procedure IqueInit;
     begin
      qnext := 0; qindex := qnext;
      qlength:=0;
     end;
 
  function queadd(eque : descriptor):boolean;
  begin
    queadd := true;
    if qnext < MAX then
      begin
       que[qnext] := eque;
       inc(qnext);
      end
    else queadd := false;
  end;
 
  function quedel(eque : integer):boolean;
  begin
    if  qnext = 0 then quedel := false
 
      else   begin
                for i := eque to qlength-2 do
                   que[i] := que[i+1];
             dec(qnext);
                   dec(qlength);
             quedel := true;
             end;
  end;
 
begin
    IqueInit;
    {Заполняем очередь потоков со статусами ожидание}
    for i := 0 to MAX-1 do
        begin
         Thead.id := i;
         Thead.status := 1;
         queadd(Thead);
         inc(qlength);
        end;
        que[0].status := 0; {Первый который в очереди статус - 0 (выполнение)}
        point := 0;
    ch := 0;
    repeat
      for i := 0 to qlength-1 do
                begin
        write('PoTok [', que[i].id, ']  CTaTyC[', astat[que[i].status],']');
                  if point = i then write(' <---- ');
                writeln;
            end;
 
      writeln('Bb|bePuTE DeuCTBuE');
      writeln('1 - Co3DaHue Potoka |  2 - 3aBePIIIeHuE PoToKa | 3 - 3akoH4uT KBaHT | ');
      writeln('4 - bLoKuPoBaTb | 5 - Pa3bLoKuPoBaTb | 6 - Exit');
      readln(func);
      case func of
        1 : begin
           Thead.id := ch;
           Thead.status := 1;
                if not queadd(Thead) then writeln('-----------> HeT MeCT<----------')
                else
                begin
                      inc(qlength); inc(ch);
                      if qlength = 1 then  que[point].status := 0;
                end;
 
          if ch=4 then ch := 0;
          end;
 
      2 : begin temp := que[point].id;
                if not quedel(point) then writeln('----------> o4ePeDb PYcTa <---------')
                else
                   begin
                       writeln('-----> PoToK c id =', temp,' 3aBeP|||eH <-------');
                       if que[point].status <> 3 then que[point].status := 0;
                   end;
          end;
 
      3 : begin
              if qlength > 0 then
               begin
                 if que[point].status <> 2 then que[point].status := 1;
                 inc(point); if point = qlength then point := 0;
                 if que[point].status <> 2 then que[point].status := 0
               end else writeln('--------> o4ePeDb PYcTa<-------');
          end;
 
      4 : begin
              if qlength <> 0 then
                    que[point] .status := 2
                    else writeln('------------> o4ePeDb PYcTa <---------')
          end;
      5 : begin
                 if qlength <> 0 then
                  begin   if que[point].status = 2 then
                                          que[point].status := 1;
                  end
                 else writeln('-----------> o4ePeDb PYcTa <----------')
          end;
    end;
 
 
  until func = 6;
 
end.



Написал в Турбо Паскаль под доc, под виндовс что то не хотел компилироваться. Так что запустить можно из DOS BOX

Есть конечно огрехи, например из состояния блокировка нельзя перейти в состояние RUN, можно только закончить квант потом обратно вернувшись она будет в состояние ожидания, и потом она сама запустится.
1
Миниатюры
Программная реализация простого бесприоритетного планировщика потоков  
Вложения
Тип файла: rar POTOK.rar (2.9 Кб, 7 просмотров)
Runinterface
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
01.09.2017, 20:30  [ТС] 14
Спасибо за ответ, посмотрю..надеюсь это подойдет.
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 20:34 15
Цитата Сообщение от Runinterface Посмотреть сообщение
Спасибо за ответ, посмотрю..надеюсь это подойдет.
Подожди, у меня тоже такая же задача. Не копируй её пока что. Мне тоже надо преподу сдавать на проверку ) Потом если пойдет изменим кое что!
0
Runinterface
0 / 0 / 0
Регистрация: 20.12.2016
Сообщений: 16
01.09.2017, 20:36  [ТС] 16
Окей хорошо))
Надеюсь все ок будет)
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 20:38 17
Цитата Сообщение от EpicSR Посмотреть сообщение
Написал я свой индуский код, который эмулирует асбтрактный поток
Там ввод point никуда не потерялся? А то я чего-то не вижу как предлагается выбирать какой поток прибить/приостановить.
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 20:45 18
point это указатель, она указывает на какой элементы массива (очереди) указывает воображаемый процессор.
При запуске программы она указывает на первый поток который стоит в очереди(на скриншоте стрелка) На следующйи поток можно перейти только, когда отбираем время квант и point увеличиться на единицу(указывать на следующий элемент очереди. Как то так.
0
Renji
2123 / 1561 / 476
Регистрация: 05.06.2014
Сообщений: 4,523
01.09.2017, 20:50 19
Цитата Сообщение от EpicSR Посмотреть сообщение
При запуске программы она указывает на первый поток который стоит в очереди(на скриншоте стрелка) На следующйи поток можно перейти только, когда отбираем время квант и point увеличиться на единицу(указывать на следующий элемент очереди. Как то так.
Это все конечно замечательно, но что делать если я хочу прибить поток находящийся в середине очереди? Я уж не знаю подразумевал ли это автор задачи, но IRL блокировать/прибивать можно любой поток, а не только активный.
0
EpicSR
8 / 2 / 2
Регистрация: 29.01.2016
Сообщений: 101
01.09.2017, 20:57 20
Ну для этого нужно перейти командой "Закончить Квант" на требуемый поток, и можно завершить командой "Завершить поток", хоть в середине. И она из очереди удаляется, ну можно изменить её состояние на ожидание или блокировать.
Не пробовал запустить программу? , там все понятно станет. Или компилировать исходник в турбопаскале и посмотреть
0
01.09.2017, 20:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2017, 20:57

Программная реализация асимметричного алгоритма RSA
Помогите в написании программной реализации асимметричного алгоритма RSA в...

Реализация планировщика с тремя состояниями, где величина кванта зависит от приоритета процесса, приоритет можно повысить или понизить
Реализация планировщика с тремя состояниями, где величина кванта зависит от...

Организация кольцевого буфера. Программная реализация монитора
Ребят помогите решить задание по параллельному программированию, завтра уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru