Головна

Приклад 8.1. Кооперативний перемикач потоків

  1.  API Інтерфейс Windows на прикладі Visual Basic ver 6.0
  2.  Drupal: практичні приклади
  3.  IV. Приклади конкретних застосувань
  4.  IV. Приклади конкретних застосувань
  5.  IV. Приклади конкретних застосувань
  6.  IV. Приклади конкретних застосувань
  7.  IV. Приклади конкретних застосувань

Thread * thread_queue_head;
 Thread * thread_queue_tail;
 Thread * current_tread;
 Thread * old__thread;
 void TaskSwitch () {old_thread = current_thread; add_to_queue_tail (current_thread); current_thread = get_from_queue_head (); asm {.
 move bx, old_thread
 push bp
 move ax, sp
 move thread_sp [bx], ax
 move bx, current_thread
 move ax, rhread_sp [bx]
 pop bp
}
 return;
}

Якщо система програмування передбачає, що при виконанні функції повинні зберігатися певні регістри (як, наприклад, С-компілятори для х86 зберігають при викликах регістри SI и DI (ESI / EDI в 1386)), то вони також зберігаються в стеку. Тому запропонований нами варіант також буде автоматично зберігати і відновлювати всі необхідні регістри.
 Зрозуміло, що крім покажчиків стека і стекового кадру, struct Thread повинна містити ще деякі поля. Як мінімум, вона повинна містити покажчик на наступну активну нитку. Система повинна зберігати покажчики на описувач поточної нитки і на кінець списку. При цьому ThreadSwitch переставляє поточну нитку в кінець списку, а поточної робить наступну за нею в списку. Все знову активізуються нитки також ставляться в кінець списку. При цьому список не зобов'язаний бути двонаправленим, адже ми витягуємо елементи тільки з початку, а додаємо тільки в кінець.
 Часто в літературі такий список називають чергою ниток (thread queue) або чергою процесів. Така чергу присутній у всіх відомих автору реалізаціях багатозадачних систем. Крім того, черги ниток використовуються і при організації черг очікування різних подій, наприклад, при реалізації семафорів Дейкстри.
 Планувальник, заснований на Threadswitch, Т. Е. На принципі перемикання з ініціативи активної нитки, використовується в ряді експериментальних і навчальних систем. Цей же принцип, званий кооперативної багатозадачністю, Реалізований в бібліотеках мов Simula 67 і Modula-2. MS Windows 3.x також мають засіб для організації кооперативного перемикання завдань - системний виклик GetNextEvent.
 Часто кооперативні нитки називають не нитками, а співпрограмами - Адже вони викликають один одного, подібно підпрограм. Єдина відмінність такого виклику від виклику процедури полягає в тому, що такий виклик не ие-рархічен - викликана програма може знову передати управління вихідної і залишитися при цьому активною.
 Основною перевагою кооперативної багатозадачності є простота налагодження планувальника. Крім того, знімаються всі колізії, пов'язані з критичними секціями і тому подібними труднощами - адже нитка може просто не віддавати нікому управління, поки не буде готова до цього.
 З іншого боку, кооперативна багатозадачність має і серйозні недоліки.
 По-перше, необхідність включати в програму виклики Threadswitch ускладнює програмування взагалі і перенесення програм з однозадачних чи інакше організованих багатозадачних систем зокрема.
 Особливо неприємно вимога регулярно викликати Threadswitch для обчислювальних програм. Найчастіше такі програми виконують відносно короткий внутрішній цикл, швидкість роботи якого визначає швидкість всієї програми. Для "плавної" багатозадачності необхідно викликати Threadswitch з тіла цього циклу. Робити виклик на кожному кроці Циклу недоцільно, тому необхідно буде написати код, схожий на наведений в прикладі 8.2.




 Приклад 4.2. Приклад послідовності запитів пам'яті 1 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 2 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 3 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 4 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 5 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 6 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 7 сторінка |  Приклад 4.2. Приклад послідовності запитів пам'яті 8 сторінка |  Приклад 7.1. Наївна реалізація взаємного виключення на основі прапора змінної |  Приклад 7.6. Обхід помилки втраченого пробудження |

© 2016-2022  um.co.ua - учбові матеріали та реферати