1 / 123

現代系統核心報告

現代系統核心報告. 第三組 范綱烜 995202029 張柔止 995202059 陳浩宇 995202032 呂兆威 995202037 鄭清懷 995202065 張靖裕 995202055 李怡臻 995202078 楊郁莉 995202084. Chapter 3 windows 行程與緒程. Windows 行程 (process) 緒程 (thread). 行程 ( process). 行程 (process) 行程定義了一個執行環境 位置空間 (address space) 程式碼 (text) …. 行程記憶體結構. 行程的建立.

Download Presentation

現代系統核心報告

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 現代系統核心報告 第三組 范綱烜995202029張柔止995202059 陳浩宇995202032呂兆威995202037 鄭清懷995202065張靖裕995202055 李怡臻995202078楊郁莉995202084

  2. Chapter 3 windows行程與緒程 Windows 行程(process) 緒程(thread)

  3. 行程(process) • 行程(process) • 行程定義了一個執行環境 • 位置空間(address space) • 程式碼(text) • …

  4. 行程記憶體結構

  5. 行程的建立 • 建立一個執行體行程物件 • 建立一個初始緒程 • 為初始緒程建立一個堆疊 • 設置初始環境 • 緒程參予系統的排程

  6. 行程狀態

  7. 行程控制表 • 每一個行程在作業系統之中都對應著一個行程控制表(Process Control Block)

  8. 行程控制表(續) • 行程狀態(Process state ) • 可以是new、ready、running、waiting或halted等 • 程式計數器(Program counter) • 指明該行程接著要執行的指令位址 • CPU暫存器(CPU registers) • 其數量和類別,完全因電腦架構而異 • CPU排班法則(CPU scheduling information) • 包括行程的優先順序 (Priorlty)、排班佇列(scheduling queue)的指標以及其它的排班參數

  9. 行程控制表(續) • 記憶體管理資訊(Memory-management information) • 基底暫存器(base register)和限制暫存器(limit register),分頁表(Page table)值的資訊統所使用的記憶系統區段表(segment table)。 • Accounting information • CPU和實際時間的使用數量、時限、帳號工作或行程號碼 • 輸入/輸出狀態資訊(I/O status information) • 配置給行程的輸入/輸出裝置,包括開啟檔案的串列 等等

  10. 多行程模型

  11. Process switch

  12. 行程間通訊(Inter-Process Communication ) • 行程間通訊(IPC,Inter-Process Communication),指至少兩個行程或執行緒間傳送資料或訊號的一些技術或方法。 • shared memory • Pipe • Socket

  13. Thread • Thread組成包含以下元素: • 程式計數器 • CPU暫存器 • 堆疊空間 • 執行緒ID狀態

  14. Thread • 在同一個Process中,不同Thread之間可以彼此共享資源: • 程式碼區域 • 資料區域 • 作業系統資源(EX:openfile,signal)

  15. 行程與緒程 • 一個Process可以有多個Thread。 • 同一個Process內的Thread使用相同的Memory Space,這些Thread各自擁有其Stack。

  16. 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 張柔止

  17. 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 張柔止

  18. 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 張柔止

  19. kernel-level thread • Advantages: • 核心會妥善處理好緒程之間共用處理器的資源分配問題,而無需考慮緒程之間的控制權轉換。 • Disadvantages: • The kernel-level threads are slow and inefficient. • Significant overhead & increased in kernel complexity. Present by 995202059 張柔止

  20. Multithreaded programming • 在支援kernel-level thread的環境中,行程可以容納多個緒程,這導致了多緒程程式設計(Multithreaded programming)模型。 • 在此模型中,緒程間的通訊十分方便及高效率。但是也容易造成緒程間因同步不正確,而導致資料被破壞。 Present by 995202059 張柔止

  21. Thread scheduling algo • 衡量準則: 1. 公平性 2.CPU被有效利用 • FIFO: 若緒程的執行時間長短不一,則實際 效果可能非常不公平 • Random: 打斷緒程執行時,會存在固有的緒 程切換負擔 • Priority: 高優先權的緒程可能霸佔處理器資源 Present by 995202059 張柔止

  22. Thread&process Present by 995202059 張柔止

  23. 3.3 Windows 中行程和緒程資料結構 3.3.1核心層的行程和緒程物件

  24. 3.3.1核心層的行程和緒程物件 • 在Kernerl中,Process 和 Thread 都有相對應的資料結構 • 一個KPROCESS代表一個行程,每個行程都會一個KPROCESS • EPROCESS會建立KPROCESS

  25. 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正在那些處理器上執行

  26. 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可以在哪些處理器上執行。

  27. 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 相關

  28. 3.3 Windows 中行程和緒程資料結構 3.3.1核心層的行程和緒程物件

  29. 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中的資料成員

  30. 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佇列的操作

  31. 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進入等待時刻的時間點, 好讓平衡集管理員可以根據這選項做出相對應的決策

  32. 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; };

  33. 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 =>需要另外分配

  34. 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;

  35. 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;

  36. 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;

  37. 3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • typedefstruct _KTHREAD { } KTHREAD, *PKTHREAD, *PRKTHREAD; LIST_ENTRYThreadListEntry;//表一個雙串列上的節點 PVOIDSListFaultAddress;//與user mode互鎖單串列POP操作的錯誤處理有關

  38. 3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • 從以上介紹的KPROCESS和KTHREAD的資料結構可看出 • 核心層的process和threadobject只包含了系統資源管理和多控制流程並行執行所涉及的基本資訊 • 不含與應用程式相關聯的資訊(ex:process映像檔案和thread啟動函式位址)

  39. 3.3.1核心層的行程和緒程物件-KTHREAD(Part3) • Process Object 提供了thread的基本執行環境 • 包含process address space和一組process範圍內公用的參數 • Thread Object 提供了為參與thread 排程而必須的各種資訊及其維護控制流程的狀態

  40. EPROCESS Define 995202078 李怡臻

  41. Outline • Introduction • EPROCESSStructure

  42. Introduction • 每一個Windows process都是由一個 Executive process (EPROCESS) block來表示。而一個process可能有多個thread,這些thread則由一個executive thread (ETHREAD) block來表示。 • EPROCESS不僅包括了進程(Process)的許多屬性,還包擴了許多指向其他數據結構的指針,其中包含了大量有用的信息。

  43. 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;

  44. EPROCESSStructure

  45. 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

  46. EPROCESSStructure (Con.)

  47. Windows記憶體管理機制 • Windows使用了Intel x86的二級或多級分頁表機制來存取虛擬記憶體。處理器在執行記憶體存取指令時,將虛擬位址翻譯成實體位址,翻譯過程涉及到查詢分頁目錄和分頁表,一旦分頁表項目指出一個頁面末在實體記憶體中,則觸發分頁錯誤( page fault)例外。 Two-Level Page-Table Scheme

  48. 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;  

  49. EPROCESSStructure (Con.)

  50. Lock (鎖) • 鎖的用途是實作互斥存取: • 鎖=0:表示瑣是空閒的,任何 thread都可以獲得,獲得後,鎖的值指定為1,其他thread 都無法獲得鎖 • 鎖=1:未獲得鎖的thread必須被封鎖,直到使用鎖的 thread釋放該鎖為止。 • Spinlock(自旋鎖):本質上是一種忙等待(busy-wait)。為了取得spinlock,處理器不停的檢查鎖的狀態而不做其他事情,直到鎖的狀態變成可用。 • Pushlock(推鎖):支援互斥和共用兩種模式的同步機制。

More Related