C++多线程(1)基本概念 -- 程序、进程、线程、内核对象等 VC++深入详解(孙鑫)笔记

版权声明:版权所有,盗版必究。欢迎转载收藏。 https://blog.csdn.net/yl_best/article/details/83149814

目录

进程

程序

进程

进程与程序的区别与联系

进程由两个部分组成

进程特点

内核对象

进程地址空间

线程

线程组成

线程特点

线程运行

多线程与多进程对比【TODO-表格形式对比】

尽量使用多线程程序的原因

关于多进程和多线程的经典定义


进程

程序

程序是计算机指令的集合,它以文件的形式(如.exe)存储在磁盘上。常见的程序如记事本(notepad)、控制台(cmd)。

进程

进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身的地址空间中的一次执行活动。

进程与程序的区别与联系

进程是资源申请、调度和独立运行的单位。因此,它使用系统中的运行资源;而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此它不占用系统的运行资源。

一个程序可以对应多个进程。例如,可以同时打开多个记事本程序的进程;在一个进程中也可以同时访问多个程序。

进程由两个部分组成

内核对象:内核对象是操作系统用来管理进程。也是系统用来存放关于进程的统计信息的地方。是一种内存块,也是一种数据结构。

地址空间:它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间,如线程栈(stack)和堆(heap)分配空间。

进程特点

进程是不活泼的。进程从来不执行任何东西。真正完成代码执行的是线程,而进程只是线程的容器,或者说是线程的执行环境。若要是进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程的地址空间中的代码。

单个进程可能包含若干个线程,这些线程都“同时”执行进程地址空间中的代码。

每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程,也就是执行main函数或WinMain函数的线程,可以把main函数或WinMain函数看做是主线程的进入点函数。此后,该线程可以创建其他的线程。

内核对象

内核对象是操作系统内部分配的一个内存块,该内存块是一种数据结构,其成员负责维护该对象的各种信息。由于内核对象的数据结构只能被内核访问使用,因此应用程序在内存中无法找到该数据结构,并直接改变其内容,只能通过Windows提供的一些函数来对内核对象进行操作。

进程地址空间

系统赋予每个进程独立的虚拟地址空间。对于32位进程来说,这个地址空间是4GB(232)。因为对32位指针来说,它的寻址范围是232。

每个进程都有它自己的私有地址空间。线程A_1可以访问进程,线程A_1是不能访问进程B地址空间在中的数据结构,反之亦然。如下图。

页文件pagefile.sys为应用程序增加了可以使用的内存。它通过在磁盘上划分出一块空间当作内存使用,从而增加了应用程序可以使用的内存,我们把这块内存称为虚拟内存。页文件pagefile.sys属于受保护的操作系统文件,位于系统盘下。一般被隐藏起来,可以通过“显示->文件夹选项->查看”将其显示。

4GB是虚拟的地址空间,只是内存地址的一个范围。在你能成功地访问数据而不会出现非法访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。

这4GB的虚拟地址空间中,

2GB是内核方式分区,工内核代码、设备驱动程序、设备I/O高速缓冲、非页面内存池的肺片和进程页面表等事宜

用户方式分区使用的地址空间约为2GB,这个分区是进程的私有地址空间所在的地方,其中还有一部分地址空间是作为NULL指针分区。

一个进程不能读取、写入或者以任何方式访问驻留在该分区中的另外一个进程的数据。对于所有应用程序来说,该分区是维护进程的大部分数据的地方。

线程

线程组成

线程由两个部分组成

线程的内核对象。操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。

线程栈(stack)。它用于维护线程在执行代码时需要的所有函数参数和局部变量。

线程特点

当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。

线程总是在某个进程环境中创建的。系统从进程的地址空间中分配内存,供线程的栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。

线程只有一个内核对象和一个栈,保留的记录很少,因此所需要的内存也很少。由于线程需要的开销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。

线程运行

如果计算机拥有多个CPU,线程就能真正意义上同时运行了。

时间片 -- 操作系统为每一个运行线程安排一定的CPU时间。系统通过一种循环的方式为线程提供时间片,每个线程在自己的时间内运行。因为时间片相当短,因此,给用户的感觉就好像线程是同时运行的一样。

多线程与多进程对比【TODO-表格形式对比】

问题:是否可以用多进程程序来取代多线程程序呢?

答案:是可以的,但还是应该尽量采用多线程程序。

尽量使用多线程程序的原因

一、对进程的创建来说,系统要为进程分配私有的4GB的虚拟地址空间,它所占用的资源比较多;对多线程程序来说,多个线程是共享同一个进程的地址空间,所占用的资源较少。

二、当进程间切换时,需要交换整个地址空间,而线程之间的切换只是执行环境的改变,因此效率比较高。

关于多进程和多线程的经典定义

教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”。 

更多内容请看C/C++重点知识路线 精华总结 笔记

来源:VC++深入详解(孙鑫)

猜你喜欢

转载自blog.csdn.net/yl_best/article/details/83149814