关于 十二月, 2007 的文章

如何将USB移动硬盘做成DOS启动盘

如何将USB移动硬盘做成DOS启动盘
准备工具:
1.一把螺丝刀;
1.一台带有光驱的台式电脑;
2.一张带有DOS工具的windows安装/恢复光盘;
3.一个带有USB接口的移动硬盘;
注:安装/恢复光盘推荐 GhostXP系列或番茄花园系列,它们的官方ISO文件分别在 http://www.tomatolei.comhttp://www.doshome.com 有下载。
 
一.分区的创建
1.将USB移动硬盘接到台式电脑上(建议接到主机后方靠近网口或键盘鼠标接口的USB接口,这样供电比较充足和稳定)。
2.将移动硬盘分割为两个分区:第一个分区为主分区,大小≤2GB,分区类型为FAT;第二个分区为逻辑分区,分区类型为FAT32。
3.将已经分割好的两个分区进行格式化:注意,第一个分区不采用“快速格式化”选项,而第二个分区则采用“快速格式化”选项;
注:进行2、3步时可通过Windows自带的分区功能(“我的电脑”-“管理”-“磁盘管理”)或比较流行的PQ。
4.待格式化完成之后,取下USB移动硬盘,然后关闭电脑;
二.分区的激活
5.拿起你的螺丝刀,拆开主机箱的外壳并将主机上的硬盘线暂时拔掉;
6. 将USB移动硬盘接到台式电脑上,开启主机,进入BIOS,将第一启动项更改为光盘启动,第二启动项更改为USB移动硬盘启动;
7.保存BIOS设置重启后,进入光盘的DOS环境中;
8.执行fdisk命令,这时会出现一个向导,选择“…激活…”的一项,然后激活USB移动硬盘的第一个大小为2GB的分区。
9.推出fdisk命令,这时候会返回到DOS命令环境;
三.系统的传输
10.执行 sys c: 命令
11.等待其提示“系统文件传输完毕”时,DOS的系统就已经成功安装到第一个主分区了;
12.但是,这样的一个纯粹的DOS系统几乎是不能做任何事情的,因为它只包含为数不多的几个内部命令。像FIND.EXE,CHKDSK.EXE,XCOPY.EXE,FDISK.EXE等命令都是没有的。像GHOST.EXE这样的系统恢复工具更是缺乏。
13.通过dir /w 查看出A: 盘跟目录的各个命令文件,选取有用的直接 copy file c: 就可以了,当然,这个操作也可以在进入Windows后挂接移动硬盘然后直接拖进去。
14.到这里,整个制作过程就算是完成了。
四.平时的应用
15.之后,每次需要进入移动硬盘的DOS的话,只需要先修改BIOS的第一启动为移动硬盘启动(USB-HDD),然后在有DOS提示列表的时候按F5即可。
16.在我的工作中,我用到的最多的其实也就是,将需要用到的.GHO镜像文件和I386安装目录拷贝到第二个分区,然后通过DOS环境中执行GHOST.EXE或winnt.exe进行恢复和硬盘安装系统。
 
以上,是我的整个全手工制作过程,当然,网络上还有流传的更广泛的使用“USBBOOT”软件安装的制作方法(不过仍然有软件注册、过期以及不稳定的情况)。
一款强大的USB启动盘制作软件 下载地址: http://www.downbank.cn/soft/1/8/2007/200702263508.htm

No Comments

Apache+Mysql+Php+ZendOptimizer+JDK+Tomcat 安装与配置[原创规范]

所需文件的下载地址:
Mysql:http://dev.mysql.com/downloads/mysql/
Apache:http://httpd.apache.org/download.cgi
Php:http://www.php.net/downloads.php
Zlib:http://www.zlib.net/zlib-1.2.3.tar.gz
Freetype:http://sourceforge.net/project/showfiles.php?group_id=3157
Libpng:http://sourceforge.net/search/?type_of_search=soft&type_of_search=soft&words=libpng
Jpeg-6b:http://www.ijg.org/files/jpegsrc.v6b.tar.gz
GD Library:http://www.boutell.com/gd/http/gd-2.0.33.tar.gz
Zend Optimizer:http://www.zend.com/en/products/guard/downloads
JDK:http://java.sun.com/j2se/1.4.2/download.html
Tomcat:http://archive.apache.org/dist/jakarta/tomcat-5/
Tomcat-connectors:http://archive.apache.org/dist/jakarta/tomcat-connectors/jk2/source/

1)      安装配置Mysql (Mysql4.x.xx 与 Mysql5.x.xx 版本皆可)

打开并进入Mysql编译环境:
$ tar xzvf mysql-x.x.xx.tar.gz
$ cd mysql-x.x.xx/

修改编译所需配置文件sql/mysqld.cc 中的最大连接数:
搜索:&max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,
修改:&max_connections, 0, GET_ULONG, REQUIRED_ARG, 200, 1, 16384, 0, 1,

$ groupadd mysql
$ useradd -g mysql mysql

(如果是Debian或Ubuntu系统的话可能需要)
安装系统默认缺少的curses/termcap 库:
$ apt-cache search curses | grep lib
$ apt-get install libncurses5-dev

$ mkdir -p /opt/mysql/data
$ mkdir -p /opt/mysql/var

$ ./configure --prefix=/opt/mysql --with-mysqld-user=mysql --with-extra-charsets=all --with-unix-socket-path=/opt/mysql/var/mysql.sock --localstatedir=/opt/mysql/data --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler
注:--prefix=/opt/mysql 把mysql-x.x.xx指定安装到/opt/mysql目录中;
--with-extra-charsets=all 对多语言的支持;
--with-unix-socket-path=/opt/mysql/var/mysql.sock 这个是指定mysql服务器启动后,联机套接字文件所处的位置和文件名,避免mysql无法启动的情况发生;
--with-mysqld-user=username 这个是让mysql服务器也能让系统中普通用户username也能启动mysql服务器,避免死掉但无法推出的情况;
--localstatedir=/opt/mysql/data 指定数据库文件存放的目录;

$ make
$ make install

待MySQL安装完毕.剩下的就是配置了;
$ cp /opt/mysql/share/mysql/my-medium.cnf /etc/my.cnf

注:将配置文件拷贝到/etc目录下成为my.cnf,大家可以根据自己的需要选择配置文件(配置文件在/opt/mysql/share/mysql/目录下,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf这些).

修改mysql各系统文件权限与属主,以避免启动时造成错误;
$ chmod 755 /opt/mysql/var/             设置/opt/mysql/var的目录权限为755
$ chown -R mysql:mysql /opt/mysql/      把/opt/mysql目录归属到mysql这个用户下

创建MySQL的授权表;
$ /opt/mysql/bin/mysql_install_db –user=mysql

配置并启动Mysql服务;
$ /opt/mysql/bin/mysqld_safe &
$ cp /opt/mysql/share/mysql/mysql.server /etc/init.d/mysqld
$ cd /opt/mysql/libexec
$ cp mysqld mysqld.old
$ strip mysqld
$ ln -s /opt/mysql/bin/mysql /usr/bin/mysql
$ ln -s /opt/mysql/bin/mysqladmin /usr/sbin/mysqladmin

$ netstat -atln                           查看3306端口是否打开
$ /etc/init.d/mysqld restart              如果重启mysql顺利则说明mysql安装成功
$ mysqladmin -u root password 123456      设置mysql的root密码

$ mysql -uroot –p123456                   使用root用户进入mysql命令行
mysql>use mysql;
mysql>delete from user where password="";删除用于本机匿名连接的空密码帐号
mysql>flush privileges;
mysql>quit;

进入/etc目录下的rc2.d rc3.d rc4.d rc5.d 目录建立开机自启动服务的软链接文件;
$ ln -s ../init.d/mysqld S20mysql
进入/etc目录下的rc0.d rc1.d rc6.d 目录建立关机自停止服务的软链接文件;
$ ln -s ../init.d/mysqld K20mysql

2)      安装配置Apache (Apache2.x.x 版本)

打开并进入Apache编译环境:
$ tar xzvf httpd-2.x.x.tar.gz
$ cd httpd-2.x.x/

$ ./configure --prefix=/opt/apache --enable-so --enable-rewrite --enable-cgi --with-config-file-path=/opt/apache/conf --enable-track-vars --with-mpm=worker
注:--prefix=/opt/apache 指定安装到/opt/apache目录中;
--enable-cgi 支持CGI;
--with-config-file-path=/opt/apache/conf 指定把配制文件放在/opt/apache/conf目录中;
--enable参数告诉设置脚本,我们需要启动so和rewrite模块,so模块是用来提供DSO支持的apache核心模块,而rewrite模块则是用意实现地址重写的模块,由于rewrite模块需要DBM支持,如果在初次安装时没有编译进apache,以后需要用到时需要重新编译整个apache才可以实现。

$ make
$ make install
修改配置文件/opt/apache/conf/httpd.conf:

ServerName 127.0.0.1:80

<IfModule dir_module>
DirectoryIndex index.html index.html.var index.htm index.php
</IfModule>

# If the AddEncoding directives above are commented-out, then you
# probably should define those extensions to indicate media types:
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

$ cp /opt/apache/bin/apachectl /etc/init.d/apachectl
$ ln -s /opt/apache/bin/apachectl /usr/bin/apachectl

进入/etc目录下的rc2.d rc3.d rc4.d rc5.d 目录建立开机自启动服务的软链接文件;
$ ln -s ../init.d/apachectl S20apache
进入/etc目录下的rc0.d rc1.d rc6.d 目录建立关机自停止服务的软链接文件;
$ ln -s ../init.d/apachectl K20apache

$ apachectl start
在浏览器的地址栏中输入商用通IP,若看到“It works!”字样或 Apache羽毛页面则说明安装成功!

3)      安装Php以及相关常用组件 (Php4.x.x 与 Php5.x.x 版本皆可)

编译安装GD库相关套件:
zlib: 进入解压后的zlib目录并执行以下命令:
$ ./configure
$ make
$ make install
freetype:进入解压后的freetype目录并执行以下命令:
$ ./configure --prefix=/usr/local/freetype
$ make
$ make install
libpng:进入解压后的libpng目录并执行以下命令:
$ ./configure
$ make
$ make install
jpeg-6b:进入解压后的jpeg-6b目录并执行以下命令:
$ mkdir -p /usr/local/jpeg/bin
$ mkdir /usr/local/jpeg/lib
$ mkdir /usr/local/jpeg/include
$ mkdir -p /usr/local/jpeg/man/man1
$ ./configure --prefix=/usr/local/jpeg --enable-shared --enable-static
$ make
$ make install
GD Library:进入解压后的gd目录并执行以下命令:
$ ./configure --prefix=/usr/local/gd --with-jpeg=/usr/local/jpeg --with-freetype=/usr/local/freetype --with-png --with-zlib
$ make
$ make install

打开并进入Php编译环境:
$ tar xzvf php-x.x.x.tar.gz
$ cd php-x.x.x/

(如果是Debian或Ubuntu系统的话可能需要)
安装系统默认缺少的lex 组件:
$ apt-get install flex

编译并安装php:
$ ./configure --prefix=/opt/php --with-apxs2=/opt/apache/bin/apxs --with-gd=/usr/local/gd --enable-gd --enable-gd-native-ttf --with-jpeg-dir=/usr/local/jpeg --with-png --with-ttf --with-zlib --with-freetype-dir=/usr/local/freetype --enable-magic-quotes --with-mysql=/opt/mysql --with-mysql-sock=/opt/mysql/var/mysql.sock --with-iconv --with-mbstring --enable-mbstring --enable-track-vars --enable-force-cgi-redirect --enable-ftp --with-config-file-path=/opt/php/etc --with-pear=/opt/php/pear --enable-sockets --with-mail --with-xml

$ make
$ make install

$ cp php-x.x.x/php.ini-dist /opt/php/etc/php.ini

修改配置文件/opt/php/etc/php.ini:
register_globals = On

然后编写php测试页info.php:内容如下:
<?php
phpinfo();
?>

查看/opt/apache/conf/httpd.conf文件,看是否存在语句(如果安装的Php5):
LoadModule php5_module        modules/libphp5.so
如果存在,即说明apache已经成功加载了php模块;

$ apachectl restart
将info.php放置到/opt/apache/htdocs 目录下;
$ chmod 755 info.php
在浏览器中能在该页面中看到php的信息则说明安装成功!
注:启用了SELinux的FC或RedHat会提示权限问题并导致Php无法正常工作,禁用SELinux后重启系统即可解决问题。

4)      安装配置ZendOptimizer (各个版本皆可)
$ tar xzvf ZendOptimizer-x.x.x-linux-x-i386.tar.gz
$ cd ZendOptimizer-x.x.x/
$ ./install.sh
接着依照安装向导的提示信息完成整个安装配置过程;

此刻,LAMP环境已经安装完毕,不需要Tomcat服务的话到这里就算结束了。

5)      安装配置JDK ( j2sdk-1.4.2.xx 版本皆可)

$ chmod a+x j2sdk-1_4_2_09-linux-i586.bin (本文中安装的版本为 1.4.2_09)
$ ./j2sdk-1_4_2_09-linux-i586.bin
安装后会生成文件夹j2sdk1.4.2_09,将文件夹j2sdk1.4.2_09移动(或复制)到你想要存放的JDK的位置(本文中是/opt/j2sdk1.4.2_09/);
接下来编辑/etc/profile文件加入JDK环境变量,在文件末尾处加入以下内容:

$ vi /etc/profile

export JAVA_HOME=/opt/j2sdk1.4.2_09
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=$JAVA_HOME/jre

$ source /etc/profile
这样可以使配置文件的内容立刻生效;

$ set
在这里你可以看见当前所有的环境变量;

$ java –version
如果JDK配置正确的话,运行上面的命令将会出现JDK的相应版本。

6)      安装配置Tomcat以及相关组件 (jakarta-tomcat-5.x.xx版本皆可)
$ tar xzfv jakarta-tomcat-5.0.28.tar.gz   (本文安装的版本是:jakarta-tomcat-5.0.28)

$ cp -rf jakarta-tomcat-5.0.28 /opt/tomcat
$ cd /opt/tomcat/

现在来测试一下tomcat是否安装成功:

$ ./bin/startup.sh      启动tomcat服务
访问http://127.0.0.1:8080/ 看能否看到tomcat的默认页面,能看到说明tomcat服务已经在运行了。

$ ./bin/shutdown.sh 停止tomcat服务
注意观察停止服务的时候有无报错信息。
开始安装jakarta-tomcat-connectors-jk2,用来整合apache和tomcat,编译生成的mod_jk2.so模块被apache加载之后,就能将不属于自己的请求转发给tomcat:
$ tar xzfv jakarta-tomcat-connectors-jk2-2.0.4-src.tar.gz

$ cd jakarta-tomcat-connectors-jk2-2.0.4-src/jk/native2/

$ ./configure --with-apxs2=/home/www/apache/bin/apxs
$ make

$ cd ../build/jk2/apache2/
$ /opt/apache/bin/apxs -n jk2 -i mod_jk2.so   (将mod_jk2.so添加到apache2的modules中)

上面就完成了Tomcat和Connectors的安装.接下来进行与Apache的整合.

Tomcat与Apache的整合:
$ cd /opt/apache/conf/

vi httpd.conf

编辑配置文件在其中加入这个模块,保存退出;
LoadModule jk2_module modules/mod_jk2.so

然后在这个目录新建一文件workers2.properties
$ vi workers2.properties

[channel.socket: localhost:8009]
port=8009
host=localhost
[ajp13: localhost:8009]
channel=channel.socket: localhost:8009
[uri:/*.jsp]
worker=ajp13: localhost:8009
[uri:/examples/*.jsp]
worker=ajp13: localhost:8009

$ cd /opt/tomcat/conf/

vi server.xml
找到其中的<Host>中的<Contest>项,修改相关参数如下,保存退出;
<Context path="" docBase="/opt/apache/htdocs" debug="0" reloadable="true" crossContext="true"/>

$ /opt/tomcat/bin/startup.sh
$ apachectl restart
重启Apache和Tomcat后即可查看到整合后的效果。

参考资料:
《RedHatAS4下Apache2+MySQL+Php+Tomcat整合及虚拟主机配置》http://bbs.chinaunix.net/viewthread.php?tid=770898
《Linux+Apache+Mysql+PHP典型配置》 http://www.5ilinux.com/blog/archives/000013.html
《Debian+Apache2+MySQL5+PHP5+GD》http://www.pmal.net/viewthread.php?tid=8849

, , , , ,

No Comments

中华人民共和国劳动合同法(全文)

转载出处:http://www.51labour.com/zhuanti/2007ldht/html/PageR1-1.asp
《中华人民共和国劳动合同法》已由中华人民共和国第十届全国人民代表大会常务委员会第二十八次会议于2007年6月29日通过,现予公布,自2008年1月1日起施行。
中华人民共和国主席    胡锦涛
2007年6月29日
中华人民共和国劳动合同法
---------------------------------------------------------
目  录
第一章 总  则
  第二章 劳动合同的订立
  第三章 劳动合同的履行和变更
  第四章 劳动合同的解除和终止
  第五章 特别规定
    第一节 集体合同
    第二节 劳务派遣
    第三节 非全日制用工
  第六章 监督检查
  第七章 法律责任
第八章 附  则
---------------------------------------------------------
第一章 总  则
  第一条 为了完善劳动合同制度,明确劳动合同双方当事人的权利和义务,保护劳动者的合法权益,构建和发展和谐稳定的劳动关系,制定本法。
  第二条 中华人民共和国境内的企业、个体经济组织、民办非企业单位等组织(以下称用人单位)与劳动者建立劳动关系,订立、履行、变更、解除或者终止劳动合同,适用本法。
  国家机关、事业单位、社会团体和与其建立劳动关系的劳动者,订立、履行、变更、解除或者终止劳动合同,依照本法执行。
  第三条 订立劳动合同,应当遵循合法、公平、平等自愿、协商一致、诚实信用的原则。
  依法订立的劳动合同具有约束力,用人单位与劳动者应当履行劳动合同约定的义务。
  第四条 用人单位应当依法建立和完善劳动规章制度,保障劳动者享有劳动权利、履行劳动义务。
  用人单位在制定、修改或者决定有关劳动报酬、工作时间、休息休假、劳动安全卫生、保险福利、职工培训、劳动纪律以及劳动定额管理等直接涉及劳动者切身利益的规章制度或者重大事项时,应当经职工代表大会或者全体职工讨论,提出方案和意见,与工会或者职工代表平等协商确定。
  在规章制度和重大事项决定实施过程中,工会或者职工认为不适当的,有权向用人单位提出,通过协商予以修改完善。
  用人单位应当将直接涉及劳动者切身利益的规章制度和重大事项决定公示,或者告知劳动者。
  第五条 县级以上人民政府劳动行政部门会同工会和企业方面代表,建立健全协调劳动关系三方机制,共同研究解决有关劳动关系的重大问题。
  第六条 工会应当帮助、指导劳动者与用人单位依法订立和履行劳动合同,并与用人单位建立集体协商机制,维护劳动者的合法权益。
第二章 劳动合同的订立
  第七条 用人单位自用工之日起即与劳动者建立劳动关系。用人单位应当建立职工名册备查。
  第八条 用人单位招用劳动者时,应当如实告知劳动者工作内容、工作条件、工作地点、职业危害、安全生产状况、劳动报酬,以及劳动者要求了解的其他情况;用人单位有权了解劳动者与劳动合同直接相关的基本情况,劳动者应当如实说明。
  第九条 用人单位招用劳动者,不得扣押劳动者的居民身份证和其他证件,不得要求劳动者提供担保或者以其他名义向劳动者收取财物。
  第十条 建立劳动关系,应当订立书面劳动合同。
  已建立劳动关系,未同时订立书面劳动合同的,应当自用工之日起一个月内订立书面劳动合同。
  用人单位与劳动者在用工前订立劳动合同的,劳动关系自用工之日起建立。
  第十一条 用人单位未在用工的同时订立书面劳动合同,与劳动者约定的劳动报酬不明确的,新招用的劳动者的劳动报酬按照集体合同规定的标准执行;没有集体合同或者集体合同未规定的,实行同工同酬。
  第十二条 劳动合同分为固定期限劳动合同、无固定期限劳动合同和以完成一定工作任务为期限的劳动合同。
  第十三条 固定期限劳动合同,是指用人单位与劳动者约定合同终止时间的劳动合同。
  用人单位与劳动者协商一致,可以订立固定期限劳动合同。
  第十四条 无固定期限劳动合同,是指用人单位与劳动者约定无确定终止时间的劳动合同。
  用人单位与劳动者协商一致,可以订立无固定期限劳动合同。有下列情形之一,劳动者提出或者同意续订、订立劳动合同的,除劳动者提出订立固定期限劳动合同外,应当订立无固定期限劳动合同:
  (一)劳动者在该用人单位连续工作满十年的;
  (二)用人单位初次实行劳动合同制度或者国有企业改制重新订立劳动合同时,劳动者在该用人单位连续工作满十年且距法定退休年龄不足十年的;
  (三)连续订立二次固定期限劳动合同,且劳动者没有本法第三十九条和第四十条第一项、第二项规定的情形,续订劳动合同的。
用人单位自用工之日起满一年不与劳动者订立书面劳动合同的,视为用人单位与劳动者已订立无固定期限劳动合同。
  第十五条 以完成一定工作任务为期限的劳动合同,是指用人单位与劳动者约定以某项工作的完成为合同期限的劳动合同。
  用人单位与劳动者协商一致,可以订立以完成一定工作任务为期限的劳动合同。
  第十六条 劳动合同由用人单位与劳动者协商一致,并经用人单位与劳动者在劳动合同文本上签字或者盖章生效。
  劳动合同文本由用人单位和劳动者各执一份。
  第十七条 劳动合同应当具备以下条款:
  (一)用人单位的名称、住所和法定代表人或者主要负责人;
  (二)劳动者的姓名、住址和居民身份证或者其他有效身份证件号码;
  (三)劳动合同期限;
  (四)工作内容和工作地点;
  (五)工作时间和休息休假;
  (六)劳动报酬;
  (七)社会保险;
  (八)劳动保护、劳动条件和职业危害防护;
  (九)法律、法规规定应当纳入劳动合同的其他事项。
  劳动合同除前款规定的必备条款外,用人单位与劳动者可以约定试用期、培训、保守秘密、补充保险和福利待遇等其他事项。
  第十八条 劳动合同对劳动报酬和劳动条件等标准约定不明确,引发争议的,用人单位与劳动者可以重新协商;协商不成的,适用集体合同规定;没有集体合同或者集体合同未规定劳动报酬的,实行同工同酬;没有集体合同或者集体合同未规定劳动条件等标准的,适用国家有关规定。
  第十九条 劳动合同期限三个月以上不满一年的,试用期不得超过一个月;劳动合同期限一年以上不满三年的,试用期不得超过二个月;三年以上固定期限和无固定期限的劳动合同,试用期不得超过六个月。
  同一用人单位与同一劳动者只能约定一次试用期。
  以完成一定工作任务为期限的劳动合同或者劳动合同期限不满三个月的,不得约定试用期。
  试用期包含在劳动合同期限内。劳动合同仅约定试用期的,试用期不成立,该期限为劳动合同期限。
  第二十条 劳动者在试用期的工资不得低于本单位相同岗位最低档工资或者劳动合同约定工资的百分之八十,并不得低于用人单位所在地的最低工资标准。
  第二十一条 在试用期中,除劳动者有本法第三十九条和第四十条第一项、第二项规定的情形外,用人单位不得解除劳动合同。用人单位在试用期解除劳动合同的,应当向劳动者说明理由。
  第二十二条 用人单位为劳动者提供专项培训费用,对其进行专业技术培训的,可以与该劳动者订立协议,约定服务期。
  劳动者违反服务期约定的,应当按照约定向用人单位支付违约金。违约金的数额不得超过用人单位提供的培训费用。用人单位要求劳动者支付的违约金不得超过服务期尚未履行部分所应分摊的培训费用。
  用人单位与劳动者约定服务期的,不影响按照正常的工资调整机制提高劳动者在服务期期间的劳动报酬。
  第二十三条 用人单位与劳动者可以在劳动合同中约定保守用人单位的商业秘密和与知识产权相关的保密事项。
  对负有保密义务的劳动者,用人单位可以在劳动合同或者保密协议中与劳动者约定竞业限制条款,并约定在解除或者终止劳动合同后,在竞业限制期限内按月给予劳动者经济补偿。劳动者违反竞业限制约定的,应当按照约定向用人单位支付违约金。
  第二十四条 竞业限制的人员限于用人单位的高级管理人员、高级技术人员和其他负有保密义务的人员。竞业限制的范围、地域、期限由用人单位与劳动者约定,竞业限制的约定不得违反法律、法规的规定。
  在解除或者终止劳动合同后,前款规定的人员到与本单位生产或者经营同类产品、从事同类业务的有竞争关系的其他用人单位,或者自己开业生产或者经营同类产品、从事同类业务的竞业限制期限,不得超过二年。
  第二十五条 除本法第二十二条和第二十三条规定的情形外,用人单位不得与劳动者约定由劳动者承担违约金。
  第二十六条 下列劳动合同无效或者部分无效:
  (一)以欺诈、胁迫的手段或者乘人之危,使对方在违背真实意思的情况下订立或者变更劳动合同的;
  (二)用人单位免除自己的法定责任、排除劳动者权利的;
  (三)违反法律、行政法规强制性规定的。
  对劳动合同的无效或者部分无效有争议的,由劳动争议仲裁机构或者人民法院确认。
  第二十七条 劳动合同部分无效,不影响其他部分效力的,其他部分仍然有效。
  第二十八条 劳动合同被确认无效,劳动者已付出劳动的,用人单位应当向劳动者支付劳动报酬。劳动报酬的数额,参照本单位相同或者相近岗位劳动者的劳动报酬确定。
第三章 劳动合同的履行和变更
  第二十九条 用人单位与劳动者应当按照劳动合同的约定,全面履行各自的义务。
  第三十条 用人单位应当按照劳动合同约定和国家规定,向劳动者及时足额支付劳动报酬。
  用人单位拖欠或者未足额支付劳动报酬的,劳动者可以依法向当地人民法院申请支付令,人民法院应当依法发出支付令。
  第三十一条 用人单位应当严格执行劳动定额标准,不得强迫或者变相强迫劳动者加班。用人单位安排加班的,应当按照国家有关规定向劳动者支付加班费。
  第三十二条 劳动者拒绝用人单位管理人员违章指挥、强令冒险作业的,不视为违反劳动合同。
  劳动者对危害生命安全和身体健康的劳动条件,有权对用人单位提出批评、检举和控告。
  第三十三条 用人单位变更名称、法定代表人、主要负责人或者投资人等事项,不影响劳动合同的履行。
  第三十四条 用人单位发生合并或者分立等情况,原劳动合同继续有效,劳动合同由承继其权利和义务的用人单位继续履行。
  第三十五条 用人单位与劳动者协商一致,可以变更劳动合同约定的内容。变更劳动合同,应当采用书面形式。
  变更后的劳动合同文本由用人单位和劳动者各执一份。
第四章 劳动合同的解除和终止
  第三十六条 用人单位与劳动者协商一致,可以解除劳动合同。
  第三十七条 劳动者提前三十日以书面形式通知用人单位,可以解除劳动合同。劳动者在试用期内提前三日通知用人单位,可以解除劳动合同。
  第三十八条 用人单位有下列情形之一的,劳动者可以解除劳动合同:
  (一)未按照劳动合同约定提供劳动保护或者劳动条件的;
  (二)未及时足额支付劳动报酬的;
  (三)未依法为劳动者缴纳社会保险费的;
  (四)用人单位的规章制度违反法律、法规的规定,损害劳动者权益的;
  (五)因本法第二十六条第一款规定的情形致使劳动合同无效的;
  (六)法律、行政法规规定劳动者可以解除劳动合同的其他情形。
  用人单位以暴力、威胁或者非法限制人身自由的手段强迫劳动者劳动的,或者用人单位违章指挥、强令冒险作业危及劳动者人身安全的,劳动者可以立即解除劳动合同,不需事先告知用人单位。
  第三十九条 劳动者有下列情形之一的,用人单位可以解除劳动合同:
  (一)在试用期间被证明不符合录用条件的;
  (二)严重违反用人单位的规章制度的;
  (三)严重失职,营私舞弊,给用人单位造成重大损害的;
  (四)劳动者同时与其他用人单位建立劳动关系,对完成本单位的工作任务造成严重影响,或者经用人单位提出,拒不改正的;
  (五)因本法第二十六条第一款第一项规定的情形致使劳动合同无效的;
  (六)被依法追究刑事责任的。
  第四十条 有下列情形之一的,用人单位提前三十日以书面形式通知劳动者本人或者额外支付劳动者一个月工资后,可以解除劳动合同:
  (一)劳动者患病或者非因工负伤,在规定的医疗期满后不能从事原工作,也不能从事由用人单位另行安排的工作的;
  (二)劳动者不能胜任工作,经过培训或者调整工作岗位,仍不能胜任工作的;
  (三)劳动合同订立时所依据的客观情况发生重大变化,致使劳动合同无法履行,经用人单位与劳动者协商,未能就变更劳动合同内容达成协议的。
  第四十一条 有下列情形之一,需要裁减人员二十人以上或者裁减不足二十人但占企业职工总数百分之十以上的,用人单位提前三十日向工会或者全体职工说明情况,听取工会或者职工的意见后,裁减人员方案经向劳动行政部门报告,可以裁减人员:
  (一)依照企业破产法规定进行重整的;
  (二)生产经营发生严重困难的;
  (三)企业转产、重大技术革新或者经营方式调整,经变更劳动合同后,仍需裁减人员的;
  (四)其他因劳动合同订立时所依据的客观经济情况发生重大变化,致使劳动合同无法履行的。
  裁减人员时,应当优先留用下列人员:
  (一)与本单位订立较长期限的固定期限劳动合同的;
  (二)与本单位订立无固定期限劳动合同的;
  (三)家庭无其他就业人员,有需要扶养的老人或者未成年人的。
  用人单位依照本条第一款规定裁减人员,在六个月内重新招用人员的,应当通知被裁减的人员,并在同等条件下优先招用被裁减的人员。
  第四十二条 劳动者有下列情形之一的,用人单位不得依照本法第四十条、第四十一条的规定解除劳动合同:
  (一)从事接触职业病危害作业的劳动者未进行离岗前职业健康检查,或者疑似职业病病人在诊断或者医学观察期间的;
  (二)在本单位患职业病或者因工负伤并被确认丧失或者部分丧失劳动能力的;
  (三)患病或者非因工负伤,在规定的医疗期内的;
  (四)女职工在孕期、产期、哺乳期的;
  (五)在本单位连续工作满十五年,且距法定退休年龄不足五年的;
  (六)法律、行政法规规定的其他情形。
  第四十三条 用人单位单方解除劳动合同,应当事先将理由通知工会。用人单位违反法律、行政法规规定或者劳动合同约定的,工会有权要求用人单位纠正。用人单位应当研究工会的意见,并将处理结果书面通知工会。
  第四十四条 有下列情形之一的,劳动合同终止:
  (一)劳动合同期满的;
  (二)劳动者开始依法享受基本养老保险待遇的;
  (三)劳动者死亡,或者被人民法院宣告死亡或者宣告失踪的;
  (四)用人单位被依法宣告破产的;
  (五)用人单位被吊销营业执照、责令关闭、撤销或者用人单位决定提前解散的;
  (六)法律、行政法规规定的其他情形。
  第四十五条 劳动合同期满,有本法第四十二条规定情形之一的,劳动合同应当续延至相应的情形消失时终止。但是,本法第四十二条第二项规定丧失或者部分丧失劳动能力劳动者的劳动合同的终止,按照国家有关工伤保险的规定执行。
  第四十六条 有下列情形之一的,用人单位应当向劳动者支付经济补偿:
  (一)劳动者依照本法第三十八条规定解除劳动合同的;
  (二)用人单位依照本法第三十六条规定向劳动者提出解除劳动合同并与劳动者协商一致解除劳动合同的;
  (三)用人单位依照本法第四十条规定解除劳动合同的;
  (四)用人单位依照本法第四十一条第一款规定解除劳动合同的;
  (五)除用人单位维持或者提高劳动合同约定条件续订劳动合同,劳动者不同意续订的情形外,依照本法第四十四条第一项规定终止固定期限劳动合同的;
  (六)依照本法第四十四条第四项、第五项规定终止劳动合同的;
  (七)法律、行政法规规定的其他情形。
  第四十七条 经济补偿按劳动者在本单位工作的年限,每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的,按一年计算;不满六个月的,向劳动者支付半个月工资的经济补偿。
  劳动者月工资高于用人单位所在直辖市、设区的市级人民政府公布的本地区上年度职工月平均工资三倍的,向其支付经济补偿的标准按职工月平均工资三倍的数额支付,向其支付经济补偿的年限最高不超过十二年。
  本条所称月工资是指劳动者在劳动合同解除或者终止前十二个月的平均工资。
  第四十八条 用人单位违反本法规定解除或者终止劳动合同,劳动者要求继续履行劳动合同的,用人单位应当继续履行;劳动者不要求继续履行劳动合同或者劳动合同已经不能继续履行的,用人单位应当依照本法第八十七条规定支付赔偿金。
  第四十九条 国家采取措施,建立健全劳动者社会保险关系跨地区转移接续制度。
  第五十条 用人单位应当在解除或者终止劳动合同时出具解除或者终止劳动合同的证明,并在十五日内为劳动者办理档案和社会保险关系转移手续。
  劳动者应当按照双方约定,办理工作交接。用人单位依照本法有关规定应当向劳动者支付经济补偿的,在办结工作交接时支付。
  用人单位对已经解除或者终止的劳动合同的文本,至少保存二年备查。
第五章 特别规定
 第一节 集体合同
  第五十一条 企业职工一方与用人单位通过平等协商,可以就劳动报酬、工作时间、休息休假、劳动安全卫生、保险福利等事项订立集体合同。集体合同草案应当提交职工代表大会或者全体职工讨论通过。
  集体合同由工会代表企业职工一方与用人单位订立;尚未建立工会的用人单位,由上级工会指导劳动者推举的代表与用人单位订立。
  第五十二条 企业职工一方与用人单位可以订立劳动安全卫生、女职工权益保护、工资调整机制等专项集体合同。
  第五十三条 在县级以下区域内,建筑业、采矿业、餐饮服务业等行业可以由工会与企业方面代表订立行业性集体合同,或者订立区域性集体合同。
  第五十四条 集体合同订立后,应当报送劳动行政部门;劳动行政部门自收到集体合同文本之日起十五日内未提出异议的,集体合同即行生效。
  依法订立的集体合同对用人单位和劳动者具有约束力。行业性、区域性集体合同对当地本行业、本区域的用人单位和劳动者具有约束力。
  第五十五条 集体合同中劳动报酬和劳动条件等标准不得低于当地人民政府规定的最低标准;用人单位与劳动者订立的劳动合同中劳动报酬和劳动条件等标准不得低于集体合同规定的标准。
  第五十六条 用人单位违反集体合同,侵犯职工劳动权益的,工会可以依法要求用人单位承担责任;因履行集体合同发生争议,经协商解决不成的,工会可以依法申请仲裁、提起诉讼。
 第二节 劳务派遣
  第五十七条 劳务派遣单位应当依照公司法的有关规定设立,注册资本不得少于五十万元。
  第五十八条 劳务派遣单位是本法所称用人单位,应当履行用人单位对劳动者的义务。劳务派遣单位与被派遣劳动者订立的劳动合同,除应当载明本法第十七条规定的事项外,还应当载明被派遣劳动者的用工单位以及派遣期限、工作岗位等情况。
  劳务派遣单位应当与被派遣劳动者订立二年以上的固定期限劳动合同,按月支付劳动报酬;被派遣劳动者在无工作期间,劳务派遣单位应当按照所在地人民政府规定的最低工资标准,向其按月支付报酬。
  第五十九条 劳务派遣单位派遣劳动者应当与接受以劳务派遣形式用工的单位(以下称用工单位)订立劳务派遣协议。劳务派遣协议应当约定派遣岗位和人员数量、派遣期限、劳动报酬和社会保险费的数额与支付方式以及违反协议的责任。
  用工单位应当根据工作岗位的实际需要与劳务派遣单位确定派遣期限,不得将连续用工期限分割订立数个短期劳务派遣协议。
  第六十条 劳务派遣单位应当将劳务派遣协议的内容告知被派遣劳动者。
  劳务派遣单位不得克扣用工单位按照劳务派遣协议支付给被派遣劳动者的劳动报酬。
  劳务派遣单位和用工单位不得向被派遣劳动者收取费用。
  第六十一条 劳务派遣单位跨地区派遣劳动者的,被派遣劳动者享有的劳动报酬和劳动条件,按照用工单位所在地的标准执行。
  第六十二条 用工单位应当履行下列义务:
  (一)执行国家劳动标准,提供相应的劳动条件和劳动保护;
  (二)告知被派遣劳动者的工作要求和劳动报酬;
  (三)支付加班费、绩效奖金,提供与工作岗位相关的福利待遇;
  (四)对在岗被派遣劳动者进行工作岗位所必需的培训;
  (五)连续用工的,实行正常的工资调整机制。
  用工单位不得将被派遣劳动者再派遣到其他用人单位。
  第六十三条 被派遣劳动者享有与用工单位的劳动者同工同酬的权利。用工单位无同类岗位劳动者的,参照用工单位所在地相同或者相近岗位劳动者的劳动报酬确定。
  第六十四条 被派遣劳动者有权在劳务派遣单位或者用工单位依法参加或者组织工会,维护自身的合法权益。
  第六十五条 被派遣劳动者可以依照本法第三十六条、第三十八条的规定与劳务派遣单位解除劳动合同。
  被派遣劳动者有本法第三十九条和第四十条第一项、第二项规定情形的,用工单位可以将劳动者退回劳务派遣单位,劳务派遣单位依照本法有关规定,可以与劳动者解除劳动合同。
  第六十六条 劳务派遣一般在临时性、辅助性或者替代性的工作岗位上实施。
  第六十七条 用人单位不得设立劳务派遣单位向本单位或者所属单位派遣劳动者。
 第三节 非全日制用工
  第六十八条 非全日制用工,是指以小时计酬为主,劳动者在同一用人单位一般平均每日工作时间不超过四小时,每周工作时间累计不超过二十四小时的用工形式。
  第六十九条 非全日制用工双方当事人可以订立口头协议。
  从事非全日制用工的劳动者可以与一个或者一个以上用人单位订立劳动合同;但是,后订立的劳动合同不得影响先订立的劳动合同的履行。
  第七十条 非全日制用工双方当事人不得约定试用期。
  第七十一条 非全日制用工双方当事人任何一方都可以随时通知对方终止用工。终止用工,用人单位不向劳动者支付经济补偿。
  第七十二条 非全日制用工小时计酬标准不得低于用人单位所在地人民政府规定的最低小时工资标准。
  非全日制用工劳动报酬结算支付周期最长不得超过十五日。
第六章 监督检查
  第七十三条 国务院劳动行政部门负责全国劳动合同制度实施的监督管理。
  县级以上地方人民政府劳动行政部门负责本行政区域内劳动合同制度实施的监督管理。
  县级以上各级人民政府劳动行政部门在劳动合同制度实施的监督管理工作中,应当听取工会、企业方面代表以及有关行业主管部门的意见。
  第七十四条 县级以上地方人民政府劳动行政部门依法对下列实施劳动合同制度的情况进行监督检查:
  (一)用人单位制定直接涉及劳动者切身利益的规章制度及其执行的情况;
  (二)用人单位与劳动者订立和解除劳动合同的情况;
  (三)劳务派遣单位和用工单位遵守劳务派遣有关规定的情况;
  (四)用人单位遵守国家关于劳动者工作时间和休息休假规定的情况;
  (五)用人单位支付劳动合同约定的劳动报酬和执行最低工资标准的情况;
  (六)用人单位参加各项社会保险和缴纳社会保险费的情况;
  (七)法律、法规规定的其他劳动监察事项。
  第七十五条 县级以上地方人民政府劳动行政部门实施监督检查时,有权查阅与劳动合同、集体合同有关的材料,有权对劳动场所进行实地检查,用人单位和劳动者都应当如实提供有关情况和材料。
  劳动行政部门的工作人员进行监督检查,应当出示证件,依法行使职权,文明执法。
  第七十六条 县级以上人民政府建设、卫生、安全生产监督管理等有关主管部门在各自职责范围内,对用人单位执行劳动合同制度的情况进行监督管理。
  第七十七条 劳动者合法权益受到侵害的,有权要求有关部门依法处理,或者依法申请仲裁、提起诉讼。
  第七十八条 工会依法维护劳动者的合法权益,对用人单位履行劳动合同、集体合同的情况进行监督。用人单位违反劳动法律、法规和劳动合同、集体合同的,工会有权提出意见或者要求纠正;劳动者申请仲裁、提起诉讼的,工会依法给予支持和帮助。
  第七十九条 任何组织或者个人对违反本法的行为都有权举报,县级以上人民政府劳动行政部门应当及时核实、处理,并对举报有功人员给予奖励。
第七章 法律责任
  第八十条 用人单位直接涉及劳动者切身利益的规章制度违反法律、法规规定的,由劳动行政部门责令改正,给予警告;给劳动者造成损害的,应当承担赔偿责任。
  第八十一条 用人单位提供的劳动合同文本未载明本法规定的劳动合同必备条款或者用人单位未将劳动合同文本交付劳动者的,由劳动行政部门责令改正;给劳动者造成损害的,应当承担赔偿责任。
  第八十二条 用人单位自用工之日起超过一个月不满一年未与劳动者订立书面劳动合同的,应当向劳动者每月支付二倍的工资。
  用人单位违反本法规定不与劳动者订立无固定期限劳动合同的,自应当订立无固定期限劳动合同之日起向劳动者每月支付二倍的工资。
  第八十三条 用人单位违反本法规定与劳动者约定试用期的,由劳动行政部门责令改正;违法约定的试用期已经履行的,由用人单位以劳动者试用期满月工资为标准,按已经履行的超过法定试用期的期间向劳动者支付赔偿金。
  第八十四条 用人单位违反本法规定,扣押劳动者居民身份证等证件的,由劳动行政部门责令限期退还劳动者本人,并依照有关法律规定给予处罚。
  用人单位违反本法规定,以担保或者其他名义向劳动者收取财物的,由劳动行政部门责令限期退还劳动者本人,并以每人五百元以上二千元以下的标准处以罚款;给劳动者造成损害的,应当承担赔偿责任。
  劳动者依法解除或者终止劳动合同,用人单位扣押劳动者档案或者其他物品的,依照前款规定处罚。
  第八十五条 用人单位有下列情形之一的,由劳动行政部门责令限期支付劳动报酬、加班费或者经济补偿;劳动报酬低于当地最低工资标准的,应当支付其差额部分;逾期不支付的,责令用人单位按应付金额百分之五十以上百分之一百以下的标准向劳动者加付赔偿金:
  (一)未按照劳动合同的约定或者国家规定及时足额支付劳动者劳动报酬的;
  (二)低于当地最低工资标准支付劳动者工资的;
  (三)安排加班不支付加班费的;
  (四)解除或者终止劳动合同,未依照本法规定向劳动者支付经济补偿的。
  第八十六条 劳动合同依照本法第二十六条规定被确认无效,给对方造成损害的,有过错的一方应当承担赔偿责任。
  第八十七条 用人单位违反本法规定解除或者终止劳动合同的,应当依照本法第四十七条规定的经济补偿标准的二倍向劳动者支付赔偿金。
  第八十八条 用人单位有下列情形之一的,依法给予行政处罚;构成犯罪的,依法追究刑事责任;给劳动者造成损害的,应当承担赔偿责任:
  (一)以暴力、威胁或者非法限制人身自由的手段强迫劳动的;
  (二)违章指挥或者强令冒险作业危及劳动者人身安全的;
  (三)侮辱、体罚、殴打、非法搜查或者拘禁劳动者的;
  (四)劳动条件恶劣、环境污染严重,给劳动者身心健康造成严重损害的。
  第八十九条 用人单位违反本法规定未向劳动者出具解除或者终止劳动合同的书面证明,由劳动行政部门责令改正;给劳动者造成损
害的,应当承担赔偿责任。
  第九十条 劳动者违反本法规定解除劳动合同,或者违反劳动合同中约定的保密义务或者竞业限制,给用人单位造成损失的,应当承担赔偿责任。
  第九十一条 用人单位招用与其他用人单位尚未解除或者终止劳动合同的劳动者,给其他用人单位造成损失的,应当承担连带赔偿责任。
  第九十二条 劳务派遣单位违反本法规定的,由劳动行政部门和其他有关主管部门责令改正;情节严重的,以每人一千元以上五千元以下的标准处以罚款,并由工商行政管理部门吊销营业执照;给被派遣劳动者造成损害的,劳务派遣单位与用工单位承担连带赔偿责任。
  第九十三条 对不具备合法经营资格的用人单位的违法犯罪行为,依法追究法律责任;劳动者已经付出劳动的,该单位或者其出资人应当依照本法有关规定向劳动者支付劳动报酬、经济补偿、赔偿金;给劳动者造成损害的,应当承担赔偿责任。
  第九十四条 个人承包经营违反本法规定招用劳动者,给劳动者造成损害的,发包的组织与个人承包经营者承担连带赔偿责任。
  第九十五条 劳动行政部门和其他有关主管部门及其工作人员玩忽职守、不履行法定职责,或者违法行使职权,给劳动者或者用人单位造成损害的,应当承担赔偿责任;对直接负责的主管人员和其他直接责任人员,依法给予行政处分;构成犯罪的,依法追究刑事责任。
第八章 附  则
  第九十六条 事业单位与实行聘用制的工作人员订立、履行、变更、解除或者终止劳动合同,法律、行政法规或者国务院另有规定的,依照其规定;未作规定的,依照本法有关规定执行。
  第九十七条 本法施行前已依法订立且在本法施行之日存续的劳动合同,继续履行;本法第十四条第二款第三项规定连续订立固定期限劳动合同的次数,自本法施行后续订固定期限劳动合同时开始计算。
  本法施行前已建立劳动关系,尚未订立书面劳动合同的,应当自本法施行之日起一个月内订立。
  本法施行之日存续的劳动合同在本法施行后解除或者终止,依照本法第四十六条规定应当支付经济补偿的,经济补偿年限自本法施行之日起计算;本法施行前按照当时有关规定,用人单位应当向劳动者支付经济补偿的,按照当时有关规定执行。
  第九十八条 本法自2008年1月1日起施行。
(2007年6月29日第十届全国人民代表大会常务委员会第二十八次会议通过)

No Comments

CSDN 的Blog真让我伤心

当初我选择了你而没有选择CU,而现在我屡次被你伤害后仍未抛弃你,是因为我相信你能做的很好!
几乎每天的 23:00 -- 04:00期间,你的访问速度都是超级缓慢!甚至根本就打不开!!Bug更是从未停歇!
IT人大多都是夜猫子,也只有这段时间才有空来整理自己的博客,但我不知道此刻到底会有多大的流量会让你扛不住?
听说Micro$oft在给你拿$,所以你不得不全套采用它的技术:Windows Server + MS SQL + ASP.NET ?(你是不是很冤?)
那么,我真的很想问问,到底是你本身的技术真的差劲呢?还是服务器的配置差劲呢?还是给你拿$的开发工具本来就不行?
这不是在发牢骚啊!这是真心的希望你能做得好啊!
如果我对你已经失去了信心,我是不会怎么埋怨你的,我会直接搬家到CU去!我此刻还未抛弃你!所以证明我认为你还有希望!
我还很菜,但很菜的我都知道,用户才是最宝贵的!
而目前,论坛里的老用户越来越少来这里了,新用户屡屡得不到前辈的帮助,结果呢:论坛的人气日益下滑,你丢失了很多的老用户!
新闻报道越来越缺乏权威性,结果呢:CSDN的编辑已经被大家用 "垃圾" 来形容!
博客已经声名狼藉了,“烂” “垃圾” “鄙视” 这些难听的字眼已经常常见到,结果呢:我们这些还支持着相信着你的,却仍然不得不忍受着持续的伤害!
没有了用户,没有了信誉,没有了好的名声,我想知道那$还会有人拿给你么?
或许你们已经麻木了,你们已经不求上进了,所以你们不会知道对我们的伤害有多深,你们不会认识到持续丢失的用户是多么的宝贵,你们不会认为品牌信誉的降低是多么可怕!
下面,是我在网上无意间见到的那些被CSDN所伤害的痕迹(如果你有勇气,在百度google中输入 “CSDN+空格+伤害词汇/侮辱词汇” 你可以看到相当多的内容):
http://topic.csdn.net/u/20070716/10/3910384d-8fab-48e7-b75d-f9147276cdbe.html
http://www.fengfengkuang.cn/j2me/11244.html
http://www.blogjava.net/BlueDavy/archive/2005/05/13/4793.html
http://topic.csdn.net/u/20070124/18/47d23d04-4ecb-4203-bea6-c28ad7b17306.html
http://lordhong.javaeye.com/blog/36800
http://amplifier2000.spaces.live.com/blog/cns!492ACA247E71009E!112.entry
 
2008年2月18日发言:CSDN的状态终于趋于稳定了,总算没有辜负我的长期信任和期望,让我还能继续忍受下去。

No Comments

我的23岁,我的迷惘

我就快满23岁了,我在6年之后(29岁)能达到什么高度?
那时候
我的专业技能如何?
我的Linux、C、C++、Python、网络、Windows、数据库……
我的英语能力如何?
我的口语水平如何?我阅读专业文档的能力如何?我是否结识了一些外国朋友?
我的工作如何?
我的职位是什么?我的同事是哪些人?我的公司是什么?我的老板如何?
我的爱情如何?
我和虹虹如何?我们在同一个城市工作吧?虹虹更可爱吧?我更幸福吧?
我的生活如何?
我的生活习惯好吧?我居住的房子?我的厨艺?我穿的衣服鞋子?我用的手机?我是否还在和谁合租?我的猫还在?
我的母亲怎样?
妈妈还健康么?妈妈心情愉快么?我一年能看望她几次?妈妈会觉得我有出息么?
我的做事态度如何?
我还能认真的对待我的工作么?我还会很积极么?我还能敏锐的发现那些周围人已经麻木的、却可以拿出业绩的细节和要点么?
我的为人处世如何?
我有多少朋友?我有多少知心朋友?我的口碑如何?我是否结识了一些非常优秀的前辈?我是否结识了一些很出色的人?我经常和大家出去聚会么?
我的公司咋样?
我还想着我自己的公司么?我能当个管理者么?我有领导能力么?我有创业能力么?我的创业资金在哪?我的股东在哪?我的公司是干嘛的?我的员工在哪?
而这时候
我会写完这篇博客之后回去继续浪费我宝贵的生命么?
那些明知道坚持下去肯定会出成绩的事情我还会中途放弃么?
我还会鄙视自己么?
我还会这么颓废么?

No Comments

想成为嵌入式程序员应知道的0x10个基本问题

转载引用地址:http://blog.chinaunix.net/u/13991/showart_109557.html
很经典的一套题目,作者 Nigel Jones 是住在 Maryland 的一名顾问。
-----------------------------------------------------------------------------------------------------------------------------------------
    C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。
    这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为面试者和被面试者提供许多有用信息。
    此外,撇开面试的压力不谈,这种测试也是相当有趣的。
    从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。
    这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这是个愚蠢的问题吗?
    如要你答出某个字符的ASCII值。
    这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不是在嵌入式系统上。
    如果上述任何问题的答案是"是"的话,那么我知道我得认真考虑我是否应该去做这份工作。
    从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。
    不管怎么样,看一下这人如何回答他不会的问题也是满有趣。
    应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?
    当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?
    我发现这些信息与他们的测试成绩一样有用。
    有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮助。
    这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。
    这个测试适于不同水平的应试者,大多数初级水平的应试者的成绩会很差,经验丰富的程序员应该有很好的成绩。
    为了让你能自己决定某些问题的偏好,每个问题没有分配分数,如果选择这些考题为你所用,请自行按你的意思分配分数。

预处理器(Preprocessor)

--------------------------------------------------------------------------------

 
1 . 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在这想看到几件事情:
1) #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
3) 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。
4) 如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。

2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。
 #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 

这个测试是为下面的目的而设的:
1) 标识#define在宏中应用的基本知识。这是很重要的。因为在嵌入(inline)操作符变为标准C的一部分之前,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。
2)三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。
3) 懂得在宏中小心地把参数用括号括起来.
4) 我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?
        least = MIN(*p++, b);
3. 预处理器标识#error的目的是什么?
        如果你不知道答案,请看参考文献1。这问题对区分一个正常的伙计和一个书呆子是很有用的。只有书呆子才会读C语言课本的附录去找出象这种问题的答案。当然如果你不是在找一个书呆子,那么应试者最好希望自己不要知道答案。

死循环(Infinite loops)

--------------------------------------------------------------------------------

 
4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决方案。
我首选的方案是:

while(1)
{

}

一些程序员更喜欢如下方案:

for(;;)
{

}

        这个实现方式让我为难,因为这个语法没有确切表达到底怎么回事。如果一个应试者给出这个作为方案,我将用这个作为一个机会去探究他们这样做的基本原理。如果他们的基本答案是:"我被教着这样做,但从没有想到过为什么。"这会给我留下一个坏印象。

第三个方案是用 goto
Loop:
...
goto Loop;
        应试者如给出上面的方案,这说明或者他是一个汇编语言程序员(这也许是好事)或者他是一个想进入新领域的BASIC/FORTRAN程序员。

数据声明(Data declarations)

--------------------------------------------------------------------------------

 
5. 用变量a给出下面的定义
a) 一个整型数(An integer)
b)一个指向整型数的指针( A pointer to an integer)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)
d)一个有10个整型数的数组( An array of 10 integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An array of 10 pointers to integers)
f) 一个指向有10个整型数数组的指针( A pointer to an array of 10 integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

        人们经常声称这里有几个问题是那种要翻一下书才能回答的问题,我同意这种说法。当我写这篇文章时,为了确定语法的正确性,我的确查了一下书。但是当我被面试的时候,我期望被问到这个问题(或者相近的问题)。因为在被面试的这段时间里,我确定我知道这个问题的答案。应试者如果不知道所有的答案(或至少大部分答案),那么也就没有为这次面试做准备,如果该面试者没有为这次面试做准备,那么他又能为什么出准备呢?

Static

--------------------------------------------------------------------------------

 
6. 关键字static的作用是什么?
        这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明显的作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

        大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码范围的好处和重要性。

Const

--------------------------------------------------------------------------------

 
7.关键字const有什么含意?

        我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下Saks的文章吧。)
        如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?

const int a;
int const a;
const int *a;
int * const a;
int const * a const;

        前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提一句,也许你可能会问,即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:

1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)
2) 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。
3) 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Volatile

--------------------------------------------------------------------------------

 
8. 关键字volatile有什么含意?并给出三个不同的例子。
        一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量

        回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。
        假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。
1) 一个参数既可以是const还可以是volatile吗?解释为什么。
2) 一个指针可以是volatile 吗?解释为什么。
3) 下面的函数有什么错误:

int square(volatile int *ptr)
{
        return *ptr * *ptr;
}

下面是答案:
1)是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
2); 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。
3) 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)
{
    int a,b;
    a = *ptr;
    b = *ptr;
    return a * b;
}

        由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:

long square(volatile int *ptr)
{
    int a;
    a = *ptr;
    return a * a;
}

位操作(Bit manipulation)

--------------------------------------------------------------------------------

 
9. 嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。

对这个问题有三种基本的反应:

1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。
2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit fields因此完全对我无用,因为我的编译器用其它的方式来实现bit fields的。从道德讲:永远不要让一个非嵌入式的家伙粘实际硬件的边。
3) 用 #defines 和 bit masks 操作。这是一个有极高可移植性的方法,是应该被用到的方法。最佳的解决方案如下:

#define BIT3 (0x1 << 3)
static int a;

void set_bit3(void)
{
    a |= BIT3;
}
void clear_bit3(void)
{
    a &= ~BIT3;
}

        一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

访问固定的内存位置(Accessing fixed memory locations)

--------------------------------------------------------------------------------

 
10. 嵌入式系统经常具有要求程序员去访问某特定的内存位置的特点。在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

这一问题测试你是否知道为了访问一绝对地址把一个整型数强制转换(typecast)为一指针是合法的。这一问题的实现方式随着个人风格不同而不同。典型的类似代码如下:
    int *ptr;
    ptr = (int *)0x67a9;
    *ptr = 0xaa55;

一个较晦涩的方法是:

    *(int * const)(0x67a9) = 0xaa55;

        即使你的品味更接近第二种方案,但我建议你在面试时使用第一种方案。

中断(Interrupts)

--------------------------------------------------------------------------------

 
11. 中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表性的是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
    double area = PI * radius * radius;
    printf("\nArea = %f", area);
    return area;
}

这个函数有太多的错误了,以至让人不知从何说起了:
1) ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

代码例子(Code examples)

--------------------------------------------------------------------------------

 
12.下面的代码输出是什么,为什么?
void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a+b > 6) ? puts("> 6") : puts("<= 6");
}

        这个问题测试你是否懂得C语言中的整数自动转换原则,我发现有些开发者懂得极少这些东西。不管如何,这无符号整型问题的答案是输出是 ">6"。原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。

13. 评价下面的代码片断:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
/*1's complement of zero */

        对于一个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:

unsigned int compzero = ~0;

        这一问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法避免的烦恼。
        到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧...

动态内存分配(Dynamic memory allocation)

--------------------------------------------------------------------------------

 
14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?
        这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已经在ESP杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入一种虚假的安全感觉后,我拿出这么一个小节目:
下面的代码片段的输出是什么,为什么?
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
    puts("Got a null pointer");
else
    puts("Got a valid pointer");

        这是一个有趣的问题。最近在我的一个同事不经意把0值传给了函数malloc,得到了一个合法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是"Got a valid pointer"。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确。得到正确的答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。

Typedef

--------------------------------------------------------------------------------

 
15 Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;

        以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?
        这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是:typedef更好。思考下面的例子:

dPS p1,p2;
tPS p3,p4;

第一个扩展为

struct s * p1, p2;
.
        上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

晦涩的语法

--------------------------------------------------------------------------------

 
16 . C语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;

        这个问题将做为这个测验的一个愉快的结尾。不管你相不相信,上面的例子是完全合乎语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:
c = a++ + b;

        因此, 这段代码持行后a = 6, b = 7, c = 12。
       
        如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。我发现这个问题的最大好处是这是一个关于代码编写风格,代码的可读性,代码的可修改性的好的话题。

        好了,伙计们,你现在已经做完所有的测试了。这就是我出的C语言测试题,我怀着愉快的心情写完它,希望你以同样的心情读完它。如果是认为这是一个好的测试,那么尽量都用到你的找工作的过程中去吧。天知道也许过个一两年,我就不做现在的工作,也需要找一个。

作者介绍:
        Nigel Jones 是一个顾问,现在住在Maryland,当他不在水下时,你能在多个范围的嵌入项目中找到他。他很高兴能收到读者的来信,他的email地址是: NAJones@compuserve.com

参考文献
1) Jones, Nigel, "In Praise of the #error directive," Embedded Systems Programming, September 1999, p. 114.
2) Jones, Nigel, " Efficient C Code for Eight-bit MCUs ," Embedded Systems Programming, November 1998, p. 66.

No Comments

旧忆:脑海里突然勾勒出一副画面

这曾经是我大学毕业前的一篇随笔,现在拿来看,竟然有着不同的感受。
我现在的发展方向已经和预期的不同了,并没有做为一名程序员而是偏向了网络和Linux系统管理。
而我的生活方面,却是截然不同的。现在的我很幸福,过的很积极,充满了理想和光明,很快乐,那一道美丽的“彩虹”也伴随着我。:)
其实,生活不一定非要自己给自己很多的辛酸和艰辛才能走向成功。
积极、快乐、健康的生活可以学到更多的东西、得到更多的锻炼和结识更多的朋友,并拥有让自己非常幸福的爱情,也更容易有所创造。
因为,生活犹如一面镜子,当你对他微笑的时候,他便对你微笑。而相互微笑着交往和做事的时候,才更加成功。
-----------------------------------------------------------------------------------------------------------------------------------------------------
脑海里突然勾勒出一副画面
 
我在一间租借的房间里面,靠着椅子,盯着电脑,心里想着让自己伤感的往事。
房间不大但很整洁,我每天离开公司之后会回来继续自己的编程或者是其它的工作,我已经也一直都是一个人,身边会有新的同事和朋友,会一直都拥有生命中不多的几个知心朋友。
我在漂泊的生活,在毕业之前我就准备好了用10年的时间来漂泊。还记得那时候自己是惧怕平庸的生活,知道漂泊会带来的种种辛酸,会隐约有那种疼痛的感受,但自己确实已经准备好了来接受。
而现在,伤痛越来越多,我还没有麻木,没有怨天尤人,一切只是因为早有准备。我还是会有短暂的快乐,会在程序中工作中,会在项目取得成功时,会在发年度奖金的时候感到快乐。
我逐渐开始喜欢了这种孤独,每当回到我的这件屋子里面的时候我才会深深体验到这种孤独,这种触动心灵的感受让自己甘心承受。因为只有这个时候我才会思考自己,思考过去和将来。“…在向往的桌旁工作…”我会在平时埋葬其中,会和同事们很和睦的相处,会在一起经常的开甚至很过分的玩笑,会笑得死去活来,会时常一起聚餐,这些也一直都是自己在努力的人际交往,这种漂泊。
我很经常的想起家里的母亲,我尽自己的能力让她骄傲让她过的很好。也会回去看她,会不时的回味那种眼泪即将流出的感动。我的生命里,母亲越来越重要。常常的,我还会看望自己的亲人们,很大方的对待他们。我了解亲情的可贵。
我还在继续曾经到现在的一个愿望,一个人努力做出一个出色的项目,一切用自己的努力把它趋于完美,这就像是在麻痹自己,但是幸福的麻痹,是有好处的麻痹。而在最后,我会给它一个名字,和我的名字一样,和我的曾经一样。
我一直都在珍藏,都在避开,都在惧怕会忘记的“彩虹”。
生命中仅此一次的“彩虹”。
而现在,我还得继续自己的漂泊,因为我喜欢这样,喜欢。
很真实很深处的感动,不知道这些会不会出现在将来我的生活中。
于2006-3-23 00:13
 
而下面是我当时的人生规划:
-----------------------------------------------------------------------------------------------------------------------------------------------------
铭记我的梦想
我对计算机事业有着无尽的热爱与兴趣,我的人生规划是踏踏实实的从一名底层的程序员做起,历经一个IT人的各个人生阶段。
我不愿意让自己碌碌无为,不愿意让自己死于安乐,没有激情和压力的环境不会吸引到我。不断的学习,让自己经历漂泊和辛酸,让自己的价值不断提升,这才是我最想得到的人生。
在22岁之前我还在一直埋怨上天给予我的种种不公平,然而现在,我所肯定的是,一个人只要铭记自己的梦想并为之拼搏,自信与激情会一直围绕在你的身边。
我毕业于一所专科学校,国家教育局突如其来的不允许升本的政策让自己不得不准备好毕业。也就是在这一年,让自己经受了很多的挫折和打击。我曾经放弃过自己的梦想,人生似乎变得平庸而昏暗。幸好那只是很短的一段时间。
在企业中学习到的知识和东西远远超过了学校。这也是让我有勇气确信自己经过努力一定能实现梦想的原因,一个拥有了真正能力的人到任何地方都会有所作为。
我的终极梦想是我的公司MCSR,它的员工都是有着自身梦想的人,都在不懈的为着梦想而努力。公司是他们实现梦想的舞台,见证他们的成功、我的成功。

,

No Comments

Windows蓝屏画面错误代码说明一览表

原文地址:http://dollydai.bokee.com/1101202.html
Windows蓝屏画面错误代码说明一览表
使用IE的默认查找快捷键: Ctrl+F 可以更快速的定位到你要查找的错误代码信息。
-------------------------------------------------------------
一、部分代码具体含义
1.停止错误编号:0x0000000A
说明文字:IRQL-NOT-LESS-OR-EQUAL
通常的原因:驱动程序使用了不正确的内存地址.
解决方法:如果无法登陆,则重新启动计算机.当出现可用的作系统列表时,按F8键.在Windows高级选项菜单屏幕上,选择"最后一次正确的配置",然后按回车键.
检查是否正确安装了所有的新硬件或软件.如果这是一次全新安装,请与硬件或软件的制造商联系,获得可能需要的任何Windows更新或驱动程序.
运行由计算机制造商提供的所有的系统诊断软件,尤其是内存检查.
禁用或卸掉新近安装的硬件(RAM,适配器,硬盘,调制解调器等等),驱动程序或软件.
确保硬件设备驱动程序和系统BIOS都是最新的版本.
确保制造商可帮助你是否具有最新版本,也可帮助你获得这些硬件.
禁用 BIOS内存选项,例如cache或shadow.
2.停止错误编号:0x0000001E
说明文字:KMODE-EXPTION-NOT-HANDLED
通常的原因:内核模式进程试图执行一个非法或未知的处理器指令.
解决方法:确保有足够的空间,尤其是在执行一次新安装的时候.
如果停止错误消息指出了某个特定的驱动程序,那么禁用他.如果无法启动计算机.应试着用安全模式启动,以便删除或禁用该驱动程序.
如果有非 Microsoft支持的视频驱动程序,尽量切换到标准的VGA驱动程序或Windows提供的适当驱动程序.
禁用所有新近安装的驱动程序.
确保有最新版本的系统BIOS.硬件制造商可帮助确定你是否具有最新版本,也可以帮助你获得他.
BIOS内存选项,例如cache,shadow.
3.停止错误编号:0x00000023或0x00000024
说明文字:FAT-FILE-SYSTEM或MTFS-FILE-SYSTEM
通常原因:问题出现在Ntfs.sys(允许系统读写NTFS驱动器的驱动程序文件)内.
解决方法:运行由计算机制造商提供的系统诊断软件,尤其是硬件诊断软件.
禁用或卸载所有的反病毒软件,磁盘碎片整理程序或备份程序.
通过在命令提示符下运行Chkdsk /f命令检查硬盘驱动器是否损坏,然后重新启动计算机.
4.停止编号:0x0000002E
说明文字ATA-BUS-ERROR
通常的原因:系统内存奇偶校验出错,通常由硬件问题导致.
解决方法:卸掉所有新近安装的硬件(RAM.适配器.硬盘.调制解调器等等).
运行由计算机制造商提供的系统诊断软件,尤其是硬件诊断软件.
确保硬件设备驱动程序和系统BIOS都是最新版本.
使用硬件供应商提供的系统诊断,运行内存检查来查找故障或不匹配的内存.
禁用BIOS内存选项,例如cache或shadow.
在启动后出现可用作系统列表时,按F8.在Windows高级选项菜单屏幕上,选择"启动VGA模式:.然后按回车键.如果这样做还不能解决问题,可能需要更换不同的视频适配器列表,有关支持的视频适配器列表,请参阅硬件兼容性列表.
5.停止编号:0x0000003F
说明文字:NO-MOR-SYSTEM-PTES
通常的原因:每哟正确清理驱动程序.
解决方法:禁用或卸载所有的反病毒软件,磁盘碎片处理程序或备份程序.
6:停止错误编号:0x00000058
说明文字:FTDISK-INTERN-ERROR
通常的原因:容错集内的某个主驱动器发生故障.
解决方法:使用Windows安装盘启动计算机,从镜象(第2)系统驱动器引导.有关如何编辑Boot.ini文件以指向镜象系统驱动器的指导,可在MIcrosoft支持服务Web站点搜索"Edit ARC path".
7.停止错误编号:0x0000007B
说明文字:INACCESSI-BLE-BOOT-DEVICE
通常原因:初始化I/O系统(通常是指引导设备或文件系统)失败.
解决方法:引导扇区病毒通常会导致这种停止错误.是用反病毒软件的最新版本,检查计算机上是否有存在病毒.如果找到病毒,则必须执行必要的不找把他从计算机上清除掉,请参阅反病毒软件文档了解如何执行这些步骤.
卸下所有新近安装的硬件(RAM,适配器,调制解调器等等).
核对MIcrosoft硬件兼容性列表以确保所有的硬件和驱动程序都与Windows兼容.
如果使用的适SCSI适配器,可以从硬件供应商除获得最新WINDOWS驱动程序,禁用SCSI设备的同步协商,检查该SCSI链是否终结,并核对这些设备的SCSI ID,如果无法确定如何执行能够这些步骤,可参考硬件设备的文档.
如果你用的是IDE设备,将板上的IDE端口定义为唯一的主端口.核对IDE设备的主/从/唯一设置.卸掉除硬盘之外的所有IDE设备.如果无法确认如何执行这些不找,可参考硬件文档.
如果计算机已使用NTFS文件系统格式化,可重新启动计算机,然后在该系统分区上运行Chkdsk /f/r命令.如果由于错误而无法启动系统,那么使用命令控制台,并运行Chkdsk /r命令. 运行Chkdsk /f命令以确定文件系统是否损坏.如果Windows不能运行Chkdsk命令,将驱动器移动到其他运行Windows的计算机上,然后从这台计算机上对该驱动器运行Chkdsk命令.
8.停止错误编号:0x0000007F
说明文字:UNEXPECTED-KERNEL-MODE-TRAP
通常的原因:通常是由于硬件或软件问题导致,但一般都由硬件故障引起的.
解决方法:核对Microsoft硬件兼容性列表以确保所有的硬件和驱动程序都与Windows兼容.如果计算机主板不兼容就会产生这个问题.
卸掉所由新近安装的硬件.
运行由计算机制造商提供的所有系统诊断软件,尤其是内存检查.
禁用BIOS内存选项,例如cache或shadow.
9.停止错误编号:0x00000050
说明文字:PAGE-FAULT-IN-NONPAGED-AREA
通常的原因:内存错误(数据不能使用分页文件交换到磁盘中).
解决方法:卸掉所有的新近安装的硬件.
运行由计算机制造商提供的所有系统诊断软件.尤其是内存检查.
检查是否正确安装了所有新硬件或软件,如果这是一次全新安装,请与硬件或软件制造商联系,获得可能需要的任何Windows更新或驱动程序.
禁用或卸载所有的反病毒程序.
禁用BIOS内存选项,例如cache或shadow.
10.停止错误编号:0x00000077
说明文字:KERNEL-STEL-STACK-INPAGE-ERROR
通常的原因:无法从分页文件将内核数据所需的页面读取到内存中。
解决方法:使用反病毒软件的最新版本,检查计算机上是否有病毒。如果找到病毒,则执行必要的步骤把他从计算机上清除掉。请参阅制造商提供的所有系统诊断软件,尤其是内存检查。
禁用BIOS内存选项,例如cache,shadow.
11.停止错误编号:0x00000079
说明文字:MISMATCHED-HAL
通常的原因:硬件抽象层与内核或机器类型不匹配(通常发生在单处理器和多处理器配置文件混合在同一系统的情况下)。
解决方法:要解决本错误,可使用命令控制台替换计算机上错误的系统文件。
单处理器系统的内核文件是Ntoskml.exe,而多处理器系统的内核文件是Ntkrnlmp.exe,但是,这些文件要与安装媒体上的文件相对应;在安装完Windows2000和,不论使用的是哪个原文件,都会被重命名为Ntoskrnl.exe文件。HAL文件在安装之后也使用名称Hal.dll但是在安装媒体,但是在安装媒体上却有若干个可能的HAL文件。
12.停止错误编号:0x0000007A
说明文字:KERNEL-DATA-INPAGE-ERROR
通常的原因:无法从分页文件将内核数据所需的页面读取到内存中。(通常是由于分页文件上的故障,病毒,磁盘控制器错误或由故障的RAM引起的)。
解决方法:使用反病毒软件的最新版本,检查计算机上是否存在病毒。如果找到病毒。则执行必要的步骤把他从计算机上清除掉,请参阅犯病度软件文档了解如何执行这些步骤。
如果计算机已使用NTFS文件系统格式化。可重新启动计算机,然后在该系统分区上运行Chkdsk /f/r命令。如果由于错误而无法启动命令,那么使用命令控制台,并运行Chkdsk /r命令。
运行由计算机制造商提供的所有的系统在低端软件,尤其是内存检查。
13.停止错误编号:0xC000021A
说明文字:STATUS-SYSTEM-PROCESS-TERMINATED
通常的原因:用户模式子系统,例如Winlogon或客户服务器运行时子系统(CSRSS)已被损坏,所以无法再保证安全性。
解决方法:卸掉所有新近安装的硬件。
如果无法登陆,则重新启动计算机。当出现可用的作系统列表时按F8。在Windows2000高级选项菜单屏幕上,选择:"最后一次正确的配置"。然后按回车。
运行故障恢复台,并允许系统修复任何检测到的错误。
14.停止错误编号:0xC0000221
说明文字:STATUS-IMAGE-CHECKISU7M-MISMATCH
通常的原因:驱动程序或系统DLL已经被损坏。
解决方法:运行故障复控台,并且允许系统修复任何检测到的错误。
如果在RAM添加到计算机之后,立即发生错误,那么可能是分页文件损坏,或者新RAM由故障或不兼容。删除Pagefile.sys并将系统返回到原来的RAM配置。
运行由计算机制造商提供的所有的系统诊断软件,尤其是内存检查。
二、所有代码说明
---------------------------------------------------------
0 0x0000 操作完成。
1 0x0001 不正确的函数。
2 0x0002 系统找不到指定的文件。
3 0x0003 系级找不到指定的路径。
4 0x0004 系统无法打开文件。
5 0x0005 拒绝存取。
6 0x0006 无效的代码。
7 0x0007 内存控制模块已损坏。
8 0x0008 内存空间不足,无法处理这个指令。
9 0x0009 内存控制模块地址无效。
10 0x000A 环境不正确。
11 0x000B 尝试载入一个格式错误的程序。
12 0x000C 存取码错误。
13 0x000D 资料错误。
14 0x000E 内存空间不够,无法完成这项操作。
15 0x000F 系统找不到指定的硬盘。
16 0x0010 无法移除目录。
17 0x0011 系统无法将文件移到其它的硬盘。
18 0x0012 没有任何文件。
19 0x0013 储存媒体为防写状态。
20 0x0014 系统找不到指定的装置。
21 0x0015 装置尚未就绪。
22 0x0016 装置无法识别指令。
23 0x0017 资料错误(cyclic redundancy check)
24 0x0018 程序发出一个长度错误的指令。
25 0x0019 磁盘机在磁盘找不到持定的磁区或磁轨。
26 0x001A 指定的磁盘或磁盘无法存取。
27 0x001B 磁盘机找不到要求的磁区。
28 0x001C 打印机没有纸。
29 0x001D 系统无法将资料写入指定的磁盘。
30 0x001E 系统无法读取指定的装置。
31 0x001F 连接到系统的某个装置没有作用。
32 0x0020 The process cannot access the file because it is being used byanother process.
33 0x0021 文件的一部份被锁定,现在无法存取。
34 0x0022 磁盘机的磁盘不正确。请将%2(Volume Serial Number: %3)插入磁盘机%1。
36 0x0024 开启的分享文件数量太多。
38 0x0026 到达文件结尾。
39 0x0027 磁盘已满。
50 0x0032 不支持这种网络要求。
51 0x0033 远端电脑无法使用。
52 0x0034 网络名称重复。
53 0x0035 网络路径找不到。
54 0x0036 网络繁忙。
55 0x0037 The specified network resource or device is no longer available.
56 0x0038 The network BIOS command limit has been reached. 57 0x0039 网卡发生问题。
58 0x003A 指定的服务器无法执行要求的操作。
59 0x003B 网络发生意外的错误。
60 0x003C 远端配接卡不兼容。
61 0x003D 打印机队列已满。
62 0x003E 服务器的空间无法储存等候打印的文件。
63 0x003F 等候打印的文件已经删除。
64 0x0040 指定的网络名称无法使用。
65 0x0041 拒绝存取网络。
66 0x0042 网络资源类型错误。
67 0x0043 网络名称找不到。
68 0x0044 超过区域电脑网卡的名称限制。
69 0x0045 超过网络BIOS操作阶段的限制。
70 0x0046 远端服务器已经暂停或者正在起始中。
71 0x0047 由于连接数目已达上限,此时无法再连接到这台远端电脑。
72 0x0048 指定的打印机或磁盘装置已经暂停作用。
80 0x0050 文件已经存在。
82 0x0052 无法建立目录或文件。
83 0x0053 INT24失败
84 0x0054 处理这项要求的储存体无法使用。
85 0x0055 近端装置名称已经在使用中。
86 0x0056 指定的网络密码错误。
87 0x0057 参数错误。
88 0x0058 网络发生资料写入错误。
89 0x0059 此时时系统无法执行其它行程。
100 0x0064 无法建立其它的系统semaphore。
101 0x0065 属于其它行程专用的semaphore。
102 0x0066 semaphore已经设定,而且无法关闭。
103 0x0067 无法指定semaphore 。
104 0x0068 在岔断时间无法要求专用的semaphore。
105 0x0069 此 semaphore 先前的拥有权已经结束。
106 0x006A 请将磁盘插入 %1。
107 0x006B 因为代用的磁盘尚未插入,所以程序已经停止。
108 0x006C 磁盘正在使用中或被锁定。
109 0x006D Pipe 已经中止。
110 0x006E 系统无法开启指定的装置或档案。
111 0x006F 文件名太长。
112 0x0070 硬盘空间不足。
113 0x0071 没有可用的内部文件识别字。
114 0x0072 目标内部文件识别字不正确。
117 0x0075 由应用程序所执行的IOCTL呼叫不正确。
118 0x0076 写入验证参数值不正确。
119 0x0077 系统不支持所要求的指令。
120 0x0078 此项功能仅在 Win32 模式有效。
121 0x0079 semaphore 超过逾时期间。
122 0x007A 传到系统呼叫的资料区域太小。
123 0x007B 文件名、目录名和或储存体标签语法错误。
124 0x007C 系统呼叫层次不正确。
125 0x007D 磁盘没有设定标签。
126 0x007E 找不到指定的模组。
127 0x007F 找不到指定的程序。
128 0x0080 没有子行程可供等待。
129 0x0081 %1 这个应用程序无法在 Win32 模式下执行。
130 0x0082 Attempt to use a file handle to an open disk partition for anoperation other than raw disk I/O.
131 0x0083 尝试将文件指标移至文件开头之前。
132 0x0084 无法在指定的装置或文件,设定文件指标。
133 0x0085 JOIN 或 SUBST 指令无法用于内含事先结合过的磁盘机。
134 0x0086 尝试在已经结合的磁盘机,使用 JOIN 或 SUBST 指令。
135 0x0087 尝试在已经替换的磁盘机,使用 JOIN 或 SUBST 指令。
136 0x0088 系统尝试删除未连结过的磁盘机的连结关系。
137 0x0089 系统尝试删除未替换过的磁盘机的替换关系。
138 0x008A 系统尝试将磁盘机结合到已经结合过之磁盘机的目录。
139 0x008B 系统尝试将磁盘机替换成已经替换过之磁盘机的目录。
140 0x008C 系统尝试将磁盘机替换成已经替换过之磁盘机的目录。
141 0x008D 系统尝试将磁盘机 SUBST 成已结合的磁盘机目录。
142 0x008E 系统此刻无法执行 JOIN 或 SUBST。
143 0x008F 系统无法将磁盘机结合或替换同一磁盘机下目录。
144 0x0090 这个目录不是根目录的子目录。
145 0x0091 目录仍有资料。
146 0x0092 指定的路径已经被替换过。
147 0x0093 资源不足,无法处理这项指令。
148 0x0094 指定的路径这时候无法使用。
149 0x0095 尝试要结合或替换的磁盘机目录,是已经替换过的目标。
150 0x0096 CONFIG.SYS 文件未指定系统追踪资讯,或是追踪功能被取消。
151 0x0097 指定的 semaphore事件 DosMuxSemWait 数目不正确。
152 0x0098 DosMuxSemWait 没有执行/设定太多的 semaphore。
153 0x0099 DosMuxSemWait 清单不正确。
154 0x009A 你所输入的储存媒体标元长度限制。
155 0x009B 无法建立其它的执行绪。
156 0x009C 接收行程拒绝接受信号。
157 0x009D 区段已经被舍弃,无法被锁定。
158 0x009E 区段已经解除锁定。
159 0x009F 执行绪识别码的地址不正确。
160 0x00A0 传到 DosExecPgm 的引数字符串不正确。
161 0x00A1 指定的路径不正确。
162 0x00A2 信号等候处理。
164 0x00A4 系统无法建立执行绪。
167 0x00A7 无法锁定文件的部份范围。
170 0x00AA 所要求的资源正在使用中。
173 0x00AD 取消范围的锁定要求不明显。
174 0x00AE 文件系统不支持自动变更锁定类型。
180 0x00B4 系统发现不正确的区段号码。
182 0x00B6 操作系统无法执行 %1。
183 0x00B7 文件已经存在,无法建立同一文件。
186 0x00BA 传送的旗号错误。
187 0x00BB 指定的系统旗号找不到。
188 0x00BC 操作系统无法执行 %1。
189 0x00BD 操作系统无法执行 %1。
190 0x00BE 操作系统无法执行 %1。
191 0x00BF 无法在 Win32 模式下执行 %1。
192 0x00C0 操作系统无法执行 %1。
193 0x00C1 %1 不是正确的 Win32 应用程序。
194 0x00C2 操作系统无法执行 %1。
195 0x00C3 操作系统无法执行 %1。
196 0x00C4 操作系统无法执行这个应用程序。
197 0x00C5 操作系统目前无法执行这个应用程序。
198 0x00C6 操作系统无法执行 %1。
199 0x00C7 操作系统无法执行这个应用程序。
200 0x00C8 程序码的区段不可以大于或等于64KB。
201 0x00C9 操作系统无法执行 %1。
202 0x00CA 操作系统无法执行 %1。
203 0x00CB 系统找不到输入的环境选项。
205 0x00CD 在指令子目录下,没有任何行程有信号副处理程序。
206 0x00CE 文件名称或副文件名太长。
207 0x00CF ring 2 堆迭使用中。
208 0x00D0 输入的通用文件名字元 * 或 ? 不正确,或指定太多的通用文件名字元。
209 0x00D1 所传送的信号不正确。
210 0x00D2 无法设定信号处理程序。
212 0x00D4 区段被锁定,而且无法重新配置。
214 0x00D6 附加到此程序或动态连结模组的动态连结模组太多。
215 0x00D7 Can't nest calls to LoadModule.
230 0x00E6 The pipe state is invalid.
231 0x00E7 所有的 pipe instances 都在忙碌中。
232 0x00E8 The pipe is being closed.
233 0x00E9 No process is on the other end of the pipe.
234 0x00EA 有更多可用的资料。
240 0x00F0 操作阶段被取消。
254 0x00FE 指定的延伸属性名称无效。
255 0x00FF 延伸的属性不一致。
259 0x0103 没有可用的资料。
266 0x010A 无法使用 Copy API。
267 0x010B 目录名称错误。
275 0x0113 延伸属性不适用于缓冲区。
276 0x0114 在外挂的文件系统上的延伸属性文件已经损坏。
277 0x0115 延伸属性表格档满。
278 0x0116 指定的延伸属性代码无效。
282 0x011A 外挂的这个文件系统不支持延伸属性。
288 0x0120 意图释放不属于叫用者的 mutex。
298 0x012A semaphore 传送次数过多。
299 0x012B 只完成 Read/WriteProcessMemory 的部份要求。
317 0x013D 系统找不到位于讯息文件%2中编号为0x%1的讯息。
487 0x01E7 尝试存取无效的地址。
534 0x0216 运算结果超过32位。
535 0x0217 信道的另一端有一个行程在接送资料。
536 0x0218 等候行程来开启信道的另一端。
994 0x03E2 存取延伸的属性被拒。
995 0x03E3 由于执行绪结束或应用程序要求,而异常终止 I/O操作。
996 0x03E4 重迭的 I/O 事件不是设定成通知状态。
997 0x03E5 正在处理重迭的 I/O 操作。
998 0x03E6 对记忆体位置的无效存取。
999 0x03E7 执行 inpage 操作发生错误。
1001 0x03E9 递归太深,堆迭溢出。
1002 0x03EA 视窗无法用来传送讯息。
1003 0x03EB 无法完成这项功能。
1004 0x03EC 旗号无效。
1005 0x03ED 储存媒体未含任何可辨识的文件系统。请确以载入所需的系统驱动
程序,而且该储存媒体并未损坏。
1006 0x03EE 储存该文件的外部媒体发出警告,表示该已开启文件已经无效。
1007 0x03EF 所要求的作业无法在全屏幕模式下执行。
1008 0x03F0 An attempt was made to reference a token that does not exist.
1009 0x03F1 组态系统登录数据库毁损。
1010 0x03F2 组态系统登录机码无效。
1011 0x03F3 无法开启组态系统登录机码。
1012 0x03F4 无法读取组态系统登录机码。
1013 0x03F5 无法写入组态系统登录机码。
1014 0x03F6 系统登录数据库中的一个档案必须使用记录或其它备份还原。已经还原成功。
1015 0x03F7 系统登录毁损。其中某个档案毁损、或者该档案的系统映对内存内容毁损、会是档案无法复原。
1016 0x03F8 系统登录起始的 I/O 作业发生无法复原的错误。系统登录无法读入、写出或更新,其中的一个档案内含系统登录在内存中的内容。
1017 0x03F9 系统尝试将档案加载系统登录或将档案还原到系统登录中,但是,指定档案的格式不是系统登录文件的格式。
1018 0x03FA 尝试在标示为删除的系统登录机码,执行不合法的操作。
1019 0x03FB 系统无法配置系统登录记录所需的空间。
1020 0x03FC 无法在已经有子机码或数值的系统登录机码建立符号连结。
1021 0x03FD 无法在临时机码下建立永久的子机码。
1022 0x03FE 变更要求的通知完成,但信息并未透过呼叫者的缓冲区传回。呼叫者现在需要自行列举档案,找出变更的地方。
1051 0x041B 停止控制已经传送给其它服务所依峙的一个服务。
1052 0x041C 要求的控制对此服务无效
1053 0x041D The service did not respond to the start or control request in a timely fashion.
1054 0x041E 无法建立服务的执行绪。
1055 0x041F 服务数据库被锁定。
1056 0x0420 这种服务已经在执行。
1057 0x0421 帐户名称错误或者不存在。
1058 0x0422 指定的服务暂停作用,无法激活。
1059 0x0423 指定循环服务从属关系。
1060 0x0424 指定的服务不是安装进来的服务。
1061 0x0425 该服务项目此时无法接收控制讯息。
1062 0x0426 服务尚未激活。
1063 0x0427 无法联机到服务控制程序。
1064 0x0428 处理控制要求时,发生意外状况。
1065 0x0429 指定的数据库不存在。
1066 0x042A 服务传回专属于服务的错误码。
1067 0x042B The process terminated unexpectedly.
1068 0x042C 从属服务或群组无法激活。
1069 0x042D 因为登入失败,所以没有激活服务。
1070 0x042E 在激活之后,服务在激活状态时当机。
1071 0x042F 指定服务数据库锁定无效。
1072 0x0430 指定的服务已经标示为删除。
1073 0x0431 指定的服务已经存在。
1074 0x0432 系统目前正以上一次执行成功的组态执行。
1075 0x0433 从属服务不存在,或已经标示为删除。
1076 0x0434 目前的激活已经接受上一次执行成功的控制设定。
1077 0x0435 上一次激活之后,就没有再激活服务。
1078 0x0436 指定的名称已经用于服务名称或服务显示名称。
1100 0x044C 已经到了磁带的最后。
1101 0x044D 到了档案标示。
1102 0x044E 遇到磁带的开头或分割区。
1103 0x044F 到了档案组的结尾。
1104 0x0450 磁带没有任何资料。
1105 0x0451 磁带无法制作分割区。
1106 0x0452 存取多重容体的新磁带时,发现目前区块大小错误。
1107 0x0453 加载磁带时,找不到磁带分割区信息。
1108 0x0454 无法锁住储存媒体退带功能。
1109 0x0455 无法解除加载储存媒体。
1110 0x0456 磁盘驱动器中的储存媒体已经变更。
1111 0x0457 已经重设 I/O 总线。
1112 0x0458 磁盘驱动器没有任何储存媒体。
1113 0x0459 目标 multi-byte code page,没有对应 Unicode 字符。
1114 0x045A 动态链接库 (DLL) 起始例程失败。
1115 0x045B 系统正在关机。
1116 0x045C 无法中止系统关机,因为没有关机的动作在进行中。
1117 0x045D 因为 I/O 装置发生错误,所以无法执行要求。
1118 0x045E 序列装置起始失败,会取消加载序列驱动程序。
1119 0x045F 无法开启装置。这个装置与其它装置共享岔断要求(IRQ)。至少已经有一个使用同一IRQ 的其它装置已经开启。
1120 0x0460 A serial I/O operation was completed by another write to the serial port. (The IOCTL_SERIAL_XOFF_COUNTER reached zero.)
1121 0x0461 因为已经过了逾时时间,所以序列 I/O 作业完成。(IOCTL_SERIAL_XOFF_COUNTER 不是零。)
1122 0x0462 在磁盘找不到任何的 ID 地址标示。
1123 0x0463 磁盘扇区 ID 字段与磁盘控制卡追踪地址不符。
1124 0x0464 软式磁盘驱动器控制卡回报了一个软式磁盘驱动器驱动程序无法识别的错误。
1125 0x0465 软式磁盘驱动器控制卡传回与缓存器中不一致的结果。
1126 0x0466 存取硬盘失败,重试后也无法作业。
1127 0x0467 存取硬盘失败,重试后也无法作业。
1128 0x0468 存取硬盘时,必须重设磁盘控制卡,但是连重设的动作也失败。
1129 0x0469 到了磁带的最后。
1130 0x046A 可用服务器储存空间不足,无法处理这项指令。
1131 0x046B 发现潜在的死锁条件。
1132 0x046C 指定的基本地址或档案位移没有适当对齐。
1140 0x0474 尝试变更系统电源状态,但其它的应用程序或驱动程序拒绝。
1141 0x0475 系统 BIOS 无法变更系统电源状态。
1150 0x047E 指定的程序需要新的 Windows 版本。
1151 0x047F 指定的程序不是 Windows 或 MS-DOS 程序。
1152 0x0480 指定的程序已经激活,无法再激活一次。
1153 0x0481 指定的程序是为旧版的 Windows 所写的。
1154 0x0482 执行此应用程序所需的链接库档案之一毁损。
1155 0x0483 没有应用程序与此项作业的指定档案建立关联。
1156 0x0484 传送指令到应用程序发生错误。
1157 0x0485 找不到执行此应用程序所需的链接库档案。
1200 0x04B0 指定的装置名称无效。
1201 0x04B1 装置现在虽然未联机,但是它是一个记忆联机。
1202 0x04B2 尝试记忆已经记住的装置。
1203 0x04B3 提供的网络路径找不到任何网络提供程序。
1204 0x04B4 指定的网络提供程序名称错误。
1205 0x04B5 无法开启网络联机设定文件。
1206 0x04B6 网络联机设定文件坏掉。
1207 0x04B7 无法列举非容器。
1208 0x04B8 发生延伸的错误。
1209 0x04B9 指定的群组名称错误。
1210 0x04BA 指定的计算机名称错误。
1211 0x04BB 指定的事件名称错误。
1212 0x04BC 指定的网络名称错误。
1213 0x04BD 指定的服务名称错误。
1214 0x04BE 指定的网络名称错误。
1215 0x04BF 指定的资源共享名称错误。
1216 0x04C0 指定的密码错误。
1217 0x04C1 指定的讯息名称错误。
1218 0x04C2 指定的讯息目的地错误。
1219 0x04C3 所提供的条件与现有的条件组发生冲突。
1220 0x04C4 尝试与网络服务器联机,但是与该服务器的联机已经太多。
1221 0x04C5 其它网络计算机已经在使用这个工作群组或网域名称。
1222 0x04C6 网络没有显示出来或者没有激活。
1223 0x04C7 使用者已经取消作业。
1224 0x04C8 要求的作业无法在已经开启使用者对应区段的档案执行。
1225 0x04C9 远程系统拒绝网络联机。
1226 0x04CA 关闭网络联机。
1227 0x04CB 网络传输端点已经有相关连的地址。
1228 0x04CC 地址尚未有相关的网络端点。
1229 0x04CD 尝试在不存在的网络连线作业。
1230 0x04CE 在作用中的网络联机上执行无效的作业。
1231 0x04CF 无法传输到远程网络。
1232 0x04D0 无法联机到远程系统。
1233 0x04D1 远程系统不支持传输通讯协议。
1234 0x04D2 远程系统的目的地网络端点没有作何执行中的服务。
1235 0x04D3 要求已经中止。
1236 0x04D4 进端系统已经中断网络联机。
1237 0x04D5 无法完成作业,请重试。
1238 0x04D6 无法与服务器联机,原因是这个帐户已经到达同时联机数目的上限。
1239 0x04D7 尝试在这个帐户未授权的时间登入网络。
1240 0x04D8 这个帐户无法从这个地方登入网络。
1241 0x04D9 网络地址无法用于这个要求的作业。
1242 0x04DA 服务已经登记。
1243 0x04DB 指定的服务不存在。
1244 0x04DC 作业无法执行,原因是使用者尚未授权使用。
1245 0x04DD 要求的作业无法执行,原因是使用者尚未登入网络。指定的服务不存在。
1246 0x04DE 传回要求呼叫者继续工作的讯息。
1247 0x04DF 在完成起始作业之后,尝试再执行起始作业。
1248 0x04E0 没有其它的近端装置。
1300 0x0514 并未指定所有的参照权限给呼叫者。
1301 0x0515 帐户名称与安全识别码之间尚有未执行完成的联机。
1302 0x0516 此帐户并未设定特别的系统配额限制。
1303 0x0517 没有可用的加密机码。传回一个已知的加密机码。
1304 0x0518 NT 密码太复杂,无法转换成 LAN Manager 密码。传回的LAN Manager密码是一个空字符串。
1305 0x0519 修正层次不详。
1306 0x051A 表示两个修订阶层不兼容。
1307 0x051B 此安全识别码无法指定为这个对象的拥有者。
1308 0x051C 此安全识别码无法指定为主要的对象群组。
1309 0x051D An attempt has been made to operate on an impersonation token by a thread that is not currently impersonating a client.
1310 0x051E 不可以关闭群组。
1311 0x051F 目前没有可登入的服务器,所以无法处理登入要求。
1312 0x0520 指定登入作业阶段不存在。该作业阶段可能已经结束。
1313 0x0521 指定的权限不存在。
1314 0x0522 客户端未列出要求的权限。
1315 0x0523 所提供的名称格式与帐户名称不符。
1316 0x0524 指定的使用者已经存在。
1317 0x0525 指定的使用者不存在。
1318 0x0526 指定的群组已经存在。
1319 0x0527 指定的群组不存存。
1320 0x0528 指定的使用者帐户已经是指定群组的成员,或指定的群组因为内含成员而无法删除。
1321 0x0529 指定的使用者帐户不是指定的群组帐户成员。
1322 0x052A 上一次留下来的管理帐户无法关闭或删除。
1323 0x052B 无法更新密码。所输入的密码不正确。
1324 0x052C 无法更新密码。所输入的新密码内含不符合密码规定。
1325 0x052D 因为违反密码更新规则,所以无法更新密码。
1326 0x052E 登入失败: 无法辨识的使用者名称或密码错误。
1327 0x052F 登入失败: 使用者帐户限制。
1328 0x0530 登入失败: 违反帐户登入时间限制。
1329 0x0531 登入失败: 使用者不可登入这部计算机。
1330 0x0532 登入失败: 指定的帐户密码过期。
1331 0x0533 登入失败: 帐户目前无效。
1332 0x0534 帐户名称与帐户识别码不符。
1333 0x0535 一次要求太多的近端使用者识别码 (local user identifiers, LUIDs)。
1334 0x0536 没有可用的近端使用者识别码(local user identifiers,LUIDs)。
1335 0x0537 安全识别码的转授权部份对这个特殊用法无效。
1336 0x0538 无效的存取控制清单结构。
1337 0x0539 安全识别码结构无效。
1338 0x053A 安全叙述子结构无效。
1340 0x053C 无法建立继承的存取控制清单或存取控件目。
1341 0x053D 服务器目前无效。
1342 0x053E 服务器目前可以使用。
1343 0x053F 所提供的值是无效的识别码授权值。
1344 0x0540 没有可供安全信息更新使用的内存。
1345 0x0541 指定的属性无效,或指定的属性与整个群组的属性不兼容。
1346 0x0542 Either a required impersonation level was not provided, or the provided impersonation level is invalid.
1347 0x0543 Cannot open an anonymous level security token.
1348 0x0544 所要求的认可信息类别无效。
1349 0x0545 The type of the token is inappropriate for its attempted use.
1350 0x0546 无法在没有相关连安全性的对象执行安全作业。
1351 0x0547 指示无法连到 Windows NT 服务器,或网域中的对象受到保护,所以无法撷取所需的对象。
1352 0x0548 安全帐户管理程序或区域安全授权服务器状态不正确,所以无法执行安全作业。
1353 0x0549 网域状态错误,所以无法执行安全作业。
1354 0x054A 只有网域的主域控制器才能使用这项作业。
1355 0x054B 指定的网域不存在。
1356 0x054C 指定的网域已经存在。
1357 0x054D 尝试超过每个服务器的网域数目限制。
1358 0x054E 因为磁盘上发生严重的储存媒体错误或是数据结构毁损,所以无法完成所要求的作业。
1359 0x054F 安全帐户数据库内有内部不一致的状况。
1360 0x0550 通用的存取类型包含在某一存取屏蔽中,这个屏蔽已经对应到非通用的类型。
1361 0x0551 安全叙述子的格式不正确 (absolute or self-relative)。
1362 0x0552 所要求的动作只能给登入使用。而目前呼叫该动作的处理并未登录为登入。
1363 0x0553 无法利用已经在使用的识别码来激活新的作业阶段。
1364 0x0554 无法识别指定的确认包装。
1365 0x0555 登入作业阶段不是在与要求的作业一致的状态。
1366 0x0556 登入作业阶段识别码已经在使用中。
1367 0x0557 登入要求包含无效的登入类型值。
1368 0x0558 Unable to impersonate via a named pipe until data has been
read from that pipe.
1369 0x0559 The transaction state of a Registry subtree is incompatible
with the requested operation.
1370 0x055A 内部安全数据库毁损。
1371 0x055B 无法在内建帐户执行这项作业。
1372 0x055C 无法在这个内建的特殊群组执行这项操作。
1373 0x055D 无法在这个内建的特殊使用者执行这项作业。
1374 0x055E 因为群组目前是使用者的主要群组,所以不能从群组移除使用者。
1375 0x055F The token is already in use as a primary token.
1376 0x0560 指定的区域群组不存在。
1377 0x0561 指定的帐户名称不是区域群组的成员。
1378 0x0562 指定的帐户名称已经是区域群组的成员。
1379 0x0563 指定的区域群组已经存在。
1380 0x0564 登入失败: 使用者无权在这部计算机以要求的登入类型登入。
1381 0x0565 The maximum number of secrets that may be stored in a single system has been exceeded.
1382 0x0566 The length of a secret exceeds the maximum length allowed.
1383 0x0567 本区安全性授权数据库内含的资料不一致。
1384 0x0568 在登入时,使用者的安全内容累积太多的安全识别码。
1385 0x0569 登入失败: 使用者尚未被许可在这个台脑使用要求的登入类型。
1386 0x056A 交叉加密的密码需要变更使用者的密码。
1387 0x056B 因为成员不存在,所以无法将新的成员新增到区域群组。
1388 0x056C 因为成员的帐号类型不正确,所以无法新增到区域群组。
1389 0x056D 指定的安全 ID 太多。
1390 0x056E 需要用到交互加密的密码才能变更这个使用者的密码。
1391 0x056F 表示存取控制清单没有可继承的组件
1392 0x0570 档案或目录已毁,无法读取资料。
1393 0x0571 磁盘结构已毁无法读取。
1394 0x0572 没有指定之登入作业阶段的使用者作业阶段机码。
1395 0x0573 正在存取的服务仅授权特定数目的联机。而目前联机数目已达上限,所以无法再建立服务联机。
1400 0x0578 窗口代码无效。
1401 0x0579 菜单识别码无效。
1402 0x057A 光标句柄无效。
1403 0x057B 加速键表格句柄无效。
1404 0x057C Invalid hook handle. 1405 0x057D 无效的多重窗口位置结构控制。
1406 0x057E 无法建立最上层的子窗口。
1407 0x057F 找不到 window class。
1408 0x0580 无效的窗口,属于其它的执行绪。
1409 0x0581 快速键已经登记。
1410 0x0582 Class 已经存在。
1411 0x0583 Class 不存在。
1412 0x0584 Class 仍然有开启的窗口。
1413 0x0585 无效的索引。
1414 0x0586 图标句柄无效。
1415 0x0587 使用专用的 DIALOG 窗口文字。
1416 0x0588 清单方块识别码找不到。
1417 0x0589 找不到任何通配字符。
1418 0x058A 执行绪 (thread) 没有开启剪贴簿。
1419 0x058B 快速键没有登记。
1420 0x058C 不是有效的对话窗口。
1421 0x058D Control ID 找不到。
1422 0x058E 清单方块的讯息无效,因为没有任何的编辑句柄。
1423 0x058F 窗口不是一个清单方块。
1424 0x0590 高度必须小于 256。
1425 0x0591 装置范围 (DC) 句柄无效。
1426 0x0592 锁定程序类型无效。
1427 0x0593 锁定程序无效。
1428 0x0594 没有模块句柄就不能设定非本区的锁定。
1429 0x0595 This hook procedure can only be set globally.
1430 0x0596 The journal hook procedure is already installed.
1431 0x0597 The hook procedure is not installed.
1432 0x0598 无效的单一选择清单方块讯息。
1433 0x0599 LB_SETCOUNT 传送到 non-lazy 清单方块。
1434 0x059A 这个清单方块不支持跳格停驻。
1435 0x059B 不可毁损由其它执行绪所建立的对象。
1436 0x059C 子窗口不能有菜单。
1437 0x059D 窗口没有系统菜单。
1438 0x059E 无效的消息框样式。
1439 0x059F 无效的 system-wide (SPI_*) 参数。
1440 0x05A0 屏幕已经锁定。
1441 0x05A1 All handles to windows in a multiple-window position structure
must have the same parent.
1442 0x05A2 窗口不是子窗口。
1443 0x05A3 GW_* 指令无效。
1444 0x05A4 执行绪识别码无效。
1445 0x05A5 无法处理多重文件接口窗口的讯息。
1446 0x05A6 即现式菜单已在作用中。
1447 0x05A7 窗口没有滚动条。
1448 0x05A8 滚动条范围不可以大于 0x7FFF。 1449 0x05A9 无法以指定的方式显示或移除窗口。
1450 0x05AA 系统资源不足,无法完成所要求的服务。
1451 0x05AB 系统资源不足,无法完成所要求的服务。
1452 0x05AC 系统资源不足,无法完成所要求的服务。
1453 0x05AD 配额不足,无法完成所要求的服务。
1454 0x05AE 配额不足,无法完成所要求的服务。
1455 0x05AF 这项作业的 paging 文件太小,无法完成作业。
1456 0x05B0 找不到菜单项目。
1500 0x05DC 事件记录文件坏掉。
1501 0x05DD 无法开启事件记录文件,因此事件记录服务没有激活。
1502 0x05DE 事件记录文件已满。
1503 0x05DF 事件记录文件已经变更。
1700 0x06A4 字符串连结错误。
1701 0x06A5 连结句柄 (binding handle) 的类型错误。
1702 0x06A6 连结句柄 (binding handle) 无效。
1703 0x06A7 不支持 RPC 通讯协议顺序。
1704 0x06A8 RPC 通讯协议顺序无效。
1705 0x06A9 字符串 universal unique identifier (UUID) 无效。
1706 0x06AA 端点格式错误。
1707 0x06AB 网络地址无效。
1708 0x06AC 找不到端点。
1709 0x06AD 逾时数值无效。
1710 0x06AE 找不到对象的 universal unique identifier (UUID)。
1711 0x06AF 对象的 universal unique identifier (UUID) 已经登记。
1712 0x06B0 类型的 universal unique identifier (UUID) 已经登记。
1713 0x06B1 RPC 服务器已经在听候。
1714 0x06B2 没有登记通讯协议顺序。
1715 0x06B3 RPC 服务器没有听候指令。
1716 0x06B4 管理员类型不详。
1717 0x06B5 接口不详。
1718 0x06B6 没有联机。
1719 0x06B7 没有通讯协议顺序。
1720 0x06B8 无法建立端点。
1721 0x06B9 资源不足,无法完成作业。
1722 0x06BA RPC 服务器无法使用。
1723 0x06BB RPC 服务器太忙,无法完成这项作业。
1724 0x06BC 网络选项无效。
1725 0x06BD 这个执行绪 (thread) 没有任何执行的远程过程调用。
1726 0x06BE 远程过程调用失败。
1727 0x06BF 远程过程调用失败,所以没有执行。
1728 0x06C0 远程过程调用 (remote procedure call,RPC) 通讯协议发生错误。
1730 0x06C2 RPC 服务器不支持转送语法。
1732 0x06C4 不支持 universal unique identifier (UUID) 的类型。
1733 0x06C5 封签 (tag) 无效。
1734 0x06C6 数组无效。
1735 0x06C7 连结中没有项目名称。
1736 0x06C8 名称语法无效。
1737 0x06C9 名称语法不被支持。
1739 0x06CB 没有任何网络地址可以用来建立全球唯一的识别码 (UUID)。
1740 0x06CC 端点重复。
1741 0x06CD 授权类型不详。
1742 0x06CE 呼叫次数的上限太小。
1743 0x06CF 字符串太长。
1744 0x06D0 找不到 RPC 通讯协议顺序。
1745 0x06D1 程序号码超出范围。
1746 0x06D2 连结中没有包含任何确认信息。
1747 0x06D3 确认服务不详。
1748 0x06D4 确认层次不详。
1749 0x06D5 安全内容无效。
1750 0x06D6 确认服务不详。
1751 0x06D7 项目无效。
1752 0x06D8 服务器端点无法执行这个作业。
1753 0x06D9 端点对应程序没有其它的端点。
1754 0x06DA 没有汇出任何的接口。
1755 0x06DB 项目名称不完整。
1756 0x06DC 版本选项无效。
1757 0x06DD 没有其它的成员。
1758 0x06DE 没有任何资料可以取消汇出。
1759 0x06DF 接口找不到。
1760 0x06E0 项目已经存在。
1761 0x06E1 项目找不到。
1762 0x06E2 名称服务无法使用。
1763 0x06E3 网络地址系列无效。
1764 0x06E4 要求的作业不受支持。
1765 0x06E5 没有可用来仿真的安全内容。
1766 0x06E6 远程过程调用 (RPC) 发生内部错误。
1767 0x06E7 RPC 服务器尝试用整数除以 0。
1768 0x06E8 RPC 服务器发生地址设定错误。
1769 0x06E9 RPC 服务器的浮点作业导致除以 0 的运算。
1770 0x06EA RPC 服务器发生浮点 underflow。 1771 0x06EB RPC 服务器发生浮点 overflow。
1772 0x06EC 清单中可供连结自动代码的 RPC 服务器已经用完。
1773 0x06ED 无法开启字符转换表档案。
1774 0x06EE 包含字符转换表的档案少于 512 字节。
1775 0x06EF 在远程过程调用时,将空的 context 代码从客户端传送到主计算机。
1777 0x06F1 在远程过程调用时内容处理改变。
1778 0x06F2 传送给远程过程调用的连结代码不符。
1779 0x06F3 The stub is unable to get the remote procedure call handle. 1780 0x06F4 A null reference pointer was passed to the stub.
1781 0x06F5 The enumeration value is out of range.
1782 0x06F6 字节计数太小。
1783 0x06F7 The stub received bad data.
1784 0x06F8 所提供的使用者缓冲区对要求的作业无效。
1785 0x06F9 无法辨识磁盘储存媒体。磁盘储存媒体可能还没有制作格式。
1786 0x06FA The workstation does not have a trust secret.
1787 0x06FB The SAM database on the Windows NT Server does not have a
computer account for this workstation trust relationship. 1788 0x06FC The trust relationship between the primary domain and the trusted domain failed. 1789 0x06FD The trust relationship between this workstation and the primary domain failed. 1790 0x06FE 网络登入失败。
1791 0x06FF 远程过程调用已经在这个执行绪进行中。
1792 0x0700 尝试登入,但网络登入服务尚未激活。
1793 0x0701 使用者的帐户已经过期。
1794 0x0702 The redirector is in use and cannot be unloaded.
1795 0x0703 指定的打印机驱动程序已经安装。
1796 0x0704 指定的连接埠无法识别。
1797 0x0705 打印机驱动程序无法识别。
1798 0x0706 打印处理器不详。
1799 0x0707 指定的分隔档无效。
1800 0x0708 指定的优先级无效。
1801 0x0709 打印机名称无效。
1802 0x070A 打印机已经存在。
1803 0x070B 打印机指令无效。
1804 0x070C 指定的数据类型无效。
1805 0x070D 指定的 Environment 无效。
1806 0x070E 没有其它的连结。
1807 0x070F 这是一个跨网域的信任帐户。请用您的全域性使用者帐户或区域性使用者帐户来存取服务器。
1808 0x0710 这是一个计算机帐户。请使用您的全域性使用者帐户或区域性使用者帐户来存取这个服务器。
1809 0x0711 这是一个伺服端信任帐户。请用您的全域性使用者帐户或区域性使用者帐户来存取服务器。
1810 0x0712 指定的网域名称或安全识别码与网域信用信息不符。
1811 0x0713 服务器正在使用中,无法卸载。
1812 0x0714 指定的影像档案没有有包含资源区段。
1813 0x0715 在影像文件找不到指定的资源类型。
1814 0x0716 在影像文件找不到指定的资源名称。
1815 0x0717 在影像文件找不到指定的资源语系识别码。
1816 0x0718 可用的配额不足,无法处理这项指令。
1817 0x0719 登录任何接口。
1818 0x071A 处理这项呼叫的时候,服务器发生变更。
1819 0x071B 连结代码没有包含所有必须的信息。
1820 0x071C 通讯失败。
1821 0x071D 要求的认证层次不被支持。
1822 0x071E 没有登记任何主要的名称。
1823 0x071F 指定的错误不是有效的 Windows RPC 错误码。
1824 0x0720 A UUID that is valid only on this computer has been allocated.
1825 0x0721 发生安全包装指定错误。
1826 0x0722 没有取消执行绪 (THREAD) 1827 0x0723 针对编码/译码的代码进行无效的作业。
1828 0x0724 Incompatible version of the serializing package.
1829 0x0725 不兼容的 RPC stub 版本。
1898 0x076A 找不到群组成员。
1899 0x076B 无法建立 endpoint mapper 数据库。
1900 0x076C The object universal unique identifier (UUID) is the nil UUID.
1901 0x076D 指定的项目无效。
1902 0x076E 指定窗体名称错误。
1903 0x076F 指定的窗体大小错误。
1904 0x0770 指定的打印机句柄已经在等候。
1905 0x0771 指定的打印机已经删除
1906 0x0772 打印机的状态错误。
1907 0x0773 使用者在第一次登入之前,必须先变更它的密码。
1908 0x0774 找不到这个网域的域控制器。
1909 0x0775 参照的帐户目前被锁定,无法登入。
2000 0x07D0 像素格式无效。
2001 0x07D1 指定的驱动程序无效。
2002 0x07D2 窗口样式或 class 属性对这项作业无效。
2003 0x07D3 不支持所要求的中继文件作业。
2004 0x07D4 不支持要求的传输作业。
2005 0x07D5 不支持要求的剪辑作业。
2202 0x089A 指定的使用者名称无效。
2250 0x08CA 网络联机不存在。
2401 0x0961 这个网络联机已经开启档案或者要求暂停。
2402 0x0962 现行的联机仍然存在。
2404 0x0964 装置正在使用中,无法中断联机。
3000 0x0BB8 指定的打印机监视器不详。
3001 0x0BB9 指定的打印机驱动程序正在使用中。
3002 0x0BBA 找不到排存盘。
3003 0x0BBB 没有发出 StartDocPrinter 呼叫。
3004 0x0BBC 没有发出 AddJob 呼叫。
3005 0x0BBD 指定的打印处理器已经安装。
3006 0x0BBE 指定打印监控程序已经安装。
4000 0x0FA0 在处理指令时,WINS 发生错误。
4001 0x0FA1 无法删除区域的 WINS。
4002 0x0FA2 The importation from the file failed. 4003 0x0FA3 制作备份失败。以前执行过完整的备份吗 ?
4004 0x0FA4 无法制作备份,请检查目录。
4005 0x0FA5 名称不在 WINS 数据库中。
4006 0x0FA6 不可用未设定的打印机来取代。
6118 0x17E6 这个工作群组的服务清单目前无法使用。

No Comments

推荐一篇北师大本科生的论文:高并发高流量网站架构

原文及作者网站地址:http://www.fulin.org
这篇论文出自一名叫唐福林的北师大的目前在读本科生。
他的这篇论文的确非常的优秀。
通过他的简历也能够确定他始终都是一名相当优秀的学生,同时具备良好的个人品质和出色的实践能力!
他足以成为众多IT学子的榜样!
---------------------------------------------------------------------------------------------------
毕业论文:“高并发高流量网站架构”
HTM 格式 ODT 格式 PDF 格式
毕业论文答辩演示文稿:“高并发高流量网站架构”
HTM 格式 ODT 格式 PDF 格式
---------------------------------------------------------------------------------------------------
申请北京师范大学学士学位论文 高并发高流量网站架构 唐福林 03281077 第 2页 共 51页

高并发高流量网站架构

Architecture of Website with

High Page view and High concurrency

院系:信息科学学院

专业:计算机科学与技术

学号:03281077

姓名:唐福林

指导教师:朱小明

 

北京师范大学

2007年3月

北京师范大学士学位论文(设计)原创性声明

 

本人郑重声明: 所呈交的学士学位论文(设计),是本人在导师的指导下,独立进行研究工作所取得的成果。除文中已经注明引用的内容外,本论文不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。

本人签名:         年 月 日

北京师范大学学士学位论文(设计)使用授权的说明

本人完全了解北京师范大学有关收集、保留和使用学士学位论文(设计)的规定,即:本科生在校攻读学位期间论文(设计)工作的知识产权单位属北京师范大学。学校有权保留并向国家有关部门或机构送交论文的复印件和电子版,允许学位论文(设计)被查阅和借阅;学校可以公布学位论文的全部或部分内容,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。保密的学位论文在解密后遵守此规定。

本论文(是、否)保密论文。

保密论文在 年解密后适用本授权书。

本人签名: 年 月 日

导师签名: 年 月 日

摘 要

Web2.0的兴起,掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念,细分了网站功能和用户群,不仅成功的造就了一大批新生的网站,也极大的方便了上网的人们。但Web2.0以用户为导向的理念,使得新生的网站有了新的特点——高并发,高流量,数据量大,逻辑复杂等,对网站建设也提出了新的要求。

本文围绕高并发高流量的网站架构设计问题,主要研究讨论了以下内容:

首先在整个网络的高度讨论了使用镜像网站,CDN内容分发网络等技术对负载均衡带来的便利及各自的优缺点比较。然后在局域网层次对第四层交换技术,包括硬件解决方案F5和软件解决方案LVS,进行了简单的讨论。接下来在单服务器层次,本文着重讨论了单台服务器的Socket优化,硬盘级缓存技术,内存级缓存技术,CPU与IO平衡技术(即以运算为主的程序与以数据读写为主的程序搭配部署),读写分离技术等。在应用层,本文介绍了一些大型网站常用的技术,以及选择使用该技术的理由。最后,在架构的高度讨论了网站扩容,容错等问题。

本文以理论与实践相结合的形式,结合作者实际工作中得到的经验,具有较广泛的适用性。

关键词:高并发 高流量 网站架构 网站扩容 容错

Abstract

With web2.0 starting, raised the Internet new turn of network to start undertaking the flood tide. To be user-oriented concept of the new websites, not only successfully created a large number of new sites, but also greatly facilitate the development of the Internet people. The Web2.0 at the same time take the user as the guidance idea, enabled the newborn website to have the new characteristic - high concurrency, high page views, big data quantity, and complex logic , etc. , also set the new request to the website construction. This article revolves the high concurrent high current capacity the website overhead construction design question, the main research discussed these content: First discussed the useage of mirror sites in the entire network, CDN content distribution network, the convenience and respective good and bad points comparison which brings to the load balancing. Then in the local area network, the fourth level exchange technology, including hardware solution F5 and software solution LVS, has been carried on with a simple discussion. Received in the single server level, this article emphatically discussed the single server socket optimization, the hard disk cache technology, the memory level buffer technology, CPU and the IO balance technology , the read-write separation technology and so on. In the application level, this article introduced some large-scale website commonly used technologies, as well as the reason of choice of these technicals. Finally, highly discussed the website in the overhead construction to expand accommodates, fault-tolerant. This article form which unifies by the theory and the practice, experience which in the author practical work obtains, has amore widespread serviceability.

KEY WORDS: high page view, high concurrency, architecture of website site, expansion

 

目 录

1 引言 9

1.1 互联网的发展 9

1.2 互联网网站建设的新趋势 9

1.3 新浪播客的简介 11

2 网络层架构 12

2.1 镜像网站技术 12

2.2 CDN内容分发网络 13

2.3 应用层分布式设计 16

2.4 网络层架构小结 17

3 交换层架构 17

3.1 第四层交换简介 17

3.2 硬件实现 18

3.3 软件实现 18

4 服务器优化 19

4.1 服务器整体性能考虑 19

4.2 Socket优化 19

4.3 硬盘级缓存 22

4.4 内存级缓存 24

4.5 CPU与IO均衡 26

4.6 读写分离 26

5 应用程序层优化 28

5.1 网站服务器程序的选择 28

5.2 数据库选择 29

5.3 服务器端脚本解析器的选择 30

5.4 可配置性 32

5.5 封装和中间层思想 33

6 扩容、容错处理 33

6.1 扩容 33

6.2 容错 34

7 总结及展望 35

7.1 总结 35

7.2 展望 36

 

高并发高流量网站架构

1 引言

1.1 互联网的发展
最近十年间,互联网已经从一个单纯的用于科研的,用来传递静态文档的美国内部网络,发展成了一个应用于各行各业的,传送着海量多媒体及动态信息的全球网络。从规模上看,互联网在主机数、带宽、上网人数等方面几乎一直保持着指数增长的趋势,2006年7月,互联网上共有主机439,286,364台,WWW 站点数量达到 96,854,877个 [1]。全球上网人口在2004 年达到 7 亿 2900万 [2],中国的上网人数在 2006 年 12 月达到了约 1亿3700 万[3]。另一方面,互联网所传递的内容也发生了巨大的变化,早期互联网以静态、文本的公共信息为主要内容,而目前的互联网则传递着大量的动态、多媒体及人性化的信息,人们不仅可以通过 互联网阅读到动态生成的信息,而且可以通过它使用电子商务、即时通信、网上游戏等交互性很强的服务。因此,可以说互联网已经不再仅仅是一个信息共享网络,而已经成为了一个无所不在的交互式服务的平台。

1.2 互联网网站建设的新趋势
互联网不断扩大的规模,日益增长的用户群,以及web2.0[4]的兴起,对互联网网站建设提出了新的要求:

高性能和高可扩展性。2000 年 5 月,访问量排名世界第一(统计数据来源[5])的Yahoo [6]声称其日页浏览数达到 6 亿 2500 万,即每秒约 30,000 次HTTP 请求(按每个页面浏览平均产生 4 次请求计算) 。这样大规模的访问量对服务的性能提出了非常高的要求。更为重要的是, 互联网受众的广泛性,使得成功的互联网服务的访问量增长潜力和速度非常大,因此服务系统必须具有非常好的可扩展性,以应付将来可能的服务增长。

支持高度并发的访问。高度并发的访问对服务的存储与并发能力提出了很高的要求,当前主流的超标量和超流水线处理器能处理的并发请求数是有限的,因为随着并发数的上升,进程调度的开销会很快上升。互联网广域网的本质决定了其访问的延迟时间较长,因此一个请求完成时间也较长,按从请求产生到页面下载完成 3 秒计算, Yahoo 在 2000 年 5 月时平均有 90,000 个并发请求。而且对于较复杂的服务,服务器往往要维护用户会话的信息,例如一个互联网网站如果每天有 100 万次用户会话,每次 20分钟的话,那平均同时就会有约 14000 个并发会话。

高可用性。互联网服务的全球性决定了其每天 24 小时都会有用户访问,因此任何服务的停止都会对用户造成影响。而对于电子商务等应用,暂时的服务中止则意味着客户的永久失去及大量的经济损失,例如ebay.com[7]1999 年 6 月的一次 22小时的网站不可访问,对此网站的 380万用户的忠诚度造成巨大影响,使得 Ebay 公司不得不支付了近500万美元用于补偿客户的损失,而该公司的市值同期下降了 40 亿美元[8]。因此,关键互联网应用的可用性要求非常高。

1.3 新浪播客的简介
以YouTube[9]为代表的微视频分享网站近来方兴未艾,仅2006年一年,国内就出现近百家仿YouTube的微视频分享网站[10],试图复制YouTube的成功模式。此类网站可以说是Web2.0概念下的代表网站,具有Web2.0网站所有典型特征:高并发,高流量,数据量大,逻辑复杂,用户分散等等。新浪[11]作为国内最大的门户网站,在2005年成功运作新浪博客的基础上,于2006年底推出了新浪播客服务。新浪播客作为国内门户网站中第一个微视频分享服务的网站,依靠新浪网站及新浪博客的巨大人气资源,在推出后不到半年的时间内,取得了巨大的成功:同类网站中上传视频数量第一、流量增长最快、用户数最多[12],所有这些成绩的取得的背后,是巨大的硬件投入,良好的架构支撑和灵活的应用层软件设计。

本文是作者在新浪爱问搜索部门实习及参与新浪播客开发的经验和教训的回顾,是作者对一般高并发高流量网站架构的总结和抽象。

2 网络层架构
2.1 镜像网站技术
镜像网站是指将一个完全相同的站点放到几个服务器上,分别有自己的URL,这些服务器上的网站互相称为镜像网站[13]。镜像网站和主站并没有太大差别,或者可以视为主站的拷贝。镜像网站的好处是:如果不能对主站作正常访问(如服务器故障,网络故障或者网速太慢等),仍能通过镜像服务器获得服务。不便之处是:更新网站内容的时候,需要同时更新多个服务器;需要用户记忆超过一个网址,或需要用户选择访问多个镜像网站中的一个,而用户选择的,不一定是最优的。在用户选择的过程中,缺乏必要的可控性。

在互联网发展的初期,互联网上的网站内容很少,而且大都是静态内容,更新频率底。但因为服务器运算能力低,带宽小,网速慢,热门网站的访问压力还是很大。镜像网站技术在这种情况下作为一种有效解决方案,被广泛采用。随着互联网的发展,越来越多的网站使用服务器端脚本动态生成内容,同步更新越来越困难,对可控性要求越来越高,镜像技术因为不能满足这类网站的需要,渐渐的淡出了人们的视线。但有一些大型的软件下载站,因为符合镜像网站的条件——下载的内容是静态的,更新频率较低,对带宽,速度要求又比较高,如国外的SourceForge (http://www.SourceForge.net,著名开源软件托管网站),Fedora(http://fedoraproject.org,RedHat赞助的Linux发行版),国内的华军软件园(http://www.onlinedown.net),天空软件站(http://www.skycn.com)等,还在使用这项技术(图1)。

图1 上图:天空软件站首页的镜像选择页面

下图:SourceForge下载时的镜像选择页面

在网站建设的过程中,可以根据实际情况,将静态内容作一些镜像,以加快访问速度,提升用户体验。

2.2 CDN内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的互联网中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,分散服务器的压力,解决互联网拥挤的状况,提高用户访问网站的响应速度。从而解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题[14]。

CDN与镜像网站技术的不同之处在于网站代替用户去选择最优的内容服务器,增强了可控制性。CDN其实是夹在网页浏览者和被访问的服务器中间的一层镜像或者说缓存,浏览者访问时点击的还是服务器原来的URL地址,但是看到的内容其实是对浏览者来说最优的一台镜像服务器上的页面缓存内容。这是通过调整服务器的域名解析来实现的。使用CDN技术的域名解析服务器需要维护一个镜像服务器列表和一份来访IP到镜像服务器的对应表。当一个用户的请求到来的时候,根据用户的IP,查询对应表,得到最优的镜像服务器的IP地址,返回给用户。这里的最优,需要综合考虑服务器的处理能力,带宽,离访问者的距离远近等因素。当某个地方的镜像网站流量过大,带宽消耗过快,或者出现服务器,网络等故障的时候,可以很方便的设置将用户的访问转到另外一个地方(图2)。这样就增强了可控制性。

图2 CDN原理示意图

CDN网络加速技术也有它的局限性。首先,因为内容更新的时候,需要同步更新多台镜像服务器,所以它也只适用于内容更新不太频繁,或者对实时性要求不是很高的网站;其次,DNS解析有缓存,当某一个镜像网站的访问需要转移时,主DNS服务器更改了IP解析结果,但各地的DNS服务器缓存更新会滞后一段时间,这段时间内用户的访问仍然会指向该服务器,可控制性依然有不足。

目前,国内访问量较高的大型网站如新浪、网易等的资讯频道,均使用CDN网络加速技术(图3),虽然网站的访问量巨大,但无论在什么地方访问,速度都会很快。但论坛,邮箱等更新频繁,实时性要求高的频道,则不适合使用这种技术。

图3 新浪网使用ChinaCache CDN服务。

ChinaCache的服务节点全球超过130个,

其中中国节点超过80个,

覆盖全国主要6大网络的主要省份[15]。

2.3 应用层分布式设计
新浪播客为了获得CDN网络加速的优点,又必须避免CDN的不足,在应用层软件设计上,采取了一个替代的办法。新浪播客提供了一个供播放器查询视频文件地址的接口。当用户打开视频播放页面的时候,播放器首先连接查询接口,通过接口获得视频文件所在的最优的镜像服务器地址,然后再到该服务器去下载视频文件。这样,用一次额外的查询获得了全部的控制性,而这次查询的通讯流量非常小,几乎可以忽略不计。CDN中由域名解析获得的灵活性也保留了下来:由接口程序维护镜像网站列表及来访IP到镜像网站的对应表即可。镜像网站中不需要镜像所有的内容,而是只镜像更新速度较慢的视频文件。这是完全可以承受的。

2.4 网络层架构小结
从整个互联网络的高度来看网站架构,努力的方向是明确的:让用户就近取得内容,但又要在速度和可控制性之间作一个平衡。对于更新比较频繁内容,由于难以保持镜像网站之间的同步,则需要使用其他的辅助技术。

3 交换层架构
3.1 第四层交换简介
按照OSI[16]七层模型,第四层是传输层。传输层负责端到端通信,在IP协议栈中是TCP和UDP所在的协议层。TCP和UDP数据包中包含端口号(port number),它们可以唯一区分每个数据包所属的协议和应用程序。接收端计算机的操作系统根据端口号确定所收到的IP包类型,并把它交给合适的高层程序。IP地址和端口号的组合通常称作“插口(Socket)”。

第四层交换的一个简单定义是:它是一种传输功能,它决定传输不仅仅依据MAC地址(第二层网桥)或源/目标IP地址(第三层路由),而且依据IP地址与TCP/UDP (第四层) 应用端口号的组合(Socket)[17]。第四层交换功能就像是虚拟IP,指向实际的服务器。它传输的数据支持多种协议,有HTTP、FTP、NFS、Telnet等。

以HTTP协议为例,在第四层交换中为每个服务器组设立一个虚拟IP(Virtue IP,VIP),每组服务器支持某一个或几个域名。在域名服务器(DNS)中存储服务器组的VIP,而不是某一台服务器的真实地址。

当用户请求页面时,一个带有目标服务器组的VIP连接请求发送给第四层交换机。第四层交换机使用某种选择策略,在组中选取最优的服务器,将数据包中的目标VIP地址用实际服务器的IP地址取代,并将连接请求传给该服务器。第四层交换一般都实现了会话保持功能,即同一会话的所有的包由第四层交换机进行映射后,在用户和同一服务器间进行传输[18]。

第四层交换按实现分类,分为硬件实现和软件实现。

3.2 硬件实现
第四层交换的硬件实现一般都由专业的硬件厂商作为商业解决方案提供。常见的有Alteon[19],F5[20]等。这些产品非常昂贵,但是能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了[21]。鉴于条件关系,这里不展开讨论。

3.3 软件实现
第四层交换也可以通过软件实现,不过性能比专业硬件稍差,但是满足一定量的压力还是可以达到的,而且软件实现配置起来更灵活。 软件四层交换常用的有Linux上的LVS(Linux Virtual Server),它提供了基于心跳(heart beat)的实时灾难应对解决方案,提高了系统的鲁棒性,同时提供了灵活的VIP配置和管理功能,可以同时满足多种应用需求[22]。

4 服务器优化
4.1 服务器整体性能考虑
对于价值昂贵的服务器来说,怎样配置才能发挥它的最大功效,又不至于影响正常的服务,这是在设计网站架构的时候必须要考虑的。常见的影响服务器的处理速度的因素有:网络连接,硬盘读写,内存空间,CPU速度。如果服务器的某一个部件满负荷运转仍然低于需要,而其他部件仍有能力剩余,我们将之称为性能瓶颈。服务器想要发挥最大的功效,关键的是消除瓶颈,让所有的部件都被充分的利用起来。

4.2 Socket优化
以标准的 GNU/Linux 为例。GNU/Linux 发行版试图对各种部署情况都进行优化,这意味着对具体服务器的执行环境来说,标准的发行版可能并不是最优化的[23]。GNU/Linux 提供了很多可调节的内核参数,可以使用这些参数为服务器进行动态配置,包括影响 Socket 性能的一些重要的选项。这些选项包含在 /proc 虚拟文件系统中。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。这里仅列出一些影响TCP/IP 栈性能的可调节内核参数[24]:

/proc/sys/net/ipv4/tcp_window_scaling “1”(1表示启用该选项,0表示关闭,下同) 启用 RFC[25] 1323[26] 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。

/proc/sys/net/ipv4/tcp_sack “1”启用有选择的应答(Selective Acknowledgment),通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);对于广域网通信来说,这个选项应该启用,但是这也会增加对 CPU 的占用。

/proc/sys/net/ipv4/tcp_timestamps “1” 以一种比重发超时更精确的方法(参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。

/proc/sys/net/ipv4/tcp_mem “24576 32768 49152” 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB)。第一个值是内存使用的下限。第二个值是内存压力模式开始对缓冲区使用应用压力的上限。第三个值是内存上限。超过这个上限时可以将报文丢弃,从而减少对内存的使用。

/proc/sys/net/ipv4/tcp_wmem “4096 16384 131072” 为自动调优定义每个 socket 使用的内存。第一个值是为 socket 的发送缓冲区分配的最少字节数。第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

/proc/sys/net/ipv4/tcp_westwood “1” 启用发送者端的拥塞控制算法,它可以维护对吞吐量的评估,并试图对带宽的整体利用情况进行优化;对于 WAN 通信来说应该启用这个选项。

与其他调优努力一样,最好的方法实际上就是不断进行实验。具体应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数对性能作用的效果。在某些情况中,一些认为有益的操作可能恰恰是有害的(反之亦然)。因此,需要逐一试验各个选项,然后检查每个选项的结果,最后得出最适合具体机器的一套参数。

如果重启了 GNU/Linux 系统,设置的内核参数都会恢复成默认值。为了将所设置的值作为这些参数的默认值,可以使用 /etc/rc.local 文件,在系统每次启动时自动将这些参数配置成所需要的值。

在检测每个选项的更改带来的效果的时候,GNU/Linux上有一些非常强大的工具可以使用:

ping 这是用于检查主机的可用性的最常用的工具,也可以用于计算网络带宽延时。

traceroute 打印连接到特定网络主机所经过的一系列路由器和网关的路径(路由),从而确定每个 hop 之间的延时。

netstat 确定有关网络子系统、协议和连接的各种统计信息。

tcpdump 显示一个或多个连接的协议级的报文跟踪信息,其中包括时间信息,可以使用这些信息来研究不同协议的报文时间。

Ethereal 以一个易于使用的图形化界面提供 tcpump (报文跟踪)的信息,支持报文过滤功能。

iperf 测量 TCP 和 UDP 的网络性能;测量最大带宽,并汇报延时和数据报的丢失情况。

4.3 硬盘级缓存
硬盘级别的缓存是指将需要动态生成的内容暂时缓存在硬盘上,在一个可接受的延迟时间范围内,同样的请求不再动态生成,以达到节约系统资源,提高网站承受能力的目的。Linux环境下硬盘级缓存一般使用Squid[27]。

Squid是一个高性能的代理缓存服务器。和一般的代理缓存软件不同,Squid用一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求。它接受来自客户端对目标对象的请求并适当地处理这些请求。比如说,用户通过浏览器想下载(即浏览)一个web页面,浏览器请求Squid为它取得这个页面。Squid随之连接到页面所在的原始服务器并向服务器发出取得该页面的请求。取得页面后,Squid再将页面返回给用户端浏览器,并且同时在Squid本地缓存目录里保存一份副本。当下一次有用户需要同一页面时,Squid可以简单地从缓存中读取它的副本,直接返回给用户,而不用再次请求原始服务器。当前的Squid可以处理HTTP, FTP, GOPHER, SSL和WAIS等协议。

Squid默认通过检测HTTP协议头的Expires和 Cache-Control字段来决定缓存的时间。在实际应用中,可以显式的在服务器端脚本中输出HTTP头,也可以通过配置apache的mod_expires模块,让apache自动的给每一个网页加上过期时间。对于静态内容,如图片,视频文件,供下载的软件等,还可以针对文件类型(扩展名),用 Squid 的 refresh_pattern 来指定缓存时间。

Squid 运行的时候,默认会在硬盘上建两层hash目录,用来存储缓存的Object。它还会在内存中建立一个Hash Table,用来记录硬盘中Object分布的情况。如果Squid配置成为一个Squid集群中的一个的话,它还会建立一个 Digest Table(摘要表),用来存储其它 Squid 上的Object摘要。当用户端想要的资料本地硬盘上没有时,可以很快的知道应该去集群中的哪一台机器获得。在硬盘空间快要达到配置限额的时候,可以配置使用某种策略(默认使用LRU:Least Recently Used-最近最少用)删除一些Object,从而腾出空间[28][29]。

集群中的Squid Server 之间可以有两种关系:第一种关系是:Child 和 Parent。当 Child Squid Server 没有资料时,会直接向 Parent Squid Server 要资料,然后一直等,直到 Parent 给它资料为止。 第二种关系是:Sibling 和 Sibling。当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它向 Parent 要或直接上原始网站去拿。

默认配置的Squid,没有经过任何优化的时候,一般可以达到 50% 的命中率[30](图4)。如果需要,还可以通过参数优化,拆分业务,优化文件系统等办法,使得Squid达到 90% 以上的缓存命中率。 Squid处理TCP连接消耗的服务器资源比真正的HTTP服务器要小的多,当Squid分担了大部分连接,网站的承压能力就大大增强了。

图4 某网站使用MRTG工具检测到的Squid命中率

蓝线表示Squid的流量,绿色部分表示Apache流量

4.4 内存级缓存
内存级别的缓存是指将需要动态生成的内容暂时缓存在内存里,在一个可接受的延迟时间范围内,同样的请求不再动态生成,而是直接从内存中读取。Linux环境下内存级缓存Memcached[31]是一个不错的选择。

Memcached是danga.com(运营Live Journal[32]的技术团队)开发的一套非常优秀的分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能。和 Squid 的前端缓存加速不同,它是通过基于内存的对象缓存来减少数据库查询的方式改善网站的性能,而其中最吸引人的一个特性就是支持分布式部署;也就是说可以在一群机器上建立一堆 Memcached 服务,每个服务可以根据具体服务器的硬件配置使用不同大小的内存块,这样,理论上可以建立一个无限大的基于内存的缓存系统。

Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等[附录1]。客户端首先与 Memcached 服务建立连接,然后存取对象。每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存的时候还可以设置有效期。保存在 Memcached 中的对象实际上是放置在内存中的,而不是在硬盘上。Memcached 进程运行之后,会预申请一块较大的内存空间,自己进行管理,用完之后再申请一块,而不是每次需要的时候去向操作系统申请。Memcached将对象保存在一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时候,Memcached的时间消耗基本上只是网络Socket连接了[33]。

Memcached也有它的不足。首先它的数据是保存在内存当中的,一旦服务进程重启(进程意外被关掉,机器重启等),数据会全部丢失。其次Memcached以root权限运行,而且Memcached本身没有任何权限管理和认证功能,安全性不足。第一条是Memcached作为内存缓存服务使用无法避免的,当然,如果内存中的数据需要保存,可以采取更改Memcached的源代码,增加定期写入硬盘的功能。对于第二条,我们可以将Memcached服务绑定在内网IP上,通过Linux防火墙进行防护。

4.5 CPU与IO均衡
在一个网站提供的所有功能中,有的功能可能需要消耗大量的服务器端IO资源,像下载,视频播放等,而有的功能则可能需要消耗大量的服务器CPU资源,像视频格式转换,LOG统计等。在一个服务器集群中,当我们发现某些机器上CPU和IO的利用率相差很大的时候,例如CPU负载很高而IO负责很低,我们可以考虑将该服务器上的某些耗CPU资源的进程换成耗IO的进程,以达到均衡的目的。均衡每一台机器的CPU和IO消耗,不仅可以获得更充分的服务器资源利用,而且还能够支持暂时的过载,遇到突发事件,访问流量剧增的时候, 实现得体的性能下降(Graceful performance degradation)[34],而不是立即崩溃。

4.6 读写分离
如果网站的硬盘读写性能是整个网站性能提升的一个瓶颈的话,可以考虑将硬盘的读,写功能分开,分别进行优化。在专门用来写的硬盘上,我们可以在Linux下使用软件RAID-0(磁盘冗余阵列0级)[35]。RAID-0在获得硬盘IO提升的同时,也会增加整个文件系统的故障率——它等于RAID中所有驱动器的故障率之和。如果需要保持或提高硬盘的容错能力,就需要实现软件RAID-1,4或5,它们能在某一个(甚至几个)磁盘驱动器故障之后仍然保持整个文件系统的正常运行[36],但文件读写效率不如RAID-0。而专门用来读的硬盘,则不用如此麻烦,可以使用普通的服务器硬盘,以降低开销。

一般的文件系统,会综合考虑各种大小和格式的文件的读,写效率,因而对特定的文件读或写的效率不是最优。如果有必要,可以通过选择文件系统,以及修改文件系统的配置参数来达到对特定文件的读或写的效率最大化。比如说,如果文件系统中需要存储大量的小文件,则可以使用ReiserFS[37]来替代Linux操作系统默认的ext3系统,因为ReiserFS是基于平衡树的文件系统结构,尤其对于大量文件的巨型文件系统,搜索速度要比使用局部的二分查找法的ext3快。 ReiserFS里的目录是完全动态分配的,因此不存在ext3中常见的无法回收巨型目录占用的磁盘空间的情况。ReiserFS里小文件(< 4K)可以直接存储进树,小文件读取和写入的速度更快,树内节点是按字节对齐的,多个小文件可共享同一个硬盘块,节约大量空间。ext3使用固定大小的块分配策略,也就是说,不到4K的小文件也要占据4K的空间,导致的空间浪费比较严重[38]。 但ReiserFS对很多Linux内核支持的不是很好,包括2.4.3、2.4.9 甚至相对较新的 2.4.16,如果网站想要使用它,就必须要安装与它配合的较好的2.4.18内核——一般管理员都不是很乐意使用太新的内核,因为在它上面运行的软件,都还没有经过大量的实践测试,也许有一些小的bug还没有被发现,但对于服务器来说,再小的bug也是不能接受的。ReiserFS还是一个较为年轻的,发展迅速的文件系统,它相对于ext3来说有一个很大的缺陷就是,每次ReiserFS文件系统升级的时候,必须完全重新格式化整个磁盘分区。所以在选择使用的时候,需要权衡取舍[39]。

5 应用程序层优化
5.1 网站服务器程序的选择
经统计[40],当前互联网上有超过50%的网站主机使用Apache[41]服务器程序。 Apache是开源界的首选Web服务器,因为它的强大和可靠,而且适用于绝大部分的应用场合。但是它的强大有时候却显得笨重,配置文件复杂得让人望而生畏,高并发情况下效率不太高。而轻量级的Web服务器Lighttpd[42]却是后起之秀,基于单进程多路复用技术,其静态文件的响应能力远高于Apache。 Lighttpd对PHP的支持也很好,还可以通过Fastcgi方式支持其他的语言,比如Python等。 虽然Lighttpd是轻量级的服务器,功能上不能跟Apache比,某些复杂应用无法胜任,但即使是大部分内容动态生成的网站,仍免不了会有一些静态元素,比如图片、JS脚本、CSS等等,可以考虑将Lighttpd放在Squid的前面,构成 Lighttpd->Squid->Apache的一条处理链,Lighttpd在最前面,专门处理静态内容的请求,把动态内容请求通过Proxy模块转发给Squid,如果Squid中有该请求的内容且没有过期,则直接返回给Lighttpd。新请求或者过期的页面请求交由Apache中的脚本程序来处理。经过Lighttpd和Squid的两级过滤,Apache需要处理的请求大大减少,减少了Web应用程序的压力。同时这样的构架,便于把不同的处理分散到多台计算机上进行,由Lighttpd在前面统一分发。

在这种架构下,每一级都是可以进行单独优化的,比如Lighttpd可以采用异步IO方式,Squid可以启用内存来缓存,Apache可以启用MPM(Multi -Processing Modules,多道处理模块)等,并且每一级都可以使用多台机器来均衡负载,伸缩性好。

著名视频分享网站YouTube就是选择使用Lighttpd作为网站的前台服务器程序。

5.2 数据库选择
MySQL[43]是一个快速的、多线程、多用户和健壮的SQL数据库服务器,支持关键任务、重负载系统的使用,是最受欢迎的开源数据库管理系统,是Linux下网站开发的首选。它由MySQL AB开发、发布和提供支持。

MySQL数据库能为网站提供:

高性能。MySQL支持海量,快速的数据库存储和读取。还可以通过使用64位处理器来获取额外的一些性能,因为MySQL在内部里很多时候都使用64位的整数处理。

易用性。MySQL的核心是一个小而快速的数据库。它的快速连接,快速存取和安全可靠的特性使MySQL非常适合在互联网站上使用。

开放性。MySQL提供多种后台存储引擎的选择,如MyISAM, Heap, InnoDB,Berkeley Db等。缺省格式为MyISAM。 MyISAM 存储引擎与磁盘兼容的非常好[44]。

支持企业级应用。MySQL有一个用于记录数据改变的二进制日志。因为它是二进制的,这一日志能够快速地将数据的更改从一台机器复制(replication)到另一台机器上。即使服务器崩溃,这一二进制日志也能够保持完整。这一特性通常被用来搭建数据库集群,以支持更大的流量访问要求[30](图5)。

图5 MySQL主辅库模式集群示意

MySQL也有一些它自身的缺陷,如缺乏图形界面,缺乏存储过程, 还不支持触发器,参照完整性,子查询和数据表视图等,但这些功能都在开发者的TO-DO列表当中。这就是开源的力量:你永远可以期待更好。

国外的Yahoo!,国内的新浪,搜狐等很多大型商业网站都使用MySQL 作为后台数据库。对于一般的网站系统,无论从成本还是性能上考虑,MySQL应该是最佳的选择。

5.3 服务器端脚本解析器的选择
目前最常见的服务器端脚本有三种:ASP(Active Server Pages),JSP(Java Server Pages),PHP (Hypertext Preprocessor)[45][46]。

ASP全名Active Server Pages,以及它的升级ASP.NET,是微软公司出品的一个WEB服务器端的开发环境,利用它可以产生和运行动态的、交互的、高性能的WEB服务应用程序。ASP采用脚本语言VBScript(C#)作为自己的开发语言。 但因为只能运行在Windows环境下,这里我们不讨论它。

PHP是一种跨平台的服务器端的嵌入式脚本语言。它大量地借用C,Java和Perl语言的语法, 并耦合PHP自己的特性,使WEB开发者能够快速地写出动态生成页面。它支持目前绝大多数数据库。PHP也是开源的,它的发行遵从GPL开源协议,你可以从 PHP官方站点(http://www.php.net)自由下载到它的二进制安装文件及全部的源代码。如果在Linux平台上与MySQL搭配使用,PHP是最佳的选择。

JSP是Sun公司推出的新一代站点开发语言,是Java语言除Java应用程序和Java Applet之外的第三个应用。Jsp可以在Serverlet和JavaBean的支持下,完成功能强大的站点程序。 作为采用Java技术家族的一部分,以及Java 2(企业版体系结构)的一个组成部分,JSP技术拥有Java技术带来的所有优点,包括优秀的跨平台性,高度可重用的组件设计,健壮性和安全性等,能够支持高度复杂的基于Web的应用。

除了这三种常见的脚本之外,在Linux下我们其实还有很多其他的选择:Python(Google使用),Perl等,如果作为CGI调用,那么可选择范围就更广了。使用这些不太常见的脚本语言的好处是,它们对于某些特殊的应用有别的脚本所不具有的优势;不好的地方是,这些脚本语言在国内使用的人比较少,当碰到技术上的问题的时候,能找到的资料也较少。

5.4 可配置性

在大型网站开发过程中,不管使用什么技术,网站的可配置性是必须的。在网站的后期运营过程中,肯定会有很多的需求变更。如果每一次的需求变更都会导致修改源代码,那么,这个网站的开发可以说是失败的。

首先,也是最重要的一点,功能和展示必须分开。PHP和JSP都支持模板技术,如PHP的Smarty,Phplib,JSP的JSTL(JSP Standard Tag Library)等。核心功能使用脚本语言编写,前台展示使用带特殊标签的HTML,不仅加快了开发速度,而且方便以后的维护和升级[47]。

其次,对于前台模板,一般还需要将页面的头,尾单独提取出来,页面的主体部分也按模块或者功能拆分。对CSS,JS等辅助性的代码,也建议以单独的文件形式存放。这样不仅方便管理,修改,而且还可以在用户访问的时候进行缓存,减少网络流量,减轻服务器压力。

再次,对于核心功能脚本,必须将与服务器相关的配置内容,如数据库连接配置,脚本头文件路径等,与代码分离开。尤其当网站使用集群技术,CDN加速等技术的时候,每一台服务器上的配置可能都会不一样。如果不使用配置文件,则需要同时维护几份不同的代码,很容易出错。

最后,应该尽量做到修改配置文件后能实时生效,避免修改配置文件之后需要重启服务程序的情况。

5.5 封装和中间层思想
在功能块层次,如果使用JSP,基于纯面向对象语言Java的面向对象思想,类似数据库连接,会话管理等基本功能都已经封装成类了。如果使用PHP,则需要在脚本代码中显式的封装,将每一个功能块封装成一个函数,一个文件或者一个类。

在更高的层次,可以将网站分为表示层,逻辑层,持久层,分别进行封装,做到当某一层架构发生变化时,不会影响到其他层。比如新浪播客在一次升级的时候,将持久层的数据库由原来的集中式改为分布式架构,因为封装了数据库连接及所有操作[附录2],做到了不修改任何上层代码,平稳的实现了过渡。近来流行的MVC架构,将整个网站拆分成Model(模型/逻辑)、View(视图/界面)、Controller(控制/流程)三个部分,而且有很多优秀的代码框架可供选择使用, 像JSP的Structs,Spring,PHP的php.MVC, Studs 等。使用现成的代码框架,可以使网站开发事半功倍。

6 扩容、容错处理
6.1 扩容
一个大型网站,在设计架构的时候,必须考虑到以后可能的容量扩充。新浪播客在设计时充分地考虑了这一点。对于视频分享类网站来说,视频存储空间消耗是巨大的。新浪播客在主存储服务器上,采用配置文件形式指定每一个存储盘柜上存储的视频文件的ID范围。当前台服务器需要读取一个视频的时候,首先通过询问主存储服务器上的接口获得该视频所在的盘柜及目录地址,然后再去该盘柜读取实际的视频文件。这样如果需要增加存储用的盘柜,只需要修改配置文件即可,前台程序丝毫不受影响。

新浪播客采用MySQL数据库集群,在逻辑层封装了所有的数据库连接及操作。当数据库存储架构发生改变的时候,如增加一台主库,将某些数据表独立成库,增加读取数据用的从库等,都只需要修改封装了的数据库操作类,上层代码不用修改。

新浪播客的前台页面服务器使用F5公司的硬件第四层交换机,网通,电信分别导向不同的虚拟IP,每一个虚拟IP后面又有多个服务器提供服务。当访问流量增大的时候,可以很方便往虚拟IP后面增加服务器,分担压力。

6.2 容错
对于商业性网站来说,可用性是非常重要的。7*24的访问要求网站具有很强的容错能力。错误包括网络错误,服务器错误以及应用程序错误。

2006年12月27日台湾东部外海发生里氏7.6级地震,造成途径台湾海峡的多条海底电缆中断,导致许多国外网站,像MSN, NBA, Yahoo!(英文主站)等国内无法访问,但也有例外,以Google为代表的在国内建设有分布式数据节点的很多网站却仍然可以访问。虽然说地震造成断网是不可抗原因,但如果在这种情况下网站仍然可以访问,无疑能给网站用户留下深刻的印象。这件事情给大型商业网站留下的教训是:网站需要在用户主要分布区域保持数据存在,以防止可能的网络故障。

对于服务器错误,一般采取冗余设计的方法来避免。对于存储服务器(主要是负责写入的服务器),可以使用RAID(冗余磁盘阵列);对于数据库(主要是负责写入的主库),可以采用双主库设计[30];对于提供服务的前台,则可以使用第四层交换的集群,由多台服务器同时提供服务,不仅分担了流量压力,同时还可以互相作为备份。

在应用层程序中,也要考虑“用户友好”的出错设计。典型例子如HTTP 404 出错页面,程序内部错误处理,错误返回提示等,尽可能的做到人性化。

7 总结及展望
7.1 总结

对于一个高并发高流量的网站来说,任何一个环节的瓶颈都会造成网站性能的下降,影响用户体验,进而造成巨大的经济损失。在全互联网层面,应该使用分布式设计,缩短网站与用户的网络距离,减少主干网上的流量,以及防止在网络意外情况下网站无法访问的问题。在局域网层面,应该使用服务器集群,一方面可以支撑更大的访问量,另一方面也作为冗余备份,防止服务器故障导致的网站无法访问。在单服务器层面,应该配置操作系统,文件系统及应用层软件,均衡各种资源的消耗,消除系统性能瓶颈,充分发挥服务器的潜能。在应用层,可以通过各种缓存来提升程序的效率,减少服务器资源消耗(图6)。另外,还需要合理设计应用层程序,为以后的需求变更,扩容做好准备。

图6 典型高并发高流量网站的架构

在每一个层次,都需要考虑容错的问题,严格消除单点故障,做到无论应用层程序错误,服务器软件错误,服务器硬件错误,还是网络错误,都不影响网站服务。

7.2展望
当前Linux环境下有著名的LAMP(Linux+Apache+MySQL+PHP/PERL/PYTHON)网站建设方案,但只是针对一般的中小网站而言。对于高并发高流量的大型商业网站,还没有一个完整的,性价比高的解决方案。除去服务器,硬盘,带宽等硬件投资外,还需要花费大量的预算和时间精力在软件解决方案上。

随着互联网的持续发展,Web2.0的兴起,在可以预见的未来里,互联网的用户持续增多,提供用户参与的网站不断增加,用户参与的内容日益增长,越来越多的网站的并发量,访问量会达到一个新的高度,这就会促使越来越多的个人,公司以及研究机构来关注高并发高流量的网站架构问题。就像Web1.0成就了无数中小网站,成就了LAMP一样,Web2.0注定也会成就一个新的,高效的,成本较低的解决方案。这个方案应该包括透明的第三方CDN网络加速服务,价格低廉的第四层甚至更高层网络交换设备,优化了网络性能的操作系统,优化了读写性能,分布式,高可靠的文件系统,揉合了内存,硬盘等各个级别缓存的HTTP服务器,更为高效的服务器端脚本解析器,以及封装了大部分细节的应用层设计框架。

技术的进步永无止境。我们期待互联网更为美好的明天。

 

参考文献

[1]Robert Hobbes' Zakon, Hobbes' Internet Timeline v8.2 , available at http://www.zakon.org/robert/internet/timeline/

[2]GlobalReach Inc., Global Internet Statistics (by language), available at

http://www.glreach.com/globstats/index.php3

[3]中国互联网络信息中心,第十九次中国互联网络发展状况统计报告,available at: http://www.cnnic.net.cn/index/0E/index.htm

[4]Web2.0,Definition available at http://www.wikilib.com/wiki/Web2.0

[5]Alexa Internet, Inc. http://www.alexa.com/

[6]Yahoo! Inc. http://www.yahoo.com/

[7]eBay Inc. 著名的网上拍卖网站,http://www.ebay.com/

[8]Chet Dembeck, Yahoo! Cashes In On eBay's Outage, available at:

http://www.ecommercetimes.com/perl/story/545.html

[9]YouTube, Inc. http://www.youtube.com/

[10]数据来源:互联网周刊,2007年第3期

[11]新浪网技术(中国)有限公司,http://www.sina.com.cn/

[12]数据来源:新浪播客改版公告,available at:

http://games.sina.com.cn/x/n/2007-04-16/1427194553.shtml

[13]邓宏炎, 叶娟丽,网络参考文献初探,武汉大学学报: 人文社会科学版, 2000

[14]彭湘凯,CDN网络及其应用,微计算机信息,2005年02期

[15]数据来源:ChinaCache, http://www.chinacache.com/

[16]Open System Interconnect,开放式系统互联模型,1984年由国际标准化组织(ISO)提出的一个开放式网络互联参考模型,参考 http://www.iso.org/

[17]凌仲权,丁振国,基于第四层交换技术的负载均衡,中国数据通信,2003

[18]陈明锐,邱钊,黄曦,黄俊,智能负载均衡技术在高负荷网站上的应用,广西师范大学学报(自然科学版),2006年04期

[19]Alteon Inc. http://www.alteon.com/

[20]F5 Networks, Inc. http://www.f5.com.cn/

[21]数据来源:http://www.toplee.com/blog/archives/71.html

[22] 傅明,程晓恒,王玮,基于Linux的服务器负载均衡性访问的解决方案,计算机系统应用,2001年09期

[23]Ming-Wei Wu, Ying-Dar Lin, Open source software development: an overview, Computer, 2001 - ieeexplore.ieee.org

[24]王海花 , 杨斌,Linux TCP/IP协议栈的设计及实现特点,云南民族大学学报(自然科学版),2007年01期

[25]Requests for Comments(RFC),the publication vehicle for technical specifications and policy documents produced by the (IETF (Internet Engineering Task Force) , the IAB (Internet Architecture Board), or the IRTF (Internet Research Task Force),http://www.ietf.org/rfc.html

[26]RFC 1323,http://www.ietf.org/rfc/rfc1323.txt?number=1323

[27]Squid web proxy cache team, http://www.squid-cache.org/

[28]马俊昌 , 古志民,网络代理缓存Squid存储系统分析,计算机应用,2003年10期

[29]韩向春,郭婷婷,林星宇,丰保杰,集群缓存系统中代理缓存技术的研究,计算机工程与设计,2006年20期

[30]Brad Fitzpatrick, LiveJournal's Backend,A history of scaling, oscon 2005 ,http://www.danga.com/words/

[31]Danga Interactive, http://www.danga.com/memcached/

[32]LiveJournal,著名的博客托管商(BSP), http://www.livejournal.com/

[33]Brad Fitzpatrick,Distributed caching with memcached,Linux Journal ,Volume 2004,Issue 124,Page 5, August 2004

[34]周枫,面向 Internet 服务的可扩展集群对象 存储及磁盘日志缓存技术研究,清华大学硕士毕业论文,2002

[35]陈赟,杨根科,吴智铭,RAID系统中RAID级别的具体实现算法,微型电脑应用,2003年06期

[36]陈平仲,硬件实现RAID与软件实现RAID的比较,现代计算机(专业版),2005年01期

[37]NAMESYS,http://www.namesys.com/

[38]D Bobbins,Advanced file system implementor s guide: Journalling and ReiserFS,IBM's Developer Works Journal,June,2001

[39]刘章仪,Linux文件系统分析,贵州工业大学学报(自然科学版),2002年04期

[40]数据来源:http://news.netcraft.com/archives/2007/04/02/april_2007_web_server_survey.html

[41]The Apache Software Foundation ,http://httpd.apache.org/

[42]Lighttpd, http://www.lighttpd.net/

[43]MySQL AB,http://www.mysql.com/

[44]顾治华,忽朝俭,MySQL存储引擎与数据库性能,计算机时代,2006年10期

[45]The PHP Group,http://www.php.net/

[46]范云芝,动态网页制作技术ASP、PHP和JSP比较分析,电脑知识与技术(学术交流),2005年10期

[47]王耀希,王丽清,徐永跃,利用模板技术实现B/S 研发过程的分离与并行,计算机应用研究,2004

附 录

[附录1]

1. Memcache的客户端PHP 封装

class memcache_class

{

function memcache_class()

{

}

 

/**

* 用post方法,执行memcache的写入操作

* $data参数,允许是php的数组。

* exp参数是设定的超时时间,单位是秒。

*/

function p_memcache_write($key, $data, $exp=3600)

{

$mmPageStartTime = microtime();

$ip = MEMCACHE_SERVER_IP;

$port = MEMCACHE_SERVER_PORT;

$type = MEMCACHE_SERVER_TYPE;

 

//对$data进行序列化,允许$data是数组

$data = serialize($data);

 

//对$data进行压缩

//$data = gzcompress ($data);

 

$submit=array( type => $type,

cmd => "set",

key => $key,

data => $data,

exp => $exp

);

$ret = memcache_class::posttohost($query, $submit);

return $ret;

}

 

/**

* 用post方法,执行memcache的读出操作

*/

function p_memcache_read($key)

{

$mmPageStartTime = microtime();

$ip = MEMCACHE_SERVER_IP;

$port = MEMCACHE_SERVER_PORT;

$type = MEMCACHE_SERVER_TYPE;

 

$submit=array( type => $type,

cmd => "get",

key => $key

);

$res = memcache_class::posttohost($query, $submit);

 

//对$res进行解压缩

//$res = gzuncompress($res);

//对$res进行反序列化,允许$res是数组

$res = unserialize($res);

return $res;

}

/**

* 执行post的函数

*/

function posttohost($url, $data)

{

$mmPageStartTime = microtime();

$url = parse_url($url);

$encoded = "";

while (list($k,$v) = each($data))

{

$encoded .= ($encoded ? "&" : "");

$encoded .= rawurlencode($k)."=".rawurlencode($v);

}

for ($i = 0; $i < 3; $i ++)

{

$fp = @fsockopen($url['host'], $url['port'],$errno, $errstr, 1);

if ($fp)

break;

}

if (!$fp)

{

return "";

}

@stream_set_timeout($fp, 2);

@fputs($fp, sprintf("POST %s%s%s HTTP/1.0\n", $url['path'], $url['query'] ? "?" : "", $url['query']));

@fputs($fp, "Host: $url[host]\n");

@fputs($fp, "Content-type: application/x-www-form-urlencoded\n");

@fputs($fp, "Content-length: " . strlen($encoded) . "\n");

@fputs($fp, "Connection: close\n\n");

@fputs($fp, "$encoded\n");

$line = @fgets($fp,1024);

if (!eregi("^HTTP/1\.. 200", $line)) return;

$results = "";

$inheader = 1;

while(!feof($fp))

{

$line = @fgets($fp,1024);

if ($inheader && ($line == "\n" || $line == "\r\n"))

{

$inheader = 0;

}

elseif (!$inheader)

{

$results .= $line;

}

}

@fclose($fp);

return $results;

}

}

 

2.使用示例

$out="";

if (MEMCACHE_FLAG === true)

{

$memcache_key = md5(trim($key));

$time_before = getmicrotime();

$mdata = memcache_class::p_memcache_read($memcache_key);

$time_after = getmicrotime();

$memcache_read_time = $time_after - $time_before;

if (strlen($mdata) >= MIN_RESULT) {

$out = $mdata;

$memhit = 1;

memcached_log("CACHE_HIT");

}

else {

$memhit = 0;

memcached_log("CACHE_NOT_HIT");

}

}

if (!(strlen($out) >= MIN_RESULT))

{

$query = get_query();

$time_before=getmicrotime();

$out = http_read($MySQLHost,$MySQLPort,$query,&$errstr,10);

$time_after=getmicrotime();

}

 

$len = strlen($out);

if(MEMCACHE === true && $memhit <= 0)

{

$memcache_key = md5(trim($key));

$time_before = getmicrotime();

memcache_class::p_memcache_write($memcache_key, $out, MEMCACHE_TIME);

$time_after = getmicrotime();

$memcache_write_time = $time_after - $time_before;

memcached_log("CACHE_WRITE");

}

 

[附录2]

MySQL wrap class

<?php

class mysqlRpc

{

var $_hostWrite = '';

var $_userWrite = '';

var $_passWrite = '';

var $_hostRead = '';

var $_userRead = '';

var $_passRead = '';

var $_dataBase = '';

var $db_write_handle = null;

var $db_read_handle = null;

var $db_last_handle = null;

var $_cacheData = array();

var $mmtime = 60;

function mysqlRpc($database, $w_servername, $w_username, $w_password, $r_servername='', $r_username='', $r_password='') {}

 

function connect_write_db() {}

function connect_read_db() {}

function query_write($sql, $return = false) {}

function query_read($sql, $return = false) {}

 

function query_first($sql, $return = false) {}

function insert_id(){}

function affected_rows(){}

 

function escape_string($string){}

function fetch_array($queryresult, $type = MYSQL_ASSOC){}

 

 

}

?>

致 谢

首先衷心的感谢我的指导老师朱小明老师,正是在他的悉心指导下,这篇论文才得以顺利的完成。同时感谢信息科学学院的老师们,他们以严谨的治学态度和兢兢业业的工作精神,教会了我专业的知识和做人的道理。我还想感谢北京师范大学的所有的老师,同学们,我们一起在“学为人师,行为世范”的校训下度过了这难忘的四年,完成了成长最后的蜕变。

本文在写作的过程中得到了新浪公司的大力支持,有来自新浪播客,新浪爱问搜索的多位同事对文中的架构方案,技术细节等提供了非常有用的建议,在此一并感谢!

最后,感谢在我生命的过程中一直毫无保留的支持我的家人和朋友!

,

No Comments

书本里学不到的地道英语习语

原文出处:中国日报网站 http://www.chinadaily.com.cn/
很多英国人常用的习语,我们在书本里是学不到的。解决的一个好办法就是去英国旅游。如果不能去旅游的话,看看我给大家准备的这顿“习语大餐”也是不错的选择噢!

1. Are you all right? 你好吗?
绝对想不到“Are you all right?”还可以用来打招呼吧?其实这可是英国人最常用的打招呼句子,比“How are you?”还要流行哦!
例如:
Are you all right, David?
Fine, thank you.

2. Cheers! 谢谢,再见!
我们干杯的时候常说Cheers!,以示宾主尽欢。当英国人下公车、买完东西的时候,他们常常对司机和售货员说“Cheers!”,来代替Thank you 和 Goodbye。
例如:
Five pounds fifty, please. Cheers!
Cheers!

3. Give me a minute! 请稍等一会!
说到“稍等一会”,我们立刻想到的就是wait a minute,意思也是不错的。但是英国人会说“Give me a minute!”,
例如:
Give me a minute, David! I will find the map for you.

4. I am behind you. 我支持你
“I am behind you.”这句话真的是非常明白的表示了“一个成功的男人背后必定有一个女人”的意思。说到“我支持你”,可能很多人都会想到“I support you.”,可就是想不到“I am behind you.”吧。
例如:
Whatever decision you are going to make, I am behind you.

5. Do you really mean it? 此话当真?
当别人许诺要给你什么好处的时候,你一定会以为是天上掉馅饼了,所以禁不住要问一句:Do you really mean it? 就是"此话当真"的意思。
例如:
I can give what you want.
Do you really mean it?
Yes, I mean it!

6. Get on with it! 快点!
大家一起出去玩,有个人却总是磨磨蹭蹭的,害得所有人都要赶不上车。这时候你就可以说get on with it来催促他。
例如:
Get on with it, we have no time left!

7. Get a move on! 赶快行动吧!
记得看战斗片的时候,指挥作战的军官总是一边跑着,一边对士兵大喊:Move! Move! Move! 就是"赶快行动"的意思。现在这个词在口语中可是非常的流行,
例如:
Get a move on and help yourself to some food!

No Comments