学了c,还是要学下c++
引用和指针的区别
C++primer中对 对象的定义:对象是指一块能存储数据并具有某种类型的内存空间
一个对象a,它有值和地址&a,运行程序时,计算机会为该对象分配存储空间,来存储该对象的值,我们通过该对象的地址,来访问存储空间中的值
指针p也是对象,它同样有地址&p和存储的值p,只不过,p存储的数据类型是数据的地址。如果我们要以p中存储的数据为地址,来访问对象的值,则要在p前加解引用操作符”*“,即*p。
《深入理解LINUX内核》第二章就难到飞起,这篇文章很好的解释了些知识,mark之👿
物理地址(physical address)
用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。
——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理地址与物理的内存一一对应,也是可以接受的。也许错误的理解更利于形而上的抽像。
虚拟内存(virtual memory)
这是对整个内存(不要与机器上插那条对上号)的抽像描述。它是相对于物理内存来讲的,可以直接理解成“不直实的”,“假的”内存,例如,一个0x08000000内存地址,它并不对就物理地址上那个大数组中0x08000000 - 1那个地址元素;
之所以是这样,是因为现代操作系统都提供了一种内存管理的抽像,即虚拟内存(virtual memory)。进程使用虚拟内存中的地址,由操作系统协助相关硬件,把它“转换”成真正的物理地址。这个“转换”,是所有问题讨论的关键。
有了这样的抽像,一个程序,就可以使用比真实物理地址大得多的地址空间。(拆东墙,补西墙,银行也是这样子做的),甚至多个进程可以使用相同的地址。不奇怪,因为转换后的物理地址并非相同的。
——可以把连接后的程序反编译看一下,发现连接器已经为程序分配了一个地址,例如,要调用某个函数A,代码不是call A,而是call 0x0811111111 ,也就是说,函数A的地址已经被定下来了。没有这样的“转换”,没有虚拟地址的概念,这样做是根本行不通的。
go 一天不用就忘了这个,mark一个以防万一👿
init()
函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来:
继续深入学习Linux👿
在Linux上,proc是一个伪文件系统,提供了访问内核数据的方法,一般挂载在“/proc”目录,其中的大部分内容是只读的,挂载(mount)信息可能为:
1 | proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) |
下面列举“/proc”文件系统下的文件和目录。
/proc/[pid]
目录,pid为进程的数字ID,是个数值,每个运行着的进程都有这么一个目录。
/proc/[pid]/cmdline
是一个只读文件,包含进程的完整命令行信息。如果这个进程是zombie进程,则这个文件没有任何内容。举例如下:
1 | # ps -ef | grep 2948 |
iostat用于输出CPU和磁盘I/O相关的统计信息.👿
单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。
1 | $ iostat |
不想分几章了,所以很长很长👿
一个容器在某个时刻可能处于以下几种状态之一:
TCMalloc比glibc 2.3 malloc(作为一个名为ptmalloc2的独立库提供)和我测试的其他malloc更快。ptmalloc2在2.8 GHz P4上执行malloc/free操作对(对于小对象)需要大约300纳秒。对于相同的操作对,TCMalloc实现大约需要50纳秒。速度对于malloc实现很重要,因为如果malloc不够快,应用程序编写者倾向于在malloc之上编写自己的自定义空闲列表。这可能导致额外的复杂性和更多的内存使用,除非应用程序编写者非常小心地适当调整空闲列表的大小并从空闲列表中清除空闲对象
TCMalloc还减少了多线程程序的锁争用。对于小型对象,几乎没有争用。对于大型对象,TCMalloc尝试使用细粒度和高效的自旋锁。ptmalloc2还通过使用每线程arena来减少锁争用,但是ptmalloc2使用每线程arena存在很大问题。在ptmalloc2中,内存永远不会从一个arena转移到另一个arena。这可能导致大量浪费的空间。例如,在一个Google应用程序中,第一阶段将为其数据结构分配大约300MB的内存。当第一阶段结束时,第二阶段将在同一地址空间中开始。如果第二阶段被指定为与第一阶段使用的arena不同的arena,此阶段不会重用第一阶段之后剩余的任何内存,并会向地址空间添加另外300MB。在其他应用中也注意到类似的内存爆炸问题。