关于进程和线程最近自己问了自己一个问题,有几个月了吧,一直没有获得我想要的答案,今天发一下,希望有达人
关于进程和线程
最近自己问了自己一个问题,有几个月了吧,一直没有获得我想要的答案,今天发一下,希望有达人可以解答一下,谢谢
我的问题很简单,为什么每个进程中永远不会有0线程这种情况?至少有1个线程在主进程中存活着,我想知道这个线程与主进程的关系,为什么会出现这种情况,如果可能的话可以说得详细点,谢谢!
[解决办法]
进程必须含有一个或以上线程。
进程被创建时,会自动创建一个基线程,负责执行基本代码,当进程的所有线程消失的时候,进程会退出。
个人感觉,基线程退出的时候,进程并不会退出,而是等待所有线程消失才退出的,参考线程的数据结构,也确实没有这样的一个标识来说明当前的线程是否是基线程。线程区分优先级,默认从进程继承优先级。
进程启动步骤:
内核创建内核进程对象
创建和初始化进程块
创建进程的地址空间
内核创建内核线程对象
创建和初始化线程块
初始化线程的首地址等信息
将线程放入与进程优先级相同的调度队列内。
[解决办法]
进程必须有一个线程,这个线程称为主线程,可以这样描述主线程就是进程的灵魂。你可以看看Windows编程中多线程方面的介绍。
[解决办法]
可以这么理解,进程这个单位是 Windows 为管理程序间内存的分配而设定的,而线程则是为了实现程序代码调度而设定的。我是这么理解的,进程是程序资源的结构对象、线程是进程资源里的程序代码指针,所以光有进程没有线程是不行的。
[解决办法]
《Windows核心编程》
《深入解析Windows操作系统-Windows Internals》
[解决办法]
《Windows核心编程》应该是介绍 Win32 SDK 方式开发 Windows 应用程序的书籍,不会涉及到系统开发
当中的进程调度的理念。如果不了解这种理念,单看以Windows SDK为基础的说明,就和说“Windows进程
最少必须有一个线程”没什么两样。如果要正真理解这种理念,需要了解操作系统开发里的进程调度是
怎么回事才行。这种理念在看见有“Windows”几个字的书基本上很难找不到,因为 Microsoft 不会开源,
有关 Windows 底层的东西也不会轻易放出来告诉你们,他只会把抽象后的理念拿出来给你们洗脑,他只
要提供接口告诉你们怎么用就可以了。所以,如果真要看书,要在那种介绍操作系统开发的书籍才可以找
到一些正真的理念。
[解决办法]
[解决办法]。。。
用伪代码说的话更简单点。。
kernel32!CreateProcessW,我们调用这个
kernel32!CreateProcessInternalW,系统转到这个
ntdll!NtOpenFile,系统打开需要创建的进程的文件,获取句柄
ntdll!NtCreateSection,系统根据上面的文件句柄创建一个映射文件对象(在当前进程)
ntdll!NtQuerySection,从映射对象里面获取一些信息,比如默认的堆栈、页面大小之类的,后面创建线程需要用
ntdll!NtCreateProcess,根据映射文件对象创建一个进程对象,创建成功后系统已经初始化PEB
ntdll!NtAllocateVirtualMemory,在创建的进程对象句柄申请一个空间,用于主线程的堆栈(在被创建出来的进程)
ntdll!NtAllocateVirtualMemory,分页
【现在初始化initTeb和CONTEXT结构体,NtCreateThread要用,指定主线程执行的开始地址,这个开始地址就是上面通过NtQuerySection获取到的本exe文件的入口地址(就是如peid的那个)】
ntdll!NtCreateThread,创建主线程,TEB初始化
ntdll!NtResumeThread,执行主线程
然后程序进入执行,执行体里面做什么就是程序的事情了。
主线程退出程序并不会退出,除非主线程有ExitProcess之类的代码。。。
进程的结束流程,看ExitProcess:
ntdll!NtTerminateProcess,杀除了当前线程外的所有线程
ntdll!LdrShutdownProcess,卸载所有载入的dll
ntdll!CsrClientCallServer,通知csrss结束这个进程
[解决办法]进程是process
线程是thread
看看英文比较好理解哈