69304

Керування процесами у Windows XP

Лекция

Информатика, кибернетика и программирование

Поняття процесу й потоку у Windows XP чітко розмежовані. Процеси в даній системі визначають «поле діяльності» для потоків, які виконуються в їхньому адресному просторі. Серед ресурсів, з якими процес може працювати прямо, відсутній процесор - він доступний тільки потокам цього процесу.

Украинкский

2014-10-03

98.5 KB

12 чел.

Лекція № 8

Тема: Керування процесами у Windows XP

План

  1.  Складові елементи процесу
  2.  Структури даних процесу
  3.  Створення процесів і завершення процесів
  4.  Процеси і ресурси. Таблиця об’єктів процесу
  5.  Програмний інтерфейс керування процесами Win32 АРІ
  6.  Складові елементи потоку
  7.  Структури даних потоку
  8.  Створення потоків
  9.  Особливості програмного інтерфейсу потоків

Поняття процесу й потоку у Windows XP чітко розмежовані. Процеси в даній системі визначають «поле діяльності» для потоків, які виконуються в їхньому адресному просторі. Серед ресурсів, з якими процес може працювати прямо, відсутній процесор - він доступний тільки потокам цього процесу. Процес, проте, може задати початкові характеристики для своїх потоків і тим самим вплинути на їхнє виконання.

Складові елементи процесу

Розглянемо базові складові елементи процесу.

Адресний простір процесу складається з набору адрес віртуальної пам'яті, які він може використати. Ці адреси можуть бути пов'язані з оперативною пам'яттю, а можуть — з відображеними у пам'ять ресурсами. Адресний простір процесу недоступний іншим процесам.

Процес володіє системними ресурсами, такими як файли, мережні з'єднання, пристрої введення-виведення, об'єкти синхронізації тощо.

Процес містить деяку стартову інформацію для потоків, які в ньому створюватимуться. Наприклад, це інформація про базовий пріоритет і прив'язання до процесора.

♦ Процес має містити хоча б один потік, який система скеровує на виконання. Без потоків у Windows XP наявність процесів неможлива.

Структури даних процесу

Розглянемо структури даних, пов'язані із процесом у Windows XP. Зазначимо, що у роботі з цими структурами система використовує об'єктну модель. Для виконавчої системи Windows XP кожний процес зображається об'єктом-процесом виконавчої системи (executive process object); його також називають керуючим блоком процесу (executive process block, EPROCESS). Для ядра системи процес зображається об'єктом-процесом ядра (kernel process object), його також називають блоком процесу ядра (process kernel block, KPROCESS).

У режимі користувача доступним є блок оточення процесу (process environment block, РЕВ), що перебуває в адресному просторі цього процесу.

Розглянемо структури даних процесу докладніше. Зазначимо, що EPROCESS і KPROCESS, на відміну від РЕВ, доступні тільки із привілейованого режиму.

Керуючий блок процесу містить такі основні елементи:

♦  блок процесу ядра (KPROCESS);

ідентифікаційну інформацію;

інформацію про адресний простір процесу (її структуру розглянемо в розділі 9);

інформацію про ресурси, доступні процесу, та обмеження на використання цих ресурсів;

♦ блок оточення процесу (РЕВ); +  інформацію для підсистеми безпеки. До ідентифікаційної інформації належать:

ідентифікатор процесу (pid);

ідентифікатор процесу, що створив цей процес (незважаючи на те, що Windows ХР не підтримує відносини «предок-нащадок» автоматично, вони можуть бути задані програмним шляхом, тобто нащадок може сам призначити собі предка, задавши цей ідентифікатор);

ім'я завантаженого програмного файла.

Блок процесу ядра містить усю інформацію, що належить до потоків цього процесу:

♦  покажчик на ланцюжок блоків потоків ядра, де кожний блок відповідає потоку;

♦ базову інформацію, необхідну ядру системи для планування потоків (ця інформація буде успадкована потоками, пов'язаними із цим процесом; її буде розглянуто в розділі 4).

Блок оточення процесу містить інформацію про процес, яка призначена для доступу з режиму користувача:

♦ початкову адресу ділянки пам'яті, куди завантажився програмний файл;

♦ покажчик на динамічну ділянку пам'яті, доступну процесу.

Цю інформацію може використати завантажувач програм або процес підсистеми Win32.

Створення процесів

У Win32 АРІ прийнято модель запуску застосування за допомогою одного виклику, який створює адресний простір процесу і завантажує в нього виконуваний файл. Окремо функціональність fork() і exec() у цьому АРІ не реалізована.

Такий виклик реалізує функція CreateProcess(). Вона не є системним викликом ОС — це бібліотечна функція Win32 АРІ, реалізована в усіх Win32-сумісних системах.

Функція CreateProcess() потребує задання 10 параметрів, докладно їх буде розглянуто в розділі 3.9.6. Зазначимо, що системні виклики UNIX/POSIX потребують меншої кількості параметрів (як уже зазначалося, fork () не використовує жодного параметра, а ехес() — використовує три параметри).

Наведемо основні кроки створення нового процесу із використанням функції CreateProcess(). 1. Відкривають виконуваний файл, що його ім'я задане як параметр. При цьому ОС визначає, до якої підсистеми середовища він належить. Коли це виконуваний файл Win32, то його використовують прямо, для інших підсистем відшукують необхідний файл підтримки (наприклад, процес підсистеми POSIX для POSIX-застосувань).

2. Створюють об'єкт-процес у виконавчій системі Windows XP. При цьому виконують такі дії:

а) створюють та ініціалізують структури даних процесу (блоки EPROCESS,KPROCESS, РЕВ);

б) створюють початковий адресний простір процесу (роботу з адресним простором процесу розглянемо в розділі 9);

в) блок процесу поміщають у кінець списку активних процесів, які підтримує система.

  1.  Створюють початковий потік процесу. Послідовність дій під час створення потоку розглядатимемо під час вивчення підтримки потоків у Windows XP.
  2.  Після створення початкового потоку підсистемі Win32 повідомляють про новий процес і його початковий потік. Це повідомлення містить їхні дескриптори (handles) — унікальні числові значення, що ідентифікують процес і потік для засобів режиму користувача. Підсистема Win32 виконує низку дій після отримання цього повідомлення (наприклад, задає пріоритет за замовчуванням) і поміщає дескриптори у свої власні таблиці процесів і потоків.
  3.  Після надсилання повідомлення розпочинають виконання початкового потоку (якщо він не був заданий із прапорцем відкладеного виконання).
  4.  Завершують ініціалізацію адресного простору процесу (наприклад, завантажують необхідні динамічні бібліотеки), після чого починають виконання завантаженого програмного коду.

Завершення процесів

У разі завершення процесу відповідний об'єкт-процес стає кандидатом на вилучення із системи. При цьому диспетчер об'єктів викликає метод delete для об'єктів-процесів, який закриває всі дескриптори в таблиці об'єктів цього процесу.

Процеси і ресурси. Таблиця об'єктів процесу

Кожен процес, як було показано в розділі 2, може користуватися ресурсами через дескриптори відповідних об'єктів. Відкриті дескриптори об'єктів є індексами в таблиці об'єктів (object table), що зберігається в керуючому блоці процесу. Ця таблиця містить покажчики на всі об'єкти, дескриптори яких відкриті процесом. Процес може отримати дескриптор об'єкта кількома способами:

створивши новий об'єкт;

відкривши дескриптор наявного об'єкта;

успадкувавши дескриптор від іншого процесу;

отримавши дублікат дескриптора з іншого процесу.

Кожен елемент таблиці об'єктів містить права доступу відповідного дескриптора і його режим спадкування, який визначає, чи отримають процеси, створені

розглядуваним процесом, копію дескриптора відповідного об'єкта. Режим спадкування задають під час створення об'єкта.

Об'єкт може одночасно бути використаний декількома процесами, при цьому кожен з них отримує унікальний дескриптор, що відповідає цьому об'єкту.

Програмний інтерфейс керування процесами Win32 АРІ

У цьому розділі ми вперше торкнемося практичних особливостей програмування у Win32 АРІ [31, 50]. Перш ніж перейти до основного матеріалу, зробимо кілька зауважень.

Насамперед слід звернути увагу на систему типів Win32 АРІ. Розробники цього АРІ для визначення типів широко застосовували синоніми імен типів, тому потрібно вміти знаходити в типах Win32 АРІ традиційні типи мови С. Виділимо деякі базові типи:

BOOL — його використовують для зберігання логічного значення, насправді він
є цілочисловим;

DWORD - двобайтовий цілочисловий тип без знака, аналог unsigned int;

HANDLE — цілочисловий дескриптор об'єкта;

LPTSTR - покажчик на рядок, що складається із двобайтових або однобайтових символів (залежно від режиму компіляції програми — із підтримкою Unicode або без неї), аналог char * або wchar_t *;

LPCTSTR - покажчик на константний рядок, аналог const char * або const wchar_t *

Взагалі для створення імені типу покажчика потрібно додати до імені базового типу префікс LP. Таке утворення імен траплятиметься й далі (наприклад, LPV0ID означає void *, LPSECURITY_ATTRIBUTES - покажчик на структуру SECURITY_ATTRIBUTES).

Для використання засобів Win32 АРІ у більшості випадків достатньо підключити заголовний файл wi ndows. h. Надалі підключення цього файла матиметься на увазі за замовчуванням.

Для закриття дескрипторів об'єктів буде використана API-функція СІ oseHandlе().

Створення процесів у Win32 АРІ

Як ми вже зазначали, для створення нового процесу у Win32 використовують функцію CreateProcessO.

BOOL CreateProcess ( LPCTSTR appjiame. LPCTSTR cmdjine,

LPSECURITY_ATTRIBUTES psa_proc. LPSECURITY_ATTRIBUTES psa_thr,

BOOL 1nherit_handles. DWORD flag_create.

LPVOID environ. LPTSTR curjjir,

LPSTARTUPINFO startupjnfo. LPPROCESSJNFORMATION processjnfo ):

де: appjiame - весь шлях до виконуваного файла (NULL - ім'я виконуваного файла можна отримати з другого аргументу):

CreateProcess("C:/winnt/notepad.exe". ...);

cmdj і пе - повний командний рядок для запуску виконуваного файла, можливо, із параметрами (цей рядок виконується, якщо appname дорівнює NULL, зазвичай так запускати процес зручніше):

CreateProcessCNULL. "C:/winnt/notepad test.txt", ...);

psa_proc, psa_thr — атрибути безпеки для всього процесу і для головного потоку (особливості їхнього задання розглянемо в розділах 11 і 18, а доти як значення всіх параметрів типу LPSECURITY_ATTRIBUTES задаватимемо NULL, що означає задання атрибутів безпеки за замовчуванням);

inheritjnandles — керує спадкуванням нащадками дескрипторів об'єктів, які використовуються у процесі (питання спадкування дескрипторів будуть розглянуті в розділах 11 і 13);

flag_create - маска прапорців, які керують створенням нового процесу (наприклад, прапорець CREATE_NEW_CONSOLE означає, що процес запускається в новому консольному вікні);

envi гоп — покажчик на пам'ять із новими змінними оточення, які предок може задавати для нащадка (NULL - нащадок успадковує змінні оточення предка);

cur_di r — рядок із новим значенням поточного каталогу для нащадка (NULL -нащадок успадковує поточний каталог предка);

startup_info — покажчик на заздалегідь визначену структуру даних типу STARTUPINFO, на базі якої задають параметри для процесу-нащадка;

process_info — покажчик на заздалегідь визначену структуру даних PR0CESS_ INFORMATION, яку заповнює ОС під час виклику CreateProcessO.

Серед полів структури STARTUPINFO можна виділити:

cb — розмір структури у байтах (це її перше за порядком поле). Звичайно перед заповненням всю структуру обнуляють, задаючи тільки cb:

STARTUPINFO si = { Sizeof(si) };

lpTitle — рядок заголовка вікна для нової консолі:

//  ... si обнуляеться

si.lpTitle = "Мій процес-нащадок";

Структура PR0CESS_INF0RMATION містить чотири поля:

hProcess — дескриптор створеного процесу;
hThread — дескриптор його головного потоку;

f  dwProcessId - ідентифікатор процесу (process id, pid);

dwThreadld — ідентифікатор головного потоку (thread id, tid).

Ідентифікатор pid унікально визначає процес на рівні ОС. ОС повторно використовує pid уже завершених процесів, тому небажано запам'ятовувати їхнє значення, якщо процес уже завершився або закінчився помилкою.

CreateProcess() повертає нуль, якщо під час запуску процесу сталася помилка.

Наведемо приклад виклику CreateProcess(), у якому вказані значення всіх необхідних параметрів:

// ... задається si

PROCESSJNFORMATION pi:

CreateProcess (NULL, " C:/winnt/notepad test.txt", NULL, NULL, TRUE,

CREATE_NEW_CONSOLE. NULL, "D:/", &si, &pi); printf ("pid=Xd. tid=Xd\n". pi.dwProcessId, pi.dwThreadld); CloseHandleCpi.hThread): CloseHandleCpi.hProcess);

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

HANDLE curph = GetCurrentProcessO;

Ідентифікатор поточного процесу можна отримати за допомогою функції Get-CurrentProcessIdO:

int pid - GetCurrentProcessIdC);

Завершення процесів у Win32 API

Для завершення процесів використовують функцію ExitProcessO:

VOID ExitProcess (UINT exitcode);

де exitcode — код повернення процесу. Наприклад

ExitProcess (100); // вихід з кодом 100

Для завершення іншого процесу використовують функцію Termi nateProcess():

BOOL ТепліnateProcess (HANDLE hProcess, UINT exitcode);

У процесі, який запустив інший процес, можна отримати код завершення цього процесу за допомогою функції

GetExitCodeProcess (HANDLE hProcess, LPDWORD pexit_code);

Тут рехі t_code — покажчик на змінну, в яку заносять код завершення.

int exitcode;

GetExitCodeProcess(pi.hProcess, &exitcode);

printf ("Код повернення =£d\n", exitcode);

Синхронне й асинхронне виконання процесів у Win32 АРІ

Для того щоб реалізувати синхронне виконання, після успішного виконання CreateProcessC) процес-предок має викликати функцію очікування закінчення нащадка. Це WaitForSingleObjectC), стандартна функція очікування зміни стану об'єкта Win32 АРІ.

DWORD WaitForSingleObject (HANDLE ph. DWORD timeout);

Тут ph — дескриптор нащадка; timeout - максимальний час очікування в мілісе-кундах (INFINITE — необмежено).

Повернене значення може бути WAITFAILED через помилку.

BOOL res;

if (res = CreateProcess(... . &pi)) {

CloseHandle(pi .hThread);

if (WaitForSingleObject(pi.hProcess, INFINITE) ! = WAITJAILED) GetExitCodeProcessCpi.hProcess. Sexitcode);

}

CloseHandle(pi.hProcess);

}

Для асинхронного виконання достатньо відразу ж закрити обидва дескриптори і не викликати WaitForSingleObjectO:

if (res = CreateProcess(...   . &pi))

{

CloseHandle(pi.hThread);

CloseHandle(pi.hProcess);

}

Керування потоками у Windows XP

Для того щоб виконувати код, у рамках процесу обов'язково необхідно створити потік. У системі Windows XP реалізована модель потоків «у чистому вигляді». Процеси і потоки є різними сутностями в системі, що перебувають у чітко визначеному взаємозв'язку один з одним; для роботи з ними використовують різні системні виклики. У Windows XP ніколи не використовували модель процесів, подібну до традиційної моделі UNIX.

Багатопотоковість Windows XP базується на схемі 1:1. Кожному потоку користувача відповідає сутність у ядрі, при цьому ядро відповідає за планування потоків. Процеси не плануються.

Складові елементи потоку

Потік у Windows XP складається з таких елементів:

вмісту набору регістрів, який визначає стан процесора;

двох стеків — один використовують для роботи в режимі користувача, інший — у режимі ядра; ці стеки розміщені в адресному просторі процесу, що створив цей потік;

♦ локальної пам'яті потоку (TLS);

♦ унікального ідентифікатора потоку (thread id, tid), який вибирають із того са
мого простору імен, що й ідентифікатори процесів.

Сукупність стану процесора, стеків і локальної пам'яті потоку становить контекст потоку. Кожний потік має власний контекст. Усі інші ресурси процесу (його адресний простір, відкриті файли тощо) спільно використовуються потоками.

Розрізняють два види потоків: потоки користувача і потоки ядра, які у Windows XP називають системними робочими потоками — system worker threads. Перші з них створюють у режимі користувача й тільки за необхідності перемикають у режим ядра. Інші створюють в ядрі під час його ініціалізації і виконують у режимі ядра протягом усього часу їхнього існування.

Структури даних потоку

Відображення потоків у системі, як і відображення процесів, засноване на об'єктній моделі Windows XP. Для виконавчої системи Windows XP кожен потік відображається об'єктом-потоком виконавчої системи (executive thread object), який також називають керуючим блоком потоку (executive thread block, ETHREAD). Для ядра системи потік відображається об'єктом-потоком ядра (kernel thread object), який також називають блоком потоку ядра (thread kernel block, KTHREAD).

У режимі користувача доступним є блок оточення потоку (thread environment block, TEB), який перебуває в адресному просторі процесу, що створив потік.'

Неважко помітити, що кожній структурі даних потоку відповідає структура даних процесу (блоки EPROCESS, KPR0CESS і РЕВ).

Керуючий блок потоку містить базову інформацію про потік, зокрема:

♦ блок потоку ядра;

♦ ідентифікатор процесу, до якого належить потік, і покажчик на керуючий блок цього процесу (EPROCESS);

стартову адресу потоку, з якої почнеться виконання його коду;

інформацію для підсистеми безпеки.

Блок потоку ядра, у свою чергу, містить інформацію, необхідну ядру для організації планування і синхронізації потоків, зокрема:

♦ покажчик на стек ядра;

♦  інформацію для планувальника;

інформацію, необхідну для синхронізації цього потоку;

покажчик на блок оточення потоку.

Інформацію для планувальника буде розглянуто в розділі 4, об'єкти синхронізації — у розділі 5.

Блок оточення потоку містить інформацію про потік, доступну для застосувань режиму користувача. До неї належать:

ідентифікатор потоку;

покажчик на стек режиму користувача;

покажчик на блок оточення процесу, до якого належить потік;

покажчик на локальну пам'ять потоку.

 

Створення потоків

Основним засобом створення потоків у Windows XP є функція CreateThread() Win32 АРІ. Назвемо етапи виконання цієї функції.

1. В адресному просторі процесу створюють стек режиму користувача для потоку.

2. Ініціалізують апаратний контекст потоку (у процесор завантажують дані, що визначають його стан). Цей крок залежить від архітектури процесора.

3. Створюють об'єкт-потік виконавчої системи у призупиненому стані, для чого в режимі ядра:

а) створюють та ініціалізують структури даних потоку (блоки ETHREAD, KTHREAD, ТЕВ);

б) задають стартову адресу потоку (використовуючи передану як параметр адресу процедури потоку);

в) задають інформацію для підсистеми безпеки та ідентифікатор потоку;

г) виділяють місце під стек потоку ядра.

  1.   Підсистемі Win32 повідомляють про створення нового потоку.
  2.   Дескриптор та ідентифікатор потоку повертають у процес, що ініціював створення потоку (викликав CreateThreadO).
  3.   Починають виконання потоку (виконують перехід за стартовою адресою).

Особливості програмного інтерфейсу потоків

Програмний інтерфейс керування потоками у Windows XP є частиною Win32 АРІ. Такий інтерфейс ще називають інтерфейсом потоків Win32. Розглянемо особливості його використання.

Створення потоків у Win32 АРІ

У Win32 АРІ, як зазначалося раніше, для створення потоку призначена функція CreateThreadO, а для його завершення - EndThreadO.

На практиці, однак, пару CreateThreadO/EndThreadO є сенс використати лише тоді, коли з коду, що виконує потік, не викликаються функції стандартної бібліотеки мови С (такі, як printfO або strcmpO).

Річ у тому, що функції стандартної бібліотеки С у Win32 АРІ не пристосовані до використання за умов багатопотоковості, і для того щоб підготувати потік до роботи за таких умов, необхідно під час його створення і завершення виконувати деякі додаткові дії. Ці дії враховані у спеціальних бібліотечних функціях роботи з потоками, описаних у заголовному файлі process. h. Це функція _begi nthreadexC) для створення потоку й _endthreadex() — для завершення потоку.

Розглянемо синтаксис функції _begi nthreadex(). Відразу ж наголосимо, що той самий набір параметрів (відмінний лише за типами) передають і у функцію CreateThreadO.

#іnclude <process.h>

unsigned long _beginthreadexC void *security. unsigned stack_size.

unsigned WINAPI (*thread_fun)(void *),

void *argument, unsigned init_state, unsigned *tid );

де: security — атрибути безпеки цього потоку (NULL - атрибути безпеки за замовчуванням);

stacksize — розмір стека для потоку (зазвичай 0, у цьому разі розмір буде таким самим, що й у потоку, який викликає _beginthreadex());

thread_fun - покажчик на функцію потоку;

argument — додаткові дані для передачі у функцію потоку;

init_state — початковий стан потоку під час створення (0 для потоку, що почне виконуватися негайно, CREATEJBUSPEND для припиненого);

tid — покажчик на змінну, в яку буде записано ідентифікатор потоку після виклику (0, якщо цей ідентифікатор не потрібний).

Функція _beginthreadex() повертає дескриптор створеного потоку, який потрібно перетворити в тип HANDLE:

HANDLE th - (HANDLE)_beginthreadex( ... );

Після отримання дескриптора, якщо він у цій функції більше не потрібний, його закривають за допомогою СІ oseHandl є () аналогічно до дескриптора процесу:

CloseHandle(th);

Розглянемо приклад задання функції потоку. Додаткові дані, які передаються під час виклику _begi nthreadex() за допомогою параметра argument, доступні в цій функції через параметр типу void *.

unsigned int WINAPI thread_fun (void *num) {

printf ("потік %d  почав виконання\п", (int)num);

// код функції потоку

printf ("потік %d  завершив виконання\п". (int)num); }

Ось приклад виклику _beginthreadex() з усіма параметрами:

unsigned tid:

int number = 0:

HANDLE th = (HANDLE) _beginthreadex (

NULL. 0. thread_fun, (void *)++number, 0, &tid);

Після створення потоку може виникнути потреба змінити його характеристики. Якщо це необхідно зробити у функції потоку, варто знати, як отримати доступ до його дескриптора. Для цього використовують функцію GetCurrentThread():

unsigned int WINAPI thread_fun (void *num)

{

HANDLE curth - GetCurrentThreadO:

}

Завершення потоків у Win32 API

Функцію потоку можна завершити двома способами.

1. Виконати у ній звичайний оператор return (цей спосіб є найнадійнішим):

unsigned WINAPI thread_fun (void *num)

{

return 0;

}

2. Викликати функцію _endthreadex() з параметром, що дорівнює коду повернення:

unsigned WINAPI thread_fun (void *num)

{

_endthreadex(0):

}

Приєднання потоків у Win32 АРІ

Приєднання потоків у Win32 АРІ, подібно до очікування завершення процесів, здійснюється за допомогою функції WaitForSingleObject(). Базовий синтаксис її використання з потоками такий:

HANDLE th = (HANDLE) _beginthreadex (...);

if (WaitForSingleObjectCth. INFINITE)  !=  WAITFAILED)

{

// потік завершений успішно

}

CloseHandle(th);

Питання для самоконтролю:

  1.  Складові елементи процесу
  2.  Створення процесів
  3.  Завершення процесів
  4.  Процеси і ресурси
  5.  Синхронне і асинхронне виконання процесів у Win32 API
  6.  Складові елементи потоків
  7.  Створення потоків
  8.  Завершення потоків


 

А также другие работы, которые могут Вас заинтересовать

17869. Расходы и прибыль предприятия 448.5 KB
  Лекция 8 Тема: Расходы и прибыль предприятия Учебная цель лекции: изложить основы теории расходов и прибыли рассмотреть взаимосвязи между различными видами расходов с учётом экономического времени оказать содействие развитию у студентов экономического мышл...
17870. Рынок совершенной конкуренции 898 KB
  Лекция 9 Тема: Рынок совершенной конкуренции Учебная цель лекции: изложить основные положения теории конкуренции дать характеристику рынка совершенной конкуренции как модели идеального рынка оказать содействие развитию у студентов экономического мышления...
17871. Монопольный рынок 629 KB
  Лекция 10 Тема: Монопольный рынок Учебная цель лекции: изложить основные положения теории монополии дать понятия монопольной власти ценовой дискриминации оказать содействие развитию у студентов экономического мышления формированию самостоятельности при...
17872. Модели олигополии 261 KB
  17 Лекция 11 Тема: Модели олигополии Учебная цель лекции: изложить основные положения олигопольной структуры дать понятия моделей олигопольного поведения оказать содействие развитию у студентов экономического мышления формированию самост...
17873. Монополистическая конкуренция 197.5 KB
  11 Лекция 12 Тема: Монополистическая конкуренция Учебная цель лекции: изложить основные положения теории монополистической конкуренции дать понятия дифференциации экономических благ неценовой конкуренции оказать содействие развитию у студ
17874. Спрос на факторы производства 699.5 KB
  Лекция 13 Тема: Спрос на факторы производства Учебная цель лекции: изложить основные положения теории предельной полезности дать понятия потребностей экономических благ равновесия потребителя оказать содействие развитию у студентов экономического мышлени...
17875. КОРПОРАТИВНАЯ КУЛЬТУРА В МЕЖДУНАРОДНОМ БИЗНЕСЕ 261.5 KB
  Стиль выдерживания международной фирмой этических норм и правил определяет ее репутацию в международной среде, что в свою очередь предоставляет результативность и долговременное решение вопросов приспособления фирмой к внешним условиям международного рынка.
17876. Розробка та вдосконалення агротехнічних прийомів підвищення рівня урожайності та якості плодів гарбуза столового 374.5 KB
  Аналіз виробництва баштанних культур у Херсонській області свідчить, що за останні роки в цій галузі спостерігаються позитивні зрушення. Виробництво продовольчих баштанних повертає свої втрачені позиції і стає прибутковим, хоча досягнуто це було переважно екстенсивними методами (збільшенням посівних площ).
17877. Понятие общего равновесия 224 KB
  Понятие общего равновесия Caeteris paribus или при прочих равных При исследовании частичного равновесия мы рассматривали равновесие отдельного субъекта или рынка делая предположение caeteris paribus или в переводе с латинского языка при прочих равных. Например мы пытал...