||
程序、进程、线程、句柄
Programs, Processes, Threads, Handles
进程是动态的,程序是静态的。
进程有ID号,有独立的内存空间,进程之间不能共享内存,进程之间通讯要靠管道,消息队列,和共享内存。
进程是一个正在执行的程序,多个不同的进程可以包含相同的程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在CPU上的一次执行过程,它是一个动态的概念。程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。进程是由进程控制块、程序段、数据段三部分组成;同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。
进程:是可以并发执行的程序在某个数据集合上的运行过程,是系统进行资源分配和调度的独立单位。
线程:指进程中的一条执行路径,是系统进行处理器调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源。
线程是进程的细分,比如一个进程里至少会有一个线程,即主线程,如果需要,可以并发出多个线程,这样在程序处理时,某些不需要等待数据返回的操作可以同时进行(看似同时,其实是彼此切换,只不过CPU处理速度太快,感觉不出间断),比如媒体播放器播放一个电影中同时放音乐也同时播放画面,如果没有多线程,那么操作系统必须等到音乐播完或者画面放完才能进行下一个操作。
一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,
另一个则接收用户的按键操作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程。
线程和线程句柄(Handle)不同,线程是一个程序的工作流程,线程句柄是一个内核对象。线程的生命周期就是线程函数从开始执行到线程结束,线程句柄一旦CreateThread返回,如果你不用它操作线程或者等待线程等操作比如waitforsingleobject,就可以CloseHandle。
句柄是一种指向指针的指针。所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢? 为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-28 00:36
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社