Vmstat是Virtual Memory Statistics虚拟内存统计缩写:
物理内存是计算机内存的大小,从物理内存中读写数据比硬盘中读写数据要快很多,而内存是有限的,所以就有了物理内存和虚拟内存的概念。
物理内存就是硬件的内存,是真正的内存。
虚拟内存是为了满足物理内存不足采用的策略,利用磁盘空间虚拟出一块逻辑内存,用作虚拟内存的空间也就是交换分区。
作为物理内存的扩展,Linux会在物理内存不足时,使用交换分区的逻辑内存,内核会把暂时不用的内存块信息写到交换空间,这样物理内存就得到了释放,这块儿内存就可以用于其他目的,而需要用到这些内容的时候,这些信息就会被重新从交换分区读入物理内存。
Linux的内存管理采用的是分页存取机制,为了保证物理内存得到充分的利用,内核会在适当的时间把物理内存中不经常使用的数据块儿自动交换到虚拟内存中,而将充分使用的信息保留到物理内存中。
相关阅读:
Linux物理内存探测 http://www.linuxidc.com/Linux/2012-01/50762.htm
Linux物理内存描述 http://www.linuxidc.com/Linux/2012-01/50761.htm
Linux物理内存管理区初始化 http://www.linuxidc.com/Linux/2012-01/50757.htm
Linux虚拟内存优化的细节学习 http://www.linuxidc.com/Linux/2007-01/1759.htm
Linux环境下虚拟内存的建立 http://www.linuxidc.com/Linux/2008-07/14107.htm
需要主机的内存运行机制特点:
1:Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么需要内存,Linux也会交换出暂时不用的内存页面,这样的可以避免等待交换所需的时间。
2:Linux进行页面交换是有条件的,不是所有页面在不用时都交换到物理内存,Linux内核根据最近经常使用的算法,仅仅将一些不经常使用的页面文件交换到虚拟内存中。有时会看到这样的现象:Linux物理内存还有很多,但是交换空间也用了很多,这很正常。比如,有一个占用很大内存的进程运行的时候,需要耗费很多内存资源,此时有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多虚拟内存的进程结束并释放了物理内存之后,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要。
最后交换空间的页面在使用的时候,首先要被交换到物理内存中,如果没有足够的物理内存,他们又会马上被交换出去,这样,虚拟内存中没有足够空间来存储这些交换页面,导致Linux出现服务异常这些情况。
虚拟内存原理:
在内存中运行的每个进程都需要使用到内存,但是不是每个进行都需要每时每刻都使用系统分配的内存空间。但系统所需内存超过实际的物理内存,内核会释放某些进程所占用,但是未使用的部分或者所有物理内存,把这些资料存储在磁盘上,直到下一次调用,并将释放出来的内存提供给有需要的内存使用。
Linux内存管理中,通过调页paging和交换swapping来完成上述的内存调度。调页算法是吧内存中最近不常使用的页面换到磁盘中,把活动页面保留在内存中供进程使用。交换技术是吧整个进程,而不是部分页面全部交换到磁盘中。
分页写入磁盘的过程为:page-out,分页从硬盘重新回到内存的过程被称为page-in,内核需要一个分页的时候,发现此分页不再内存中,,就会发生page fault.
Vmstat字段说明:
Procs:进程,r:运行队列中进程数量,b:等待io的进程数量,
Memory内存:swpd:使用虚拟内存大小,free:可用内存大小,buff:用作缓冲的内存大小,cache:用作缓存的内存大小
Swap:si:每秒从交换区写到内存的大小,so:每秒写入交换区的大小。
IO:(现在Linux下块的大小为1024bytes)bi:每秒读取的块数,bo:每秒写入的块数。
System:in:每秒中断数,包括时钟中断。Cs:每秒上下文切换。
CPU:us:用户进程执行时间,sy,系统时间,idle空闲时间,wa,等待io时间。
查看内存使用的详细信息:vmstat –s
查看磁盘的读写命令:vmstat–d
查看磁盘的读写命令:vmstat–p /dev/sda1
Reads:来自这个分区的读得信息,read sectors:来自这个分区的读扇区的次数,writes来自这个分区的写的次数,requestedwrites:来自这个分区的写请求次数
查看系统的slab信息:vmstat –m
Linux下的fork
Linux 下的fork,执行一次,返回两个值,Linux下一个进程在内存中有三部分的数据,代码段,堆栈段和数据段,一般CPU都有上述三种寄存器,以方便操作系统的执行,
代码段:存放程序代码的数据。
堆栈段:存放的是子程序的返回地址,子程序的参数和程序的局部变量。
数据段:存放程序的的全局变量,参数以及动态数据分配的数据空间。
Linux下函数fork()用来创建一个新的进程,该进程几乎是当前进程的一个完全拷贝,
函数族exec()用来启动另外的进程以取代当前运行的进程。
对于父进程,fork函数返回了子程序的进程号,对于子程序,fork函数返回0.
对于父进程来说,他的进程号是比它更底层的系统调用赋予的,对于子进程而言,它的进程号是fork函数对于父进程的返回值。
Linux下进程间通信:使用:管道,消息队列,共享内存,信号量,套接口等等