孙鑫VC中的多线程小结

一、程序和进程的关系

程序是指计算机指令的集合,它以文件的形式存储在硬盘上,而进程通常被定义为一个正在运行的程序的实例,是一个程序在其自身地址空间中的一个执行活动。例如,一个编写的程序在编译后生成的后缀为.exe的可执行程序,是以文件的形式存储在硬盘上,当我们运行这个可执行文件的时候,就启动了该程序的一个实例,我们将它称为”进程“。

显然,一个程序可以对应多个进程,例如我们可以同时打开多个word程序。进程是资源申请、调度和独立运行的单位,它使用系统中的运行资源。

进程有两个部分组成:1.内核对象;2.地址空间。

内核对象是系统用来存放关于进程的统计信息的地方,它是操作系统内部分配的一个内存块,是一种数据结构,其成员负责维护该对象的各种信息,并且该内核对象只能被内核访问,因此windows只能通过一些提供的函数来对内核对象进行操作,进程由内核对象来管理。

地址空间它包含所有可执行模块或DLL模块的代码和数据,另外也包含动态内存分配的空间,例如线程的栈(stacks)和堆(heap)分配空间。系统为每个进程都赋予了独立的4G的虚拟地址空间(32位进程而言),并且每个进程都有它自己的私有地址空间。4GB的虚拟地址空间,只是内存地址的一个范围,即在我们成功地访问数据而不会出现非法访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。其中,物理存储器包含了内存和页文件。如图下图。


在本人的机器上,页文件大小为1.99G,约为2G,页文件在C盘中,如下图:




页文件透明的为应用程序增加了可以使用的内存,它通过在硬盘上划分一块空间 当作内存使用,从而增加了应用程序的可以使用的内存,这块内存被称为 虚拟内存。当然我们也可以自己修改页文件的大小,如下图。



应用程序在运行时,如果使用的内存超过了页文件的初始大小(这里是2GB),页文件会自动增长。一旦操作了设定的页文件设定的最大值时,系统有可能奔溃。
在4GB虚拟地址空间中,2GB是 内核方式分区和约为2GB的 用户方式内存分区。
内核方式分区:供内核代码、设备驱动程序、设备IO高速缓存、非页面内存池的分配和进程页面表使用。
         用户方式内存分区:这个分区是进程的 私有地址空间,其中一部分地址空间作为NULL指针分区。一个进程不能读取、写入、或者以任何方式访问驻留在私有空间中的另一个进程的数据。对所有应用程序来说,该分区时维护进程的大部分数据的地方。


二、进程和线程的关系

进程从来不执行任何东西,它只是线程的容器,如果想让进程完成某项操作,它必须拥有一个在它的环境中运行的线程,此线程负责执行包含在进程空间中的代码,换而言之,真正完成代码执行的是线程,而进程只是线程的容器,或者说是线程的执行环境。例如,一个进程可能用于若干个线程,一个进程至少拥有一个线程,当创建一个进程的时候,操作系统会自动创建这个进程的第一个线程,成为主线程,也就是,执行main函数或WinMain函数的线程,可以把main函数或WinMain函数看作是主线程的入口点函数。此后,主线程可以创建其他线程。

线程由两部分组成:1.线程的内核对象;2.线程栈(stack)。

线程的内核对象:操作系统使用线程的内核对象对线程进行管理,内核对象也是系统用了存放线程统计信息的地方。线程内核对象不是线程本身,而是操作系统用来管理线程的一个较小的数据结构。

线程栈:它用于维护线程在执行代码时需要的所有函数参数和局部变量。线程总是在某个进程环境中创建,系统从进程的地址空间中分配内存,供线程的栈使用。另外,新的线程可以访问进程的内核对象的所有句柄、进程中的所有内存和这个相同的进程中的所有其他线程的堆栈。单进程中的多个线程能实现非常容易的通信。一个线程只有一个内核对象和一个栈。

操作系统为每一个运行线程安排一定的CPU时间-时间片。系统通过一种循环的方式为线程提供时间片,线程在自己的时间片内运行。因为线程执行时间片非常短,所以在多个线程之间会频繁发生切换,给我们的感觉好像是这些线程在同时运行一样。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值