或许毕竟还只是preview版本的原因,也或许是IE实在垃圾的原因,试用了一个ie9 preview4版本,当然是m$官方下载了,google搜索ie9,第一条就是,下载,用上网本的windows7下的firefox下载,速度不快,开始50K,半分钟就隆到10K以下了,于是在frdora下使用jigsaw下载,速度平均在40K左右的样子,2M的带宽,下载只有这么40K,可能是ms他们的下载服务器没搞好,或者考虑到只是下预览版,没有考虑大量下载负荷的问题。拷到上网本的win7下,安装,照例是傻瓜安装,也照例是安装微软程序习惯的“重启”电电脑。重启吧,是多系统,win7只是其中一个,不是默认进入,还要选择。启动过程中,又出现“windows update正在配置”的提示,还要下载3个更新包,应该并不大,几分钟完成了,进入windows画面。桌面上多出来傻傻的IE图标,点击进去,果然跟网上别人发的图片一样,没有地址栏,要从菜单里打开一个输入地址的小对话框。菜单也简陋得不成样子,但里面第二个菜单项就是debug,看来微软意识到他自己浏览器的问题了,要附带上一下调试工具,不然,鬼才能搞懂那变态的、诡异的css支持。没有仔细看是否调试里有IE5,7,8几个版本的兼容选项,就是没有IE6。打开google首页随便搜索个关键词,机器猫css,想看看IE9preview对css的支持如何,是否真的如网上的篇文章里说的、连google都有称赞它的地方。然而结果列表链接去好像无法打开,试几次都不知,于是直接关掉,然后卸载ie9,实在比较垃圾,这个ie9.虽然maxthon等浏览器也基于ie的内核,但加入了很多实用的功能,可ie,却像头老病牛一样,一点一点的挪动着,缓缓的,比散步都慢,堪称牛步。
垃圾114的程序错误
垃圾的流氓114,劫持dns,突然它的页面上显示了一大堆出错消息。
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_parser_set_option(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 63
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_set_object(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 64
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_set_object(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 64
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_set_element_handler(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 65
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_set_character_data_handler(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 66
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_parser_free(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 68
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_parse(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 73
Warning: Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of xml_parse(). If you would like to enable call-time pass-by-reference, you can set allow_call_time_pass_reference to true in your INI file in /usr/local/apache2/htdocs/web/xml.php on line 73
一个WordPress评论相关的插件WP Thread Comment——“有人回复时邮件通知我”
fedora 12,13,14,15,16/centOS/redhat EL 使用第三方yum 源rpmfusion.org
以下内容来源于rpmfusion.org官方网站的使用说明
通过命令行注册并启用rpmfusion.org yum 源/Command Line Setup using rpm
To enable access to both the free and the nonfree repository use the following command:
- Fedora 12 and 13 and 14 and 15:
su -c 'yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm'
- Fedora Rawhide and what will become Fedora 16 (Alpha, Beta and snapshots):
su -c 'yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-rawhide.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-rawhide.noarch.rpm'
- RHEL5 or compatible like CentOS:
su -c 'rpm -Uvh http://download1.rpmfusion.org/free/el/updates/testing/5/i386/rpmfusion-free-release-5-0.1.noarch.rpm http://download1.rpmfusion.org/nonfree/el/updates/testing/5/i386/rpmfusion-nonfree-release-5-0.1.noarch.rpm'
官方网站的说明上好像还有使用浏览器安装rpm源的,没有试过,还是习惯使用命令行操作,毕竟命令行才是根本。
http://rpmfusion.org/Configuration
rpmfusion.org yum 源简介
RPM Fusion 是为 Fedora 及 Red Hat Enterprise Linux 用户提供的一个软件包仓库。各位 Fedora/RHEL /centOS朋友要是想要安装的软件在官方的仓库中找不到,不要泄气,兴许通过 RPM Fusion 你就找到了。
新启动的 RPM Fusion 合并了原有的 Dribble、Freshrpms、Livna 等软件包仓库,将成为最大的第三方软件包仓库。
通过 RPM Fusion 软件包仓库,你将找到 ATI/NVIDIA 显卡驱动、私有的音频/视频编码/解码器、游戏、模拟器、以及其他软件包等。
一个查询网站基本信息的工具网站,可以查询服务器位置,Web服务器程序,主要程序语言,排名,IP地址等信息 domwiki.org
http://zh.domwiki.org/
一个查询网站基本信息的工具网站,可以查询以下信息:服务器位置,Web服务器程序,主要程序语言,排名,IP地址等信息,zh子域名是其中文版,好像是很机械的翻译出来的,虽然有些地方不准确,但可以理解得通。
http://zh.domwiki.org/path8.net
这是使用它自己查询它自己域名的信息:
Domwiki.org是4390:th .ORG内最大的网站。 该网站推出的Wednesday, August 25, 2010。 该服务器主机domwiki.org在Plano, United States位置。 主要语言用于网站的文字内容是中文。 该服务器位于Layered Technologies, Inc 网络。
Ltdomains似乎是由Domwiki.使用托管服务提供商
wine个人目录下菜单项Programs位置/wine菜单项腾讯软件QQ2010删除卸载
fodora13,gnome桌面,只因为无聊测试之用,运行QQ2010的安装程序,安装向导基本正常运行运行,但无法正常使用,所以卸载,但运行卸载后,主菜单里还有wine菜单项,里有Programs子菜单,里面还有“腾讯软件-QQ2010”,再运行里里面的卸载,还是一样,这个菜单项并不能自动删除。
于是自己找一样,这个菜单项具体在哪个目录里的哪个文件。
新建一个账号,登录后,主菜单里没有wine一项,所以基本上可以认定,这个菜单项在用户目录里。
锁定在用户家目录里找,这种配置型的文件一般都会在隐藏目录里,那就在家目录里运行 ls -a , 里面有.local目录,终于在这个目录里找了这个菜单项
.local/share/applications/wine/Programs
下面要做的就很简单了,不必多说。
wordpress资料搜集帖
有用的主题
10套 wordpress主题(Responsive, Customizr, Zerif Lite, Vantage, Hueman, Virtue, Spacious, Sydney, Graphene, Evolve) http://www.icoder.top/blog/index.php/2016/08/16/10-of-the-most-popular-free-wordpress-themes/
2015免费主题之企业主题,22套(Responsive, Zerif Lite, ColorWay, Customizr, Sydney, onetone, Enigma, Spacious,
Virtue, Quest, Vantage, AccessPress Parallax, Attitude, Moesia, Catch Box, Responsive Brix, Alexandria, Oblique, Minamaze, Esteem, Catch Responsive, OnePirate) http://www.moiblog.net/2015/wordpress-corporate-themes-2015/
多功能商业主题 Talon https://www.wpdaxue.com/wordpress-theme-talon.html
插件
[附注] 本文在旧文章《让wordpress首页只显示某个栏目》基础上修改,原文无甚价值,抺之,改为现文。 于 2017/12/09
SQL Server中truncate、delete和drop的异同点
相同点:
truncate和不带where子句的delete,以及drop都会删除表内的数据
不同点:
1. truncate和delete只删除数据不删除表的结构(定义)
drop语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。
2. delete语句是数据库操作语言(dml),这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。
truncate、drop是数据库定义语言(ddl),操作立即生效,原数据不放到rollback segment中,不能回滚,操作不触发trigger。
3.delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不动。
显然drop语句将表所占用的空间全部释放。
truncate语句缺省情况下见空间释放到minextents个extent,除非使用reuse storage;truncate 会将高水线复位(回到最开始)。
4.速度,一般来说: drop> truncate > delete
5.安全性:小心使用 drop和truncate,尤其没有备份的时候.否则哭都来不及。
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除,如果和事务无关,用truncate即可。如果和事务有关,或者想触发trigger,还是用delete。
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。
Linux 下用户home目录下文件夹名字修改Desktop,Documents,Downloads,Pictures等
核心:vi ~/.config/user-dirs.dirs 编辑这个文件,文件格式很简单,一看就明白了
使用fedora linux,用户home家目录下缺省情况下可能会有以下几个目录,
Desktop Downloads Music Pictures Videos Documents Maps Public Templates
使用图形界面时,如需要选中一下文件夹,习惯上打该文件夹名字的第一个字母(如有多个同首字母目录时,再打第二个字母),这样可以很方便的快速定位,多数文件管理器都有这样功能,使用非常方便,但home目录下的几个缺省文件夹名字是大写开头的,小写输入法下打第一个字母,并不能定位;linux对文件名的大小写敏感。按shift+相应的字母,总是不方便,要同时按下shif键。
于是想,是否可以把这几个文件夹的名字改一下,首字母改成小写,这样就会方便得多。当然,直接把文件夹名字改掉,大写开头的文件夹还会被创建,也就是说,默认情况下,linux(其实应该是gnome的文件管理程序)并不认可小写的文件名。linux是可以无限定制的,家目录下文件名这一点,一定也会在某个地方有配置文件,而且应该是点号(.)开头的隐藏文件。但具体位置并不知道,没有到网上搜索相关资料,想根据自己猜测分析找到它;这样可以锻炼加深对linux的理解,也比较有成就感。
分析:这样的配置文件,应该是分别在每个用户的家目录下,这样方便每个用户自己定义这些文件名。因为在修改默认语言时(如从中文修改为英文,或相反),linux会询问是否更新家目录下的这些目录名。
于是查看家目录下的隐藏文件,
[feng@fsc ~]$ ls -al
总用量 86844
drwx------. 67 feng feng 4096 9月 5 15:00 .
drwxr-xr-x. 4 root root 4096 8月 4 01:30 ..
drwx------. 3 feng feng 4096 8月 6 23:34 .adobe
drwx------. 8 feng feng 4096 8月 28 23:10 .amsn
drwx------. 2 feng feng 4096 8月 21 21:13 amsn_received
drwxrwxr-x. 4 feng feng 4096 8月 22 00:42 .audacity-data
-rw-------. 1 feng feng 2074 9月 5 01:22 .bash_history
-rw-r--r--. 1 feng feng 18 3月 31 20:14 .bash_logout
-rw-r--r--. 1 feng feng 176 3月 31 20:14 .bash_profile
-rw-r--r--. 1 feng feng 124 3月 31 20:14 .bashrc
drwx------. 7 feng feng 4096 9月 5 14:53 .beagle
drwxrwxr-x. 2 feng feng 4096 8月 21 22:53 .BloGTK
-rw-rw-r--. 1 feng feng 4096 8月 23 22:37 brasero-session.log
drwx------. 8 feng feng 4096 8月 29 14:24 .cache
drwxrwxr-x. 3 feng feng 4096 8月 5 22:13 .color
drwxr-xr-x. 22 feng feng 4096 9月 5 14:55 .config
drwx------. 3 feng feng 4096 8月 4 01:31 .dbus
drwxrwx---. 3 feng feng 4096 8月 22 00:42 .denemo
drwxr-xr-x. 2 feng feng 4096 9月 5 15:00 Desktop
......................
-rw-r--r--. 1 feng feng 188 8月 29 22:56 .yumex.conf
文件很多,很多软件都有一个相应的隐藏文件,作为当前用户的配置文件。注意到其中有一个下.config目录
drwxr-xr-x. 22 feng feng 4096 9月 5 14:55 .config
很可能在这里,进去看看
[feng@fsc ~]$ cd .config/
[feng@fsc .config]$ ll
总用量 96
drwxrwxr-x. 2 feng feng 4096 8月 29 09:18 akonadi
drwxrwxr-x. 5 feng feng 4096 8月 28 09:11 awn
drwx------. 2 feng feng 4096 8月 23 22:41 brasero
drwx------. 2 feng feng 4096 8月 7 11:31 Empathy
drwx------. 2 feng feng 4096 8月 15 15:08 enchant
drwx------. 5 feng feng 4096 8月 29 11:22 geany
drwx------. 2 feng feng 4096 8月 29 22:53 glista
drwxr-xr-x. 3 feng feng 4096 8月 4 01:31 gnome-disk-utility
drwxr-xr-x. 3 feng feng 4096 8月 4 01:31 gnome-session
drwxrwxr-x. 4 feng feng 4096 8月 4 01:31 gnote
drwxrwxr-x. 2 feng feng 4096 8月 21 22:23 Google
drwx------. 2 feng feng 4096 9月 5 00:02 gtk-2.0
drwx------. 3 feng feng 4096 8月 4 01:31 ibus
drwxrwxr-x. 2 feng feng 4096 8月 29 23:07 InSilmaril
drwxrwxr-x. 3 feng feng 4096 9月 3 23:03 menus
drwxrwxr-x. 2 feng feng 4096 8月 15 15:08 pino
drwxrwxr-x. 4 feng feng 4096 9月 5 12:49 smplayer
drwx------. 2 feng feng 4096 8月 29 00:42 Thunar
drwxr-xr-x. 6 feng feng 4096 8月 29 13:52 transmission
-rw-rw-r--. 1 feng feng 8561 8月 29 23:09 Trolltech.conf
-rw-------. 1 feng feng 632 8月 15 15:44 user-dirs.dirs
drwxrwxr-x. 2 feng feng 4096 8月 22 01:57 zim
注意到其中的 user-dirs.dirs文件,从文件名字是判断,很可能就是它,打开看看
vi user-dirs.dirs
-----------------------------------------------------------------------------------------------
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
~
~
~
~
~
~
~
~
"user-dirs.dirs" 15L, 632C 12,1 全部
第一行写明:xdg-user-dirs-update创建修改的这个文件,修改一下试试,把下面的大写目录名改成小写的。
然后把home家目录下的几个大写首字母的目录改名,当然改成小写首字母的。
[feng@fsc ~]$ mv Documents/ documents
[feng@fsc ~]$ mv Downloads/ downloads
[feng@fsc ~]$ mv Maps maps
[feng@fsc ~]$ mv Music music
[feng@fsc ~]$ mv Templates/ tempates
[feng@fsc ~]$ mv Videos/ videos
......
然后用firefox下载个东西试试,看默认保存位置是否是到downloads里面了
一次简单的探索,志之于此
Solaris、Linux和FreeBSD的内核比较
1。我个人认为作者MAX对Linux的了解不像他对Solaris那样深入,我不知道也没法知道他的下列关于Linux的内容来自自己的代码阅读分析还是只是来自第三方的文档资料而未经自己实地验证;
2。我已经尽量符合原意地翻译了,当然中间实在忍不住的地方也插两句自己的话;
3。无论是只阅读这一篇文章,还是看其他东西,我都觉得,保持自己头脑清醒很重要;
4。谢谢
Max Bruning 是一名教师/资讯专家,他的教授内容包括Solaris内部组织,设备驱动,内核和应用的crash分析及调试,网络组织和其他一些特定科目(他的 blog在blogspot,不费点劲可能访问不了,所以也可以看看www.bruningsystems.com)。
在解释这些子系统在Solaris中是如何实现的时候,他的学生们总会问“Linux里它是怎么工作的?”或者“FreeBSD里是这 样,Solaris里呢?”这种经历最终让Max在OpenSolaris网站写了这篇A Comparison of Solaris, Linux, and FreeBSD Kernels。
文章里讨论了调度,内存管理和文件系统架构--这3个子系统在任何操作系统中都有普遍应用,而且他们是最well-understood 的组件。
目前很多分析或对比文章所引用的材料及代码都比较老,与现实脱节,Max推荐如下几个多少比较up to date的网站:
Solaris Vs. Linux
Comparing MySQL Performance
Fast Track to Solaris 10 Adoption
Solaris 10 Heads for Linux Territory
其实抛开3个系统之间的差别,他们也有很多相似之处。除了那些不同的命名习惯,这些OS在实现不同概念的时候采用了非常相似的方法。他们都支持 线程的分时调度,支持最近未使用页面替换算法实现请求调页,支持虚拟文件系统层允许不同文件系统架构。这个系统里的一个好概念在另一个系统里也会采用。比 如Linux也接受并实现了 Solaris slab 内存分配算法的概念。FreeBSD 代码里的很多术语在Solaris里也出现了(快去看看代码。。。)。考虑到这3个系统的源代码都能得到了, fxr.watson.org提供了系统源码的交叉阅读浏览,可能会发现很多有趣的地方。
好了,温情默默的套近乎结束,进入正题。
调度和调度器
Solaris的调度单位是kthread_t,FreeBSd是thread,Linux是task_struct。抬高一级,Solaris的进程是proc_t,当然每个进程里的线程就是kthread_t;Linux的进程和线程都由task_struct 表示,单线程的进程在Linux里是一个task_struct。单线程的进程在Solaris里有一个proc_t,一个kthread_t,还有一个klwp_t表示。klwp_t提供了用户和内核模式线程切换的存储区。FreeBSD里的单线程进程有一个proc ,一个thread 和一个ksegrp 。ksegrp 是“内核调度的实体组kernel scheduling entity group”。三个系统的线程表示结构不同,不过都支持调度线程。
和大家熟悉的基本一样,调度是基于优先级的。小小的数学问题是,在Linux和FreeBSD里,数字越小,优先级越高;而SUN的宝贝却喜欢数字越大,优先级越高。参考下表
三个系统都更推崇interactive 线程/进程(下面会提到interactive怎么回事)。Interactive 线程比compute-bound 线程优先级要高,不过得到的时间片要少一些。Solaris,FreeBSD和Linux都使用每CPU的“运行队列 runqueue”。FreeBSD和Linux有一个active队列和一个expired队列。名字说得很清楚了--系统从active上按照优先级 选择线程进行调度。用完自己时间片的线程就从active搬到expired上(或者为了避免“饿死”的其他情况),active空以后,内核交换 active和expired。FreeBSD还多一个idle 队列--其他两个queue都空的时候才轮到这个。Solaris的概念是每CPU“调度队列 dispatch queue”。线程用完时间片后,内核给其一个新优先级然后放回调度队列。所有3个系统的runqueue,对不同优先级的可运行线程都分别有链表。
FreeBSD四个优先级共享一个链表,Solaris和Linux则每个优先级一个链表Linux和FreeBSD结合运行时间和睡眠时间计 算线程的interactive-ness,Solaris查表。他们都不支持“gang scheduling”(有兴趣查Google即知,并行计算上的调度算法,大白话说就是一组任务一把disptach到各个CPU上。劳伦斯.利弗莫尔 那帮造原子弹的家伙最喜欢了,他们有世界上最昂贵的玩具,可以理解)每个OS都调度下一个线程而不是N个线程开始运行。这3个OS都有利用 CACHE(warm affinity)和负载均衡的机制。对超线程CPU,FreeBSD能尽量将多个线程保持在一个CPU节点上(当然可能是不同的CPU超线程上)。 Solaris也有类似机制,不过是在用户和应用的控制下,而且并不限于CPU的超线程,他们的术语是processor sets,FreeBSD的叫法是processor groups和其他2个OS最大的不同是,Solaris同时支持多个“scheduling classes”。3个OS都支持POSIX的SCHED_FIFO,SCHED_RR和SCHED_OTHER (或者SCHED_NORMAL)。SCHED_FIFO 和SCHED_RR通常支持实时线程(我不同意。。。但是照翻。。。)。
Solaris和Linux为支持实时线程都支持了内核抢占。Solaris支持fixed priority类,system class的是系统线程(比如换页线程),interactive的是在X控制下运行窗口环境的线程,还有一个Fair Share Scheduler 用于资源管理。具体可以参考Solaris资料。FreeBSD的调度器是在编译时决定的,Linux的调度?--要看版本了。
支持在系统中加 入新的调度类是要付出代价的。内核中每个可能决定调度的地方都得有一个间接得函数调用去call调度类相关的代码。比如,当一个线程将要sleep时,内 核调用调度类相关代码,完成该类中线程sleep需要完成工作。在Linux和FreeBSD上,调度已经完成了所有工作。不需要再来一个间接调用。额外 的层次,就意味着Solaris的调度要占用稍微多一点的系统开销--不过提供了更多的功能。
内存管理和分页
Solaris的进程地址空间由逻辑段segment组成。进程地址中的这些段可以通过pmap访 问。Solaris将其内存管理代码和数据结构分为平台无关和平台相关部分(这不跟没说一样嘛。。。)。平台相关部分位于HAT(hardware address translation)层。FreeBSD用vmspace描述进程地址空间,将其划分为逻辑块region。硬件相关部分在 pmap(physical map)模块,而vmap 例程处理硬件无关部分和数据结构。Linux使用内存描述符划分进程地址空间,逻辑单位是memory areas。Linux也由pmap来examine 进程地址空间。
Linux将机器相关层从更高层次的机器无关层中划分出来。 Solaris和FreeBSD中大多数类似代码比如page fault处理是机器无关的,而Linux处理page fault的代码则非常机器相关--从fault处理开始就是这样了。由此下来的结果是,Linux能很快地完成大多数分页相关代码--因为数据抽象更 少。不过,代价是,下层硬件的改变需要大量修改代码--Solaris和FreeBSD则分别把这样的工作堵截在HAT和pmap层搞定。
Segment,region和meory area的分割是:区域的虚拟地址segmetn/region/memory area映射的object/文件的位置权限map的大小
例如,程序的text(text段,即代码)在一个segmetn/region/memory area中,OS管理地址空间的机制是类似的,不过数据结构名字完全不同。
分页3个系统都使用了最近最少使用least recently used算法的变种完成页替换。他们都有一个守护daemon进程/线程完成页替换。FreeBSD的是vm_pageout daemon,它周期性地,或者当free的内存不多时,被唤醒。当可用内存低于某个限制时,vm_pageout 运行例程vm_pageout_scan扫描内存并释放一些页面。vm_pageout_scan例程可能需要异步地将更改过的页面写回到磁盘,在释放他们之前。不论由多少颗CPU,只有一个这样的daemon。Solaris的是pageout daemon,它也周期性地运行,处理空闲内存不多的情况。Solaris中的分页限制值在系统启动时自动校准,这样可以避免该守护进程过渡占用CPU或者向磁盘发出洪水般的换页请求(嗯,flood这么翻正好 ;P )。
FreeBSD的daemon在大多数情况下使用的值是固定的--不过也可以调整。Linux的LRU算法可以在运行时动态调整,而且可以有多个kswapd daemon,每CPU最多一个。这3个系统都使用global working set策略,而不是per process working set。FreeBSD有多个页面链表来追踪最近使用页。包括active,inactive,cached和feee页。根据使用情况,页面在这些链表 间走来走去。经常访问的页面会在active上。退出的进程的数据页面将被马上放到free上。
如果因为负载原因vm_pageout_scan 来不及扫描全部内存的话,FreeBSD内核可能将整个进程全部换出。如果内存短缺十分严重,vm_pageout_scan 可能会kill系统中最大的进程。Linux也使用不同的页面链表。物理内存被分为(多个)3重zone:一个DMA页面,一个普通页面,一个动态分配内 存页面。zone的实现很像由于x86架构限制而很产生的。页面在hot,cold和free链表间移动--机制和FreeBSD的类似。经常用的页面在 hot上。可用页面则在cold或者free上。
SUN的大佬使用free链,哈希链,vnode页面链支持自己的LRU实现。后两者大致相当于FreeBSD和Linux的 active/hot链--也是FreeBSD和Linux要扫描的链。Solaris要扫描的不是这两个对象,它用two-handed clock算法扫描全部页面(见Solaris Internals 或其他什么地方随你便)。大致方法是,两只手相隔固定举例,前面的手将page的引用位清空以作为标识,如果自此开始没有进程引用这个页,后面的手就释放这个页面(当然如果需要就写回磁盘)。
3个系统在分页时都考虑了NUMA本地性。他们都把IO buffer cache和虚拟内存页面的cache合并到一个系统页cache中。系统页cache用于读写文件已经被mmap了文件,还有应用的text段和data段。
文件系统
3个系统都使用数据抽象层向应用隐藏文件系统实现细节。就是用大家熟悉的open,close,read,write,stat, 等等系统调用访问文件,无论下层的文件数据的实现和组织如何。Solaris和FreeBSD把这种机制称为VFS(virtual file system),基本数据结构是vnode(virtual node)。Solaris和FreeBSD里每个被访问的文件都有一个赋给他们的vnode。除了generic 的文件信息外,vnode还包含到file-system-specific 信息的指针。Linux采用了详细的机制,也叫VFS(virtual file switch),文件系统无关的数据结构是inode。这个机构和vnode类似(小心:Solaris和FreeBSD也另有自己的inode--是 UFS文件系统里file-system-dependent 的数据)。Linux还有两个不同的结构,一个用于文件操作,另一个用于inode操作。Solaris和FreeBSD将他们合并为vnode操作。
VFS允许在系统里实现多种文件系统。这意味着他们相互访问对方的文件系统没问题。只要相关的文件系统例程和数据结构已经被移植到VFS上。所有这3个系统都允许文件系统堆叠stacking。下表列出了每个OS实现的文件系统类型,不是全部哈。
Solaris,FreeBSD和Linux显然都在从对方身上获益。随着 Solaris的开源,这种相互促进有望更快。Max个人已经感觉到Linux的变化是最快的。新技术被快速地集成进系统,只是文档和健壮性可能有点落 后。Linux有很多--或者有时是看上去有很多--开发者。FreeBSD则大概是(从某种意义上)3个系统中历史最长的。Solaris来自BSD Unix和AT&T Bell实验室Unix的结合,使用了更多数据抽象层,因而一般说来能更简便地支持更多功能。不过,内核中大多数这样的分层都没有文档描述。可能随着代码 的开放这一点会有所改善。至于他们的差别,最大的地方之一是page fault处理了。在Solaris中,发生page fault时,代码是从平台相关的trap handler开始执行的(以大家的智商,这好像不用说了吧。。。),然后会调用generic的as_fault例 程,这个例程判断发生page fault的segment,然后调用segment driver处理page fault。segment driver调用文件系统代码,后者再调用进驱动程序,换入页面。换入完成后,segment driver 调用HAT层来更新页表项。在Linux上,发生page fault后,内核调用的代码在会马上进入平台相关部分,这些处理可能更快,不过可能不太容易扩展和移植(后半段说得太省,不知道作者有没有真的研究过 Linux下对应的处理过程)。
内核观察和调试工具对正确理解系统行为有关键意义。在这方面,Solaris有kmdb,mdb和DTrace 。在开源之前,Max就对Solaris做过多年“反向工程”--他发现解决问题的时候使用工具总比阅读代码来得快--我也知道,不过得看什么场合,大家 可不要被他误导。Linux嘛,我看作者Max不太熟,所以认为没有太多工具。对FreeBSD,他也认为只是可以用GDB调试内核的 dump--Liux也可以。