概括

多进程模型

现代操作系统通过中央处理器进行任务执行的操作,通过把时间细分,在适当的时间粒度上轮流执行任务,每个任务都有机会进行执行。通过这种方式用户会认为系统的任务是在同时进行的,这种并行方式被称为伪并行,当然如果存在多个处理器,也可变成真并行。所以操作系统具体所作的事情就是:

  • 维护一个全局进程表
  • 把时间分成适当的片段
  • 在进程间进行切换

进程与线程

在现代程序的内存区域有三种类型:静态数据区、动态数据区、维护控制流信息和局部状态的调用栈区域;代码和静态数据去是可以预先确定的,动态数据区和调用栈是在程序运行过程中动态变化的。
进程如果想完成特定的功能,需要起码一个对应二进制模块。但是在实际的进程中,通常一个进行需要使用到其他的模块,而这里使用到的每一个二进制模块,在进程空间中都是一个二进制模块;综上所述,一个进程需要有代码和数据以及控制流状态的信息,还有初始的一个二进制模块,以及可选的其他二进制模块。
进程的创建是建立起基本的进程执行环境,然后加入到系统的全局进程表中,操作系统会创建一组初始的进程用于系统引导。进程的终止首先清理进程占据的所有资源,从系统全局进程表中删除。关于进程的控制流,默认状况是只存在一个控制流,哪怕需要这个控制流需要跨越多个模块,但是他的调用栈只由一个。但是在控制流执行过程又可以创建额外的控制流,也就行程了一个进程多个控制流,这也就是线程的概念。而线程又有两种模型,用户级线程和内核级线程。用户级线程是指在默认的控制流执行过程中通过一些控制点分离出的虚拟的控制流;内核级线程是指操作系统提供的线程语义。线程存在优先级,这里的优先级指的是执行先后顺序的优先级,既然存在执行顺序的概念,系统就必然有需要进行线程的维护——通过构建全局的线程表。而内核级的线程并不需要考虑是否需要把控制权交给其他的线程的问题。因为存在内核级线程,导致进程可以容纳多个线程,这就出现了多线程程序实际模型。

进程与线程的关系:

在Windows中,是支持内核级线程的,进程用于提供执行环境,一个进程包含多个线程,每个线程代表一个单独的执行流,操作系统按照线程分配处理器资源。进程创建了一个大的工作环境,而线程才是在这个环境中真正做事情的人。

内核的进程数据结构

内核层的进程结构_KPROCESS

kd> dt _kprocess
ntdll!_KPROCESS+0x000 Header           : _DISPATCHER_HEADER        //表明是一个分发器对象,对象本身是可等待的+0x010 ProfileListHead  : _LIST_ENTRY               //当进行性能分析时,作为一个节点加入全局性能分析表(KiProfileListHead+0x018 DirectoryTableBase : [2] Uint4B               //页目录基址.0 CR3 /.1超空间的CR3+0x020 LdtDescriptor    : _KGDTENTRY                //ldt描述符+0x028 Int21Descriptor  : _KIDTENTRY                   //兼容dos    +0x030 IopmOffset       : Uint2B                        //指定了进程得IOPM位置(I/O权限表),控制用户模式得I/O访问权限+0x032 Iopl             : UChar                    //定义了I/O优先级+0x033 Unused           : UChar                    +0x034 ActiveProcessors : Uint4B                    //在哪个处理器上+0x038 KernelTime       : Uint4B                    +0x03c UserTime         : Uint4B+0x040 ReadyListHead    : _LIST_ENTRY                //双向链表表头,进程处于就绪态,但是未加入全局就绪表的线程+0x048 SwapListEntry    : _SINGLE_LIST_ENTRY        //当一个进程要被换出内存时,通过此域加入到(KiProcessOutSwapListHead)单链表中+0x04c VdmTrapcHandler  : Ptr32 Void               //指向处理CTRL+C函数进程             +0x050 ThreadListHead   : _LIST_ENTRY                //该进程的所有线程+0x058 ProcessLock      : Uint4B                    //进程锁+0x05c Affinity         : Uint4B                    //指定了该进程的线程可以在哪些处理器上运行+0x060 StackCount       : Uint2B                    +0x062 BasePriority     : Char                    //基础优先级或最低优先级,该进程中的所有线程最起码的优先级(通常默认为8h)+0x063 ThreadQuantum    : Char+0x064 AutoAlignment    : UChar+0x065 State            : UChar                    //表明一个进程是否在内存中,6种状态+0x066 ThreadSeed       : UChar                    //用于该线程理想的处理器+0x067 DisableBoost     : UChar                    +0x068 PowerState       : UChar                    //电源状态+0x069 DisableQuantum   : UChar+0x06a IdealNode        : UChar                    //进程优先选择的处理器节点+0x06b Flags            : _KEXECUTE_OPTIONS+0x06b ExecuteOptions   : UChar

执行体的进程结构_EPROCESS

kd> dt _eprocess
ntdll!_EPROCESS+0x000 Pcb              : _KPROCESS            //指向KPROCESS+0x06c ProcessLock      : _EX_PUSH_LOCK        //执行体的保护锁+0x070 CreateTime       : _LARGE_INTEGER       //创建时间+0x078 ExitTime         : _LARGE_INTEGER        //保护时间+0x080 RundownProtect   : _EX_RUNDOWN_REF        //进程停止保护锁+0x084 UniqueProcessId  : Ptr32 Void            //进程ID+0x088 ActiveProcessLinks : _LIST_ENTRY        //域是一个双链表节点,所有活动进程,可以用来枚举所有进程+0x090 QuotaUsage       : [3] Uint4B            //进程内存使用量+0x09c QuotaPeak        : [3] Uint4B            //内存尖峰使用量+0x0a8 CommitCharge     : Uint4B                //虚拟内存已提交的页面数量+0x0ac PeakVirtualSize  : Uint4B                //虚拟内存大小的尖峰值+0x0b0 VirtualSize      : Uint4B                //进程的虚拟内存大小+0x0b4 SessionProcessLinks : _LIST_ENTRY        //当进程加入系统会话时,将节点加入到该会话的进程链表中+0x0bc DebugPort        : Ptr32 Void            //调试端口,不为0被调试+0x0c0 ExceptionPort    : Ptr32 Void            //异常端口+0x0c4 ObjectTable      : Ptr32 _HANDLE_TABLE    //进程的句柄表+0x0c8 Token            : _EX_FAST_REF            //进程的访问令牌,用于安全检查+0x0cc WorkingSetLock   : _FAST_MUTEX           +0x0ec WorkingSetPage   : Uint4B                //进程工作集的页面+0x0f0 AddressCreationLock : _FAST_MUTEX         //守护互斥体锁,保护对地址空间的操作。当内核代码需要对虚拟地址空间
//进行操作时, 它必须在AddressCreationLock 上执行锁操作, 完成以后再解锁+0x110 HyperSpaceLock   : Uint4B                //自旋锁,保护超空间+0x114 ForkInProgress   : Ptr32 _ETHREAD        //指向正在复制地址空间的那个线程+0x118 HardwareTrigger  : Uint4B                //用于记录硬件错误性能分析次+0x11c VadRoot          : Ptr32 Void            //指向该进程的虚拟地址空间+0x120 VadHint          : Ptr32 Void            //指向进程的物理VAD树的根+0x124 CloneRoot        : Ptr32 Void            //一个平衡树的根,当进程地址空间复制时,树被创建+0x128 NumberOfPrivatePages : Uint4B        //进程私有页面的数量+0x12c NumberOfLockedPages : Uint4B          //进程被锁住页面的数量+0x130 Win32Process     : Ptr32 Void        //指向windows子系统进程区域,如果不为NULL,则是GUI程序+0x134 Job              : Ptr32 _EJOB         //进程属于job时指向_EJOB对象+0x138 SectionObject    : Ptr32 Void        //进程的内存区对象+0x13c SectionBaseAddress : Ptr32 Void        //为该内存区对象的基地址+0x140 QuotaBlock       : Ptr32 _EPROCESS_QUOTA_BLOCK//配额块+0x144 WorkingSetWatch  : Ptr32 _PAGEFAULT_HISTORY //域用于监视一个进程的页面错误+0x148 Win32WindowStation : Ptr32 Void     //是一个进程所属的窗口站的句柄+0x14c InheritedFromUniqueProcessId : Ptr32 Void  //父进程的标识符+0x150 LdtInformation   : Ptr32 Void    //维护一个进程的LDT(局部描述符表)信息+0x154 VadFreeHint      : Ptr32 Void    //用于加速在VAD 树中执行查找操作+0x158 VdmObjects       : Ptr32 Void    //域指向当前进程的VDM 数据区+0x15c DeviceMap        : Ptr32 Void    //域指向进程使用的设备表+0x160 PhysicalVadList  : _LIST_ENTRY   +0x168 PageDirectoryPte : _HARDWARE_PTE_X86//顶级页目录表的页表项+0x168 Filler           : Uint8B+0x170 Session          : Ptr32 Void    //指向进程所在的系统会话+0x174 ImageFileName    : [16] UChar    //进程的映像文件名+0x184 JobLinks         : _LIST_ENTRY  //JOB中的所有进程+0x18c LockedPagesList  : Ptr32 Void    //记录哪些页面被锁住+0x190 ThreadListHead   : _LIST_ENTRY    //进程中的所有线程+0x198 SecurityPort     : Ptr32 Void     //进程与lsass进程的跨进程通信端口+0x19c PaeTop           : Ptr32 Void    //用于支持PAE内存访问基址+0x1a0 ActiveThreads    : Uint4B    //当前进程有多少个活动线程+0x1a4 GrantedAccess    : Uint4B    //进程的访问权限+0x1a8 DefaultHardErrorProcessing : Uint4B    //指定默认的硬件错误+0x1ac LastThreadExitStatus : Int4B    //记录刚才最后一个线程的退出状态+0x1b0 Peb              : Ptr32 _PEB    //进程环境块+0x1b4 PrefetchTrace    : _EX_FAST_REF    //指向与该进程关联的一个预取痕迹结构+0x1b8 ReadOperationCount : _LARGE_INTEGER    //记录NtReadFile服务调用次数+0x1c0 WriteOperationCount : _LARGE_INTEGER    //记录NtWriteFile服务调用次数+0x1c8 OtherOperationCount : _LARGE_INTEGER   //记录除读写操作以外的其他I/O服务次数+0x1d0 ReadTransferCount : _LARGE_INTEGER    //I/O读操作完成的次数+0x1d8 WriteTransferCount : _LARGE_INTEGER    //I/O写操作完成的次数+0x1e0 OtherTransferCount : _LARGE_INTEGER    //非读写操作完成的次数+0x1e8 CommitChargeLimit : Uint4B                //已提交的页面数量的限制值+0x1ec CommitChargePeak : Uint4B                //尖峰时刻已提交的页面数量+0x1f0 AweInfo          : Ptr32 Void    //支持AWE(地址窗口拓展)+0x1f4 SeAuditProcessCreationInfo : _SE_AUDIT_PROCESS_CREATION_INFO    //创建进程时指定的进程映像全路径名+0x1f8 Vm               : _MMSUPPORT    //Windows为每个进程管理虚拟内存的一个结构体+0x238 LastFaultCount   : Uint4B    //指向一个所有拥有此进程空间的进程的双链表+0x23c ModifiedPageCount : Uint4B    //记录该进程中已修复页面的数量+0x240 NumberOfVads     : Uint4B    //+0x244 JobStatus        : Uint4B    //记录进程所属的JOB状态+0x248 Flags            : Uint4B    //进程标志位+0x248 CreateReported   : Pos 0, 1 Bit   +0x248 NoDebugInherit   : Pos 1, 1 Bit+0x248 ProcessExiting   : Pos 2, 1 Bit+0x248 ProcessDelete    : Pos 3, 1 Bit+0x248 Wow64SplitPages  : Pos 4, 1 Bit+0x248 VmDeleted        : Pos 5, 1 Bit+0x248 OutswapEnabled   : Pos 6, 1 Bit+0x248 Outswapped       : Pos 7, 1 Bit+0x248 ForkFailed       : Pos 8, 1 Bit+0x248 HasPhysicalVad   : Pos 9, 1 Bit+0x248 AddressSpaceInitialized : Pos 10, 2 Bits+0x248 SetTimerResolution : Pos 12, 1 Bit+0x248 BreakOnTermination : Pos 13, 1 Bit+0x248 SessionCreationUnderway : Pos 14, 1 Bit+0x248 WriteWatch       : Pos 15, 1 Bit+0x248 ProcessInSession : Pos 16, 1 Bit+0x248 OverrideAddressSpace : Pos 17, 1 Bit+0x248 HasAddressSpace  : Pos 18, 1 Bit+0x248 LaunchPrefetched : Pos 19, 1 Bit+0x248 InjectInpageErrors : Pos 20, 1 Bit+0x248 VmTopDown        : Pos 21, 1 Bit+0x248 Unused3          : Pos 22, 1 Bit+0x248 Unused4          : Pos 23, 1 Bit+0x248 VdmAllowed       : Pos 24, 1 Bit+0x248 Unused           : Pos 25, 5 Bits+0x248 Unused1          : Pos 30, 1 Bit+0x248 Unused2          : Pos 31, 1 Bit+0x24c ExitStatus       : Int4B    //进程退出状态+0x250 NextPageColor    : Uint2B    //物理页面分配算法+0x252 SubSystemMinorVersion : UChar    //进程子系统主版本+0x253 SubSystemMajorVersion : UChar    //次版本号+0x252 SubSystemVersion : Uint2B+0x254 PriorityClass    : UChar    //进程优先级程度+0x255 WorkingSetAcquiredUnsafe : UChar    //+0x258 Cookie           : Uint4B    //代表该进程的随机值,第一次调用ntqueryinformation函数获取cookie值得时候,随机生成一个值,以后就用此值代表进程

内核的线程数据结构

内核层的线程结构_KTHREAD

kd> dt _kthread
ntdll!_KTHREAD+0x000 Header           : _DISPATCHER_HEADER    //分发器对象,线程可以被等待+0x010 MutantListHead   : _LIST_ENTRY    //指向内核层的线程突变体对象(mutant,对应于API 中的互斥体[mutex]对象)+0x018 InitialStack     : Ptr32 Void    //记录了原始的栈位置(高地址)+0x01c StackLimit       : Ptr32 Void    //记录了栈的低地址+0x020 Teb              : Ptr32 Void    //指向进程地址空间中的一个TEB(线程环境块)结构+0x024 TlsArray         : Ptr32 Void    +0x028 KernelStack      : Ptr32 Void    //记录了真正内核调用栈的开始位置+0x02c DebugActive      : UChar+0x02d State            : UChar    //反映了该线程当前的状态+0x02e Alerted          : [2] UChar    //指向一个数组,数组的含义是指该线程分别在内核模式和用户模式下是否可以被唤醒。+0x030 Iopl             : UChar+0x031 NpxState         : UChar    //反映了浮点处理器的状态+0x032 Saturation       : Char    //说明了线程的基本优先级相对于进程的基本优先级的调整量是否超过了整个区间的一半,其值为0、1 或−1。+0x033 Priority         : Char    //包含了该线程的优先级值,这是指它的动态优先级+0x034 ApcState         : _KAPC_STATE    //指定了一个线程的APC信息+0x04c ContextSwitches  : Uint4B        //记录了该线程进行了多少次环境切换+0x050 IdleSwapBlock    : UChar        //域是一个自旋锁,用于保护线程数据成员+0x051 Spare0           : [3] UChar+0x054 WaitStatus       : Int4B    //记录了等待的结果状态+0x058 WaitIrql         : UChar    //WaitNext 为TRUE 时,WaitIrql 记录了原先的IRQL值+0x059 WaitMode         : Char    //记录了当线程等待时的处理器模式,即内核模式或用户模式的等待+0x05a WaitNext         : UChar    //也是一个布尔值,TRUE 值表示这个线程马上要调用一个内核等待函数,它的用途是,在发出了一个信号(比如释放了一个信号量对象)以后,接下来该线程会马上调用等待函数,所以,它不必解除线程调度器锁。+0x05b WaitReason       : UChar    //记录了一个线程的等待理由+0x05c WaitBlockList    : Ptr32 _KWAIT_BLOCK    //指向一个以KWAIT_BLOCK 为元素的链表,对于一个线程而言,WaitBlockList域以及每个KWAIT_BLOCK 对象中的WaitListEntry 域构成了一个双链表,指明了该线程正在等待哪些分发器对象+0x060 WaitListEntry    : _LIST_ENTRY    //当一个线程正在等待被执行时,WaitListEntry 作为一个线程节点加入到某个链表中+0x060 SwapListEntry    : _SINGLE_LIST_ENTRY    //则被用于当线程的内核栈需要被换入时,插入到以全局变量KiStackInSwapListHead 为链表头的单链表中+0x068 WaitTime         : Uint4B+0x06c BasePriority     : Char        //是线程的静态优先级,其初始值是所属进程的BasePriority 值+0x06d DecrementCount   : UChar        //动态优先级+0x06e PriorityDecrement : Char    //记录了一个线程在优先级动态调整过程中的递减值+0x06f Quantum          : Char  //时间碎片+0x070 WaitBlock        : [4] _KWAIT_BLOCK    //第4项专门用于可等待的定时器对象+0x0d0 LegoData         : Ptr32 Void+0x0d4 KernelApcDisable : Uint4B    //0 表示不禁止APC,负数表示禁止APC+0x0d8 UserAffinity     : Uint4B    //是线程的用户亲和性,此值初始时也继承自进程对象的Affinity 值,以后可通过内核函数KeSetAffinityThread 改变。+0x0dc SystemAffinityActive : UChar+0x0dd PowerState       : UChar+0x0de NpxIrql          : UChar+0x0df InitialNode      : UChar+0x0e0 ServiceTable     : Ptr32 Void    //指向当前线程使用的系统服务表+0x0e4 Queue            : Ptr32 _KQUEUE    //是一个队列分发器对象+0x0e8 ApcQueueLock     : Uint4B    //是一个自旋锁,用于保护APC 队列的操作+0x0f0 Timer            : _KTIMER    //附在一个线程上的定时器+0x118 QueueListEntry   : _LIST_ENTRY    //记录了线程在处理一个队列项时加入到队列对象的线程链表中的节点地址。+0x120 SoftAffinity     : Uint4B+0x124 Affinity         : Uint4B    //域指定了线程的处理器亲和性+0x128 Preempted        : UChar    //说明这个线程是否被高优先级的线程抢占了+0x129 ProcessReadyQueue : UChar    //说明一个线程是否在所属进程KPROCESS对象的ReadyListHead 链表中+0x12a KernelStackResident : UChar    //说明该线程的内核栈是否驻留在内存中,当内核栈被换出内存时,该值将被置成FALSE;当换入内存时,再置成TRUE+0x12b NextProcessor    : UChar        +0x12c CallbackStack    : Ptr32 Void    //包含了线程的回调(callback)栈地址,此栈在该线程从内核模式调用到用户模式时使用。+0x130 Win32Thread      : Ptr32 Void    //指向由Windows 子系统管理的区域+0x134 TrapFrame        : Ptr32 _KTRAP_FRAME    //陷阱桢+0x138 ApcStatePointer  : [2] Ptr32 _KAPC_STATE+0x140 PreviousMode     : Char          //先前模式+0x141 EnableStackSwap  : UChar    //说明本线程的内核栈是否允许被换出到外存中+0x142 LargeStack       : UChar+0x143 ResourceIndex    : UChar+0x144 KernelTime       : Uint4B+0x148 UserTime         : Uint4B+0x14c SavedApcState    : _KAPC_STATE     //结构体+10是process域,可以查看当前线程的进程体+0x164 Alertable        : UChar    //说明了一个线程是否可以被唤醒+0x165 ApcStateIndex    : UChar    //指明了当前的APC 状态在ApcStatePointer 域中的索引。+0x166 ApcQueueable     : UChar    //是否可以插入APC+0x167 AutoAlignment    : UChar+0x168 StackBase        : Ptr32 Void    //StackBase 记录了当前栈的基位置(高地址)+0x16c SuspendApc       : _KAPC    //SuspendApc 被初始化成一个专门的APC+0x19c SuspendSemaphore : _KSEMAPHORE    //线程的恢复(resume)操作则是通过控制SuspendSemaphore 信号量的计数来实现+0x1b0 ThreadListEntry  : _LIST_ENTRY    //代表了一个双链表上的节点,当一个线程被创建时,它会被加入到进程对象的ThreadListHead 链表中+0x1b8 FreezeCount      : Char+0x1b9 SuspendCount     : Char+0x1ba IdealProcessor   : UChar+0x1bb DisableBoost     : UChar

执行体的线程结构_ETHREAD

kd> DT _ETHREAD
ntdll!_ETHREAD+0x000 Tcb              : _KTHREAD            //KTHREAD结构+0x1c0 CreateTime       : _LARGE_INTEGER        //线程的创建时间+0x1c0 NestedFaultCount : Pos 0, 2 Bits        +0x1c0 ApcNeeded        : Pos 2, 1 Bit+0x1c8 ExitTime         : _LARGE_INTEGER        //线程的退出时间+0x1c8 LpcReplyChain    : _LIST_ENTRY    //用于跨进程通信(LPC)+0x1c8 KeyedWaitChain   : _LIST_ENTRY    //带键事件的等待链表+0x1d0 ExitStatus       : Int4B    //退出状态+0x1d0 OfsChain         : Ptr32 Void    +0x1d4 PostBlockList    : _LIST_ENTRY        //用于一个线程向配置管理器登记注册表键的变化通知+0x1dc TerminationPort  : Ptr32 _TERMINATION_PORT    //当一个线程退出时,系统会通知所有已经登记过要接收其终止事件的那些端口+0x1dc ReaperLink       : Ptr32 _ETHREAD    //仅在线程退出时使用。当线程被终止时, 该节点将被挂到PsReaperListHead 链表上+0x1dc KeyedWaitValue   : Ptr32 Void    //是带键事件的键值+0x1e0 ActiveTimerListLock : Uint4B    //域是操作此链表(↓)的自旋锁+0x1e4 ActiveTimerListHead : _LIST_ENTRY        //域是一个双链表的头,链表中包含了当前线程的所有定时器+0x1ec Cid              : _CLIENT_ID        //其中包含了线程的唯一标识符+0x1f4 LpcReplySemaphore : _KSEMAPHORE    //用于LPC 应答通知+0x1f4 KeyedWaitSemaphore : _KSEMAPHORE    //用于处理带键的事件+0x208 LpcReplyMessage  : Ptr32 Void    //是一个指向LPCP_MESSAGE 的指针,其中包含了LPC应答消息+0x208 LpcWaitingOnPort : Ptr32 Void    //说明了在哪个端口对象上等待+0x20c ImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION    //指向线程的模仿信息,Windows 允许一个线程在执行过程中模仿其他的用户来执行一段功能,这样可以实现更为灵活的访问控制安全特性+0x210 IrpList          : _LIST_ENTRY    //包含了当前线程所有正在处理但尚未完成的I/O 请求(IRP 对象)。+0x218 TopLevelIrp      : Uint4B    //指向线程的顶级IRP+0x21c DeviceToVerify   : Ptr32 _DEVICE_OBJECT    //指向一个待检验的设备对象+0x220 ThreadsProcess   : Ptr32 _EPROCESS    //指向当前线程所属的进程+0x224 StartAddress     : Ptr32 Void    //包含了线程的启动地址,这是真正的线程启动地址+0x228 Win32StartAddress : Ptr32 Void    //Windows 子系统的启动地址,(通常是系统dll的线程启动地址,往往是相同的,Win32StartAddress 域中包含的才真正是Windows 子系统接收到的线程启动地址)+0x228 LpcReceivedMessageId : Uint4B    //包含了接收到的LPC 消息的ID+0x22c ThreadListEntry  : _LIST_ENTRY    //是一个双链表的节点,每个线程都会加入到它所属进程EPROCESS结构的ThreadListHead 双链表中+0x234 RundownProtect   : _EX_RUNDOWN_REF    //是线程的停止保护锁+0x238 ThreadLock       : _EX_PUSH_LOCK    //一把推锁, 用于保护线程的数据属性+0x23c LpcReplyMessageId : Uint4B    //指明了当前线程正在等待对一个消息的应答+0x240 ReadClusterSize  : Uint4B    //指明了在一次I/O操作中读取多少个页面+0x244 GrantedAccess    : Uint4B    //包含了线程的访问权限,这里的访问权限是一个位组合+0x248 CrossThreadFlags : Uint4B    //是一些针对跨线程访问的标志位+0x248 Terminated       : Pos 0, 1 Bit+0x248 DeadThread       : Pos 1, 1 Bit+0x248 HideFromDebugger : Pos 2, 1 Bit+0x248 ActiveImpersonationInfo : Pos 3, 1 Bit+0x248 SystemThread     : Pos 4, 1 Bit+0x248 HardErrorsAreDisabled : Pos 5, 1 Bit+0x248 BreakOnTermination : Pos 6, 1 Bit+0x248 SkipCreationMsg  : Pos 7, 1 Bit+0x248 SkipTerminationMsg : Pos 8, 1 Bit+0x24c SameThreadPassiveFlags : Uint4B    //一些只有在最低中断级别(被动级别)上才可以访问的标志位,并且只能被该线程自身访问+0x24c ActiveExWorker   : Pos 0, 1 Bit+0x24c ExWorkerCanWaitUser : Pos 1, 1 Bit+0x24c MemoryMaker      : Pos 2, 1 Bit+0x250 SameThreadApcFlags : Uint4B    //是一些在APC 中断级别上被该线程自身访问的标志位+0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit+0x250 LpcExitThreadCalled : Pos 1, 1 Bit+0x250 AddressSpaceOwner : Pos 2, 1 Bit+0x254 ForwardClusterOnly : UChar       //指示是否仅仅前向聚集+0x255 DisablePageFaultClustering : UChar    //用于控制页面交换的聚集与否

(EPROCESS/KPROCESS/ETHREAD/KTHREAD)进程与线程内核层中的结构相关推荐

  1. 操作系统中的进程与线程和java中的线程

    简介 在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程.但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行.因此线程被引入操作系统. 为什么需要线程? 如果非要说是 ...

  2. 内核和用户模式下进程与线程创建

    文章目录 内核模式下进程与线程的创建 进程创建 线程创建 用户模式下进程与线程的创建 内核模式下进程与线程的创建 进程创建 在内核模式中,一个进程的创建是从函数NtCreateProcess开始的.该 ...

  3. 进程和线程:进程的开销比线程大在了哪里?

    不知你在面试中是否遇到过这样的问题,题目很短,看似简单,但在回答时又感觉有点吃力?比如下面这两个问题: 进程内部都有哪些数据? 为什么创建进程的成本很高? 这样的问题确实不好回答,除非你真正理解了进程 ...

  4. linux内核的进程管理,Linux内核设计与实现——进程管理

    主要内容 进程 进程描述符及任务结构 进程创建 线程在linux中的实现 进程终结 1. 进程 进程不仅仅是一段可执行程序代码,还包含其他资源,如打开的文件,挂起的信号,内核内部数据,处理器状态,一个 ...

  5. 进程、线程、协程、通信方式

    文章目录 进程 线程 协程 进程.线程.协程的区别 概念 进程.线程共同点 进程.线程不同点 线程.协程比较 通信方式之间的差异 进程通信 管道(pipe) 有名管道 (namedpipe) 信号量( ...

  6. Linux 操作系统原理 — 进程与线程管理

    目录 文章目录 目录 前言 进程与线程 内核线程,用户线程与轻量级进程 内核线程 轻量级进程 用户线程 轻量级进程与用户线程的区别 用户线程与轻量级进程的混合模式 用户线程和内核线程的区别 线程的实现 ...

  7. linux下查看进程的线程数,linux查看进程的线程数

    top -H -p $PID  #查看对应进程的那个线程占用CPU过高 1.top -H 手册中说:-H : Threads toggle 加上这个选项启动top,top一行显示一个线程.否则,它一行 ...

  8. 读者投稿 | 写Go满一年啦,来聊聊进程、线程与协程

    进程 在早期的单任务计算机中,用户一次只能提交一个作业,独享系统的全部资源,同时也只能干一件事情.进行计算时不能进行 IO 读写,但 CPU 与 IO 的速度存在巨大差异,一个作业在 CPU 上所花费 ...

  9. 操作系统之进程和线程

    操作系统也是软件,区别于应用软件的最大特点具有进程管理.内存管理等功能. 一 进程 1.1 什么是进程(process) 进程指的就是正在运行中的程序.进程也是有生命周期,当程序运行结束,则进程结束. ...

最新文章

  1. 下班后散步雨后湖景一角
  2. webpack 开发模式管理 Development
  3. Android File.listFiles()返回null问题
  4. 计算机控制系统视频关守平,国家级精品课《计算机控制系统》课程建设研讨会顺利召开...
  5. LA 4123 (计数 递推) Glenbow Museum
  6. Android studio 0.5.0 注意事项
  7. 网件rax40可以刷梅林_支持WiFi6,带宽达到3000Mbps,网件RAX40路由器评测 | 钛极客...
  8. Cocos2d-x-使用脚本概述
  9. 演练:使用 Windows 窗体收集数据
  10. 卡方分布分位数_数理统计第五讲(三大分布)
  11. html表单电子邮件验证验证,详解JavaScript表单验证(E-mail 验证)
  12. 从信号与系统,数字信号处理的角度看目前手头研发的蓝牙耳机
  13. ubuntu安装freeradius3, freeradius3-mysql并配置
  14. vue -lic 搭建vue项目
  15. 没有大招的火山引擎,拿下70%大模型玩家
  16. 斐波纳契数列(Fibonacci Sequence),又称黄金分割数列
  17. ps命令 查看系统进程信息
  18. 关于js关闭窗口的事件和用法
  19. 都是博士生的西湖大学第三期新招195位学生
  20. Vue 2.0 官网 API 零碎知识整理

热门文章

  1. TCL电子软件开发生活记录(更新中)
  2. swift项目嵌入flutter的module混合开发(官方推荐模式)
  3. 螺栓、螺柱、螺钉的分类
  4. 一个曾经的吉他手——孔乙己
  5. 深入剖析ReentrantLock公平锁与非公平锁源码实现
  6. 微信小程序新坑-文字溢出连续英文或者英文溢出 会出现字符
  7. 【SpringBoot进阶】阿里云短信发送配置
  8. 小程序如何跳转到第三方H5页面
  9. 娃娃机共享扫码平台开发
  10. 牛客Steins;Gate(原根+FFT)