Posts Tagged ‘虚拟内存’

November 18, 2009
1
2
3
4
5
6
7
int
main()
{
	char * str = new char[32];
	str = "Hello, Piggy!";
	return 0;
}

这样是会内存泄漏的……而我一直都不知道……不过想来也自然,因为这样是允许的,char *str = “Hello, Piggy!”;,“程序中的字符串被存放在常量存储区”不要把这句话当成耳旁风,谨记。

Tags: ,,.
November 4, 2009
  • 最优置换算法(OPT)
      最优置换(OPTimal replacement),顾其名,知其义,这是一种最优的算法,因为对于任一页面请求序列,其产生的缺页中断次数时最少的,但,这只是理论上的最优。其实质是:当调入新的一页而必须预先置换某个老页时,所选择的老页应是将来不再被使用,或者是在最远的将来才被访问。其最优性是容易证明的。
      但是最优页面置换算法的实现是困难的,因为它需要我们预先就知道一个进程整个运行过程中页面走向的全部情况,而这几乎时不可能的。所以,这个算法主要还是用来衡量其他算法的优劣的。
Tags: ,,.
November 1, 2009

  只占了十分之一左右!这又是为什么呢?永远也学不完的虚拟内存啊!

  呃……又SB了!const int size = 2^30;这哪里是1G啊!分明是28嘛!Orz…汇编码里面尽是28!这下好了,改成1<<30,运行了四个实例,机器就笨的像猪了:

  等程序结束了,刚开始运行着到浏览器也慢了一会儿,估计是被换到交换文件里面去了。

Tags: ,.
September 5, 2009

  操作系统为每一个进程维护着一个虚拟的地址空间,这个地址空间的大小通常取决于系统的地址线数目,比如在32位系统中,虚拟地址空间的返回就是0×00000000~0xFFFFFFFF,大小共4G。通常操作系统会划分出一部分来专门供内核使用,而不允许用户进程直接访问。Linux内核占用4G中高地址的1G,即0XC0000000~0XFFFFFFFF,windows内核通常占用高地址的2G空间,但也可配置成1G。进程的代码、数据以及共享库等资源终究是要放在物理内存中才能被访问的,操作系统在建立用户进程时,会为其建立各自独立的虚拟地址空间,然后将各自的数据段、代码段、BSS段等映射到这个地址空间,并为其初始化堆、栈等必须的资源。另外,操作系统还将虚拟空间和物理空间都划分成大小相等的页,把进程数据所在虚拟地址空间的各个虚拟页面映射到其真正被加载的物理页面,这种映射是全相联方式的,即任何一个虚页可以被映射到任何一个实页。

Tags: ,.
August 28, 2009

  管道是Linux支持的 IPC形式之一,具有以下特点:

  • 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
  • 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);
  • 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
  • 数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。
Tags: ,,,.
August 22, 2009

表明看来似乎合情合理,由于C++的多态特性,允许我们将一个子类地址赋给父类型的指针pb,释放对象时理所当然的对pb进行delete。但,在程序运行时,并没有输出M destructed…,即D::m的析构函数没有被调用,而m的析构函数是需要D::~D()来调用的,所以子类D的析构函数也没有被调用。这是很容易理解的,因为父类的析构函数不是virtual的。由此,我们得出结论,用来继承的父类的析构函数总应该是virtual的,除非你确定它绝对不会被用于多态。关于这一点,《Effective C++》里面已经讲到了。

除了上面的问题,我们还应该关心的是,尽管析构函数没有被调用,那M::i的空间被释放了吗?It’s a question!由于析构函数没有被调用,那么释放M::i的任务就完全落在了delete身上的了,那么delete做到了吗?It’s a very question!这又回到了上一篇日志中所描述的问题上了。我的观点是delete做到了它应该做的事情,它只负责释放当初new申请的空间,即对象本身,至于对象里面是否有动态申请的内存,那就不是delete而是对象析构函数自己的工作了。

Tags: ,,.
August 15, 2009

这里的内存会被正确释放吗?答案要分两方面来讨论。*pd对象本身的内存(4Byte)会不会被释放,就像上例中所说,我还是不知道。但(*pd)::pi所指向的内存肯定是打了水漂啦!因为delete看到的只是一个char*类型的pd,只会简单做一些处理(待高人讲解),而不会调用析构函数demo::~demo()。甚至有时候它会调用其他类的析构函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
class demo
{
    public:
        //~ 此处省略代码数行……
        ~demo()
        {
             delete [] pi;
        }
    private:
        int * pi;
};
 
class foo
{
public:
    ~foo(){cout<<"foo's collapsing..."<<endl;
};
int
main()
{
    demo * pd = new demo;
    delete (foo*)pd;
    return 0;
}

foo童鞋真是可怜,让我们来了个借尸还魂,Orz,借刀杀人才对!

Tags: ,.
August 14, 2009
我能抽象出整个世界...
但是我不能抽象出你...
因为你在我心中是那么的具体...
所以我的世界并不完整...
我可以重载甚至覆盖这个世界里的任何一种方法...
但是我却不能重载对你的思念...
也许命中注定了 你在我的世界里永远的烙上了静态的属性...
而我不慎调用了爱你这个方法...
当我义无返顾的把自己作为参数传进这个方法时...
我才发现爱上你是一个死循环...
它不停的返回对你的思念压入我心里的堆栈...
在这无尽的黑夜中...
我的内存里已经再也装不下别人...
我不停的向系统申请空间...
但却捕获一个异常---我爱的人不爱我...
为了解决这个异常...
我愿意虚拟出最后一点内存...
把所有我能实现的方法地址压入堆栈...
并且在栈尾压入最后一个方法---将字符串"我爱你,你爱我吗?"传递给你...
如果返回值为真--我将用尽一生去爱你...
否则--我将释放掉所有系统资源
Tags: ,,,.
June 24, 2009

在C++程序中,有下面五”类”内存:

  • 在栈上创建。在执行函数时,函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,一般使用寄存器来存取,效率很高,但是分配的内存容量有限。
  • 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete来释放内存。动态内存的生存期由程序员自己决定,使用非常灵活。
  • 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
  • 文字常量分配在文字常量区,程序结束后由系统释放。
  • 程序代码区。
Tags: ,.
Page 1 of 11