`
russelltao
  • 浏览: 157706 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Linux下的内存使用技巧点滴(未完)

 
阅读更多

任何语言编程中,最核心的问题都会包括内存的管理。我认为,从性能上来说,任何系统提供高性能的关键都是缓存的有效利用,在本机编程上,RAM内存则是最有效的CACHE。从代码到程序到进程,编译环境和运行环境在其中对内存的管理起到至关重要的作用。即使如JAVA这种平台无关的语言,它同样通过参数受限于实际环境的限制,它在操作系统平台中的内存布局,同样是按照内核的规矩来的。

当前LINUX由于是免费的,所以大部分SERVER类程序都运行在LINUX上,弄清楚LINUX关于内存的管理是有实用价值的,LINUX2.6内核是当前主流的LINUX内核,所以下面仅谈linux2.6内核中的内存管理一些编程技巧,但是对使用跨平台语言或者中间件编程来说,还是有参考意义的。

我们在使用内存时,最关心的是:无错、高效。无错,是程序的健壮性要求,高效,是对程序性能的要求,这两点都需要对内核管理内存有了解才能做到。下面重点说下为了保证无错和高效需要了解的基本原理。

首先举几个例子说下我们常见的内存错误或者低效使用导致的问题。

1、我们在写服务器端程序时,通常喜欢用多线程实现(在LINUX上用轻量级进程实现)高效的并发,并且为了提高效率习惯每个线程都会在初始化时就预分配大块内存,这样可以在运行过程中长期复用。在运行过程中每个线程也会有动态堆内存的分配。因为不同的硬件配置和操作系统设置,会导致不同的线程数带来不一样的性能,所以这个线程数通常是可配的。那么,如果我们的预分配内存需要大容量时,同时我们为了提高性能把线程数提高后,可能会带来进程崩溃甚至数据变乱(32LINUX不打开PAE扩展时,支持的最大进程地址空间是3G)。

2、复杂的程序常常有几十次的方法调用,如果不是很注重的在方法中分配了过大的栈内存,超过了系统允许的最大值(LINUX默认为8M),同样引发进程崩溃。

3、内存越界,C/C++中常见。一些攻击程序常利用栈地址空间越界,拿到指令寄存器里的地址,将代码执行到任意的线性地址中,比如具备ROOT权限的父进程的代码段。

4、调用mmap系统调用来映射内存时,进程会新分配一个线性区给这段映射。那么这块线性区的大小是有限制的,而且内存向磁盘中刷数据时是重量级系统调用,必须慎重设计。

了解Linux内存,我认为最快的方式是了解主流体系架构下的分页机制以及进程的地址空间。

Linux进程的地址空间,是由许多组线性地址组成的,默认情况下,最多可以拥有65536组线性地址。Linux2.6内核通过一个双向链表和红黑树(2.6内核前没有,普通进程只有几十组线性地址,这时是高效的,但线性区很多时没有红黑树是很低效的)作为全部进程线性区的容器。这些线性区用来存储代码段,数据段,栈,堆,文件内存映射,IPC共享线性区等等。这些线性区,在进程生命周期内可能被增加、删除、修改。我们需要清楚,代码和运行时分配的对象存储在哪些线性区中,以及这些线性区的限制和如何有效的使用它们。

用户态下的进程启动时,会复制父进程的地址空间的指针,如果进程不会修改父进程地址空间中的页,则父进程的页将永远不会复制到当前进程的地址空间中。早期的LINUX版本没有这种写时复制的机制,效率低下,目前的LINUX内核都支持这种,效率有很大提高。

分享到:
评论

相关推荐

    Linux使用技巧集

    Linux使用技巧集 作者:佚名 -------------------------------------------------------------------------------- 安装“红帽子” 《一步一步安装Turbo Linux 》 如 何 在 Linux 下 拨 号 上 Internet 网 ...

    C++ 相关编程技巧点滴

    C++ 相关编程技巧点滴 一些常用或网上不太容易直接查到的C++ 编程技巧说明, 一些为本人编成经验的总结

    LoadRunner使用技巧及相关知识点滴

    本篇文章将深入探讨LoadRunner的使用技巧及相关知识点。 一、LoadRunner架构与组件 1. Controller:这是LoadRunner的核心组件,负责创建和管理测试场景,监控测试执行过程,并分析测试结果。 2. VuGen(Virtual ...

    Linux中文手册

    14.Linux下文件操作编程和GAWK的介绍和应用 15.如何为Linux添加软件详解 16.LINUX的引导过程 17.删除Xteam Linux 硬盘分区的方法 18.关于Linux下编写和编译程序的几个问题 19.基于Linux的学习方法 20.在Linux...

    Microsoft Office Word2007使用点滴

    在Microsoft Office Word 2007中,用户经常会遇到各种操作上的问题,本文将深入探讨两个常见的使用技巧:去掉文字下的波浪线以及改变默认的微软输入法。 首先,让我们来解决文字下方波浪线的问题。这些波浪线通常...

    DotNET_CS(WinForm)开发技巧点滴

    【 DotNET_CS(WinForm) 开发技巧点滴】 在.NET框架下的C/S(客户端/服务器)应用程序开发中,WinForm是一种常见的用户界面技术。这里我们探讨一些开发中的实用技巧,这些技巧可以帮助提升开发效率和软件质量。 1. ...

    Linux服务器安全问题点滴.pdf

    Linux服务器安全是网络环境中至关重要的一个方面,因为服务器是网络安全的核心。Linux因其开源特性而被认为相对安全,但安全漏洞的发现和修复需要依赖系统管理员的及时响应。文章中提到,许多安全问题并非源自系统...

    LoadRunner使用技巧及相关知识点滴.pdf

    其他性能测试技巧 - **参数化**:通过将常量值替换为数据文件中的变量,使得脚本能够灵活地处理不同输入数据,从而提高脚本的重用性和准确性。 - **性能指标分析**:除了基本的脚本开发和调试之外,文档还提到了...

    自动点滴管理系统

    5. **消息队列**:在高并发情况下,WCF可以使用消息队列技术,保证消息的可靠传递,避免系统过载。 此外,系统可能还采用了关系型数据库如SQL Server来存储数据,利用ADO.NET作为数据访问层,与业务逻辑层和表现层...

    液体点滴速度监控装置

    本系统通过光电传感器检测液面高度和液体点滴速度,使用步进电机控制液体点滴速度,并实现了多机通信,即一个主机站控制多个从机站和主、从机之间的数据传输。 系统组成框图: 1. 测量模块:使用光电传感器检测...

    自动点滴管理系统.NET

    在.NET 3.5框架下,开发自动点滴管理系统时,开发人员可以充分利用该框架提供的类库和工具,如ASP.NET、LINQ以及AOP(面向切面编程)等,以提高开发效率和代码质量。.NET 3.5框架引入了对C# 3.0和VB.NET 9.0的支持,...

    精彩编程与编程技巧-VB技巧点滴...

    ### 知识点一:利用 Windows API 在 VB 中隐藏光标 在Visual Basic(简称VB)编程中,...以上四个知识点涵盖了 VB 编程中的一些实用技巧,可以帮助开发者解决实际开发过程中遇到的问题,提高程序的性能和用户体验。

    基于Wcf技术的自动点滴管理系统

    【基于Wcf技术的自动点滴管理系统】是一种利用先进的软件技术设计的医疗管理工具,主要用于提升医疗机构的点滴护理效率。此系统的核心是运用Windows Communication Foundation(Wcf),这是一种由微软提供的.NET框架...

    智能液体点滴速度监测

    标题中的“智能液体点滴速度监测”是指一种利用现代科技手段对输液过程中的点滴速度进行实时、精确监控的技术。这项技术通常结合传感器、微处理器和显示设备,旨在提高医疗护理的安全性和效率,防止因点滴速度不当...

    java点滴学习资料

    ### Java点滴学习资料 #### 一、Java简介与特点 Java是一种高级编程语言,由Sun Microsystems公司于1995年推出。Java的核心优势之一在于其跨平台特性,即所谓的“一次编写,到处运行”,这使得Java代码能够在不同...

Global site tag (gtag.js) - Google Analytics