深入浅出MFC第2版(PDF格式)-第148部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
「多个执行线程同时工作」的幻觉主要是靠排程器来完成…它以一个硬件定时器和一组复
杂的游戏规则,在不同的执行线程之间做快速切换动作。以Windows 95 和Windows NT
而言,在非特殊的情况下,每个执行线程被CPU 照顾的时间(所谓的timeslice )是20 个
milliseconds 。
如果你有一部多CPU 计算机,又使用一套支持多CPU 的操作系统(如Windows NT ),
那么一个CPU 就可以分配到一个执行线程,真正做到实实在在的多任务。这种操作系统特性
称为symmetric multiprocessing (SMP)。Windows 95 没有SMP 性质,所以即使在多CPU
计算机上跑,也无法发挥其应有的高效能。
图14…1 表现出一个进程(PDB )如何透过「MODREF 串行」连接到其所使用的所有模
组。图14…2 表现出一个模块数据结构(MDB )的细部内容,最后的DataDirectory'16' 记
录着16 个特定节区(sections )的地址,这些sections 包括程序代码、资料、资源。图
14…3 表现出一个执行线程数据结构(PDB )的细部内容。
747
…………………………………………………………Page 810……………………………………………………………
第篇 深入 MFC 程式設計
当Windows 加载器将程序加载内存中,KERNEL32 挖出一些内存,构造出一个
PDB 、一个TDB 、一个以上的MDBs (视此程序使用到多少DLL 而定)。针对TDB ,
操作系统又要产生出memory context (就是在操作系统书籍中提到的那些所谓page
tables )、消息队列、handle 表格、环境数据结构(EDB )。。。。当这些系统内部数据结构
都构造完毕,指令指位器(Instruction Pointer )移到程序的进入点,才开始程序的执行。
Module Table IMTEs
pModuleTableArray 0 KERNEL32。DLL
Process
Database ) 1 USER32。DLL
e
l
b
a
t
e
for l
u
d
MODRefList o
m
pNextModRef o 2
t
n GDI32。DLL
MY。EXE i
x
e
d
n
i
0 (
3
ppdb
4 MYEXE。EXE
)
e
l
b
ta
e
pNextModRef l 5
u
d
o
m
o
t
n
i
x
4 e
d
n
i
(
6
ppdb
7 FOO。DLL
pNextModRef 8
9 (index into module table)
ppdb 9 BAR。DLL
MODREF list
(MY。EXE uses KERNEL32 and BAR。DLL)
图14…1 进程 (PDB ) 透过 「MODREF 串行」连接到其所使用的所有模块
执行线程优先权 (Priority)
我想我们现在已经能够用很具体的形象去看所谓的进程、模块、执行线程了。「执行事实」
发生在执行线程身上,而不在进程身上。也就是说,CPU 排程单位是执行线程而非进程。排
程器据以排序的,是每个执行线程的优先权。
优先权的设定分为两个阶段。我已经在第1章介绍过。执行线程的「父亲大人」(进程)
748
…………………………………………………………Page 811……………………………………………………………
14 MFC
第 章 多緒程式設計
拥有所谓的优先权等级(priority class ,图1…7),可以在CreateProcess 的参数中设定。
执行线程基本上继承自其「父亲大人」的优先权等级,然后再加上CreateThread 参数中的
微调差额(…2~+2 )。获得的结果(图1…8)便是执行线程的所谓base priority ,范围从0~31
数值愈高优先权愈高。::SetThreadPriority 是调整优先权的工具,它所指定的也是微调差
额(…2~+2 )。
IMTE 結構 Module Database (MDB)
00h DWORD un1 IMAGE_NT_HEADERS :
DWORD Signature
04h PIMAGE_NT_HEADERS pNTHdr IMAGE_FILE_HEADER FileHeader :
08h DWORD un2 WORD Machine;
0Ch PSTR pszFileName WORD NumberOfSections;
10h PSTR pszModName DWORD TimeDateStamp;
14h WORD cbFileName DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
16h WORD cbModName
WORD SizeOfOptionalHeader;
18h DWORD un3 WORD Characteristics;
1Ch DWORD cSections IMAGE_OPTIONAL_HEADER OptionalHeader :
20h DWORD un5 WORD Magic;
24h DWORD baseAddress/Module Handle BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
28h WORD hModule16
DWORD SizeOfCode;
2Ah WORD cUsage DWORD SizeOfInitializedData;
2Ch DWORD un7 DWORD SizeOfUninitializedData;
30h PSTR pszFileName2 DWORD AddressOfEntryPoint;
34h WORD cbFileName2 DWORD BaseOfCode;
DWORD BaseOfData;
36h DWORD pszModName2
DWORD ImageBase;
3Ah WORD cbModName2 DWORD SectionAlignment;
DWORD FileAlignment;