windows进程为每个分配进程的4GB虚拟地址怎么理解

本文章为原创欢迎交流,欢迎轉载;转载请勿篡改内容并且注明出处,谢谢!本文重点论述进程内存的空间布局目的是明白在程序运行时,即执行code时具体是操作嘚那块内存。

操作系统一般采用虚拟内存管理技术(简单讲分层内存换来技术cpu要操作某个数据的过程:首先在cache中查询,若无在内存中查詢若无在硬盘中查询;具体内容请参考其他文档);

所以os分配给每个进程一个独立的,连续的虚拟的,地址内存空间该大小一般是4G32位操作系统,即232次方)其中将高地址值的内存空间分配给os占用,linux os占用1Gwindow os占用2G;其余内存地址空间分配给进程使用;

分别称作内核空間和用户空间;

通常情况下,用户进程不能访问内核空间的地址例外情况是用户进程通过系统调用访问内核空间;

  1. Textro-dataDataBSS四个段的大小昰在程序编译时确定的;
  2. Textro-dataData三个段的内容存储在可执行文件中;
  3. Text, ro-data, Data, BSS四个段的内容是常驻内存的即进程从开始运行到僵死它们都一直存在內存,所以访问它们用的是常量地址;
  4. Stack Segment被放在高地址值是有原因的原因是:调用函数(加帧)是减esp的,函数返回(减帧)是加esp的调用茬前,所以栈是向低地址扩展的放在高地址比较合适;

多线程程序与普通程序的内存布局的不同:

多线程程序和普通程序在内存中的不哃只要表现在栈的不同,每一个线程一个栈所以线程的局部变量不会受到其他线程的影响。而.text, .data. .bss等部分段是各个线程共享的所以线程间通信很简单,可以直接在这些共享内存中存取就可以了;

所谓祸福相依线程内操作这些共享内存的数据时候,要非常小心以避免有两個或多个线程同时操作同一块内存区域;

本文章为原创,欢迎交流欢迎转载;转载请勿篡改内容,并且注明出处谢谢!

本节重点介绍程序中各种不同类型的变量的存放地方:


  当一个程序运行的时候它就会變成进程,而变成进程的程序就会得到虚拟内存给它分配的“地盘”——4G这个地盘由MMU来管理。这就好像一个人去世以后上天成仙神仙給他分配了一块地,他可以在他自己的地盘上恣意妄为这样做的目的主要是为了解决物理内存稀缺的问题。

  而这4G也划分成了两大块第┅块1G要分给内核,我们用户是看不见也进不去的

第二块3G是给用户使用的。就像地拿到手了还要盖房装修,我们用户拿到这3G也要做同样嘚事这3G也要分成好几块。

    3G:①栈空间:特点是由系统管理先进后出,里面放了局部变量、函数形参、自动变量

            ③数据段:数据段里媔又分三块,第一块是bss保存未初始化的全局变量;第二块是rodata,保存了常量;第三块是.data(静态数据区)保存了初始化的全局变量还有static修饰嘚变量  

发布了60 篇原创文章 · 获赞 18 · 访问量 5万+

在一个windows进程机器上创建进程或鍺线程的上限受限于上述核心资源的情况,对于不同内存大小不同操作系统(32位,64位)而言其创建的上限也不同。

根据该文章我们总结叻如下要点,请参考:

进程是操作系统结构的基础windows进程进程是一个具有一定独立功能的可执行文件关于某个数据集合的一次运行活动。茬windows进程内核中有对应的进程对象(Object), 操作系统使用该内核进程对象及其关联的数据结构来存储和跟踪该可执行程序的运行情况

线程是进程中嘚一个实体,是被系统独立调度和分派的基本单位线程自己不拥有系统资源,它可与同属一个进程的其它线程共享进程所拥有的全部资源在windows进程内核中有对应的线程Object来跟踪线程的运行情况。

简单的说线程创建的上限主要与线程用户态Stack大小,进程用户态虚拟内存大小Kernel Stack汾配大小,系统Resident available memory大小有关

windows进程进程创建时,会分配虚拟内存空间一般而言,32位操作系统为4G(2G用户空间+2G内核空间)而64位操作系统,虚拟内存寻址则大的多(8 TB用户空间+8TB内核空间)windows进程线程创建时,会分配用户态Stack(栈)来传递函数参数(function parameters), 管理本地变量(local variables), 保存函数返回地址(function

理论上来说一个進程所创建的线程数量为 min(进程用户态虚拟内存大小/线程用户态分配stack大小,系统Resident avaiable memory/线程内核默认kernel stack大小)

在不同的操作系统版本(32位,64位)以及不同類型的进程(32位64位),最高创建的线程数量是不同的

在进程创建时,除了默认包含的线程的资源外系统还需要预留最小的working set(工作集,归属於物理内存)满足进程基本需要默认大小为200K。此外进程还需要使用虚拟地址空间来存放初始化数据,包含数据结构、PTEHandle,Objects等资源在微軟Blog的测试中,创建一个测试进程基本上消耗1MB Commited virutal Space (已提交虚拟内存),

进程/线程的创建上限与操作系统的核心资源有着密切的联系,我们可以通过適当的调整来系统资源增加其上限但是根据微软官方建议,如果一个/多个应用程序从设计上需要创建大量的进程/线程而这又成为资源瓶颈,那么设计者需要重新考虑架构
一般而言,一个可扩展的应用程序应该让正在运行的线程正好与CPU核数相同(如果使用NUMA非一致性内存访問则与Node上CPU的数量相同),或者使用另外一种方法将同步IO机制修改为异步IO机制,通过IO完成机制来实现CPU与线程数的对应

我要回帖

更多关于 windows进程 的文章

 

随机推荐