进程和线程
1.进程
从Win32的角度来看,进程就是一大堆对象的拥有权的集合,进程拥有的对象包括内存和资源两类
进程拥有的内存:
被进程拥有的内存可以分为以下三个类型
1) Code
Code是程序的可执行部分,一定是只读性质
2) Data
Data是程序中的所有变量(不包括函数中的局部变量),可以分为全局变量和静态变量两种
3) Stack
每个线程产生时配有一个堆栈,调用函数是也会分配一个堆栈,Stack中存放着局部变量
注:这些内存对进程中的所有线程都是可用的,这在多线程中带来了很大的方便,同时也带来很大的灾难
进程拥有的资源:
进程拥有的资源包括以下几类
1) 核心对象
如线程即文件句柄
2) USER资源
如对话框和字符串
3) GDI资源
如Device Context和画刷
进程就像一本活页笔记本,你可以在其中的活页上写东西,也可以擦掉内容或整页撕掉,活页笔记本只是持有那些东西而已,同理,进程本身并不能够执行,它只是提供一个安置内存和线程的地方。
注:
线程是进程拥有的一个对象
2.线程
进程和内存并没有真正的做事情,一旦CPU开始执行代码,就有了一个线程
注:
我对进程和线程的理解是这样的:
进程类似一个大的房间,房间里有书柜,饮水机,桌子,椅子,电脑及人等,房间是一个容器,拥有着上述各种对象,对房间来说,上述对象没什么本质的区别,只是类别不同而已,
线程类似于房间中的人,可以利用房间中的其他对象执行任务,如一个人拿着杯子去饮水机接水,对进程来说,线程只是他拥有的一个对象,也许比较特殊一点而已
真正执行任务的是人,人利用进程中的其他资源执行某一项任务,更进一步说,房间里可以有多个人,当多个人都要接水时,就涉及到饮水机的互斥访问了,当多个人需要合作完成某项任务了,如一起打dota,那么就需要利用房间里的一些资源如电脑,进行通信了
更进一步来说,当房间里一个人出去了,那对房间来说,只不过出去一个人,对进程来说,失去了一个线程或失去了一个对象,只不过这个对象有点特殊,可以称之为核心对象,同样,当房间里搬出一张桌子,也是失去了一个对象。
这样很多问题就一目了然了,如为什么不使用多个进程,原因很简单,如果我们要接一杯水,我们会重新盖个房间呢,还是在已有的房间里派个人呢?学究一些的话,原因如下
1) 增加一个线程的开销更少
2)利用已有的进程中的资源使资源的利用率更高