工作简历项目经历阐述

来源:互联网 发布:双敏主板上的网络精灵 编辑:程序博客网 时间:2024/05/07 22:40

大规模图片处理系统 

Ÿ针对大规模图片处理系统速度过慢,占用内存过大等问题,提出解决方案:


包含两方面:(1)多幅图像:
                     

                      (2)一张很大的图像: 
       
  
                                  32位支持的最大内存为4G,内核占用一部分,留给程序最大的内存使用大概只有1.6g
具体解释参考:http://bbs.csdn.net/topics/390848702?list=lz
 Windows体系操作系统中,程序分为用户态、内核态两种形态,32位程序总共能访问的内存地址有4G,默认情况下其中有2G内存是分给内核模式使用,用户模式能使用的内存最多为2G,而实际情况下一个应用程序最多只能管理到1.6 – 1.7GB的内存。(加上程序本身还有消耗,实际能给用户代码使用的内存更小)
要扩大程序内存使用范围,有以下几种做法:
1、 程序编译为64位。将彻底解决内存访问限制
2、 Window 32位操作系统中,可以通过改变启动参数的方式,将程序默认内核模式占用的内存缩小为1GB,则用户模式能管理的内存能扩大到2.5G左右。具体方式每个版本的windows配置方式均不一样。网上针对每个版本都有详细的配置方法
3、 Window 64位操作系统中,由于32位的程序是运行在它模拟的一套32位子系统环境中,所以通过改变启动参数的方式是不能达到扩大内存范围的效果的。
4、 Visual Studio 2003以上版本,编译程序时可以通过设置LARGEADDRESSAWARE链接选项,达到扩大内存范围的效果。
                                  
为什么要用换页:
http://blog.csdn.net/friendley/article/details/51533254

为什么引入分页机制

想象一下这样一种情况:假设我们用的计算机物理内存是4GB,但是我们的程序大小是5GB。那么这个时候我们无法将程序全部放到内存中,也就无法运行程序。分页机制引入的原因之一就是为了解决这个问题。分页机制的引入实现了虚拟存储器的机制。

另外,程序执行具有局部性,也就是说一段时间内,只需要程序代码中的一小部分(相对于整个程序)就可以实现程序的执行。那么我们就不用把所有代码和数据都存放在内存中,而是将现在或很近的将来需要的代码和数据放入内存就行了。要实现这个功能需要分页机制。在这种情况下,相同大小的内存在引入分页机制后可以同时存放更多的程序。这由进一步提高了存储器的容量。

现代操作系统都用分页机制来管理物理内存,intel80386以后,一页大多数都是4K。操作系统将磁盘的一部分划出来,作为虚拟内存,由于内存的速度要比磁盘快得多,所以操作系统要按照某种换页机制将不需要的页面换到磁盘中,将需要的页面调到内存中,这就是换页。也叫系统换页。

进程与页:操作系统基本分页存储管理方式

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应该保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。系统又为每个进程建立了一张页表,其记录着相应页在内存中对应的物理块号。进程在执行时,通过查找页表找到内存中对应的物理块号。可见,页表的作用的实现从页号到物理块号的地址映射。

 

现代的大多数计算机系统,都支持非常大的逻辑地址空间(2^32~2^64)。在这样的环境下,页表就变得非常大,要占用相当大的内存空间。采用的解决方法:

a)、采用离散分配方式来解决难以找到一块连续的大内存空间的问题;

b)、只将当前需要的部分页表项调入内存,其余的页表项仍然留在磁盘上,需要时在调入。


内存交换技术,虚拟内存:http://blog.csdn.net/weiwenhp/article/details/8507207

我们知道当多进程在内存中共存时,如果内存足够大都够用,大家相安无事自然是最理想的事了.不过现实往往没那么美好.有些时候内存会满了,不够用了.此时必须将进程从内存移到硬盘中去.有空间时可能又会被移回内存来.专业点的说法叫 滚出(roll-out),滚进(roll-in).或者叫换出,换入.

 

在进行换出,换入时你可能会想到两种方法

(1)以进程为单位换出换进,这是最简单最容易想到的.但是显然不够灵活,因为一个进程所需的内存空间较大.所以这种交换技术现在用的不多

(2)只交换进程的一部分. 通过页式或段式内存管理先把进程的虚拟地址空间划分为若干页面或段,这样交换时就可就交换页或段.

 

页式存储管理

所谓分页就是把进程的虚拟地址空间划分成大小均匀的一页页的(实际上就是一块块的,把进程切成几小块罢了),比如一页是1K,然后把物理内存也划分成一页页的.然后再把两者映射起来.如下图.哎发现有时说一堆话学不如一个图顶用,下面的图都是我们从别处拷来的,图片原地址http://www.doc88.com/p-982340562158.html

 

当然这个映射关系的信息肯定要保存在哪.都保存在寄存器中.然后通过逻辑地址找物理地址的流程如下图

 

 

 

段式存储管理

分页时,就是不管三七二十一,都一刀切,把程序切成均匀的一页页的.但我们知道程序实际运转时是成为很多模块的,比如一个函数可能是一个模块.如果按程序的逻辑结构来分成更小的组成部分可能更合理.因为程序执行时也可以那样分成一个个小的单位去执行的嘛.这里我们把程序的更小单位叫作业

不过分段存储管理其实跟分页管理大的思想理念是一样的,都是把程序分成更小的单位嘛,便于交换而已.只不过分段不是均匀分成固定大小的页,而是根据实际情况分在大小不均的段.此时由于段大小不一,所以除了知道每个段的开始地址还必须要有段表长度的信息.

 

逻辑地址与物理地址转换如下图

 

 

 

分页与分段结合

分页与分段自然是各有好处.分段如果每段太大了自然不太好,那还不如干脆把整个程序交换出去得了,不用整得这么麻烦

于是有人想着把这两种方法结合起来,叫段页式存储管理.你要以在一段内再使用分页技术

 

 

虚拟内存

我们以前讲了在32的windows上,每个程序运行时都会分配2G的虚拟地址空间.就算你调大的话也最多就3G.从这句话里我们可以延伸出这样一些结论.

1.由于32的系统寻址空间只有4G,所以你整个大于4G的内存完全是浪费资源.系统只会用到其中的4G,多出来的根本不会去用.

2.你可能想着每个进程都是2G的虚拟地址空间,那一个进程加载进内存岂不是会把内存塞满了啊.实际上不会的,因为一来嘛分配给你2G地址空间.你不一定用这么多,可能只用10M,这样加载到内存的时候只加载你实际用的.另外就是不会一次把所有进程需要的内存分配下来然后把程序加载进来,而只是加载暂时需要的程序代码或数据

3.因为每个进程地址空间最大也只能整个3G出来.所以如果你的进程一跑时需要4G的地址空间才够用.那你的电脑肯定没法支持的.所以如果一些大型游戏需要内存特别多,你32的系统不管怎么整就玩不了.

 

另外你就肯定会有疑问. 过去个几年我们买电脑时貌似内存很多都512M,1G就算多了.然后嘛基本是32的系统.那如果某个程序实际有用到1G内存咋整? 因为虽然说程序中分配时是用的虚拟地址空间,但如果你在那2G的虚拟地址空间中实际有用到1G,最后就要映射到实际内存中去的啊.而且你1G的内存地址可是不能出现重复.这样那512内存肯定不够用的.

后面就出现了个虚拟内存的概念.就是划出一部分硬盘来当作内存用.当在虚拟内存空间中实际用到的内存大于物理内存时需要用到虚拟内存.在windows中可以在Advanced system settings那里面去设置虚拟内存的大小.不管如果是32位的话虚拟内存加上实际内存肯定也不能大于4G,不然多出来的那部分也是没有用处的.

假如还是上面的例子,512M内存,然后有1G的进程.你于是可以弄个1G的虚拟内存.然后映射的时候,先在实际的内存中映射,可能除开系统需要的一部分外就剩下300了.于是就先映射这300的内存,剩下的再去虚拟内存中映射.

反正你的用的时候只要发个逻辑地址过去.剩下的事就不用管,操作系统有个MMU(memory management unit),里面会有个页表.反正你输入逻辑地址它最终给你转换成物理内存地址或硬盘地址.

至于具体细节比较麻烦的.大概思路是,进程一般会采取分页技术,分成大小一样的很多页,每页有编号.然后页表里面会把你每页对应内存中具体的一块内存.当超过那300的实际上就对应于虚拟内存中去了.(实际上就是硬盘上的一个swp文件),肯定也有标志信息表明这部分是在硬盘上. 于是当进程运行起来时,需要用到某个地址时就映射到虚拟内存中时就会出现所谓的缺页,那页不在内存中嘛,于是就需要去硬盘上把数据读进内存来,如果内存满了就需要置换出去一些页. 所以你设置了虚拟内存,最后如果真的会有用到,那你会看到硬盘转的很快,然后程序运行速度会变慢.硬盘的操作比内存慢很多



             
原创粉丝点击