Потік у Windows — реалізація потоків в родині операційних систем Windows, структури всередині процесу, які містять виконуваний код та отримують процесорний час для його виконання з метою одночасного чи псевдо-одночасного виконання кількох задач. Новостворений процес має один потік виконання, і під час роботи може породжувати інші потоки (і зупиняти їх). Алгоритми, які реалізується у кількох потоках, називають багатопотоковими.
Переваги багатопотоковості
Багатопотоковість програми створює підґрунтя для реалізації реальної багатозадачності — виконання кількох завдань одночасно (якщо обчислювальна система є багатопроцесорною), або «псевдоодночасно» («майже одночасно») на однопроцесорних системах. Наявність кількох потоків дозволяє:
- Оптимізувати організацію поведінки програми. Часто поведінка програми може бути організована у кілька незалежних паралельних алгоритмів, тоді їх можна винести в окремі потоку. При цьому їм можна задавати різний пріоритет виконання.
- Обходити критичні до часу операції. Якщо програма має лише один потік, то вона повинна зупинити все виконання при очікуванні повільних операцій, таких як запис у файл чи відображення засобами мультимедіа. При цьому процесор перебуває у простої, поки ця операція не завершиться. Якщо застосунок складається з кількох потоків, він може продовжувати виконання в окремих потоках, коли один потік очікуватиме на завершення повільної операції.
- Реалізувати багатопроцесорну обробку. Якщо система, у якій працює програма, є мультипроцесорною, то можна сповна скористатись наявними обчислювальними ресурсами і підвищити її ефективність шляхом використанням кількох потоків. При цьому різні потоки можуть виконуватись одночасно на різних процесорах.
Таким чином, доцільне використання потоків може значно поліпшити продуктивність і зручність використання програм.
На одному процесорі багатопотоковість відбувається шляхом тимчасової активізації різних потоків. Таке перемикання відбувається досить часто, щоб користувач сприймав виконання потоків як одночасне. У багатопроцесорних і багатоядерних системах потоки можуть реально виконуватись одночасно. При цьому кожен процесор або ядро обробляє окремий потік (або кілька потоків).
Загальна характеристика потоків
Хоча в кожного потоку є свій контекст виконання. Кожний потік усередині одного процесу використовує його віртуальний адресний простір (а також інші ресурси, які належать процесу). Це означає, що всі потоки в процесі можуть записувати й зчитувати вміст пам'яті інших потоків цього процесу. Але потоки не можуть посилатися на адресний простір іншого процесу. Виняток може бути в ситуації, коли процес надає частину свого адресного простору як розділ загальної пам'яті через об'єкт «проектований файл» (file mapping object), або коли один із процесів має право на відкриття іншого процесу й використовує функції доступу до пам'яті між процесами.
За замовчуванням у потоків немає власного маркера доступу, але він може отримати його і це дозволить йому підміняти контекст захисту іншого процесу.
Потік містить такі важливі елементи:
- завантажений для виконання код;
- вміст набору регістрів процесора, що відображають стан процесора;
- два стеки, один із яких використовується потоком при виконанні в , а інший — у ;
- закриту область пам'яті, яку називають локальною пам'яттю потоку (thread-local storage, TLS); вона використовується підсистемами, бібліотеками виконуваних систем (run-time libraries) і DLL;
- унікальний ідентифікатор потоку;
- іноді потоки мають свій контекст захисту, який використовується багатопотоковими серверними програмами, що підміняють контекст захисту клієнтів.
Контекст потоку
Вміст змінних регістрів, стеку й локальних областей пам'яті називають контекстом потоку. Оскільки ця інформація відмінна для кожної апаратної платформи, на якій може працювати Windows, відповідна структура даних також є платформо-залежною. Функція GetThreadContext надає доступ до цієї апаратно-залежної інформації (яку називають блоком CONTEXT).
Рівні пріоритету потоків
Windows має 32 рівня пріоритету — від 0 до 31. Вони групуються як:
- шістнадцять рівнів реального часу (16-31);
- п'ятнадцять динамічних рівнів ( 1-15);
- один системний рівень (0), зарезервований для потоку обнуління сторінок пам'яті (zero page thread).
У межах кожного класу пріоритету можуть бути наступні рівні пріоритету потоків:
- THREAD_PRIORITY_IDLE,
- THREAD_PRIORITY_LOWEST,
- THREAD_PRIORITY_BELOW_NORMAL,
- THREAD_PRIORITY_NORMAL,
- THREAD_PRIORITY_ABOVE_NORMAL,
- THREAD_PRIORITY_HIGHEST,
- THREAD_PRIORITY_TIME_CRITICAL.
За замовчуванням потоки створюються із значенням пріоритету THREAD_PRIORITY_NORMAL. Значення рівнів пріоритету потоків THREAD_PRIORITY_ABOVE_NORMAL та THREAD_PRIORITY_HIGHEST найчастіше використовуються у потоках, що призначені для взаємозв'язку з користувачами. Фонові потоки, які не потребують значних процесорних ресурсів, можуть мати пріоритет THREAD_PRIORITY_BELOW_NORMAL або THREAD_PRIORITY_LOWEST.
Рівні пріоритету потоку призначаються з урахуванням двох різних точок зору — Windows API і ядра Windows. Windows API спочатку впорядковує процеси за класами пріоритету, призначеними при їхньому створенні (Realtime (реального часу), High (високий), Above Normal (вище звичайного), Normal (звичайний), Below Normal (нижче звичайного) і Idle (простоюючий)), а потім — за відносним пріоритетом індивідуальних потоків у межах цих процесів (Time-critical (критичний за часом), Highest (найвищий), Above Normal (вище звичайного), Normal (звичайний), Below Normal (нижче звичайного), Lowest (найменший) і Idle (простоюючий)).
Базовий пріоритет кожного потоку у Windows API встановлюється, виходячи із класу пріоритету її процесу й відносного пріоритету самого потоку.
Стани потоків
Стани потоків:
- Initialized (ініціалізований)
- Ready (готовий)
- Standby (простоює)
- Running (виконується)
- Waiting (очікує)
- Transition (перехідний стан)
- Terminated (завершений)
Планування потоків у Windows
Детальніше: Планування потоків
Системний алгоритм керування послідовністю виконання потоків та розподілу процесорного часу між ними називають плануванням потоків. У Windows реалізовано підсистему витискуючого планування потоків на основі рівнів пріоритету, у якій завжди виконується готовий до виконання потік з найбільшим пріоритетом. Але вибір потоку для виконання може бути обмежений набором процесорів, на яких вона може працювати. Це явище називають прив'язкою до процесорів (processor affinity). За замовчуванням потік виконується на будь-якому доступному процесорі, але можна змінити прив'язку до процесорів через функції планування.
Створення потоку
Життєвий цикл потоку починається при його створенні програмою. Запит на створення потоку надходить виконавчій системі Windows, диспетчер процесів виділяє пам'ять для об'єкта «потік» і викликає ядро для ініціалізації блоку потоку. Нижче перераховані основні етапи створення потоку функцією API CreateThread (вона міститься в Kernel32.dll):
- Створення стеку користувацького режиму в адресному просторі процесу.
- Ініціалізація апаратного контексту потоку, специфічного для конкретної архітектури процесора.
- Для створення об'єкта «потік» виконавчої системи викликається NtCreateThread. CreateThread повідомляє підсистему Windows про створення нового потоку і та виконує підготовчі операції.
- Викликаючому коду повертаються дескриптор і ідентифікатор потоку, згенерований на попередньому етапі.
- Виконання потоку відновлюється і йому може бути виділено процесорний час (якщо він не був створений із прапорцем CREATE_SUSPENDED).
Функція CreateThread оголошена так (визначення за допомогою мови Delphi):
function CreateThread( lpThreadAttributes: Pointer; // Атрибути безпеки потоку dwStackSize: DWORD; // Розмір стеку для потоку lpStartAddress: TFNThreadStartRoutine; // Функція потоку lpParameter: Pointer; // Аргумент для нового потоку dwCreationFlags: DWORD; // Прапорці створення var lpThreadId: DWORD // Ідентифікатор потоку ): THandle; // Дескриптор потоку
Ключовим параметром цієї функції є вказівник lpStartAddress, який вказує на функцію потоку. Саме у ній міститься виконуваний код потоку. Як правило, це адреса функції, яка приймає єдиний 32-бітний вказівник у ролі аргументу та повертає 32-бітний вихідний код.
Конкуренція (конфлікт) потоків
Детальніше: Конкуренція потоків
У зв'язку з тим, що Windows використовує витискуючу багатозадачність, при якій виконання будь-якої потоку може бути перерване в будь-який момент часу, доступ кількох потоків до однієї ділянки пам'яті процесу може спричинити суттєві проблеми. Справа у тому, що багато операцій при виконанні програми повинні бути атомарними, тобто неподільними: коли потік виконує таку дію, інші потоку бачать її або ще непочатою, або вже завершеною. Якщо потоку не синхронізовані, то всі операції аж до рівня процесорних інструкцій є неатомарні. Ситуація, при якій різні потоки, виконуючи доступ до спільного для них ресурсу, порушують логіку алгоритму програми, називають конкуренцією (конфліктом) потоків.
Для запобігання помилкам, які можуть виникати при узгодженні роботи кількох потоків у Windows, використовують засоби синхронізації: критичні секції, м'ютекси, семафори та . Об'єкти синхронізації забезпечують доступ до системних ресурсів, які можуть перебувати під керуванням одного чи кількох процесів. Об'єкт синхронізації може перебувати у двох станах: сигнальному та несигнальному. Коли об'єкт перебуває у стані зайнятості, або несигнальному стані, очікуюча потік не може працювати. Сигнальний стан об'єкта синхронізації дозволяє продовжити роботу потоку.
Волокна
Система Windows забезпечує також функціонування механізму волокон (fibers). Волокна дозволяють програмам створювати власні «потоку виконання», не використовуючи системний механізм планування потоків на основі пріоритетів. Волокна часто називають «полегшеними» потоками. Вони невидимі ядру, оскільки реалізуються у . Для створення волокна потрібно викликати функцію ConvertThreadToFiber, що перетворить потік у волокно. Отримане волокно може створювати додаткові волокна (у кожного волокна може бути свій набір волокон). Виконання волокна (на відміну від потоку) не починається доти, поки воно не буде ініційоване вручну. Волокно працює до завершення або до перемикання на інше волокно.
Джерела
- Коноваленко І. В., Федорів П. С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [ 8 грудня 2012 у Wayback Machine.].
- MSDN. Processes and Threads [ 30 серпня 2017 у Wayback Machine.](англ.)
- Руссинович М. и Соломон Д. (2008). Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. Мастер-класс. Москва: Издательзство «Русская Редакция». с. 346. ISBN .
- Руссинович М. Внутреннее устройство Microsoft Windows: Windows Server 2003, Windows XP и Windows 2000. Мастер-класс / М.Руссинович, Д.Соломон ; пер. с англ. — 4-е изд. — М: Издательско-торговый дом «Русская редакция» ; СПб: Питер, 2005.
- Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/ Дж. Рихтер ; пер. с англ. — 4-е изд. — СПб. : Питер; М.: Издательско-торговый дом «Русская редакция», 2001.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dokladnishe Potik ta Bagatopotokovist Potik u Windows realizaciya potokiv v rodini operacijnih sistem Windows strukturi vseredini procesu yaki mistyat vikonuvanij kod ta otrimuyut procesornij chas dlya jogo vikonannya z metoyu odnochasnogo chi psevdo odnochasnogo vikonannya kilkoh zadach Novostvorenij proces maye odin potik vikonannya i pid chas roboti mozhe porodzhuvati inshi potoki i zupinyati yih Algoritmi yaki realizuyetsya u kilkoh potokah nazivayut bagatopotokovimi Perevagi bagatopotokovostiBagatopotokovist programi stvoryuye pidgruntya dlya realizaciyi realnoyi bagatozadachnosti vikonannya kilkoh zavdan odnochasno yaksho obchislyuvalna sistema ye bagatoprocesornoyu abo psevdoodnochasno majzhe odnochasno na odnoprocesornih sistemah Nayavnist kilkoh potokiv dozvolyaye Optimizuvati organizaciyu povedinki programi Chasto povedinka programi mozhe buti organizovana u kilka nezalezhnih paralelnih algoritmiv todi yih mozhna vinesti v okremi potoku Pri comu yim mozhna zadavati riznij prioritet vikonannya Obhoditi kritichni do chasu operaciyi Yaksho programa maye lishe odin potik to vona povinna zupiniti vse vikonannya pri ochikuvanni povilnih operacij takih yak zapis u fajl chi vidobrazhennya zasobami multimedia Pri comu procesor perebuvaye u prostoyi poki cya operaciya ne zavershitsya Yaksho zastosunok skladayetsya z kilkoh potokiv vin mozhe prodovzhuvati vikonannya v okremih potokah koli odin potik ochikuvatime na zavershennya povilnoyi operaciyi Realizuvati bagatoprocesornu obrobku Yaksho sistema u yakij pracyuye programa ye multiprocesornoyu to mozhna spovna skoristatis nayavnimi obchislyuvalnimi resursami i pidvishiti yiyi efektivnist shlyahom vikoristannyam kilkoh potokiv Pri comu rizni potoki mozhut vikonuvatis odnochasno na riznih procesorah Takim chinom docilne vikoristannya potokiv mozhe znachno polipshiti produktivnist i zruchnist vikoristannya program Na odnomu procesori bagatopotokovist vidbuvayetsya shlyahom timchasovoyi aktivizaciyi riznih potokiv Take peremikannya vidbuvayetsya dosit chasto shob koristuvach sprijmav vikonannya potokiv yak odnochasne U bagatoprocesornih i bagatoyadernih sistemah potoki mozhut realno vikonuvatis odnochasno Pri comu kozhen procesor abo yadro obroblyaye okremij potik abo kilka potokiv Zagalna harakteristika potokivHocha v kozhnogo potoku ye svij kontekst vikonannya Kozhnij potik useredini odnogo procesu vikoristovuye jogo virtualnij adresnij prostir a takozh inshi resursi yaki nalezhat procesu Ce oznachaye sho vsi potoki v procesi mozhut zapisuvati j zchituvati vmist pam yati inshih potokiv cogo procesu Ale potoki ne mozhut posilatisya na adresnij prostir inshogo procesu Vinyatok mozhe buti v situaciyi koli proces nadaye chastinu svogo adresnogo prostoru yak rozdil zagalnoyi pam yati cherez ob yekt proektovanij fajl file mapping object abo koli odin iz procesiv maye pravo na vidkrittya inshogo procesu j vikoristovuye funkciyi dostupu do pam yati mizh procesami Za zamovchuvannyam u potokiv nemaye vlasnogo markera dostupu ale vin mozhe otrimati jogo i ce dozvolit jomu pidminyati kontekst zahistu inshogo procesu Potik mistit taki vazhlivi elementi zavantazhenij dlya vikonannya kod vmist naboru registriv procesora sho vidobrazhayut stan procesora dva steki odin iz yakih vikoristovuyetsya potokom pri vikonanni v a inshij u zakritu oblast pam yati yaku nazivayut lokalnoyu pam yattyu potoku thread local storage TLS vona vikoristovuyetsya pidsistemami bibliotekami vikonuvanih sistem run time libraries i DLL unikalnij identifikator potoku inodi potoki mayut svij kontekst zahistu yakij vikoristovuyetsya bagatopotokovimi servernimi programami sho pidminyayut kontekst zahistu kliyentiv Kontekst potoku Vmist zminnih registriv steku j lokalnih oblastej pam yati nazivayut kontekstom potoku Oskilki cya informaciya vidminna dlya kozhnoyi aparatnoyi platformi na yakij mozhe pracyuvati Windows vidpovidna struktura danih takozh ye platformo zalezhnoyu Funkciya GetThreadContext nadaye dostup do ciyeyi aparatno zalezhnoyi informaciyi yaku nazivayut blokom CONTEXT Rivni prioritetu potokiv Rivni prioritetu potokiv Windows maye 32 rivnya prioritetu vid 0 do 31 Voni grupuyutsya yak shistnadcyat rivniv realnogo chasu 16 31 p yatnadcyat dinamichnih rivniv 1 15 odin sistemnij riven 0 zarezervovanij dlya potoku obnulinnya storinok pam yati zero page thread U mezhah kozhnogo klasu prioritetu mozhut buti nastupni rivni prioritetu potokiv THREAD PRIORITY IDLE THREAD PRIORITY LOWEST THREAD PRIORITY BELOW NORMAL THREAD PRIORITY NORMAL THREAD PRIORITY ABOVE NORMAL THREAD PRIORITY HIGHEST THREAD PRIORITY TIME CRITICAL Za zamovchuvannyam potoki stvoryuyutsya iz znachennyam prioritetu THREAD PRIORITY NORMAL Znachennya rivniv prioritetu potokiv THREAD PRIORITY ABOVE NORMAL ta THREAD PRIORITY HIGHEST najchastishe vikoristovuyutsya u potokah sho priznacheni dlya vzayemozv yazku z koristuvachami Fonovi potoki yaki ne potrebuyut znachnih procesornih resursiv mozhut mati prioritet THREAD PRIORITY BELOW NORMAL abo THREAD PRIORITY LOWEST Rivni prioritetu potoku priznachayutsya z urahuvannyam dvoh riznih tochok zoru Windows API i yadra Windows Windows API spochatku vporyadkovuye procesi za klasami prioritetu priznachenimi pri yihnomu stvorenni Realtime realnogo chasu High visokij Above Normal vishe zvichajnogo Normal zvichajnij Below Normal nizhche zvichajnogo i Idle prostoyuyuchij a potim za vidnosnim prioritetom individualnih potokiv u mezhah cih procesiv Time critical kritichnij za chasom Highest najvishij Above Normal vishe zvichajnogo Normal zvichajnij Below Normal nizhche zvichajnogo Lowest najmenshij i Idle prostoyuyuchij Bazovij prioritet kozhnogo potoku u Windows API vstanovlyuyetsya vihodyachi iz klasu prioritetu yiyi procesu j vidnosnogo prioritetu samogo potoku Stani potokiv Stani potokiv u Windows ta mozhlivi perehodi mizh stanami Stani potokiv Initialized inicializovanij Ready gotovij Standby prostoyuye Running vikonuyetsya Waiting ochikuye Transition perehidnij stan Terminated zavershenij Planuvannya potokiv u WindowsDetalnishe Planuvannya potokiv Sistemnij algoritm keruvannya poslidovnistyu vikonannya potokiv ta rozpodilu procesornogo chasu mizh nimi nazivayut planuvannyam potokiv U Windows realizovano pidsistemu vitiskuyuchogo planuvannya potokiv na osnovi rivniv prioritetu u yakij zavzhdi vikonuyetsya gotovij do vikonannya potik z najbilshim prioritetom Ale vibir potoku dlya vikonannya mozhe buti obmezhenij naborom procesoriv na yakih vona mozhe pracyuvati Ce yavishe nazivayut priv yazkoyu do procesoriv processor affinity Za zamovchuvannyam potik vikonuyetsya na bud yakomu dostupnomu procesori ale mozhna zminiti priv yazku do procesoriv cherez funkciyi planuvannya Stvorennya potokuZhittyevij cikl potoku pochinayetsya pri jogo stvorenni programoyu Zapit na stvorennya potoku nadhodit vikonavchij sistemi Windows dispetcher procesiv vidilyaye pam yat dlya ob yekta potik i viklikaye yadro dlya inicializaciyi bloku potoku Nizhche pererahovani osnovni etapi stvorennya potoku funkciyeyu API CreateThread vona mistitsya v Kernel32 dll Stvorennya steku koristuvackogo rezhimu v adresnomu prostori procesu Inicializaciya aparatnogo kontekstu potoku specifichnogo dlya konkretnoyi arhitekturi procesora Dlya stvorennya ob yekta potik vikonavchoyi sistemi viklikayetsya NtCreateThread CreateThread povidomlyaye pidsistemu Windows pro stvorennya novogo potoku i ta vikonuye pidgotovchi operaciyi Viklikayuchomu kodu povertayutsya deskriptor i identifikator potoku zgenerovanij na poperednomu etapi Vikonannya potoku vidnovlyuyetsya i jomu mozhe buti vidileno procesornij chas yaksho vin ne buv stvorenij iz praporcem CREATE SUSPENDED Funkciya CreateThread ogoloshena tak viznachennya za dopomogoyu movi Delphi function CreateThread lpThreadAttributes Pointer Atributi bezpeki potoku dwStackSize DWORD Rozmir steku dlya potoku lpStartAddress TFNThreadStartRoutine Funkciya potoku lpParameter Pointer Argument dlya novogo potoku dwCreationFlags DWORD Praporci stvorennya var lpThreadId DWORD Identifikator potoku THandle Deskriptor potoku Klyuchovim parametrom ciyeyi funkciyi ye vkazivnik lpStartAddress yakij vkazuye na funkciyu potoku Same u nij mistitsya vikonuvanij kod potoku Yak pravilo ce adresa funkciyi yaka prijmaye yedinij 32 bitnij vkazivnik u roli argumentu ta povertaye 32 bitnij vihidnij kod Konkurenciya konflikt potokivDetalnishe Konkurenciya potokiv U zv yazku z tim sho Windows vikoristovuye vitiskuyuchu bagatozadachnist pri yakij vikonannya bud yakoyi potoku mozhe buti perervane v bud yakij moment chasu dostup kilkoh potokiv do odniyeyi dilyanki pam yati procesu mozhe sprichiniti suttyevi problemi Sprava u tomu sho bagato operacij pri vikonanni programi povinni buti atomarnimi tobto nepodilnimi koli potik vikonuye taku diyu inshi potoku bachat yiyi abo she nepochatoyu abo vzhe zavershenoyu Yaksho potoku ne sinhronizovani to vsi operaciyi azh do rivnya procesornih instrukcij ye neatomarni Situaciya pri yakij rizni potoki vikonuyuchi dostup do spilnogo dlya nih resursu porushuyut logiku algoritmu programi nazivayut konkurenciyeyu konfliktom potokiv Dlya zapobigannya pomilkam yaki mozhut vinikati pri uzgodzhenni roboti kilkoh potokiv u Windows vikoristovuyut zasobi sinhronizaciyi kritichni sekciyi m yuteksi semafori ta Ob yekti sinhronizaciyi zabezpechuyut dostup do sistemnih resursiv yaki mozhut perebuvati pid keruvannyam odnogo chi kilkoh procesiv Ob yekt sinhronizaciyi mozhe perebuvati u dvoh stanah signalnomu ta nesignalnomu Koli ob yekt perebuvaye u stani zajnyatosti abo nesignalnomu stani ochikuyucha potik ne mozhe pracyuvati Signalnij stan ob yekta sinhronizaciyi dozvolyaye prodovzhiti robotu potoku VoloknaDokladnishe Volokno programuvannya Sistema Windows zabezpechuye takozh funkcionuvannya mehanizmu volokon fibers Volokna dozvolyayut programam stvoryuvati vlasni potoku vikonannya ne vikoristovuyuchi sistemnij mehanizm planuvannya potokiv na osnovi prioritetiv Volokna chasto nazivayut polegshenimi potokami Voni nevidimi yadru oskilki realizuyutsya u Dlya stvorennya volokna potribno viklikati funkciyu ConvertThreadToFiber sho peretvorit potik u volokno Otrimane volokno mozhe stvoryuvati dodatkovi volokna u kozhnogo volokna mozhe buti svij nabir volokon Vikonannya volokna na vidminu vid potoku ne pochinayetsya doti poki vono ne bude inicijovane vruchnu Volokno pracyuye do zavershennya abo do peremikannya na inshe volokno DzherelaKonovalenko I V Fedoriv P S Sistemne programuvannya u Windows z prikladami na Delphi T TNTU 2012 8 grudnya 2012 u Wayback Machine MSDN Processes and Threads 30 serpnya 2017 u Wayback Machine angl Russinovich M i Solomon D 2008 Vnutrennee ustrojstvo Microsoft Windows Windows Server 2003 Windows XP i Windows 2000 Master klass Moskva Izdatelzstvo Russkaya Redakciya s 346 ISBN 978 5 459 01730 4 Russinovich M Vnutrennee ustrojstvo Microsoft Windows Windows Server 2003 Windows XP i Windows 2000 Master klass M Russinovich D Solomon per s angl 4 e izd M Izdatelsko torgovyj dom Russkaya redakciya SPb Piter 2005 Rihter Dzh Windows dlya professionalov sozdanie effektivnyh Win32 prilozhenij s uchetom specifiki 64 razryadnoj versii Windows Dzh Rihter per s angl 4 e izd SPb Piter M Izdatelsko torgovyj dom Russkaya redakciya 2001