存档在 2013年9月

用户级线程和内核级线程

2013年9月25日

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用smp,即利用多核cpu。windows线程就是这样的。

2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu,目前Linux pthread大体是这么做的。

线程的实现可以分为两类:用户级线程(User-Level Thread)和内核线线程(Kernel-Level Thread),后者又称为内核支持的线程或轻量级进程。在多线程操作系统中,各个系统的实现方式并不相同,在有的系统中实现了用户级线程,有的系统中实现了内核级线程。
» 阅读更多: 用户级线程和内核级线程

apache和tomcat

2013年9月20日

apache支持静态页,tomcat支持动态的,比如servlet等,一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。
apache可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。
apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。
 
这两个有以下几点可以比较的:
1、两者都是apache组织开发的
2、两者都有HTTP服务的功能
3、两者都是免费的不同点:Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器.
 
» 阅读更多: apache和tomcat

在整数序列中查找缺失的项

2013年9月19日

今天看到一个题目“有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数”前提还不能用位图。想起以前做ACM那段时间,有做过类似的题目,使用异或来找出成双的整数序列中为单的那个数。

来看下面3个题目:
1. n个数,1, 2, 3, …, n,除了其中的一个数以外,其它所有数都出现了2次,要求找出那个数。
将所有的数进行异或,两个相同的数异或结果为0,故最终的结果就是只出现一次的那个数。

2. n个数中,除了2个数以外,其它所有数都出现了2次,找出那两个数。
假设这两个数为A,B,依然用前面异或的思路,最终异或的结果将是A^B的结果。虽然现在不能还不能确定这两个数,但是考虑到异或结果不为0,其结果的二进制表示中,肯定有为1的bit,找出该bit。
这两个数的该bit必定一个为0,一个为1.根据该bit的值是否为1,将原来所有数分为两组,其中一组该bit为0,另外一组该bit为1. 这里再分别对这两组进行异或,得到的两个值就是最终要找的那两个数。

3. 有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数
与上面提到的第2个问题类似,只不过这里所有值都只出现了一次,并且缺失了2个。这里我们把1,2,…,10w这10w个数补充到原数组中,就与问题2一样了,用问题2的解法即可解决该问题。

2013年9月编程语言排行榜

2013年9月17日
Position
Sep 2013
Position
Sep 2012
Delta in Position Programming Language Ratings
Sep 2013
Delta
Sep 2012
Status
1 1 C 16.975% -2.32%   A
2 2 Java 16.154% -0.11%   A
3 4 C++ 8.664% -0.48%   A
4 3 Objective-C 8.561% -1.21%   A
5 6 PHP 6.430% +0.82%   A
6 5 C# 5.564% -1.03%   A
7 7 (Visual) Basic 4.837% -0.69%   A
8 8 Python 3.169% -0.69%   A
9 11 JavaScript 2.015% +0.69%   A
10 14 Transact-SQL 1.997% +1.12%   A
11 15 Visual Basic .NET 1.844% +1.00%   A
12 9 Perl 1.692% -0.57%   A
13 10 Ruby 1.382% -0.34%   A
14 12 Delphi/Object Pascal 0.897% -0.10%   A-
15 16 Pascal 0.888% +0.06%   A
16 13 Lisp 0.770% -0.20%   A
17 19 PL/SQL 0.676% +0.07%   A-
18 24 R 0.646% +0.21%   B
19 20 MATLAB 0.639% +0.08%   B
20 25 COBOL 0.628% +0.20%   B

shell之xargs

2013年9月16日

xargs 的功能
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。
这就是xargs命令的用处所在,特别是与find命令一起使用。find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

 find . -type f -print | xargs file

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

find . -name "*.core" -print | xargs echo "" > /mnt/liyao.log

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

 ll
total 56
-rwxrwxrwx 1 root root  1012 Jul  3 21:43 anaconda-ks.cfg
-rwxrwxrwx 1 root root 27974 Jul  3 21:43 install.log
-rwxrwxrwx 1 root root  4708 Jul  3 21:43 install.log.syslog
-rwxrwxrwx 1 root root   232 Jul  3 22:36 liyao.txt

find . -perm -7 -print | xargs chmod o-w

 ll
total 56
-rwxrwxr-x 1 root root  1012 Jul  3 21:43 anaconda-ks.cfg
-rwxrwxr-x 1 root root 27974 Jul  3 21:43 install.log
-rwxrwxr-x 1 root root  4708 Jul  3 21:43 install.log.syslog
-rwxrwxr-x 1 root root   232 Jul  3 22:36 liyao.txt

用grep命令在所有的普通文件中搜索hostname这个词:

find . -type f -print | xargs grep "hostname"

用grep命令在 / 下的所有普通文件中搜索hostnames这个词:

find / -name \* -type f -print | xargs grep "hostnames"
Binary file /var/lib/rpm/Packages matches
Binary file /sbin/mount.nfs4 matches
Binary file /sbin/busybox matches
Binary file /sbin/nash matches
Binary file /sbin/dhclient matches
Binary file /sbin/mount.nfs matches
Binary file /sbin/umount.nfs4 matches
Binary file /sbin/umount.nfs matches

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

 

一些重要的选项:

-t #显示当前执行的实际命令
-n #比如-n2 意思是每次传递给执行命名的源记录为两条

如何在shell脚本中屏蔽某些信号中断(ctrl+c/ctrl+d等)

2013年9月16日

可以使用trap命令,来捕获信号,常见信号有
HUP(1) 挂起,通常因终端掉线或用户退出而引发
INT(2) 中断,通常因按下Ctrl+C组合键而引发
QUIT(3) 退出,通常因按下Ctrl+\组合键而引发
ABRT(6) 中止,通常因某些严重的执行错误而引发
ALRM(14) 报警,通常用来处理超时
TERM(15) 终止,通常在系统关机时发送
还可以通过

kill -l

或者

trap -l

来打印

[root@Creater]#kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

比如我们要对以下的几个信号捕获且打印信息。

trap "echo "Receive a signal"" HUP INT PIPE QUIT TERM

awk正则表达式

2013年9月11日

对于awk而言,正则表达式是置于两个正斜杠之间、由字符组成的模式。Awk支持使用正则表达式元字符对正则表达式进行某种方式修改。如果输入行中的某个字符串与正则表达式相匹配,则最终条件为真,于是执行与该表达式关联的所有操作。如果没有指定操作,则打印与正则表达式匹配的记录.

元字符 说明
^ 在串首匹配
$ 在串尾匹配
. 匹配单个任意字符
* 匹配零个或多个前导字符
+ 匹配一个或多个前导字符
匹配零个或一个前导字符
|(A|B) 指定如果以 |(垂直线)隔开的字符串的任何一个在字符串中,则字符串匹配,匹配A或B
[ABC] 匹配指定字符组(即A、B和C)中任一字符
[^ABC] 匹配任何一个不在指定字符组(即A、B和C)中的字符
[A-Z] 匹配A至Z之间的任一字符
(AB)+ 将字符串组合在一起,匹配一个或多个AB的组合,例如:AB、ABAB
~,!~ 表示指定变量与正则表达式匹配(代字号)或不匹配(代字号、感叹号)的条件语句
{m, n} 指定如果 m 和 n 之间(包含的 m 和 n)个模式的具体值在字符串中(其中m<= n),则字符串匹配
\ 转义字符。位于正则表达式中具有特殊含义的任何字符之前时,转义字符除去其任何特殊含义
& 用于替代串中,代表查找串中匹配到的内容

表-Awk的正则表达式元字符

元字符 说明
\<>/ 单词定位
\(\) 向前引用
\{\} 重复

一个Java程序员应该掌握的10项技能

2013年9月11日

一个Java程序员应该掌握的10项技能

1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。

2、命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer、HtmlConverter、jar、java、 javac、javadoc、javap、javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你对java 实际上还很不了解。

3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。

4、API:Java的核心API是非常庞大的,但是有一些内容笔者认为是必须熟悉的,否则不可能熟练的运用Java,包括:◆java.lang包下的80%以上的类的功能的灵活运用。

◆java.util包下的80%以上的类的灵活运用,特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer.

◆java.io包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。

◆java.math包下的100%的内容。

◆java.net包下的60%以上的内容,对各个类的功能比较熟悉。

◆java.text包下的60%以上的内容,特别是各种格式化类。

◆熟练运用JDBC. 8)、java.security包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java.

◆AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印。

◆Swing的基本内容,和AWT的要求类似。

◆XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。

5、测试:必须熟悉使用junit编写测试用例完成代码的自动测试。

6、管理:必须熟悉使用ant完成工程管理的常用任务,例如工程编译、生成javadoc、生成jar、版本控制、自动测试。

7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。

8、思想:必须掌握OOP的主要要求,这样使用Java开发的系统才能是真正的Java系统。

9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全部小写等,这样程序的可读性才比较好。

10、博学:掌握J2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技术,掌握软件架构设计思想、搜索引擎优化、缓存系统设计、网站负载均衡、系统性能调优等实用技术。