程序、进程、线程的概念
作者:互联网
1、程序(Program)
程序是一个具体的文件,是计算机指令的集合,存储在磁盘上,如EXE文件。
2、进程(Process)
进程:是一个正在运行程序的实例,是程序在其自身的地址空间中的一次执行活动。
进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运
行的单位,因此,程序不占用系统的运行资源。
进程由两个部分组成:
内核对象:操作系统用它来管理进程。是系统用来存放进程的统计信息的地方。
地址空间:包含所有可执行模块或DLL模块的代码和数据,以及动态内存所分配的空间,如堆空间和栈空间。
进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。若要使进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线
程负责执行包含在进程地址空间中的代码。
单个进程可能包含若干个线程,这些线程都“同时” 执行进程地址空间中的代码。
每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当操作系统创建一个进程时,会自动创建这个进程的第一个线程,称为主线程
。此后,主线程可以创建其他的线程。如main()、WinMain()所在的线程一般就是主线程。
系统赋予每个进程独立的虚拟地址空间。对于32位进程来说,这个地址空间是4GB。
每个进程有它自己的私有地址空间。
3、线程(Thread)
线程也由两个部分组成:
内核对象:操作系统用它来管理线程。是系统用来存放线程的统计信息的地方。
线程堆栈:它用于维护线程在执行代码时需要的所有参数和局部变量。
当创建线程时,系统创建一个线程的内核对象。该内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。该数据结构保存了
线程的相关统计信息。
线程总是在某个进程中创建。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,
新线程可以访问进程的内核对象的所有句柄、进程中的所有内存,以及同一进程中的所有其他线程的堆栈。这使得单个进程中的多个线程能够
非常容易地互相通信。
线程只有一个内核对象和一个堆栈,保留的记录很少,因此所需要的内存也很少。
因为线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。
操作系统为每一个运行的线程分配一定的CPU时间----时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因时间
片相当短,因此,给用户的感觉,就好像线程是同时运行的一样。
Sleep()函数会主动暂停当前线程的时间片,暂时交出控制权,自己去“睡觉”。
如果计算机拥有多个CPU,多个线程就能真正意义上同时运行了。
使同一进程中的各线程协调一致地工作称为线程的同步。系统提供了多种同步方法,如:临界区(CriticalSection),事件(Event),互斥
量(Mutex),信号量(Semaphore)等。
可以使用PostThreadMessage()函数进行线程间的通讯。
4、使用多线程的场合
帮助理解:一个理发师要为ABC三位贵宾理发,为了不使三个贵宾感到自己有先后之分,理发师可以为A服务n秒,之后为B服务n秒,再为C服务n
秒,然后再为A服务n秒,如此循环;只要n足够小,ABC就感觉到自己没有被怠慢。如果有3个理发师,当然是最理想的了,可以每个理发师真正
的为一个贵宾服务。这里的理发师就相当于CPU,一个理发师就是单CPU,三个理发师就是多CPU了;而为三个贵宾理发,就是3个工作任务。
QQ多人同时聊天。
火车站多窗口售票。
大批量文件复制:复制文件本身使用一个线程,显示进度使用一个线程。如果用一个线程的话,则主界面会失去反应,给用户感觉是死机了。
转载于:https://www.cnblogs.com/order/archive/2012/10/26/2740743.html
标签:理发师,程序,空间,地址,线程,内核,进程 来源: https://blog.csdn.net/weixin_30565199/article/details/99407675