有关线程与进程的基础与理解

来源:互联网 发布:windows故障转移集群 编辑:程序博客网 时间:2024/06/10 08:59

1.线程是执行线程的简称,线程函数是线程的一个执行事实,线程函数的执行期,也就是该线程的生命期。

2.相关的几个名词:

Process Database(PDB):进程数据结构;

Module Database(MDB):模块数据结构;

Thread Local Storage(TLS):线程局部存储;

Thread Database(TDB):线程数据结构。

3.模块:系统构建的一个用来管理代码,数据,资源的一种数据结构。

   进程:一大堆拥有权的集合。进程拥有地址空间,动态配置而来的内存,文件,线程和一系列的模块。

   线程:是一个执行事实,系统用一个特定的数据结构,记录线程的所有相关数据,包括线程局部存储空间(TLS),消息队列,句柄表,  地址空间等等。切记,CPU调度的单位是线程而不是进程。

4.windows如何加载一个应用程序?

当windows加载器将程序加载到内存中,KERNEL32挖出一些内存,构建出一个PDB,一个TDB,一个以上的MDBs(视程序使用DLL的多少而定)。针对TDB,操作系统又要产生出memory context,消息队列,句柄表,环境数据结构(EDB),当这些系统内部数据结构都构建完毕,指令指位器(Instruction Pointer)移到程序的进入点,才开始程序的执行。

5.线程优先级问题?

线程的“父亲大人”(进程)拥有所谓的优先级等级,可以在CreateProcess的参数中设定。线程基本上继承自其父进程的优先级,然后加上CreateThread参数中的微调差额(-2~+2),获得的结果便是线程所谓的基本优先级,范围从0~31,数值大则优先级高。::SetThreadPriority是调整优先级的工具,它所指定的也是微调差额(-2~+2)。

6.线程的冻结问题?

可以用::SuspendThread强制冻结一个线程(::ResumeThread可以解除冻结)。线程会被冻结,表示这个线程“要去抓取消息,而线程所附带的消息队列中却没有消息”。如果一个线程完全和UI(用户界面)没有关系,并不表示这个线程没有消息队列,只是它的程序代码中没有消息循环,这种线程叫worker thread(工作者线程)。正因为它没有消息循环的代码,所以它不可能被冻结。如果某个线程调用::GetMessage而其消息队列却是空的,这个线程便被冻结,知道再有消息进来为止。冻结的意思就是不管你的线程优先级多高,暂时退出CPU的调度行列。

7.worker thread与UI thread的差别》

从windows操作系统的角度来看,线程就是线程,并没有不同,不需要分类,但从MFC角度看,分为工作者线程和用户界面线程。但是要注意,线程本来就带有消息队列,而如果线程程序代码中带有一个消息循环,就称为UI thread。

8.有关窗口管理的问题?

为程序中每一个窗口产生一个线程,负责窗口行为是错误的认识。因为子窗口一旦切换,上述做法会导致线程也切换,而线程的切换要花费大量的系统资源。比较好的做法是把所有UI操作都集中在主线程中,其他的纯粹计算的工作才考虑交割工作者线程去做。

9.为你的程序产生的第一个进程和线程,是系统加载器以及核心模块(KERNEL32)合作的结果,而不是调用CreateProcess和CreateThread产生的。MFC程序的第一个操作是CWinApp::CWinApp(比WinMain早),在那里没有产生线程的操作,而是进行收集线程的相关信息。

 

原创粉丝点击