一、程序和进程的关系
程序是指计算机指令的集合,它以文件的形式存储在硬盘上,而进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身地址空间中的一个执行活动。例如,一个编写的程序在编译后生成的后缀为.exe的可执行程序,是以文件的形式存储在硬盘上,当我们运行这个可执行文件的时候,就启动了该程序的一个实例,我们将它称为”进程“。
显然,一个程序可以对应多个进程,例如我们可以同时打开多个word程序。进程是资源申请、调度和独立运行的单位,它使用系统中的运行资源。
进程有两个部分组成:1.内核对象;2.地址空间。
内核对象是系统用来存放关于进程的统计信息的地方,它是操作系统内部分配的一个内存块,是一种数据结构,其成员负责维护该对象的各种信息,并且该内核对象只能被内核访问,因此windows只能通过一些提供的函数来对内核对象进行操作,进程由内核对象来管理。
地址空间它包含所有可执行模块或DLL模块的代码和数据,另外也包含动态内存分配的空间,例如线程的栈(stacks)和堆(heap)分配空间。系统为每个进程都赋予了独立的4G的虚拟地址空间(32位进程而言),并且每个进程都有它自己的私有地址空间。4GB的虚拟地址空间,只是内存地址的一个范围,即在我们成功地访问数据而不会出现非法访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。其中,物理存储器包含了内存和页文件。如图下图。
在本人的机器上,页文件大小为1.99G,约为2G,页文件在C盘中,如下图:
二、进程和线程的关系
进程从来不执行任何东西,它只是线程的容器,如果想让进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程空间中的代码,换而言之,真正完成代码执行的是线程,而进程只是线程的容器,或者说是线程的执行环境。例如,一个进程可能用于若干个线程,一个进程至少拥有一个线程,当创建一个进程的时候,操作系统会自动创建这个进程的第一个线程,成为主线程,也就是,执行main函数或WinMain函数的线程,可以把main函数或WinMain函数看作是主线程的入口点函数。此后,主线程可以创建其他线程。
线程由两部分组成:1.线程的内核对象;2.线程栈(stack)。
线程的内核对象:操作系统使用线程的内核对象对线程进行管理,内核对象也是系统用了存放线程统计信息的地方。线程内核对象不是线程本身,而是操作系统用来管理线程的一个较小的数据结构。
线程栈:它用于维护线程在执行代码时需要的所有函数参数和局部变量。线程总是在某个进程环境中创建,系统从进程的地址空间中分配内存,供线程的栈使用。另外,新的线程可以访问进程的内核对象的所有句柄、进程中的所有内存和这个相同的进程中的所有其他线程的堆栈。单进程中的多个线程能实现非常容易的通信。一个线程只有一个内核对象和一个栈。
操作系统为每一个运行线程安排一定的CPU时间-时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间片内运行。因为线程执行时间片非常短,所以在多个线程之间会频繁发生切换,给我们的感觉好像是这些线程在同时运行一样。