Тема    Тема 7. Передача повідомлень між процесами. Міжпроцеснасинхронізація. Система "Виробник-Споживач"Запитання  ...

Информация о документе:

Дата добавления: 15/02/2016 в 06:24
Количество просмотров: 14
Добавил(а): Аноним
Название файла: tema_nbsp_nbsp_tema_7_peredacha_pov_domlen_m_zh_pr.docx
Размер файла: 20 кб
Рейтинг: 0, всего 0 оценок

Тема    Тема 7. Передача повідомлень між процесами. Міжпроцеснасинхронізація. Система "Виробник-Споживач"Запитання  ...

Тема    Тема 7. Передача повідомлень між процесами. Міжпроцесна
синхронізація. Система "Виробник-Споживач"
Запитання       Тип:1   Взаємодіючими називають процеси, які використовують


Запитання       Тип:1   Незалежними називають процеси, які використовують

Запитання       Тип:1   Чи може комп'ютер виконувати кілька процесів в
конкурентному режимі (в режимі розділювання часу одного процесора між
багатьма задачами - concurrently)?

Запитання       Тип:1   Чи може комп'ютер з одним центральним процесором та
ядром виконувати кілька процесів паралельно, тобто неконкурентно (не
розділяючи час), одночасно?

Запитання       Тип:1   Яким чином комп'ютер може виконувати кілька процесів
одночасно (конкурентно, але не паралельно)?

Запитання       Тип:1   Конкуруючі процеси (concurrent processes) це ті, що
виконуються на

Запитання       Тип:1   Коли процеси можна назвати взаємодіючими?

Запитання       Тип:1   За яких обставин можливе пришвидшення обробки даних?

Запитання       Тип:1   Збільшення швидкості розв'язання задачі обробки даних
вимагає, щоб її виконували

Запитання       Тип:1   З якою метою деякі операційні системи організовано у
вигляді множини взаємодіючих процесів (модулів), наприклад, сервісів у
Windows?

Запитання       Тип:1   Яким чином операційна система забезпечує захист
адресного простору процесу, так, що жоден інший процес не може
пошкодити його дані або код?

Запитання       Тип:1   Яким чином операційна система забезпечує захист
адресного простору процесу, так, що жоден інший процес не може
пошкодити його дані або код?

Запитання       Тип:1   Коли один процес повинен передати повідомлення іншому
через спільну пам'ять, то він має

Запитання       Тип:1   Необмежений буфер (unbounded buffer) - це буфер, який

Запитання       Тип:1   Обмежений буфер (bounded buffer) - це буфер, який

Запитання       Тип:1   Синхронна передача повідомлень - це тоді, коли відправник

Запитання       Тип:1   Асинхронна передача повідомлень - це тоді, коли відправник

Запитання       Тип:1   Симетрична адресація в прямому зв'язку передбачає, що

Запитання       Тип:1   Асиметрична адресація в прямому зв'язку передбачає, що

Запитання       Тип:1   Передача повідомлень з автоматичною буферизацією

Запитання       Тип:1   Передача повідомлень без буферизації

Запитання       Тип:1   Передача повідомлень з непрямою адресацією передбачає, що

Запитання       Тип:1   Передача повідомлень з прямою адресацією передбачає, що

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює одиниці. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 2: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює нулю. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 2: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює двом. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 2: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює одиниці. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 1: ReleaseSemaphore(h1)
Потік 2: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює одиниці. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 2: ReleaseSemaphore(h1)
Потік 1: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор відкритого семафору. Поточне
значення семафора дорівнює нулю. Нехай ReleaseSemaphore - функція
збільшення значення семафора на одиницю, а WaitForSingleObject -
функція зменшення значення семафора на одиницю, r1, r2 - локальні
змінні потоків, A, B - змінні, що спільно використовуються двома
потоками. На початку А=B=0.
Що відбудеться після виконання потоками наступної послідовності операторів?
Потік 1: int r2 = A;
Потік 2: int r1 = B;
Потік 1: WaitForSingleObject(h1)
Потік 2: ReleaseSemaphore(h1)
Потік 1: r2 += 10;
Потік 1: WaitForSingleObject(h1)

Запитання       Тип:1   Нехай h1 - дескриптор вільного м'ютекса, який колись
був зайнятий потоком t1. Потік t2 намагається виконати операцію
блокування м'ютекса h1 за допомогою системного виклику lock(h1). Після
виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Потік t2 намагається виконати операцію блокування м'ютекса h1 за
допомогою системного виклику lock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Потік t2 знаходиться у черзі очікувачів на м'ютекс h1. Потік t1
намагається виконати операцію розблокування м'ютекса h1 за допомогою
системного виклику unlock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 складається з лише одного потоку -
t2. Потік t1 намагається виконати операцію розблокування м'ютекса h1
за допомогою системного виклику unlock(h1). Після виконання цього
виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 порожня. Потік t2 намагається
виконати операцію розблокування м'ютекса h1 за допомогою системного
виклику unlock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 порожня. Потік t2 намагається
виконати операцію блокування м'ютекса h1 за допомогою системного
виклику lock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор вільного м'ютекса. Черга
очікувачів на м'ютекс h1 порожня. Потоки t1 та t2 одночасно
намагаються виконати операцію блокування м'ютекса h1 за допомогою
системного виклику lock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 порожня. Потоки t2 та t3 одночасно
намагаються виконати операцію блокування м'ютекса h1 за допомогою
системного виклику lock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 порожня. Потоки t2 та t3 одночасно
намагаються виконати операцію розблокування м'ютекса h1 за допомогою
системного виклику unlock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 складається з двох потоків: t2 та
t3. Потік t1 виконує операцію розблокування м'ютекса h1 за допомогою
системного виклику unlock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор м'ютекса, що зайнятий потоком
t1. Черга очікувачів на м'ютекс h1 складається з двох потоків: t2 та
t3. Потік t4 виконує операцію блокування м'ютекса h1 за допомогою
системного виклику lock(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор автоматичної події. Черга
очікувачів на подію h1 складається з двох потоків: t1 та t2. Потік t3
виконує операцію сигналізування події h1 за допомогою системного
виклику notify(h1) або PulseEvent(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор автоматичної події. Черга
очікувачів на подію h1 порожня. Потік t1 виконує операцію
сигналізування події h1 за допомогою системного виклику notify(h1) або
PulseEvent(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор семафора. Черга очікувачів на h1
- порожня. Потік t1 виконує операцію підняття семафора h1 за допомогою
системного виклику up(h1) або ReleaseSemaphore(h1). Після виконання
цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор автоматичної події. Черга
очікувачів на подію h1 складається з одного потоку - t2. Потік t1
виконує операцію очікування події h1 за допомогою системного виклику
wait(h1) або WaitForSingleObject (h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор автоматичної події. Черга
очікувачів на подію h1 складається з одного потоку - t2. Потік t1
виконує операцію сигналізування події h1 за допомогою системного
виклику nofity(h1) або PulseEvent (h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор ручної події. Черга очікувачів
на подію h1 складається з двох потоків: t1 та t2. Потік t3 виконує
операцію сигналізування події h1 за допомогою системного виклику
notify(h1) або PulseEvent(h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор ручної події. Черга очікувачів
на подію h1 складається з двох потоків: t1 та t2. Потік t3 виконує
операцію очікування події h1 за допомогою системного виклику wait(h1)
або WaitForSingleObject (h1). Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор семафора, стан якого дорівнює
нулю. Черга очікувачів на h1 - порожня. Потік t1 виконує операцію
підняття семафора h1 за допомогою системного виклику up(h1) або
ReleaseSemaphore(h1). Після виконання цього виклику синхронізаційний
об'єкт h1 збільшує змінну свого стану N на одиницю, тобто N=1. Це дає
змогу

Запитання       Тип:1   Нехай h1 - дескриптор семафора, стан якого дорівнює
нулю. Черга очікувачів на h1 складається з двох потоків: t2 та t3.
Потік t1 виконує операцію опускання семафора h1 за допомогою
системного виклику down(h1) або WaitForSingleObject (h1). Виконання
цього виклику дає змогу

Запитання       Тип:1   Нехай h1 - дескриптор семафора, стан якого дорівнює
нулю. Черга очікувачів на h1 складається з двох потоків: t2 та t3.
Потік t1 виконує операцію підняття семафора h1 за допомогою системного
виклику up(h1) або ReleaseSemaphore(h1), що змінює його стан на
одиницю. Після виконання цього виклику

Запитання       Тип:1   Нехай h1 - дескриптор семафора, стан якого дорівнює
нулю. Черга очікувачів на h1 складається з двох потоків: t2 та t3.
Потік t1 двічі виконує операцію підняття семафора h1 за допомогою
системного виклику up(h1) або ReleaseSemaphore(h1), кожен з яких
змінює його стан на одиницю, тобто в сумі на два. Після виконання цих
викликів

Запитання       Тип:1   Нехай h1 - дескриптор семафора, стан якого дорівнює
нулю. Черга очікувачів на h1 - порожня. В системі функціонують три
потоки: t1, t2 та t3. Потік t1 виконує операцію підняття семафора h1
за допомогою системного виклику up(h1) або ReleaseSemaphore(h1), що
змінює його стан на одиницю. Після виконання цього виклику

Запитання       Тип:1   Неатомарність запису довгих типів даних (long, double,
long double) може призвести до того, що операція прочитання довгої
змінної при одночасній її модифікації іншим потоком може завершитися

Запитання       Тип:1   Відсутність машинної інструкції запису в однобайтову
комірку оперативної пам'яті, може спричинити в багатопотокових
програмах

Запитання       Тип:1   Нехай потік 1 виконує метод з наступними операторами:
while (!this->done)
   Sleep(1000);
В той же час потік 2 виконує метод з такими операторами:
for (unsigned long i=0; i<N; i++)
   compute (i);
this->done = true;
Причому в обох фрагментах this - це посилання на один і той же самий
об'єкт, булеве поле done на початку виконання методів дорівнює false.
В якому випадку цикл потоку 1 може не зупинитися після виконання всіх
операторів потоку 2?

Запитання       Тип:1   Нехай run_threads одночасно запускає на виконання два
потоки, що виконують код функцій, заданих її аргументами. Тоді,
розглянувши код нижченаведеної програми, скажіть чи може функція th1
надрукувати у стандартний вивід "131"?
class A{
        public:
        /* volatile */ int x;
        A(){
                x=1;
        }
};
A p;
void th1(){
        A& r1 = p;
        int r2 = r1.x;
        int r3 = p.x;
        int r4 = r1.x;
        cout << r2 << r3 << r4 << endl;
}
void th2(){
        A& r5 = p;
        int i = 0;
        r5.x = 3;
}
int main(){
        run_threads(th1, th2);
        return 0;
}

Запитання       Тип:1   Нехай run_threads одночасно запускає на виконання два
потоки, що виконують код функцій, заданих її аргументами. Тоді,
розглянувши код нижченаведеної програми, скажіть чи може функція th1
надрукувати у стандартний вивід "131"?
class A{
        public:
        volatile int x;
        A(){
                x=1;
        }
};
A p;
void th1(){
        A& r1 = p;
        int r2 = r1.x;
        int r3 = p.x;
        int r4 = r1.x;
        cout << r2 << r3 << r4 << endl;
}
void th2(){
        A& r5 = p;
        int i = 0;
        r5.x = 3;
}
int main(){
        run_threads(th1, th2);
        return 0;
}

Тема    Об'єкт синхронізації "Монітор"
Запитання       Тип:1   Нехай монітор реалізовано за допомогою наступного С++
коду для ОС Windows:
#define _WIN32_WINNT 0x0400
#include <winbase.h>
class Monitor{
        HANDLE mutex,event;
public:
        Monitor(){
                mutex = CreateMutex (NULL, FALSE,NULL);
                event = CreateEvent (NULL, FALSE,FALSE,NULL);
        }
        void lock(){
                WaitForSingleObject (mutex, INFINITE);
        }
        void unlock(){
                ReleaseMutex(mutex);
        }
        void wait(){
                SignalObjectAndWait (mutex, event, INFINITE,FALSE);
                lock();
        }
        void notify(){
                PulseEvent(event);
        }
};
Що відбувається при виклику методу wait()?

Запитання       Тип:1   Нехай монітор реалізовано за допомогою наступного С++
коду для ОС Windows:
#define _WIN32_WINNT 0x0400
#include <winbase.h>
class Monitor{
        HANDLE mutex,event;
public:
        Monitor(){
                mutex = CreateMutex (NULL, FALSE,NULL);
                event = CreateEvent (NULL, FALSE,FALSE,NULL);
        }
        void lock(){
                WaitForSingleObject (mutex, INFINITE);
        }
        void unlock(){
                ReleaseMutex(mutex);
        }
        void wait(){
                SignalObjectAndWait (mutex, event, INFINITE,FALSE);
                lock();
        }
        void notify(){
                PulseEvent(event);
        }
};
Що відбувається при виклику методу notify()?

Запитання       Тип:1   Нехай монітор реалізовано за допомогою наступного С++
коду для ОС Windows:
#define _WIN32_WINNT 0x0400
#include <winbase.h>
class Monitor{
        HANDLE mutex,event;
public:
        Monitor(){
                mutex = CreateMutex (NULL, FALSE,NULL);
                event = CreateEvent (NULL, FALSE,FALSE,NULL);
        }
        void lock(){
                WaitForSingleObject (mutex, INFINITE);
        }
        void unlock(){
                ReleaseMutex(mutex);
        }
        void wait(){
                SignalObjectAndWait (mutex, event, INFINITE,FALSE);
                lock();
        }
        void notify(){
                PulseEvent(event);
        }
};
Що відбувається при виклику методу lock()?

Запитання       Тип:1   Нехай монітор реалізовано за допомогою наступного С++
коду для ОС Windows:
#define _WIN32_WINNT 0x0400
#include <winbase.h>
class Monitor{
        HANDLE mutex,event;
public:
        Monitor(){
                mutex = CreateMutex (NULL, FALSE,NULL);
                event = CreateEvent (NULL, FALSE,FALSE,NULL);
        }
        void lock(){
                WaitForSingleObject (mutex, INFINITE);
        }
        void unlock(){
                ReleaseMutex(mutex);
        }
        void wait(){
                SignalObjectAndWait (mutex, event, INFINITE,FALSE);
                lock();
        }
        void notify(){
                PulseEvent(event);
        }
};
Що відбувається при викли