内存文件系统【Linux下使用内存文件系统】

这里主要介绍了内存文件系统的两种形式:ramfs tmpfs

在Linux中可以将一部分内存当作分区来使用,我们称之为RamDisk。对于一些经常被访问的文件,而它们又不会被更改,可以将它们通过 RamDisk放在内存中,即可明显地提高系统的性能。当然你的内存可要足够大了。RamDisk有两种,一种可以格式化,加载,在Linux内核 2.0/2.2就已经支持,其不足之处是大小固定。另一种是内核2.4才支持的,通过Ramfs或者tmpfs来实现,它们不能被格式化,但是用起来灵 活,其大小随所需要的空间而增加或减少。这里主要介绍一下Ramfs和Tmpfs。

Ramfs顾名思义是内存文件系统,它工作于虚拟 文件系统(VFS)层。不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。如果你的Linux已经将Ramfs编译进内核,你就可以很 容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可。

# mkdir -p /RAM1
# mount -t ramfs none /RAM1

缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。

QUOTE:
# mkdir -p /RAM1
# mount -t ramfs none /RAM1 -o maxsize=10000
以上即创建了一个限定了最大使用内存大小为10M的ramdisk。

Tmpfs 是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的ramdisk,也不同于针对物理内存的Ramfs。Tmpfs可以使用物理内存,也可以使 用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。Tmpfs就 是和虚拟内存子系统来"打交道"的,它向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在 交换分区中。Tmpfs同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。使用tmpfs,首先你编译内核时得选择"虚拟内存文 件系统支持(Virtual memory filesystem support)" ,然后就可以加载tmpfs文件系统了。

# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs

为了防止tmpfs使用过多的内存资源而造成系统的性能下降或死机,可以在加载时指定tmpfs文件系统大小的最大限制。

# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m

以上创建的tmpfs文件系统就规定了其最大的大小为32M。不管是使用ramfs还是tmpfs,必须明白的是,一旦系统重启,它们中的内容将会丢失。所以那些东西可以放在内存文件系统中得根据系统的具体情况而定。

再补充一下:ramfs只会在物理内存中被创建,而tmpfs可能在物理内存中创建,也可能在交换分区中被创建。对于想利用内存的高速IO来提高效能的应用,最好是使用ramfs。对于只是想存放临时缓存的应用,最好是用tmpfs,以提前内存的利用率。

内存文件系统【FreeBSD下的内存文件系统】

FreeBSD下的内存文件系统

大多数操作系统,包括FreeBSD,通常使用磁盘来保存需要存储的数据。而操作系统采用文件的形式来保存数据,因此操作系统在磁盘上存储数据需要按照一定的格式进行,以便系统能够正确存储和访问文件,数据在磁盘上的组织格式被称为文件系统,不同的操作系统通常使用不同的数据组织格式,就是说使用不同的文件系统,例如FreeBSD使用UFS,而Linux使用Ext2FS等等。UFS是最古老和标准的Unix文件系统,但FreeBSD下对其进行了改进,主要目的是改善性能,改进后的文件系统也被称为FFS。

由于文件系统已经成为了操作系统访问外部磁盘数据的标准形式,操作系统很少直接访问磁盘获取数据。由于数据存储在实际应用中的重要意义,文件系统已经成为操作系统最基本的元素之一。进一步,多个操作系统可以通过同样的文件系统访问外部磁盘,而同一个操作系统也可以通过不同的文件系统访问不同的外部磁盘设备。这样一来,文件系统就成为了界于操作系统和外部磁盘设备之间的一个独立层次。

正是由于文件系统已经成为了独立的一个抽象层,因此可以在这个层次进行更为复杂的处理,例如不让文件系统从磁盘设备设备上读取数据,而是从网络上读取数据,就形成了网络文件系统,从内存中读取数据就形成了内存文件系统,对读取的数据进行加解密处理,就形成了加密文件系统,等等。

虚拟磁盘和内存文件系统

虽然目前磁盘的容量、速度和可靠性基本上能满足绝大多数应用系统的要求,但是在某些情况下,使用磁盘存储数据仍然存在一些问题。一个例子是在嵌入式系统中,系统通常没有磁盘,数据通常存储在各种不可擦写或可擦写型半导体芯片中。另一个常遇到的例子是应用系统对于数据访问要求特别高的性能,由于磁盘是一种机械设备,读写的性能总是有限的,不能满足应用系统的需要。

在这些例子中,在面对需要解决的问题的时候,通常有一个隐含前提,就是不改动操作系统和应用程序本身。如果可以改动系统,那么,人们就可以针对具体的需要设计另外一套完整的系统,上述问题事实上也就并不存在了。但是这种做法并不现实,因为这将意味着将全部操作系统和应用系统都推倒重来。因此,为了解决这些极端的需求,最简单的方法是在内存中分配一个区域作为文件系统的数据存储区,而不是使用磁盘作为存储设备,这样既能够满足操作系统对文件系统的需求,也能够满足应用系统的特殊需要。

使用内存作为文件系统基本上有两种不同的选择方式,最简单的方式是将内存中的一个区域模拟一个磁盘分区,然后就可以在这个虚拟磁盘上按照现有的文件系统组织数据,因此就需要初始化文件系统、装载与卸载等标准文件系统操作。另一种方法为重新设计一套全新的文件系统,其中并不包含任何磁盘的概念,但在系统中表现为一个标准文件系统。明显的,重新设计一套文件系统需要更多的工作量,因此,绝大多数情况下,人们使用第一种虚拟磁盘的方法。但是,现有的文件系统,如UFS等,都是基于磁盘设备而设计的,因此很多概念,比如按磁盘块读取数据、缓冲、碎片等等,都是针对磁盘设备提出的,理论上基于内存的存储不需要这些概念,因而也不会出现这些概念需要解决的一些问题。

由于内存文件系统是使用内存来模拟磁盘操作,因此数据都是在内存之间传输,就可以得到比较高的读写性能。当然,使用内存文件系统,一旦系统重新启动,所有的内容也就不再存在了,因此只能用来保存临时性的数据。也是由于是使用内存来保存数据,缓冲实质上没有任何意义,传统文件系统中的异步”async”和同步”sync”这两种概念的意义也不大了。

虽然从本质上讲,内存文件系统根本不需要缓冲,直接访问就能达到最好的效率,但是很难做到这一点,尤其是由于目前都还是使用内存来模拟一个磁盘设备的情况,内存文件系统事实上还是经过了缓冲。从这个地方,也可以看出目前使用的内存文件系统的弊病,内存文件系统本身占据了一份内存,磁盘缓冲又会占据一份内存,这样就导致了内存的浪费。在系统有交换分区存在的条件下,一旦系统内存紧张,该文件系统中的有关数据也会被交换到具体的交换设备上,同样避免不了对磁盘的物理访问,达不到提高性能的目的。而且一旦包括交换空间在内的所有虚拟内存用光,系统就无法正常提供服务了,从而影响系统的稳定性。

试图使内存文件系统绕过磁盘缓冲其实并不容易,这是因为在目前的操作系统中,磁盘是非常重要的一部分。非常重要的虚拟内存概念就是使用磁盘设备作为交换设备模拟内存,而磁盘缓冲而是通过内存来缓冲磁盘数据,虚拟内存、磁盘缓冲就是操作系统内存管理中的最基本元素,如何处理这两个部分,也是影响系统性能的最重要的因素。文件系统实质上是建立在操作系统的内存管理部分之上的,因此绕过这一部分,需要更困难的内核工作。

因此,对于高负载的服务器,使用内存文件系统实际上得不偿失,在系统内存很快用光的情况下,操作系统将进行磁盘交换,导致系统性能严重下降,这比起直接使用磁盘文件系统更为糟糕。事实上,在高负载的服务器环境下,允许系统使用更多的内存来缓冲磁盘数据,更有效的发挥系统的磁盘缓冲能力,在实际使用中更为有效。

使用MFS

FreeBSD下最基本的内存文件系统为MFS(Memory File System)文件系统,它是直接从虚拟内存中为文件系统申请空间。虽然它命名为MFS,实质上它还是使用的标准UFS的数据组织格式,仍然有扇区、磁盘块等基本概念,但是为了使用方便,它没有创建可以被直接访问的虚拟磁盘设备。实际上MFS是一个不完整的虚拟磁盘系统,由于它没有虚拟磁盘设备,因此导致在一些情况下它不能很方便的应用。

使用MFS需要内核中的”options MFS”支持,这个选项实质上是一个标准选项,在缺省情况下的FreeBSD内核都支持,因此一般不需要重新定制内核。然后就可以使用mount_mfs来安装内存文件系统,或者在标准mount命令中指定mfs选项。

# mount_mfs -s 131072 /dev/da0s1b /tmp

执行这个命令之后,mount_mfs就从虚拟内存中申请131072个扇区大小的内存,用来作为MFS文件系统的存储区域,并将该文件系统安装到/tmp目录下。这里使用/dev/da0s1b作为设备文件参数,这个磁盘分区为一个交换分区,它并不是实际使用的磁盘设备或虚拟磁盘,它的基本目的是用来满足mount_mfs的参数需要。即使系统中有多个交换设备,这也并不意味着MFS就只会交换到这个指定设备上,虚拟内存按照自己的规则分配物理内存或交换空间。

当然,使用交换设备作为参数事实上也起到了一些额外的作用,因为对于标准文件系统来讲,必须通过初始化的过程确定文件系统的组织格式,而MFS不需要独立的初始化过程,在mount_mfs操作的时候就同时执行了初始化,因而mount_mfs可以从这个设备文件中读取一些初始化相关的参数信息,例如每个扇区大小等,来初始化MFS文件系统。通常扇区尺寸为512字节,因此该文件系统总大小为64M。

这里就可以看出,基本的MFS是不存在虚拟磁盘设备的,mount_mfs直接申请内存并用作文件系统,而在mount命令中使用的设备参数为交换设备而非虚拟磁盘设备。一些情况下希望操作虚拟磁盘设备,那么使用MFS就不方便了。

使用vn伪设备

MFS是通过一个独立的文件系统来达到内存文件系统的目的,伪设备VN就是通过另一种方式来达到这个目的,它直接模拟一个虚拟的磁盘设备,那么在这个虚拟磁盘设备中可以应用各种不同的文件系统来保存数据。VN设备需要内核支持"pseudo-device vn"配置和/dev目录下的设备文件vn0、vn0c等,这通常不是缺省配置,需要用户重新定制内核。

VN设备主要使用文件作为虚拟磁盘的存储空间,例如将光盘的镜像文件用作虚拟光盘设备,将软盘的镜像文件作为虚拟软盘设备等等。当然模拟是有一定限度的,主要用来模拟文件系统,例如虚拟光盘设备上就没有音轨数据,无法作为CD播放等等。

显然使用内存保存虚拟磁盘数据,与使用文件相比甚至更为简单。因此,VN设备也支持使用内存来模拟一个虚拟磁盘。VN设备需要使用vnconfig程序来控制虚拟磁盘设备,那么为指定虚拟磁盘磁盘申请内存,并配置该虚拟磁盘的操作为:

# vnconfig -s 131072 /dev/vn0c

这里使用-s参数指明申请内存空间的大小,而vn0c为空闲的虚拟磁盘设备。配置好了虚拟磁盘之后,就可以使用标准的磁盘操作命令对磁盘进行操作,包括文件系统的初始化。对于虚拟磁盘设备来讲,一般不需要分区操作,而是直接进行文件系统操作,事实上虚拟磁盘通常也没有分区的概念,fdisk命令也不识别虚拟磁盘,可以将虚拟磁盘设备当作一个完整的分区设备。这是因为在Unix下本来是没有磁盘分区的概念的,这个概念是DOS/PC概念,因此FreeBSD对磁盘分区的支持限于可能存在其他系统的物理磁盘,对于只用于Unix的虚拟磁盘,就不需要这个概念了。

# disklabel -r -w /dev/vn0c auto

# newfs /dev/vn0c

# mount /dev/vn0c /tmp

由于使用VN设备比起MFS来讲要多一个创建虚拟磁盘设备的过程,因此使用vnconfig就与使用mount_mfs不同,要略微麻烦一些,除了需要经历vnconfig配置虚拟磁盘之外,还需要初始化磁盘设备、创建文件系统等步骤。

显然,由于创建了虚拟磁盘设备,在这里就不再是裸的MFS系统,而是一个更为完善的虚拟磁盘系统。显然,这里就不需要MFS的帮助,而在newfs和mount时直接使用UFS文件系统。理论上可以使用各种不同的文件类型格式,并不限于是UFS。

内存磁盘设备md

使用MFS系统,就可以最方便快捷的建立内存文件系统,使用vn设备,就可以建立内存文件系统相关的虚拟磁盘设备,基本上,这两个内存文件系统将满足绝大多数应用系统的需要。然而,一个非常重要的问题仍然存在,就是这些内存文件系统都是在系统启动之后,通过相应的配置命令进行配置的,而在一些情况下,需要在系统启动或启动之前,就配置好内存文件系统。

这种在系统启动之前要求配置好内存文件系统的例子之一就是系统安装程序,因为安装系统通常都是使用光盘或软盘启动,光盘或软盘作为系统的根文件系统当然是可行的,但总存在种种限制,例如软盘的访问速度和可靠性限制,光盘的只读限制等等。因此,目前的FreeBSD的系统安装程序,是使用内存文件系统作为安装系统的根文件系统,而不是试图将软盘或光盘作为安装系统的根文件系统。在这种情况下,通常使用一个独立的系统镜像文件,在启动之前载入内存,作为内存文件系统的初始数据来配置内存文件系统。

为了达到这个目的,就需要使用系统中的伪设备md,这需要相应的内核支持"pseudo-device md",这个选项通常需要重新定制内核。此后,还需要在/dev目录下创建相应的设备文件md0和md0c。这样使用新内核重新启动之后,就可以用使用普通磁盘一样的方法来使用它了,而不需要任何配置过程。

# disklabel -r -w /dev/md0c auto

# newfs /dev/md0c

# mount /dev/md0c /tmp

这里不需要使用任何配置程序配置虚拟磁盘设备,因为在启动过程中它就被自动配置了,内核为设备自动申请必要的内存空间。需要注意的是,使用MD设备并没有指定磁盘的大小,因为预先保留的md磁盘的大小是在编译内核时就确定的,缺省大小为20000个扇区。如果要更改内核为MD设备分配的空间大小,就需要在定制内核时改变设置选项”MD_NSECT”的值,并重新编译内核。显然,这样做显然比较麻烦,也使得它的实际用处不大。

但当MD设备用在安装系统的时候,作为最初启动的虚拟磁盘需要载入一个预先配置好的磁盘镜像文件,这个时候虚拟磁盘的大小就是由这个磁盘镜像文件决定的,而不再是MD_NSECT设置的值。正是由于MD设备在启动过程中配置,因而灵活性不足,就使得MD设备主要用在安装系统中。

启动镜像设置

对于系统安装程序,或者一些嵌入式系统来讲,存储数据的物理设备无法很方便的作为文件系统存在,例如存储设备为不可擦写的ROM或者具备一定擦写寿命的Flash中,这些设备如果用作文件系统就有各种各样的限制,此时就需要使用内存文件系统作为辅助,例如使用内存文件系统作为根文件系统,或者作为临时文件系统等等。

但是由于内存文件系统是使用不可长期保存的RAM存储器保存数据,系统重新启动或断电后其中保存的数据就不再存在,因此每次启动之后虚拟磁盘中的数据都是随机的,需要重新进行初始化操作。也可以提供一种手段为最初的虚拟磁盘提供初始数据,通常这通过使用镜像文件的方法来完成。

使用伪设备MD,就可以将一个预先准备好的文件作为md设备的镜像数据,这样MD设备一旦创建就已经具备了必要的数据,而系统启动之后立即可以访问已经具备数据的虚拟磁盘了。通过这样的操作,就可以使用虚拟磁盘文件系统作为根文件系统,启动其中的系统安装程序。

因此,这个时候就需要为MD设备准备初始镜像文件,最直接的方法是首先用确定的大小创建MD设备,初始化文件系统,安装上文件系统并复制必要的数据,然后在卸载文件系统,使用dd命令直接操作虚拟磁盘设备,将数据复制到一个镜像文件中。但是由于MD设备的大小比较不容易改变,因此这种方法并不灵活。此外,由于MD设备被作为一个虚拟的物理磁盘被系统处理,系统对它的处理事实上是和真实物理磁盘设备的处理方法也是一样的,因此也可以使用物理磁盘,创建文件系统并复制其镜像的方法来获得镜像数据。

使用虚拟磁盘MD和物理磁盘都可以得到镜像文件,但是这两种方法都不是很灵活,最好的方法是可以直接修改镜像文件本身。事实上VN设备正是用作这个处理任务,它能使用镜像文件作为虚拟磁盘的存储区域,使用VN设备创建并修改镜像文件的数据是非常适合的。因此在大小一致的条件下,就可以直接将VN设备的镜像文件复制到MD设备上,然后将MD设备安装到系统中,就可以访问到具体数据。

因此,使用VN设备预先定制好MD设备使用的镜像文件是最常用、最方便的方法。系统载入镜像文件的过程应该在启动之前完成,以便系统在启动过程中能够配置好该MD设备。事实上,镜像文件是由Boot Loader载入的,作为MD设备的缺省数据。当然,另一种选择是直接将镜像文件写入内核文件中,使得镜像数据和内核一起载入。将镜像文件写入内核的方式需要改动内核,并且写入之后就不容易改变镜像文件中的数据,因此,目前这种方式很少被用到。

为了将镜像文件写入内核,需要设置内核选项MD_ROOT_SIZE,需要指定它的尺寸大于镜像文件的尺寸,以便系统在内核中保留出大于镜像文件的自由空间,以使得写入的数据不至于覆盖内核中有用的数据。这个参数和MD_NSECT是不同的,但它也为一个虚拟磁盘预保留了空间。如果是使用Boot Loader来载入镜像文件,就不能设置这个选项,因为这将导致系统在启动时初始化多个虚拟磁盘,而只有第一个虚拟磁盘md0才是可以启动的。

当然,一个能够将MD设备作为启动根文件系统的内核,除了标准的md和MFS选项之外,还需要"options MD_ROOT"的设置选项,以保证内核搜索MD设备的作为根文件系统。这个设置也可以写作"MFS_ROOT",以便和早期的FreeBSD系统兼容,早期的FreeBSD系统没有使用md伪设备,而是使用第二种直接写入内核的MFS文件系统作为根文件系统。

几种不同方式的比较

无论是MFS,还是VN设备和MD设备,它们对数据的处理方式其实是非常类似的,MFS就是直接在内存中开辟一个UFS格式的区域,用作文件系统,这个区域其实就是一个虚拟磁盘镜像。而VN设备和MD设备是先申请内存空间,然后采用标准的文件系统工具进行处理,因此更为灵活。

最为重要的一点区别实际上是它们获得自由内存空间的方式不同,MFS和VN实际上是使用动态的方式申请虚拟内存,而md设备实际上是在系统启动之前已经分配完毕,是一种静态的方式,其实是通过内核申请空间的方式MALLOC分配的。这样就导致MFS和VN设备申请的内存是按照虚拟内存的方式进行处理,就是说它们是基于交换空间的,在物理内存不够的情况下将被自然的交换到磁盘设备中。而MD设备使用的内存是内核申请的,因而位于内核空间中,主要占用物理内存。

这两种不同的使用内存的方式,造成了这几种不同的内存文件系统的不同用途和使用限制,MFS和VN可以使用更多的交换空间,因而容量更大,使用更灵活,但在高负载的情况下由于系统交换,仍然会造成磁盘访问。虽然对于md设备,这种现象理论上不会发生,但md设备的大小是受到物理内存的限制的,占用的是宝贵的内核空间,因此主要用来处理比如启动镜像这样的情况,而很少用来处理其他任务。

除了这些文件系统之外,FreeBSD上事实上还有其他的一些内存文件系统,例如V9FS,这种文件系统的特征是一个纯粹的文件系统,没有涉及磁盘的那些扇区、块等概念等等,这些文件系统目前还不是很完善,也不是标准系统的一部分。

对于内存文件来讲,一些特色其实是非常有意义的,例如文件系统的压缩技术,由于它能够减少内存空间的大小,因此对于内存文件系统是非常有意义的,可以用于嵌入式系统等领域。虽然有人在这个方面曾经做过努力,但目前这种特性在FreeBSD下还不能直接得到。

FreeBSD 5.0中内存文件系统

当对这几种不同的文件系统进行分析比较之后,可以发现它们存在很多种共性,例如MFS和vn设备对于内存的使用方式是相同的,而vn设备和md设备由于都是虚拟磁盘,因此其内容是相同的,这也导致了可以使用vn设备为md设备创建镜像文件。因此,完全可以将这三种不同的使用内存文件系统的方式合并起来,使设置和操作更为简单易用。

事实上,之所以存在这几种不同的内存文件系统,源于FreeBSD的历史开发过程。最早的内存文件系统显然是MFS,但由于不存在虚拟磁盘,存在种种不统一和协调的地方,因此后来就设计了MD设备。VN设备则与此无关,它最初就是为了文件作为存储设备而设计的,但使用内存作为存储显然也十分直接和简单。

因此,在最新的FreeBSD 5.0版本中,这些内存文件系统的设置都统一起来,特别是将vn设备和md设备的功能都统一到新版本的伪设备md中。并且在FreeBSD 5.0下,设备的创建和内存的分配更为方便,不象在4.x之前,系统中的配置选项只能指定一定数量的虚拟磁盘设备(缺省是一个设备)。而且,由于FreeBSD 5.0使用了DEVFS特色,设备文件的创建是自动进行的,不再需要手工使用MAKEDEV命令创建设备文件入口。

例如,需要从虚拟内存中申请内存创建内存文件系统的时候,就需要执行md设备的控制程序mdconfig:

# mdconfig -a -t swap -s 30M

这就会在虚拟内存中申请30M空间,并创建虚拟磁盘,使用的虚拟设备为第一个md设备md0,如果系统中的md0设备已经被占用,那么mdconfig就依序向后寻找下一个空余的md设备,并创建它。由于mdconfig能自动创建新的设备,这样就解决了在内核配置文件指定伪设备数量的问题。

也可以使用-u指定使用的md伪设备的序号,例如下列命令将创建md10,并使用它作为虚拟磁盘设备:

# mdconfig -a -t swap -s 30M -u 10

上面的命令都是使用虚拟内存空间作为数据存储空间,是由swap参数指定的。同样,使用mdconfig也能从内核空间中创建虚拟磁盘,此时-t指定的存储类型参数为malloc,这告诉内核使用内核的MALLOC方法申请内存。

# mdconfig -a -t malloc -s 30M

这种方法就相当于老的md设备的申请内存的方法,但显然更为灵活,因为可以在具体使用过程中申请内存和设备,这是因为FreeBSD 5.0的内核允许更灵活的使用MALLOC内存申请方式。当然,一般还是主要使用swap申请虚拟空间的内存。

由于mdconfig和伪设备md将完全代替vnconfig和伪设备vn,那么使用mdconfig也能创建使用文件作为虚拟磁盘的与vn兼容的方式,这需要指定存储类型参数为vnode,并使用 -f指定具体的存储数据的物理文件名字。

# mdconfig -a -t vnode -f imagefile -s 30M

在使用mdconfig配置好虚拟磁盘之后,就可以使用disklabel、newfs、mount等管理虚拟磁盘。而在不需要这些虚拟磁盘的时候,就可以卸载相应的文件系统,并使用mdconfig删除指定的磁盘等。

# mdconfig -l

使用参数”-l”,则mdconfig列出系统中所有的虚拟磁盘设备。

# mdconfig -d -u 0

为了删除指定了磁盘,需要使用”-d"参数,而使用"-u 0”则指定删除序号为0的虚拟磁盘,即md0。

什么是UNIX系统

摘自:http://www.apuebook.com/index.html

        

  1. What is the difference between "UNIX System" and "UNIX system?"

When we speak of the UNIX System itself as an entity, we capitalize the ‘S’ in System. When we are speaking about a possible implementation of the UNIX System or a particular UNIX system, we use a lower-case ‘s’.

        

  1. What is the difference between Unix and UNIX?

The Unix operating system was developed at AT&T Bell Laboratories. When AT&T registered the name as a trademark, they capitalized the name to UNIX. Today the trademark is owned by The Open Group. For a system to call itself UNIX, it needs to meet certain criteria, pass conformance tests, and license the name.

        

  1. Is Mac OS X a UNIX system?

While Mac OS X resembles a UNIX system and provides a UNIX-compatible environment, it has not yet been formally certified as a UNIX system. On the other hand, if it looks like a duck, walks like a duck, and quacks like a duck, then it’s probably a duck.

        

  1. Is FreeBSD a UNIX system?

While FreeBSD resembles a UNIX system and provides a UNIX-compatible environment, it has not yet been formally certified as a UNIX system. On the other hand, if it looks like a duck, walks like a duck, and quacks like a duck, then it’s probably a duck.

        

  1. Is Linux a UNIX system?

While Linux resembles a UNIX system and provides a UNIX-compatible environment, it has not yet been formally certified as a UNIX system. On the other hand, if it looks like a duck, walks like a duck, and quacks like a duck, then it’s probably a duck.

        

  1. Is Solaris a UNIX system?

Yes, Solaris has been formally certified to be a UNIX system.

 

简单地用中文总结一下:Mac OS X    FreeBSD   Linux 都是类unix系统,但是没有正式地说法;Solaris确实是真正的unix系统

PHP版的ftok函数实现

从php手册中抄的,但是我也看过C版的ftok函数的实现,两个是一样的:

<?php
function ftok($pathname$proj_id
) {
   
$st = @stat($pathname
);
   if (!
$st
) {
       return –
1
;
   }
   
   
$key sprintf("%u", (($st[‘ino’] & 0xffff) | (($st[‘dev’] & 0xff) << 16) | (($proj_id 0xff) << 24
)));
   return 
$key
;
}

echo ftok($_SERVER["SCRIPT_FILENAME"], 250);
?>

注意里面影响ftok值的几个因素: 文件的inode 和dev

iostat 命令简介

iostat 命令报告cpu利用率磁盘利用率两项内容。

iostat -c 只查看cpu利用率

iostat -d 只查看磁盘利用率

iostat device 显示指定磁盘的利用率信息 如: iostat sda

iostat -p device 显示指定磁盘的各个分区的利用率信息 如: iostat -p sda 注意device是磁盘,不能是分区

iostat -x 显示磁盘利用率的更详细信息 注意:-x -p不能同时使用,-x -c同时使用也是没有意义的

iostat -k 以KB为单位显示磁盘统计信息

iostat -m 以MB为单位显示磁盘统计信息

iostat interval 即:隔inerval时间显示一次,如,iostat 2 隔两秒显示一次,直到ctrl+c 结束

iostat interval count 即:隔inerval时间显示一次,显示count 次数结束,如,iostat 2 6 隔2秒显示一次,显示6次结束

显示信息解释:

cpu信息:

avg-cpu: %user %nice %system %iowait %steal %idle
0.08 0.07 1.38 0.14 0.00 98.33

%user :cpu处于用户空间的时间

%nice :cpu花费在更改级别后的进程上的时间比

%system:cpu花费在执行内核代码上的时间比

%iowait: cpu花费在等待io上的时间比 该值太大说明io是瓶颈

%steal : ???

%idle : cpu的空闲时间比

磁盘信息:

Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 2.36 0.56 34.11 11801313 713114808
sda1 3.84 0.20 15.29 4147757 319673956
sda2 3.36 0.20 13.36 4242258 279425316

tps :
Indicate the number of transfers per second that were issued to the device. A transfer is an I/O
request to the device. Multiple logical requests can be combined into a single I/O request to the
device. A transfer is of indeterminate size.

# iostat -x 1 10
Linux 2.6.18-92.el5xen    02/03/2009

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.10    0.00    4.82   39.54    0.07   54.46

Device:         rrqm/s   wrqm/s   r/s   w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     3.50  0.40  2.50     5.60    48.00    18.48     0.00    0.97   0.97   0.28
sdb               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdc               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdd               0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sde               0.00     0.10  0.30  0.20     2.40     2.40     9.60     0.00    1.60   1.60   0.08
sdf              17.40     0.50 102.00  0.20 12095.20     5.60   118.40     0.70    6.81   2.09  21.36
sdg             232.40     1.90 379.70  0.50 76451.20    19.20   201.13     4.94   13.78   2.45  93.16

rrqm/s:   每秒进行 merge 的读操作数目。即 delta(rmerge)/s
wrqm/s:  每秒进行 merge 的写操作数目。即 delta(wmerge)/s
r/s:           每秒完成的读 I/O 设备次数。即 delta(rio)/s
w/s:         每秒完成的写 I/O 设备次数。即 delta(wio)/s
rsec/s:    每秒读扇区数。即 delta(rsect)/s
wsec/s:  每秒写扇区数。即 delta(wsect)/s
rkB/s:      每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。(需要计算)
wkB/s:    每秒写K字节数。是 wsect/s 的一半。(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度。即 delta(aveq)/s/1000 (因为aveq的单位为毫秒)。
await:    平均每次设备I/O操作的等待时间 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)
svctm:   平均每次设备I/O操作的服务时间 (毫秒)。即 delta(use)/delta(rio+wio)
%util:      一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘
可能存在瓶颈。
idle小于70% IO压力就较大了,一般读取速度有较多的wait.

同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)

另外还可以参考
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。


  别人一个不错的例子.(I/O 系统 vs. 超市排队)

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了。还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了。另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的)。

I/O 系统也和超市排队有很多类似之处:

r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm)类似于收银员的收款速度
平均等待时间(await)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例。

我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间。

下面是别人写的这个参数输出的分析

# iostat -x 1
avg-cpu: %user %nice %sys %idle
16.24 0.00 4.31 79.44
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
/dev/cciss/c0d0
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p1
0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29
/dev/cciss/c0d0p2
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。

平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,那么平均等待时间可以这样计算:

平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数

应用到上面的例子: 平均等待时间 = 5ms * (1+2+…+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。

每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。

一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒内的I/O请求总共需要等待2232.8ms。所以平均队列长度应为 2232.8ms/1000ms = 2.23,而 iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz 值应为 2.23,而不是 22.35。

部分摘自:http://www.cnblogs.com/rootq/articles/1400115.html

国足欢迎你  

《国足欢迎你》
  我家球门常打开
  要进几个随你
  交锋过后就有了底
  你会爱上这里
  
  不管远近都是客人
  请不用客气
  进的少了别在意
  下次补给你
  
  我家住着谢亚龙
  书写每段传奇
  不懂足球也不要紧
  仕途才是第一
  
  陌生熟悉都是客人
  请不用拘礼
  谢主席他很热情
  场场都陪你
  
  国足欢迎你
  为你敞开球门
  再不济的实力
  也能找信心
  
  国足欢迎你
  在主场上分享平局
  哪怕你(世界)排名垫底
  
  我家球门常打开
  开怀容纳天地
  一个两个不算稀奇
  再多也输得起
  
  天大地大都是朋友
  请不用客气
  场上梦游是惯例
  场下才牛B
  
  国足欢迎你
  用红牌感动你
  你们捞足积分
  我们来出局
  
  国足欢迎你
  遇上了您就随便赢
  有我们就会有奇迹

很不错的职场寓言

       1.一只乌鸦坐在树上,整天无所事事。一只小兔子看见乌鸦,就问:“我能象你一样整天坐在那里,什么事也不干吗?”乌鸦答道:“当然啦,为什么不呢?”于是,兔子便坐在树下,开始休息。突然,一只狐狸出现了。狐狸跳向兔子……并把它给吃了。

  这个故事的寓意是……要想坐在那里什么也不干,你必须坐(做)得非常非常高。

  2.一只火鸡和一头公牛在聊天。“我非常想到那棵树顶上去,”火鸡叹口气道,“但是我没有那份力气。”“这样啊,那你为什么不吃点我的粪便呢?”公牛答道,“那里面充满了营养。”火鸡吃了一团牛粪,发现它真的使自己有力气到达树的第一个分叉处。第二天,在吃了更多的牛粪以后,火鸡到达了树的第二个分叉处。最终,两星期后,火鸡非常骄傲地站在了树的顶端。但不幸的是,没多久,它就被一个农夫盯上了,并且农夫非常利索地就将火鸡射了下来。

  这个故事的寓意是……牛粪(狗屎运)也许能使你抵达顶峰,但它不能使你永远呆在那儿。

  3.一只小鸟正在飞往南方过冬的途中。天气太冷了,小鸟冻僵了,从天上掉下来,跌在一大片农田里。它躺在田里的时候,一只母牛走了过来,而且拉了一泡屎在它身上。冻僵的小鸟躺在牛屎堆里,发掘牛粪真是太温暖了。牛粪让它慢慢缓过劲儿来了!它躺在那儿,又暖和又开心,不久就开始高兴地唱起歌来了。一只路过的猫听到了小鸟的歌声,走过来查个究竟。顺着声音,猫发现了躲在牛粪中的小鸟,非常敏捷地将它刨了出来,并将它给吃了!

  这个故事的寓意是……

  1)不是每个在你身上拉屎的都是你的敌人。

  2)不是每个把你从屎堆中拉出来的都是你的朋友。

  3)而且,当你陷入深深的屎堆当中(身陷困境)的时候,闭上你的鸟嘴!

  4、表演大师有一位表演大师上场前,他的****告诉他鞋带松了。大师点头致谢,蹲下来仔细系。

  等到****转身后,又蹲下来将鞋带解松。有个旁观者看到了这一切,不解地问:“大师,您为什么又要将鞋带解松呢?”大师回答道:“因为我饰演的是一位劳累的旅者,长途跋涉让他的鞋事松开,可以通过这个细节表现他的劳累憔悴。”“那你为什么不直接告诉你的****呢?”“他能细心地发现我的鞋带松了,并且热心地告诉我,我一定要保护他这种热情的积极性,及时地给他鼓励,至于为什么要将鞋带解开,将来会有更多的机会教他表演,可以下一次再说啊。”

  人一个时间只能做一件事,懂抓重点,才是真正的人才。

  5、鹦鹉一个人去买鹦鹉,看到一只鹦鹉前标:此鹦鹉会两门语言,售价二百元。另一只鹦鹉前则标道:此鹦鹉会四门语言,售价四百元。该买哪只呢?两只都毛色光鲜,非常灵活可爱。这人转啊转,拿不定主意。结果突然发现一只老掉了牙的鹦鹉,毛色暗淡散乱,标价八百元。这人赶紧将老板叫来:这只鹦鹉是不是会说八门语言?店主说:不。这人奇怪了:那为什么又老又丑,又没有能力,会值这个数呢?店主回答:因为另外两只鹦鹉叫这只鹦鹉老板。

  这故事告诉我们,真正的领导人,不一定自己能力有多强,只要懂信任,懂放权,懂珍惜,就能团结比自己更强的力量,从而提升自己的身价。相反许多能非常强的人却因为过于完美主义,事必躬亲,什么人都不如自己,最后只能做最好的攻关人员,销售代表,成不了优秀的领导人。

  6、金人曾经有个小国的人到中国来,进贡了三个一模一样的金人,金壁辉煌,把皇帝高兴坏了。可是这小国的人不厚道,同时出一道题目:这三个金人哪个最有价值?皇帝想了许多的办法,请来珠宝匠检查,称重量,看做工,都是一模一样的。

  怎么办?使者还等着回去汇报呢。泱泱大国,不会连这个小事都不懂吧?最后,有一位退位的老大臣说他有办法。皇帝将使者请到大殿,老臣胸有成足地拿着三根稻草,插入第一个金人的耳朵里,这稻草从另一边耳朵出来了。第二个金人的稻草从嘴巴里直接掉出来,而第三个金人,稻草进去后掉进了肚子,什么响动也没有。老臣说:第三个金人最有价值!使者默默无语,答案正确。

  这个故事告诉我们,最有价值的人,不一定是最能说的人。老天给我们两只耳朵一个嘴巴,本来就是让我们多听少说的。善于倾听,才是成熟的人最基本的素质。

  去掉自己身上的气味!

  一只鸽子老是不断地搬家。

  它觉得,每次新窝住了没多久,就有一种浓烈的怪味,让它喘不上气来,不得已只好一直搬家。

  它觉得很困扰,就把烦恼跟一只经验丰富的老鸽子诉苦。

  老鸽子说:“你搬了这么多次家根本没有用啊,因为那种让你困扰的怪味并不是从窝里面发出来的,而是你自己身上的味道啊。”

  寓言启示录:与团队格格不入,问题来自于自己!

  有些人会不断埋怨别人的过错,指责别人的缺点,他们觉得周围的环境和人处处跟自己作对;或者是认为自己“曲高和寡”,一般人无法理解自己丰富而深刻的思想。实际上,他们没有意识到真正的问题不是来自于周围,而是来自于他们自己。

  像这样的人,必须试着认清自己,试着认真而深刻地反省自己。

  而一个组织也没必要为了失掉这样一只“鸽子”而遗憾。

  愈来愈多的研究显示,领导能力不是天生的,人们完全可以透过后天的努力获得这种能力。因此,领导者要想成功地改变员工,首先就必须改变自己的领导特质。

  对领导者而言,出色的管理能力仍然是必需的。领导者拥有这种管理能力,不是为了控制和命令员工,而是为了支持、帮助员工的发展与成长。

  在这变幻莫测的全球竞争时代,公司高层与其苦苦追寻“先进”的管理方法与手段,不如将眼光放远,锁定员工的才智与热情,这是公司取之不尽的宝藏,公司必须找到适当的途径将他们释放出来。实现这个目标的唯一途径,就是让管理从控制员工,转向为相信员工潜力、鼓舞员工热情。

  7、辞职A对B说:“我要离开这个公司。我恨这个公司!”B建议道:“我举双手赞成你报复!!破公司一定要给它点颜色看看。不过你现在离开,还不是最好的时机。”A问:为什么?B说:“如果你现在走,公司的损失并不大。你应该趁着在公司的机会,拼命去为自己拉一些客户,成为公司独挡一面的人物,然后带着这些客户突然离开公司,公司才会受到重大损失,非常被动。”A觉得B说的非常在理。于是努力工作,事遂所愿,半年多的努力工作后,他有了许多的忠实客户。再见面时B问A:现在是时机了,要跳赶快行动哦!A淡然笑道:老总跟我长谈过,准备升我做总经理助理,我暂时没有离开的打算了。

  其实这也正是B的初衷。一个人的工作,永远只是为自己的简历。只有付出大于得到,让老板真正看到你的能力大于位置,才会给你更多的机会替他创造更多利润。

  8、选择有三个人要被关进监狱三年,监狱长给他们三个一人一个要求。美国人爱抽雪茄,要了三箱雪茄。法国人最浪漫,要一个美丽的女子相伴。而犹太人说,他要一部与外界沟通的电话。三年过后,第一个冲出来的是美国人,嘴里鼻孔里塞满了雪茄,大喊道:“给我火,给我火!”原来他忘了要火了。接着出来的是法国人。只见他手里抱着一个小孩子,美丽女子手里牵着一个小孩子,肚子里还怀着第三个。最后出来的是犹太人,他紧紧握住监狱长的手说:“这三年来我每天与外界联系,我的生意不但没有停顿,反而增长了200%,为了表示感谢,我送你一辆劳施莱斯!”

  这个故事告诉我们,什么样的选择决定什么样的生活。今天的生活是由三年前我们的选择决定的,而今天我们的抉择将决定我们三年后的生活。我们要选择接触最新的信息,了解最新的趋势,从而更好的创造自己的将来。

  9、老虎两个人在森林里,遇到了一只大老虎。A就赶紧从背后取下一双更轻便的运动鞋换上。B急死了,骂道:“你干嘛呢,再换鞋也跑不过老虎啊!”A说:“我只要跑得比你快就好了。”二十一世纪,没有危机感是最大的危机。特别是入关在即,电信,银行,保险,甚至是公务员这些我们以为非常稳定和有保障的企业,也会面临许多的变数。

  当更多的老虎来临时,我们有没有准备好自己的跑鞋?

  10、赶考有位秀才第三次进京赶考,住在一个经常住的店里。考试前两天他做了三个梦,第一个梦是梦到自己在墙上种白菜,第二个梦是下雨天,他戴了斗笠还打伞,第三个梦是梦到跟心爱的表妹脱光了衣服躺在一起,但是背靠着背。这三个梦似乎有些深意,秀才第二天就赶紧去找算命的解梦。算命的一听,连拍大腿说:“你还是回家吧。你想想,高墙上种菜不是白费劲吗?戴斗笠打雨伞不是多此一举吗?跟表妹都脱光了躺在一张床上了,却背靠背,不是没戏吗?”秀才一听,心灰意冷,回店收拾包袱准备回家。店老板非常奇怪,问:“不是明天才考试吗,今天你怎么就回乡了?”秀才如此这般说了一番,店老板乐了:“哟,我也会解梦的。我倒觉得,你这次一定要留下来。你想想,墙上种菜不是高种吗?戴斗笠打伞不是说明你这次有备无患吗?跟你表妹脱光了背靠靠躺在床上,不是说明你翻身的时候就要到了吗?”秀才一听,更有道理,于是精神振奋地参加考试,居然中了个探花。

  积极的人,象太阳,照到哪里哪里亮,消极的人,象月亮,初一十五不一样。想法决定我们的生活,有什么样的想法,就有什么样的未来。

  11、骆驼在动物园里的小骆驼问妈妈:“妈妈妈妈,为什么我们的睫毛那么地长?”

  骆驼妈妈说:“当风沙来的时候,长长的睫毛可以让我们在风暴中都能看得到方向。”小骆驼又问:“妈妈妈妈,为什么我们的背那么驼,丑死了!”骆驼妈妈说:“这个叫驼峰,可以帮我们储存大量的水和养分,让我们能在沙漠里耐受十几天的无水无食条件。”小骆驼又问:“妈妈妈妈,为什么我们的脚掌那么厚?”骆驼妈妈说:“那可以让我们重重的身子不至于陷在软软的沙子里,便于长途跋涉啊。”小骆驼高兴坏了:“哗,原来我们这么有用啊!!可是妈妈,为什么我们还在动物园里,不去沙漠远足呢?”

  天生我才必有用,可惜现在没人用。一个好的心态+一本成功的教材+一个无限的舞台=成功。

  每人的潜能是无限的,关键是要找到一个能充分发挥潜能的舞台。

中国人上的四大当

中国人上的四大当

第一大当:房产 
   买房意味着什么?意味着你拥有了一个属于自己的房子。是的,你是这样以为,但是在中国你并无法拥有这个房子,只是租给你而已。因为房子是你的,地不是你的,只是把土地使用权租借给你70年(从现在退70年那是抗日战争时期,谁见过那时候的房子?)。房子通常情况下30年左右就会遇上拆迁或者旧房改造。也就是说你花了买房的钱,却只能得到租房的实际效果。当然这还不是最坏的。最坏的是,当几十年后你发觉上当了!有一群流氓冲进你用一辈子积蓄买下的房子,画上一个大大的拆字!然后把你的家当全部当垃圾一样的仍出门外,不顾你的苦苦哀求,甚至还在报纸上给你按一个钉子户的臭名,任大众辱骂的时候你就会知道什么叫做绝望!
  形容中国的房地产有一个很有名的笑话是这样写的:
  以前,有个地主有很多地,找了很多长工干活,地主给长工们盖了一批团结楼住着,一天,地主的谋士对地主说:东家,长工们这几年手上有点钱了,他们住你的房子,每月交租子,不划算,反正他们永远住下去,你干脆把房子卖给他们起个名堂叫做—–公房出售!告诉他们房子永远归他们了,可以把他们这几年攒的钱收回来,地主说:不错,那租金怎么办?谋士说:照收不误,起个日本名儿,叫物业费!地主很快实行了,赚了好多钱,长工们那个高兴啊!
  过了几年,地主的村子发展成城镇了,有钱人越来越多,没地方住,谋士对地主说:东家,长工们这几年手上又有钱了,咱们给他们盖新房子,起个名堂叫做旧城改造,他们把手上的钱给我们,我们拆了房子盖新的,叫他们再买回去,可以多盖一些卖给别人,地主又实行了,这次,有些长工们不高兴了,地主的家丁派上用途了,长工们打掉牙只好往肚子里咽,地主又赚了好多钱。
  又过了几年,地主的村子发展成大城市了,有钱人更多了,地主的土地更值钱了,谋士对地主说:东家,咱们把这些长工的房子拆了,在这个地方建别墅,拆出来的地盖好房子卖给那些有钱的大款还能赚一笔,地主说:长工们不干怎么办?谋士说:咱给他们钱多点儿,起个名堂叫货币化安置,咱再到咱们的猪圈旁边建房子,起个名堂叫经济适用房,给他们修个马车道让他们到那边买房住,地主说:他们钱不够怎么办?谋士说:从咱家的钱庄借钱给他们,一年6分利,咱这钱还能生钱崽,又没风险,地主又实行了,长工们拿到钱,地主的经济适用房到现在才建了一间,长工们只好排队等房子,直到现在,还等着呢——
  于是,长工们开始闹事了,地主有点慌,忙问谋士怎么办?谋士说:赶紧通知长工们,房子要跌价了,别买了,租房住吧,正好把我们的猪圈租给他们,结果,这么多年后,长工们的钱全没了,还在租房住,直到永远!
  这个笑话虽然有点夸张,但实际上这何尝又不是事实呢?有人说既然如此?为什么中国人还要买房?疯了一样的买?为什么?还不是愚民教育的结果,就好象60年代,鼓吹人们必须购买三大件:手表、缝纫机、自行车才算是成功人士,才可嫁人娶妻。80年代鼓吹人们必须购买新四大件:电视,冰箱,洗衣机,装电话才算是出人头地才可娶妻生子一样,记得当年装电话可是要几千块钱一部啊!(人均收入不到200元的小城),而北京上海更有上万一部的时候,还得排队买号搭人情,和今天的买房又何其相似?
  而今天所有的狗屁学者又开始了这一套愚弄百姓的旧招:白领一族新标准,成功人士新选择X环X路小户型,X环X路商住型。收了你几十万后,还得每个月收你租金(新物业费),银行利息,以及各种巧立名目的加息、政策等等等等。总之不怕你不被整死,就怕你死得不够惨!老百姓咋就怎么乐于上当,而且百上不厌呢?我真是气得浑身都湿了!
第二大当:就业
当有人终于开始感叹:当年当知青的时候;当有人下岗之后感到没有生路、只能静坐抗议却无人理会,只能沦落街头还被人编首歌嘲笑着人生豪迈,重头再来的时候。你可曾想过!他们也曾经和今天的白领一样风光!他们的收入和地位也曾经让周围的人艳羡不已?你可曾想过20年后的今天!你一样会和他们一样沦落街头,众叛亲离?!
  有人说:嘿!你不知道有失业保险,养老保险,XX保险么?呵呵,我在北京漂泊N年,交了无数保险大概有好几万吧,但失业的时候跑断腿也没人给我啥保险,反而很多保险都被冻结了说我交得断断续续的,我简直又气得……这还不算,你以为你到了60岁真的就可以拿到养老保险了吗?天上又不会掉钱!今天的老年人拿的退休金是我们在挣!而今天30-40岁的人通常都有好几个兄弟姐妹!意思就是,今天的老年人能在60岁拿到养老保险是因为有5个人供一个老人!而我们这一代老去之后则是一个人供我们两个老人!钱从哪里来?没得来!您要是能活到90岁估计能领到一些养老保险,嘿:保重吧您!然而即使是这样,家长们还是疯了一样的把孩子往各种企事业国有单位里送,我身边就经常有这样的例子。我老家一个远房亲戚,找关系拖朋友,花了七万块钱通过公开招聘把儿子送进了交警队,干上合同制的破差,一个月拿800块。结果第三年被竞争上岗给刷下来了。一家人哭哭啼啼,我说刷了好,你上那班一辈子挣不回那七万,赶紧先洗洗睡,改明再凑点钱做小生意去吧!没准还能赚点。
  当年我毕业的时候,我妈也是领着我抱着钱,把我往XX部送。我一看负责招工那人那德行,就忍不住的恶心,再一看薪水,妈呀,我这不是白干10年不吃不喝才拿回成本。所以我私下威胁了那家伙一把,吓得那个大腹便便的X科长再也不敢招收我。我才得已:离家出走!·
  我就想不明白?中国人咋就这么傻?这么迷信国字呢?醒醒吧,思维正常一点行不?做事之前自己算算合算不合算成不?
  还有那些年纪轻轻的小白领们,找工作最好把薪水要高点,别要医疗保险和啥保险,然后自己把钱存起来最保险,将来用得着。
第三大当:教育
一张文凭值多少钱?一张文凭值多少钱?一张文凭值多少钱?印刷成本两块钱顶了天了。一个老师工资多少?嘿,两个学生的学费足够一学期了!一个班的书本印刷多少钱?两个学生的足够了!一个班房租多少钱一学期?嘿嘿两个学生足够了。!
  嘿!中国教育你凭啥收那么多钱!?
  嘿!百姓们!我们为啥要上当?因为从小统治阶级就告诉我们考上秀才才光荣。哦对不起我说错了,是考上大学才光荣。但老百姓从来不去想一想为什么光荣?为什么光荣……
  大学秀才又怎样还不是废物!
  你知道你的孩子是什么人在教么?在中国一般是无法适应社会的人才会沦为一个教师,举个例子。前段时间我因为一个项目的关系,找了几个大学的硕士生做程序。结果有几个人笨得很,完全不给你考虑,非得你守着才干活,而且给个文件明显有一个错别字,也不给改,等你发现了还跟你较真,是这不是他的错,是你给的就是错的。一点责任感没有,一点都不会考虑究竟是为了做事而做事还是为了做好一件事而做事。我还是很心平气和的给他们讲道理:你们必须学会为别人思考,思考别人想要什么结果再去做事情。否则无法在社会上生存。结果那几个说:我们才不要去社会上,我们考试成绩好得很,学校要我们留校做老师。再说了本来我们就没什么错,你怎么安排我们怎么做,你不安排我们就不做。这是我们的尊严和原则。我说:如果你去守门,老板没安排你下班的时候锁好仓库你就不锁了吗?您心寒吗?以后您的孩子就是在这样的人的指导下学习和成长。您放心么?
  难怪现在读大学的同居,逃课,打架,自杀…… 但家长们还是愿意花钱把孩子送进学校去,而且是花一辈子的钱。
第四大当:买车
中国人疯了吗?买车?为什么要买车???当然您有了钱花不光了,您爱怎么买怎么买,买车买房,反正油价怎么涨你也花不完钱,房子要拆迁你也不心疼。但是大多数老百姓呢?
  我以前有个同事住北二环,公司西直门那里。每天坐地铁上班最多半小时。可非得买一二手夏利,每天早上8点开始在路上堵着,然后一点一点的挪到公司。嘿,一个月停车费都不少。可人家就觉得开了车自己身份高级一点。别说开个夏利,就是开个奥迪我也没见谁对谁三磕九拜。除了显得自己比别人傻一点外完全没有别的作用。
  还有一次,我遇见一个月收入才4000的小姑娘,在计划贷款买车。于是我就问她:小姑娘,你又没做生意,自己按时上班,地铁又方便,买车干什么呢?想了半天,实在估计也想不出什么理由来了就说:有时候去超市买东西吧,打车又觉得近了点不划算,走路又远了点。所以自己开车去了!听得我差点没恶心死。你开车去超市买个方便面不觉得恶心么?装备了大哥大去拣垃圾,也是拣垃圾的!别以为买了车能证明什么。
  比如我现在自己做生意,很忙,一天大概要跑4-5个地方,见很多客户。但我就不买车,为什么?我打车随招即来,打完就走,不用担心停车没地方,不用担心挂了碰了,不用担心被贼偷了绑了,无论挂风下雨都有司机。万一碰着个堵车还可以下车坐地铁。一年也就一万多块RMB!要买一车!一年停车费都得一万多!这不是傻么?
  说别买车别买车,可就有无数的人疯了一样的去贷款买?一定要嫌自己将来死得不够惨似的!买吧,买完了加息了不是?油价涨疯了不是?停车又贵了不是?后悔了不是?新车一上路就掉价了卖也卖不掉了不是??
  告诉你,油价还得涨!一定要涨到和美国一样的油价。嘿嘿!您拿老美1/10的收入,用的是和人家一个价的汽油。我看您还得瑟不。
  最后说一句,每个人都不傻,都是从小被愚民教育给弄傻了。傻点不要紧,但性命悠关的事儿您还是精着点,多盘算盘算经济利益之间的关系!别到头来,房产一跌,油价一涨,交了半辈子钱拿了毕业证还是啥啥不会干,交了几十年苛捐杂税还啥啥福利没有。您亏的可不仅仅是差价几十万。
  有人还说什么?哎呀没办法,难道不住了,不买车啦,公车好挤呀。我说全是愚民教育出来的虚荣心在做怪。您看看我,租一个房子住才一千多块一个月,也就相当于有些人的物业费。如果要结婚我还租得起3-4千的,家具装修一应具全。而且还哪方便我住哪儿。不想搬就长期租。也和交物业费一个样。还白白省出还银行贷款、利息、首付一大堆。有事就打车,没事就坐地铁,一年一万顶天了,还省了车库费,停车费,罚款等一堆,油价涨到10块也乐呵,也不耽误事。俺大学没念完就跑了,一边自学一边自己钻研市场出策划跑业务,不也同样可以进外资企业,上市企业做经理么?还省出好几万学费来。
  当然有的人会说:你连个房子都不买,指定结不了婚。我心想:我是没有,您以为您有啊?有人说租房子不划算,租完了还是别人的,嘿嘿,你以为买房子还了几十年贷款,还清了就是你的了?啊…… 呵呵.

Linux 系统文件之 /proc/loadavg

[root@supersun ~]# cat /proc/loadavg
0.43 0.26 0.29 1/125 4133
这里的平均负载也就是可运行的进程的平均数
前三个值分别对应系统在5分钟、10分钟、15分钟内的平均负载
第四个值的分子是正在运行的进程数,分母是进程总数,最后一个是最近运行的进程ID号
现在我们将平均负载的值写到虚拟终端的标题栏上。

创建多级目录的方法

特别是对于cache目录,如果磁盘出现问题,需要我们手动重建cache目录结构可能是很麻烦的事,我们也很容易想到能不能只复制目录结构而不复制其中的文件的问题(因为复制文件会更慢);高人就说了,

find . -type d |sed ‘s/\./\/dst’ | xargs mkdir -p

其实这样find的可能很慢,我们不如手动来建,比如3级目录:

mkdir 0
cd 0
mkdir 0
cd 0
seq 0 99 | mkdir
cd ..
seq 1 99 | xargs -n 1 cp -au 0
cd ..
seq 1 99 | xargs -n 1 cp -au 0

这样,很简单的脚本就完成了,而且速度要快的多

不过写脚本用for循环更方便,不知道速度怎么样