n MS-DOS
n UNIX
n Windows, Solaris, Linux, Mach, OS/2 .
n ,
n , , -.
n
n
n :
q
q
n (TLS Win32)
n , . .
n , .
n , .
n .
n , .
n (foreground) (background).
q
n
q
n
q
n
q / - .
n (Suspending)
n .
n ,
q (Spawn)
n . ( ).
n .
q
n
n .
q
n
q
n .
Windows NT/2000/XP
Windows NT
. .
. .
. .
n .
n
|
|
q è DoS .
q .
q , .
.
n
q è .
q . (Pool ).
q .
q
n à . , .
n à. , .
n
q è .
q DoS .
n (User-level threads)
n (Kernel-level threads)
n
n .
n
n .
q : OS/2, Windows
n
n
n .
q : Solaris, Windows
Windows API
#include <iostream>
#include <windows.h>
// , .
// p
DWORD __stdcall CharsThread(LPVOID p)
{
// LPVOID p
TCHAR c = *(TCHAR*)(p);
//
while(1)
{
std::cout << c;
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[]) {
//
HANDLE hThreads[2];
TCHAR asterisk = '*';
TCHAR exclam = '!';
// , '*'
hThreads[0] = CreateThread(NULL, 0, CharsThread, &asterisk, 0, NULL);
// , '!'
hThreads[1] = CreateThread(NULL, 0, CharsThread, &exclam, 0, NULL);
//
#define TIMEOUT 2000
// TIMEOUT
WaitForMultipleObjects(2, hThreads, TRUE, TIMEOUT);
/* .
*/
CloseHandle(hThreads[0]);
CloseHandle(hThreads[1]);
return 0;
}
POSIX 1003.1
#include <pthread.h>
#include <stdio.h>
void *Thread(void *string)
{
int i;
for (i=0; i<10; i++)
printf("%s\n", (char *)string);
pthread_exit(NULL);
}
int main()
{
char *e_str = "Hello!";
char *f_str = "Bonjour!";
pthread_t e_th;
pthread_t f_th;
int rc;
rc = pthread_create(&e_th, NULL, Thread, (void *)e_str);
if (rc) exit(-1);
rc = pthread_create(&f_th, NULL, Thread, (void *)f_str);
|
|
if (rc) exit(-1);
pthread_exit(NULL);
}
Windows 2000
n
q BOOL QueueUserWorkItem(PTHREAD_START_ROUTINE pfnCallback, PVOID pvContext, ULONG dwFlags);
n
q HANDLE CreateTimerQueue();
q BOOL CreateTimerQueueTimer(PHANDLE phNewTimer, HANDLE hTimerQueue, WAITORTIMERCALLBACK pfnCallback, PVOID pvContext, DWORD dwDueTime, DWORD dwPeriod, ULONG dwFlags);
q BOOL DeleteTimerQueueTimer(HANDLE hTimerQueue, HANDLE hTimer, HANDLE hCompletionEvent);
n
q BOOL RegisterWaitForSingleObject(PHANDLE phNewWaitObject, HANDLE hObject, WAITORTIMERCALLBACK pfnCallback, PVOID pvContext, ULONG dwMilliseconds, ULONG dwFlags);
q BOOL UnregisterWaitEx(HANDLE hWaitHandle, HANDLE hCompletionEvent);
(Fibers) Windows NT
PVOID ConvertThreadToFiber(PVOID pvParam);
PVOID CreateFiber(DWORD dwStackSize, PFIBER_START_ROUTINE pfnStartAddress, PVOID pvParam);
VOID SwitchToFiber(PVOID pvFiberExecutionContext);
VOID DeleteFiber(PVOID pvFiberExecutionContext);
n SISD
q ; .
n SIMD
q ( ).
n MISD
q
n MIMD
q .
SMP AMP (ASMP)
n SMP (Symmetric Multi Processing)
q .
q , .
n AMP (Asymmetric Multi Processing)
q (master) .
q
q (slave) .
SMP versus AMP. .
n .
q
n
q .
n
q .
n
q
n
q .
SMP
n :
q (Standby processor)
q (Affinity processor)
q (Ideal processor)
q (Last processor) .
q (NT-)
c Windows 2000
n
q UNIX, Linux
n ()
q THE, MULTICS, Windows NT
n
q IBM VM/370, JVM
n
q MIT
n ( -)
q QNX, MINIX
(, Layered)
.
1. ( )
2. . .
|
|
3. , . , .
4. , (
5. .
6. , .
7. . .
8. .
n (Virtual Machine, VM)
(MINIX, QNX, Fluke, Paramecium, SPIN, Vino)
n , .
n .
n , , :
q
q
q
q
q .
n
q .
q
n
q ˸
n
q
q
n
q . .
n
q
q .
n
q
n -
q .
n (IPC Inter Process Communications)
n -
n
n :
q , ..: , ..
q () .
n
n Linux ~2 500 000 .
n Windows XP ~6 000 000 .
q ( ) 6 16 1000
q ~70% .
q
n
. .
n Singularity (Microsoft Research)
q Sing#
n
n
n
q
n (Domain)
|
|
q
n
n
n
n
q
n
n
q
n
q :
n
q
n R = {r} ,
n W={w} , .
n , :
n .
q
q , .
n , .
n
q ,
q : ,
q () ( )
q (), , .
x=e , , , ,
n
q
n
q ,
n
q
n
q , , -
:
n
q
q
q
n IRQL
q
q
q
n
q
q
- Windows
. .
n KeAcuireSpinLock(PKSPIN_LOCK pSpinLock, PKIRQL pOldIrql);
n KeReleaseSpinLock(PKSPIN_LOCK pSpinLock, PKIRQL pNewIrql);
:
n ()
q (last) , . , last.
n
q , . .
n
q .
n - , :
1.
2. wait . , , wait
3. signal . , wait
Win32
n
q VOID InitializeCriticalSection(LPCRITICAL_SECTION lpcs)
q VOID EnterCriticalSection(LPCRITICAL_SECTION lpcs)
q VOID LeaveCriticalSection(LPCRITICAL_SECTION lpcs)
n
q HANDLE CreateMutex(LPSECURITY_ATTRIBUTE lpsa, BOOL bOwner, LPCTSTR szName)
q Wait-
q BOOL RelaseMutex(HANDLE hMutex)
n
q HANDLE CreateSemaphore (LPSECURITY_ATTRIBUTE lpsa, LONG cSemInitial, LONG cSemMax, LPSTR lpszSemName)
q Wait-
q BOOL ReleaseSemaphore(HANDLE hSem, LONG cRelease, LPLONG lpPrev);
n
q HANDLE CreateEvent(LPSECURITY_ATTRIBUTE lpsa, BOOL fManual, BOOL fState, LPSTR szName)
|
|
q Wait-
q BOOL SetEvent(HANDLE hEvent)
q BOOL ResetEvent(HANDLE hEvent)
/
n - .
n -
n
/
n .
n .
n - , .
n
n .
n
n
n
n
n
n
n ()
n .
n
n
n .
q .
q (exception) (0xEh Intel)
n
q , .
n
n
n ( , ..)
n
n
q
q
n
n
n
n
n
n
n
n
n ,
n ,
n , (overlays).
n
q .
n
q ,
q
n
n ,
n .
n ; .
. .
n
n
. .
n 2U
n s, , 2U-1 < s <= 2U,
n 2U-1
n 2U-2 < s <= 2U-1, .
. .
n (Logical). ,
n (Relative). , .
n (, physical). .
.
n () .
n
n .
n
n (pages). (frames).
n
q
q .
n
n
n :
n , .
.
n
q
n (/),
n .
1. (/)
,
1. , , .
2. .
3. , ()
1. -
2. () .
3. - .
4. .
n
q
q .
n , .
n
q () , .
n
q
q , .
n ().
q ,
q .
(Thrashing)
n ,
n , .
1. .
2. .
3. .
.
n , -
n / .
n (page table).
n (page table entry - PTE) .
n , .
n (Page Fault)
n , , .
n , .
n
n .
n .
(TLB Translation Lookaside Buffer)
n
q
q
n PTE, TLB.
TLB
n , TLB
n PTE TLB ( TLB), TLB
n TLB PTE.
n
n
n TLB PTE.
n
n
n
n .
n
n , ( ). .
n , , . .
n ,
n
n
n .
n
n
n
n : , .
-
n
q
q
n
q
q
q
q
q
:
n
n
n
n
(Fetch Policy)
n ,
q
q
n (Windows 2000)
n (Windows XP)
n ,
n - .
n (, NUMA)
n .
n .
n , .
n
n (Least Recently Used LRU)
n FIFO
n (Clock Policy)
n .
n , .. .
LRU
n
n , .
n .
FIFO
n .
n (Round-robin).
n .
n , .
n .
Clock Policy ( 1)
n
n (Use bit)
n 1
n 1
n .
n .
Clock Policy. ( 2)
n
q , (u=0, m=0)
q , (u=1, m=0)
q , (u=0, m=1)
q , (u=1, m=
n , . u . (u=0, m=0) .
n 1 , (u=0, m=1), . .
n 2 , 1.
n FIFO
n , :
q
q
Windows 2000
n
q (Active/ Valid)
q (Transition)
q (Standby)
q (Modified)
q , (Modified no-write)
q (Free)
q (Zeroed)
q (Bad)
: ?
n , .
n .
n .
n
q
q
n
q , .
, .
n ,
n
n .
n .
,
n .
n , .
n .
,
n , , . .
n , .
n .
(working set strategy)
() Windows 2000
n (345 50 )
n , .
n , .
n .
Windows 2000
n , .
q , , .
q
q , ( 6 )
q ( Windows XP/2003 )
-
.
n
n ()
q
q
n -
n ()
n
n
n
q
q
q
n
n .
q (): 16 (Intel 8080), 20 (Intel 8086), 32 (Intel 80386), 36 (Intel Pentium), 64 (Intel Itanium /Itanium 2)
n ( )
n
q (): 8 (Intel 8080), 16 (Intel 8086), 32 (Intel 80386), 64 (Intel Pentium)
n
q /
q
q ( )
-
n
q
q
q
n ,
n () -
() -
n , .. .
n
-
n
n
n
n
n
-
1. -.
2. - .
3. , .
4. - .
5.
6. .
-
n (PIO)
n
n (DMA)
-
n
q - .
n -,
n -.
q -
n
q
q ( ).
q :
n /, /, / ..
- (1)
n -
n
n
n
n
n (PnP)
n
n -
n
-
n () -
n -
n -
n - -
n
n .
q ( - )
n -
q ( -, direct I/O)
q - (buffered I/O)
n
n
n
-
n
q
q ,
n
q
q
q -
n
q ( )
q ( )
n
n ( )
q
n
q
q
q
q ..
n
n -
q
n - (Driver Kernel Interface, DKI)
n - (Driver Device Interface, DDI)
q DKI/DDI
q Driver Development Kit (DDK)
n
q
q Windows 2000
q (Legacy) Windows NT
q
q WDM (Windows Driver Model)
n ()
n
n
Windows 2000
1. 1
1. IRQL.
2. . (traps) ISR
3. ISR
4. ISR DPC,
2. 2
1. IRQL DPC/Dispatch
2. .
-
n -
n -.
q
q
n - -. .
- Windows 2000
n
q -.
n , -
q .
q WaitForMultipleObjects 64 .
q
n - APC (Asynchronous Procedure Call)
q - .
n - (Input-Output Completion Port)
q .
q .
q .
q .
q .
- Windows 2000
1. 1
1. DCP- - -
2. - APC -
2. 2
1. APC.
2. APC- -
3. APC- .