1.24k likes | 1.35k Views
現代系統核心報告. 第三組 范綱烜 995202029 張柔止 995202059 陳浩宇 995202032 呂兆威 995202037 鄭清懷 995202065 張靖裕 995202055 李怡臻 995202078 楊郁莉 995202084. Chapter 3 windows 行程與緒程. Windows 行程 (process) 緒程 (thread). 行程 ( process). 行程 (process) 行程定義了一個執行環境 位置空間 (address space) 程式碼 (text) …. 行程記憶體結構. 行程的建立.
E N D
現代系統核心報告 第三組 范綱烜995202029張柔止995202059 陳浩宇995202032呂兆威995202037 鄭清懷995202065張靖裕995202055 李怡臻995202078楊郁莉995202084
Chapter 3 windows行程與緒程 Windows 行程(process) 緒程(thread)
行程(process) • 行程(process) • 行程定義了一個執行環境 • 位置空間(address space) • 程式碼(text) • …
行程的建立 • 建立一個執行體行程物件 • 建立一個初始緒程 • 為初始緒程建立一個堆疊 • 設置初始環境 • 緒程參予系統的排程
行程控制表 • 每一個行程在作業系統之中都對應著一個行程控制表(Process Control Block)
行程控制表(續) • 行程狀態(Process state ) • 可以是new、ready、running、waiting或halted等 • 程式計數器(Program counter) • 指明該行程接著要執行的指令位址 • CPU暫存器(CPU registers) • 其數量和類別,完全因電腦架構而異 • CPU排班法則(CPU scheduling information) • 包括行程的優先順序 (Priorlty)、排班佇列(scheduling queue)的指標以及其它的排班參數
行程控制表(續) • 記憶體管理資訊(Memory-management information) • 基底暫存器(base register)和限制暫存器(limit register),分頁表(Page table)值的資訊統所使用的記憶系統區段表(segment table)。 • Accounting information • CPU和實際時間的使用數量、時限、帳號工作或行程號碼 • 輸入/輸出狀態資訊(I/O status information) • 配置給行程的輸入/輸出裝置,包括開啟檔案的串列 等等
行程間通訊(Inter-Process Communication ) • 行程間通訊(IPC,Inter-Process Communication),指至少兩個行程或執行緒間傳送資料或訊號的一些技術或方法。 • shared memory • Pipe • Socket
Thread • Thread組成包含以下元素: • 程式計數器 • CPU暫存器 • 堆疊空間 • 執行緒ID狀態
Thread • 在同一個Process中,不同Thread之間可以彼此共享資源: • 程式碼區域 • 資料區域 • 作業系統資源(EX:openfile,signal)
行程與緒程 • 一個Process可以有多個Thread。 • 同一個Process內的Thread使用相同的Memory Space,這些Thread各自擁有其Stack。
User-level thread • User-level threads implement in user-level libraries, rather than via systems calls, so thread switching does not need to call operating system and to cause interrupt to the kernel. • In fact, the kernel knows nothing about user-level threads and manages them as if they were single-threaded processes. Present by 995202059 張柔止
User-level thread • Advantages: 1. User-level threads does not require modification to operating systems. 2. Simple Representation & Management 3. Fast & Efficient 4. 應用程式可採用適合自己特點的緒程選擇演算法, 並根據應用程式的邏輯來定義緒程的優先層級缺點。 • Disadvantages: 增加應用程式碼的複雜性。 Present by 995202059 張柔止
kernel-level thread • Instead of thread table in each process, the kernel has a thread table that keeps track of all threads in the system. • Operating Systems kernel provides system call to create and manage threads. Present by 995202059 張柔止
kernel-level thread • Advantages: • 核心會妥善處理好緒程之間共用處理器的資源分配問題,而無需考慮緒程之間的控制權轉換。 • Disadvantages: • The kernel-level threads are slow and inefficient. • Significant overhead & increased in kernel complexity. Present by 995202059 張柔止
Multithreaded programming • 在支援kernel-level thread的環境中,行程可以容納多個緒程,這導致了多緒程程式設計(Multithreaded programming)模型。 • 在此模型中,緒程間的通訊十分方便及高效率。但是也容易造成緒程間因同步不正確,而導致資料被破壞。 Present by 995202059 張柔止
Thread scheduling algo • 衡量準則: 1. 公平性 2.CPU被有效利用 • FIFO: 若緒程的執行時間長短不一,則實際 效果可能非常不公平 • Random: 打斷緒程執行時,會存在固有的緒 程切換負擔 • Priority: 高優先權的緒程可能霸佔處理器資源 Present by 995202059 張柔止
Thread&process Present by 995202059 張柔止
3.3 Windows 中行程和緒程資料結構 3.3.1核心層的行程和緒程物件
3.3.1核心層的行程和緒程物件 • 在Kernerl中,Process 和 Thread 都有相對應的資料結構 • 一個KPROCESS代表一個行程,每個行程都會一個KPROCESS • EPROCESS會建立KPROCESS
3.3.1核心層的行程和緒程物件-KPROCESS Define • typedefstruct _KPROCESS { } KPROCESS, *PKPROCESS, *PRKPROCESS; • 每個行程都會有一個KPORCESS物件,其內容欄位表示目前的Process狀況。 接下來欄位與proecss的 context swithch 有關 DISPATCHER_HEADER Header; //表示整個Pocess是一個Dispatcher, 所以proecss是可以等待的 LIST_ENTRY ProfileListHead; //是用來參與效能分析時,用來加入到全域效能分析清單中 ,行成當中的一個節點 ULONG_PTR DirectoryTableBase[2];//1.指向Process的分頁目錄表位置 2.指向這個Process的Hyper Space 分頁目錄表位置 • Dispatcher object(chap5.4) • 共有六種-在這裡會提到KPROCESS 與KTHREAD • KPROCESS • 在行程建立時,他會被設定為無信號,當行程(Process)結束時, • 他會變成有信號。 • 所以另外一個thread在等待某個process時就可以被通知喚醒該thread • KTHREAD • 狀況是與KPROCESS相同但是角色變成THREAD等待THREAD的信號。 //以下參數皆是為了Intel X86設計 KGDTENTRY LdtDescriptor;//是這個Process的LDT(區域描述表) KIDTENTRY Int21Descriptor;//為了相容DOS允許存取DOS系統功能 USHORT IopmOffset;//指定IOPM,(I/O權限表), kernel透過IOPM控制user mode的 I/O存取 UCHAR Iopl;//定義了I/O的優先層級 BOOLEAN Unused; volatile KAFFINITY ActiveProcessors; // 記錄Process正在那些處理器上執行
3.3.1核心層的行程和緒程物件-KPROCESS • typedefstruct _KPROCESS { } KPROCESS, *PKPROCESS, *PRKPROCESS LIST_ENTRY ReadyListHead;//是一個雙向串列的表頭,記錄在這個process 中已經就緒但未加入全域就緒串列的thread 接下來欄位與proecss的 發生clock interrupt 有關 SINGLE_LIST_ENTRY SwapListEntry; //換出=>透過這個欄位加入到KiProcessOutSwapListHead 換入=>透過這個欄位加入到KiProcessInSwapListHead(皆為單串列) ULONG KernelTime;// 記錄在核心模式下所花時間 ULONG UserTime;//記錄在使用者模式下所花時間 PVOID VdmTrapcHandler;//指向處理Ctrl+C中斷的函式,僅用於VDM (Virtral Dos Machine)的環境下執行16位元程式。 當process被換出記憶體後,這個process所屬的thread如果就緒後, 他就會被掛到這個串列中,接著要求換入這process LIST_ENTRY ThreadListHead;//是串列的開頭,主要包含了這個Process 目前所有的thread 我們也可以從這邊看 出Process與thread之間的從屬關係。 會等於thread中的值和,但是只會當一個 thread結束時才會更新到Process這兩個的值 例如用途:將串列中的每個thread加入到全域就緒thread中 Process->State=ProcessInMemory; NextEntry=Process->PeadyListHead.Flink; While(NextEntry != &Process->ReadyListHead){ Thread=CONTAIN_RECORD(NextEntry, KTHREAD, WaitListEntry); RemoveEntryList(NextEntry); Thread->ProcessReadyQueue=FALSE; KiReadyThread(Thread);//加入全域就緒thread的finction NextEntry=Process->ReadyListHead.Flink; } KSPIN_LOCK ProcessLock;//這是一個spin lock的物件。用來保護Process中的成員。 KAFFINITY Affinity;//指出這個Process可以在哪些處理器上執行。
3.3.1核心層的行程和緒程物件-KPROCESS • typedefstruct _KPROCESS { union { struct { LONG AutoAlignment : 1;//用於記憶體對齊設置(intel x86並無此設置) LONG DisableBoost : 1; LONG DisableQuantum : 1;//與thread過程中的優先層級提昇和配量分配有關 LONG ReservedFlags : 29; }; LONG ProcessFlags; }; } KPROCESS, *PKPROCESS, *PRKPROCESS SCHAR BasePriority; //process中的thread他的基本優先層級 SCHAR QuantumReset; //指定process中的thread基本配量重置值(在windows為6) UCHAR State;//說明是否在記憶體中,有六種可能狀態 1.ProcessInMemory2.ProcessOutOfMemory3.ProcessInTransition 4.ProcessOutTransition5.ProcessInSwap6.ProcessOutSwap UCHAR ThreadSeed; //在一個多處理器的環境下,每個thread都有一個優先選擇的處理器 UCHAR PowerState;//用於電源狀態管理 UCHAR IdealNode;//一個process優先選擇的處理器節點 BOOLEAN Visited; ULONG_PTR StackCount; //紀錄了目前porcess中有多少thread的堆疊放至於記憶體中 LIST_ENTRY ProcessListEntry;//將目前系統中有活動中的thread的process串成一個串列 Summry Process主要會紀錄的資訊分成下面兩類 1.與行程的記憶體環境相關 2.與其Thread 相關
3.3 Windows 中行程和緒程資料結構 3.3.1核心層的行程和緒程物件
3.3.1核心層的行程和緒程物件-KTHREAD(Part1) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; DISPATCHER_HEADER Header; //跟Process一樣是發送器物件,所以是可以被等待的 LIST_ENTRY MutantListHead;//指向一個串列開頭, 這個串列包含了所有該thread的突變體物件 PVOID InitialStack;//原始堆疊的位置(高位置) PVOID StackLimit;//堆疊的最低位置 PVOID KernelStack;//紀錄了真正核心呼叫堆疊的開始位置,他會比InitalStack還低一點, 因為中間還要紀錄浮點處理器保存區和一個例外陷阱框架。 PVOIDStackBase;//紀錄目前的堆疊基底位置,初始化石他會與InitialStack相同。 KSPIN_LOCK ThreadLock; //跟Process一樣的功能類似,是用來保護Thread中的資料成員
3.3.1核心層的行程和緒程物件-KTHREAD(Part1) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; union { KAPC_STATE ApcState;//指向目前Thread所屬的Preocess的KPROCESS結構 struct { UCHAR ApcStateFill[KAPC_STATE_ACTUAL_LENGTH]; BOOLEAN ApcQueueable;//是否可以插入APC volatile UCHAR NextProcessor; volatile UCHAR DeferredProcessor;//處理器的排程選擇 UCHAR AdjustReason; SCHAR AdjustIncrement; //這兩個是給優先層級調整原因及調整量 }; }; ULONG ContextSwitches;//紀錄了這個thread進行了幾次切換 volatile UCHAR State; //紀錄了目前thread的狀態 BOOLEAN Alertable; //說明Thread是否可以被喚醒,用於等待時, 如果他為TRUE就可以被喚醒 BOOLEAN WaitNext;//TRUE:表示他要呼叫等待函式,所以發出訊號就可以馬上呼叫, 不需要解除排程器鎖。 UCHAR NpxState; KIRQL WaitIrql;//要與WaitNext合用,當為TRUE時紀錄下先前的IRQL UCHAR WaitReason;//紀錄下為什麼會需要等待的理由。 LONG_PTR WaitStatus;//紀錄等待的結果。 KPROCESSOR_MODE WaitMode;//紀錄下當他進入等待時是在kernel mode or user mode union { PKWAIT_BLOCK WaitBlockList; //用來指向PKWAIT_BLOCK為元素的串列, 這個物件主要是要指出哪個thread在等待分派器物件, 同時每個分派器物件也會紀錄哪些thread正在等待他。 PKGATE GateObject;//紀錄正在被等待的閘道物件,這兩個不會同發生, 所以構成一個union共用指標記憶體。 }; KSPIN_LOCK ApcQueueLock; //是一個spinLock用於保護APC佇列的操作
3.3.1核心層的行程和緒程物件-KTHREAD(Part2) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; union { LIST_ENTRY WaitListEntry; //當Thread在等待執行時,他會作為一個節點加入到某個序列中,也就是KPROCESS中的WaitListEntry為起始的串列 SINGLE_LIST_ENTRY SwapListEntry; //當thread的核心堆疊要換入時,插入到KiStackImSwapListHead 當Thread處於DefferedReady的狀態時, 他會將SwapListEntry插入到 DefferedReadyList Head串列中 }; SCHAR Priority;//定義了這Thread的優先層級,在這裡 這是可以變動的。 SCHAR BasePriority;//靜態的優先層級,初始值是所屬Process的BasePriority值,可以透過KeSetBasePriority函式設定。 SCHAR PriorityDecrement;//紀錄他的優先層級的變動值。 優先層級在Windows分成兩層: 0~15:普通thread的優先層級 16~31:即時thread的優先層級 ,這兩個區域彼此事不會互相跨越的。 CHAR Saturation;//說明這個Thread相對於process的基本優先層級,是否超越者個區間的一半,值為 0,1,-1 UCHAR EnableStackSwap; //布林值,指出是否允許換出到外部記憶體 volatile UCHAR SwapBusy; //布林值,指出thread是否正在進行context swap BOOLEAN Alerted[MaximumMode];//指定該thread在哪種警告模式下可以喚醒。 在WRK中,警告模式只有使用者模式與核心模式,所以也就是指出thread在這兩個模式下是否可以喚醒 PRKQUEUE Queue; //是一個佇列發送器(分派器),如果不為NULL表示目前正處理此佇列。 ULONG WaitTime; //紀錄了一個Thread進入等待時刻的時間點, 好讓平衡集管理員可以根據這選項做出相對應的決策
3.3.1核心層的行程和緒程物件-KTHREAD(Part2) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; • KTIMER Timer;//是一個附在thread上的計時器 • 在實做可逾時的等待函式時( KeWaitForSingleObject or • KeWaitForMultiple )可以用到 • union { • struct { • LONG AutoAlignment : 1; • LONG DisableBoost : 1;//這兩個欄位是繼承Kprocess中的同名欄位, • 所以用途相同。 • LONG ReservedFlags : 30; • }; • LONG ThreadFlags; • }; union { struct { SHORT KernelApcDisable; SHORT SpecialApcDisable; //分別為16位元,0:表示不禁止APC,負數表示禁止 APC,只要因為多種因素造成要禁止他就會不停 加上負值,直到消除時才將這個因素造成的負值補回,直到變成0為止。且只有當兩個欄位都為0 時,才允許插入APC。 }; ULONG CombinedApcDisable; };
3.3.1核心層的行程和緒程物件-KTHREAD(Part2) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; union { KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1];//有4個KWAIT_BLOCK成員的陣列 struct { UCHAR WaitBlockFill0[KWAIT_BLOCK_OFFSET_TO_BYTE0]; BOOLEAN SystemAffinityActive; }; struct { UCHAR WaitBlockFill1[KWAIT_BLOCK_OFFSET_TO_BYTE1]; CCHAR PreviousMode; }; struct { UCHAR WaitBlockFill2[KWAIT_BLOCK_OFFSET_TO_BYTE2]; UCHAR ResourceIndex; }; struct { UCHAR WaitBlockFill3[KWAIT_BLOCK_OFFSET_TO_BYTE3];//專門用於可等待的計時器物件 UCHAR LargeStack; }; LIST_ENTRY QueueListEntry; //紀錄了當thead處理一個佇列項目時, 他加入到佇列物件的thread串列中的節點位址 WaitBlock其實是一個內建陣列 如果Thread等待的物件數量小於4 =>無須另外分配KWAIT_BLOCK物件記憶體 如果Thread等待的物件數量大於4 =>需要另外分配
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) PKTRAP_FRAME TrapFrame;//紀錄控制流程狀態data structure PVOID CallbackStack;//包含thread的callbackstack address 當thread從kernel mode呼叫到user mode時使用 PVOID ServiceTable;//指向該thread使用的系統服務表 UCHAR IdealProcessor;//指明在多處理器的機器上,該thread的理想處理器 BOOLEAN Preempted;//表該thread是否被高優先層級的thread搶佔了 BOOLEAN ProcessReadyQueue;//表一個thread是否在所屬的行程KPROCESS 物件的ReadyListHead串列中 BOOLEAN KernelStackResident;//說明該thread的核心堆疊是否駐留在記憶體中 • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD;
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) KAFFINITY Affinity;//指定了thread的處理器親和性 KAFFINITY UserAffinity;//是thread的使用者親和性 PKPROCESS Process;//指向thread的行程物件 UCHAR ApcStateIndex;//指名目前APC狀態在ApcStatePointer欄位中的索引 PKAPC_STATE ApcStatePointer[2];//陣列元素的型別是指向KAPC_STATE的指標 兩個元素分別指向thread物件的ApcState和SavedApcState union { KAPC_STATE SavedApcState; struct { ...... }; }; • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD;
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) PVOID Win32Thread;//指向由Windows子系統管理的區域 union { KAPC SuspendApc; }; union { KSEMAPHORE SuspendSemaphore; struct{ UCHAR SuspendSemaphorefill[KSEMAPHORE_ACTUAL_LENGTH]; ULONG SListFaultCount;}; }; • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD;
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; LIST_ENTRYThreadListEntry;//表一個雙串列上的節點 PVOIDSListFaultAddress;//與user mode互鎖單串列POP操作的錯誤處理有關
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • 從以上介紹的KPROCESS和KTHREAD的資料結構可看出 • 核心層的process和threadobject只包含了系統資源管理和多控制流程並行執行所涉及的基本資訊 • 不含與應用程式相關聯的資訊(ex:process映像檔案和thread啟動函式位址)
3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • Process Object 提供了thread的基本執行環境 • 包含process address space和一組process範圍內公用的參數 • Thread Object 提供了為參與thread 排程而必須的各種資訊及其維護控制流程的狀態
EPROCESS Define 995202078 李怡臻
Outline • Introduction • EPROCESSStructure
Introduction • 每一個Windows process都是由一個 Executive process (EPROCESS) block來表示。而一個process可能有多個thread,這些thread則由一個executive thread (ETHREAD) block來表示。 • EPROCESS不僅包括了進程(Process)的許多屬性,還包擴了許多指向其他數據結構的指針,其中包含了大量有用的信息。
EPROCESSStructure(1/4) • typedefstruct_EPROCESS { KPROCESS Pcb; EX_PUSH_LOCK ProcessLock; LARGE_INTEGER CreateTime; LARGE_INTEGER ExitTime; EX_RUNDOWN_REF RundownProtect; HANDLE UniqueProcessId; LIST_ENTRY ActiveProcessLinks; SIZE_T QuotaUsage[PsQuotaTypes]; SIZE_T QuotaPeak[PsQuotaTypes]; SIZE_T CommitCharge; SIZE_T Commit ChargeLimit; SIZE_T Commit ChargePeak SIZE_T PeakVirtualSize; SIZE_T VirtualSize; LIST_ENTRY SessionProcessLinks; PVOID DebugPort; PVOID ExceptionPort; PHANDLE_TABLE ObjectTable; EX_FAST_REF Token;
EPROCESSStructure_ActiveProcessLinks EPROCESS EPROCESS EPROCESS KPROCESS KPROCESS KPROCESS … PsActiveProcessHead LIST_ENTRY LIST_ENTRY LIST_ENTRY LIST_ENTRY Flink Flink Flink Flink Blink Blink Blink Blink
Windows記憶體管理機制 • Windows使用了Intel x86的二級或多級分頁表機制來存取虛擬記憶體。處理器在執行記憶體存取指令時,將虛擬位址翻譯成實體位址,翻譯過程涉及到查詢分頁目錄和分頁表,一旦分頁表項目指出一個頁面末在實體記憶體中,則觸發分頁錯誤( page fault)例外。 Two-Level Page-Table Scheme
EPROCESSStructure(2/4) • typedefstruct_EPROCESS { /*前面已列出第一部分*/ PFN_NUMBERWorkingSetPage; KGUARDED_MUTEX AddressCreationLock; KSPIN_LOCK HyperSpaceLock; struct _ETHREAD *ForkInProgress; ULONG_PTRHardwareTrigger; PMM_AVL_TABLEPhysicalVadRoot; PVOID CloneRoot; PFN_NUMBER NumberOfPrivatePages; PFN_NUMBER NumberOfLockedPages; PVOID Win32Process; struct _EJOB *Job; PVOIDSectionObject; PVOID SectionBaseAddress; PEPROCESS_QUOTA_BLOCK QuotaBlock; PPAGEFAULT_HISTORY WorkingSetWatch; HANDLE Win32WindowStation; HANDLE InheritedFromUniqueProcessId; PVOID LdtInformation; PVOID VadFreeHint; PVOID VdmObjects; PVOID DeviceMap;
Lock (鎖) • 鎖的用途是實作互斥存取: • 鎖=0:表示瑣是空閒的,任何 thread都可以獲得,獲得後,鎖的值指定為1,其他thread 都無法獲得鎖 • 鎖=1:未獲得鎖的thread必須被封鎖,直到使用鎖的 thread釋放該鎖為止。 • Spinlock(自旋鎖):本質上是一種忙等待(busy-wait)。為了取得spinlock,處理器不停的檢查鎖的狀態而不做其他事情,直到鎖的狀態變成可用。 • Pushlock(推鎖):支援互斥和共用兩種模式的同步機制。