MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

高并发访问的核心原则其实就一句话“把所有的用户访问请求都尽量往前推”。

如果把来访用户比作来犯的"敌人",我们一定要把他们挡在800里地以外,即不能让他们的请求一下打到我们的指挥部(指挥部就是数据库及分布式存储)。

如:能缓存在用户电脑本地的,就不要让他去访问CDN。 能缓存CDN服务器上的,就不要让CDN去访问源(静态服务器)了。能访问静态服务器的,就不要去访问动态服务器。以此类推:能不访问数据库和存储就一定不要去访问数据库和存储。

    说起来很轻松,实际做起来却不容易,但只要稍加努力是可以做到的,Google的日独立IP过亿不也做到了么?我们这几千万的PV站比起Google不是 小屋见大屋了。我们还是先从我们的小屋搭起吧!哈哈!下面内容的介绍起点是千万级别的PV站,也可以支持亿级PV的网站架构。

高性能高并发高可扩展网站架构访问的几个层次:

有人会问,我们老是说把用户对业务的访问往前推,到底怎么推啊?推到哪呢?下面,老男孩就为大家一一道来。

第一层:首先在用户浏览器端,使用Apache的mod_deflate压缩传输,再比如:expires功能、deflate和expires功能利用的好,就会大大提升用户体验效果及减少网站带宽,减少后端服务器的压力。当然,方法还有很多,这里不一一细谈了。

提示:有关压缩传输及expires功能nginx/lighttpd等软件同样也有。

第二层:页面元素,如图片/js/css等或静态数据html,这个层面是网页缓存层,比如CDN(效果比公司自己部署squid/nginx要好,他们 更专业,价格低廉,比如快网/CC等(价格80元/M/月甚至更低)而且覆盖的城市节点更多),自己架设squid/nginx cache来做小型CDN是次选(超大规模的公司可能会考虑风险问题实行自建加购买服务结合),除非是为前端的CDN提供数据源服务,以减轻后端我们的服 务器数据及存储压力,而不是直接提供cache服务给最终用户。taobao的CDN曾经因为一部分图片的次寸大而导致CDN压力大的情况,甚至对图片尺 寸大的来改小,以达到降低流量及带宽的作用。

提示:我们也可以自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache,以减轻第三层静态数据层的压力。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。

    第三层:静态服务器层一般为图片服务器,视频服务器,静态HTML服务器。这一层是前面缓存层和后面动态服务器层的连接纽带,大公司发布新闻等内容直接由 发布人员分发到各cache节点(sina,163等都是如此),这和一般公司的业务可能不一样。所以,没法直接的参考模仿,比如人人的SNS。

我们可以使用Q队列方式实现异步的分发访问,同时把动态发布数据(数据库中的数据)静态化存储。即放到本层访问,或通过其他办法发布到各cache节点, 而不是直接让所有用户去访问数据库,不知道大家发现了没有,qq.com门户的新闻评论多的有几十万条,如果所有用户一看新闻就加载所有评论,那数据库不 挂才怪。他们的评论需要审核(美其名约,实际是异步的方式,而且,评论可能都是静态化的或类似的静态化或内存cache的方式),这点可能就是需要 51cto.com这样站点学习的,你们打开51CTO的一篇博文,就会发现下面的评论一直都显示出来了,也可能是分页的。不过,应该都是直接读库的,一 旦访问量大,数据库压力大是必然。这里不是说51cto网站不好,所有的网站都是从类似的程序架构开始发展的。CU也可能是如此。

提示:我们可以在静态数据层的前端自己架设一层cache层,对我们购买的CDN提供数据源服务,可用的软件有varnish/nginx/squid 等cache。在这层的前端我们也可以架设DNS服务器,来达到跨机房业务拓展及智能解析的目的。

第四层:动态服务器层:php,java等,只有透过了前面3层后的访问请求才会到这个层,才可能会访问数据库及存储设备。经过前三层的访问过滤能到这层访问请求一般来说已非常少了,一般都是新发布的内容和新发布内容第一次浏览如;博文(包括微博等),BBS帖子。

特别提示:此层可以在程序上多做文章,比如向下访问cache层,memcache,memcachedb,tc,mysql,oracle,在程序级别 实现分布式访问,分布式读写分离,而程序级别分布式访问的每个db cache节点,又可以是一组业务或者一组业务拆分开来的多台服务器的负载均衡。这样的架构会为后面的数据库和存储层大大的减少压力,那么这里呢,相当于 指挥部的外层了。

第五层:数据库cache层,比如:memcache,memcachedb,tc等等。

根据不同的业务需求,选择适合具体业务的数据库。对于memcache、memcachedb ttserver及相关nosql数据库,可以在第四层通过程序来实现对本层实现分布式访问,每个分布式访问的节点都可能是一组负载均衡(数十台机器)。

第六层:数据库层,一般的不是超大站点都会用mysql主从结构,如:163,sina,kaixin都是如此,程序层做分布式数据库读写分离,一主(或 双主)多从的方式,访问大了,可以做级连的主从及环状的多主多从,然后,实现多组负载均衡,供前端的分布式程序调用,如果访问量在大,就需要拆业务了,比 如:我再给某企业做兼职时,发现类似的51cto的一个站点,把www服务,blog服务,bbs服务都放一个服务器上,然后做主从。这种情况,当业务访 问量大了,可以简单的把www,blog,bbs服务分别各用一组服务器拆分开,这种方式运维都会的没啥难度。当然访问量在大了,可以继续针对某一个服务 拆分如:www库拆分,每个库做一组负载均衡,还可以对库里的表拆分。需要高可用可以通过drbd等工具做成高可用方式。对于写大的,可以做主主或多主的 MYSQL REP方式,对于ORACLE来说,来几组oracle DG(1master多salve方式)就够了,11G的DG可以象mysql rep一样,支持读写分离了。当然可选的方案还有,mysql cluster 和oracle 的RAC,玩mysql cluster和oracle RAC要需要更好更多的硬件及部署后的大量维护成本,因此,要综合考虑,到这里访问量还很大,那就恭喜了,起码是几千万以上甚至上亿的PV了。

象百度等巨型公司除了会采用常规的mysql及oracle数据库库外,会在性能要求更高的领域,大量的使用nosql数据库,然后前端在加DNS,负载均衡,分布式的读写分离,最后依然是拆业务,拆库,。。。逐步细化,然后每个点又可以是一组或多组机器。

特别提示:数据库层的硬件好坏也会决定访问量的多少,尤其是要考虑磁盘IO的问题,大公司往往在性价比上做文章,比如核心业务采用硬件 netapp/emc及san光纤架构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超大,可以采取热点分取分存的方法:如:最 常访问的10-20%使用ssd存储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。

第七层:千万级PV的站如果设计的合理一些,1,2个NFS SERVER就足够了。我所维护(兼职)或经历过的上千万PV的用NFS及普通服务器做存储的还有大把,多一些磁盘,如SAS 15K*6的,或者用dell6850,搞几组 NFS存储,中小网站足够了。当然可以做成drbd+heartbeat+nfs+a/a的方式。

如果能达到本文设计要求的,中等规模网站,后端的数据库及存储压力会非常小了。 象门户网站级别,如sina等, 会采用硬件netapp/emc等等硬件存储设备或是san光纤同道,甚至在性价比上做文章,比如核心业务采用硬件netapp/emc及san光纤架 构,对于资源数据存储,如图片视频,会采用sas或固态ssd盘,如果数据超到,可以采取热点分取分存的方法:如:最常访问的10-20%使用ssd存 储,中间的20-30%采用sas盘,最后的40-50%可以采用廉价的sata。

象百度等巨型公司会采用hadoop等分布式的存储架构,前端在加上多层CACHE及多及的负载均衡,同样会根据业务进行拆分,比如爬虫层存储,索引层存储,服务层存储。。。可以更细更细。。。为了应付压力,什么手段都用上了。

    特殊业务,如人人,开心网,包括门户网站的评论,微博,大多都是异步的写入方式,即无论读写,并发访问数据库都是非常少量的。

    以上1-7层,如果都搭好了,这样漏网到第四层动态服务器层的访问,就不多了。一般的中等站点,绝对不会对数据库造成太大的压力。程序层的分布式访问是从千万及PV向亿级PV的发展,当然特殊的业务 还需要特殊架构,来合理利用数据库和存储。

转自:http://bbs.chinaunix.net/thread-3626937-1-1.html

posted @ 2011-12-11 21:43 leekiang 阅读(1747) | 评论 (0)编辑 收藏

下载gparted的iso文件,修改CentOS虚拟机为从光盘启动,并且选中该iso文件。重新启动CentOS虚拟机,在启动时迅速点击虚拟机窗口,同时按ESC键,可看到Boot Menu,选择从光盘启动,重启后就可以使用gparted了。

使用gparted和acronis进行Linux分区和NTFS分区无损调整
http://gparted.sourceforge.net/larry/generalities/gparted.htm
在VMWare中增加Linux文件系统空间
VMware虚拟机中调整Linux分区大小手记
给Vmware进行硬盘扩容
增加VMware下的虚拟机磁盘空间
How to mount space in /dev/sda2
linux  分区扩容
Insufficient Space for Yum Installs? I'm confused
Resizing Virtual Machines Guide with VMware
How To Resize/Grow VMware Linux Disks and Partitions

posted @ 2011-12-11 21:40 leekiang 阅读(398) | 评论 (0)编辑 收藏

1,安装gcc
yum install gcc

2,安装MySQL,并设置为开机自动启动。
# yum install mysql mysql-devel mysql-server
# chkconfig --levels 235 mysqld on
# /etc/init.d/mysqld start

3,安装ruby
# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p352.tar.gz
# tar zxf ruby-1.8.7-p352.tar.gz
# cd ruby-1.8.7-p352
# ./configure 
# make 
# make install

# ruby -v
目前ruby1.8.7最新的是p352,见ftp://ftp.ruby-lang.org/pub/ruby/1.8/
默认会安装到/usr/local/lib/ruby/

4,安装rubygems
在安装rails 之前,要先安装rubygems
这个比较挑剔,在redmine安装指导(http://www.redmine.org/projects/redmine/wiki/RedmineInstall)中提到有要求,要在1.3.7 ~ 1.7.0之间,这里选择了1.6.2版。同样是下载源码安装。
# cd ~/rails_install
# wget http://rubyforge.org/frs/download.php/74445/rubygems-1.6.2.tgz
# tar zxvf rubygems-1.6.2.tgz
# cd rubygems-1.6.2
# ruby setup.rb
安装成功后,执行gem –v ,可看到版本信息。

5,安装Rails及相关gems

wget http://rubygems.org/downloads/rake-0.8.7.gem
wget http
://rubygems.org/downloads/rack-1.1.0.gem
wget http
://rubygems.org/downloads/rails-2.3.14.gem
wget http
://rubygems.org/downloads/activesupport-2.3.14.gem
wget http
://rubygems.org/downloads/activerecord-2.3.14.gem
wget http
://rubygems.org/downloads/actionpack-2.3.14.gem
wget http
://rubygems.org/downloads/actionmailer-2.3.14.gem
wget http
://rubygems.org/downloads/activeresource-2.3.14.gem

wget http
://rubygems.org/downloads/i18n-0.4.2.gem
wget http
://rubygems.org/downloads/mysql-2.8.1.gem
wget http
://rubygems.org/downloads/cgi_multipart_eof_fix-2.5.0.gem
wget http
://rubygems.org/downloads/coderay-1.0.0.gem

gem  install 
--local rake-0.8.7.gem
gem  install 
--local rack-1.1.0.gem 
gem  install 
--local rails-2.3.14.gem
gem  install 
--local mysql-2.8.1.gem
gem  install 
--local i18n-0.4.2.gem
gem  install 
--local cgi_multipart_eof_fix-2.5.0.gem
gem  install 
--local coderay-1.0.0.gem

6,安装Redmine1.2.3
使用svn下载Redmine 1.2源码到/www目录中
svn co svn://rubyforge.org/var/svn/redmine/branches/1.2-stable redmine-1.2

创建Redmine数据库和redmine用户
CREATE DATABASE redmine CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'redmine';
GRANT ALL ON redmine.* TO 'redmine'@'localhost';

到database.yml文件,修改production节点的帐号和密码为redmine,注意冒号后要有空格。

到/www/redmine1.2目录下
rake config/initializers/session_store.rb
RAILS_ENV
=production rake db:migrate
RAILS_ENV
=production rake redmine:load_default_data
ruby script
/server webrick -8000 -e production


如果报错:rake aborted! no such file to load -- openssl
先yum install  openssl-devel
然后到下载的ruby源码的ext/openssl目录
ruby extconf.rb  (生成Makefile)
make
make install



删除已安装的ruby
How to uninstall Ruby from /usr/local?
How to Remove an Old version of Ruby



参考:
CentOS 6.0 安装配置rails 2.3.11 + redmine 1.2.1 笔记
Redmine在Linux(CentOS)下的安装及配置




"./configure && make && make install"是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤。
./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC(
cc是gcc的连接,gcc是编译器)或GCC,它是个shell脚本
make是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
AUTOMAKE和AUTOCONF是非常有用的用来发布C程序的东西

posted @ 2011-12-10 12:26 leekiang 阅读(531) | 评论 (0)编辑 收藏

一:浏览器显示中文
yum install fonts-chinese  
yum install fonts-ISO8859-2-75dpi
修改 /etc/sysconfig/i18n ,内容如下:
LANG="en_US.UTF-8"
SYSFONT="lat0-sun16"

二:中文输入法安装
yum -y install scim* 
yum -y install Deployment_Guide-zh-* lv-* stardict*
参见 Linux CentOS下,浏览器乱码,支持中文解决;以及中文输入法的安装

安装jdk
在/usr/java目录
chmod 777 jdk-6u29-linux-i586-rpm.bin
./jdk-6u29-linux-i586-rpm.bin


在安装新的虚拟机时,如果选择了ISO或者光盘立即安装,vmware会自动配置自动安装,但这样默认安装的CentOS系统,在显示中文的时候,会出现乱码。有人讲了解决办法:
CentOS在vmware7下中文乱码的解决方法
但另外有人说还是有问题,要采用以下的办法:
选择“我将操作系统以后安装(I will install the operating system  later)”,把裸机建出来后,先Virtual Machine Setting,点CDROM 然后在左边选择加载ISO文件(USe ISO image file),再启动安装就没问题了。


由于VMware的智能自动安装,如果没有前面的两步,在安装系统时将不会出现语言选择、软件定制、分区等几乎所有设置选择,系统将会完全自动安装完毕。但这样安装的系统不能显示中文,没有中文输入法,连编译工具GCC也没有,什么意思啦,就是这样只安装了最核心最基本的一些东西。
开始不知道,就没有前两步装的,结果装完后又要考虑汉化,然后又要装中文输入法,要用GCC 时,发现没有GCC,然后又得装GCC,后来找了半天,终于在http://zhidao.baidu.com/question /89551368.html?fr=qrl&cid=89&index=5找到了答案,终于不用再为汉化而烦了,呵呵!这样VM安装 RHEL,就轻松解决问题了。
补充:这样的安装方法相对简易安装(easyinstall)有些麻烦,那就是安装完后得手动安装vmtools,但别紧张,我教你个笨办法无忧解决,哪怕你没有linux基础:
(1)点击vmvare上的安装vmtools按钮,系统会下载vmtools tar.gz 的cd
(2)复制它到桌面,解压
(3)双击解压后文件里面vmware-install.pl ,弹出对话框,选“在终端运行”
(4)一路回车即可,最后要选择一下分辨率:12
(5)安装后重启虚拟机
来源

当出现"Please insert disc 2 to continue"时,点击vmware提供的"Change Disc"。

问题:yum install mysql-server时报错“Insufficient space in download directory /var/cache/yum/base/packages”
解决:rm -rf /var/cache/yum/*。也可修改/etc/yum.conf的cachedir=/var/cache/yum, 但根本原因可能是磁盘满了。


VMware虚拟机安装redhat Linux 问题
简单CentOS配置步骤
CentOS 5.5 图形安装教程(超详细)
CentOS 6.0 图形(图解)安装教程、基本配置、网络配置、软件源配置、安装压缩、语言包
How to Install Linux on VMWare
用VMware虚拟机安装CentOS-5.0

posted @ 2011-10-18 03:03 leekiang 阅读(1151) | 评论 (0)编辑 收藏

用某程序打开某文件(如果有空格,必须用引号):
call "C:\Program Files\Notepad++\notepad++.exe"  E:\工作.txt
执行这个bat时,会弹出一个对话框,如何隐藏运行呢?可以使用vba:
CreateObject("WScript.Shell").Run "cmd /c E:\test.bat",0
保存为test.vbs,双击它就可以隐藏运行了。

bat脚本方便备份文件
bat批处理学习笔记

posted @ 2011-10-15 18:49 leekiang 阅读(366) | 评论 (0)编辑 收藏

使用Perf4J进行性能分析和监控

posted @ 2011-10-08 02:35 leekiang 阅读(343) | 评论 (0)编辑 收藏

ResultSetHandler的实现类有很多种,涉及数组、map 、javabean等,都接受一个RowProcessor类型的参数来实现结果集向对象的转化。其中RowProcessor的默认实现类为BasicRowProcessor, 用户也可以自己实现RowProcessor。 BasicRowProcessor使用BeanProcessor来完成resultset中的值向javabean的映射,前提要求列名和bean属性名必须一致。

ArrayHandler :将ResultSet中第一行的数据转化成对象数组
ArrayListHandler : 将ResultSet中所有的数据转化成List,List中存放的是Object[]
BeanHandler :将ResultSet中第一行的数据转化成类对象
BeanListHandler :将ResultSet中所有的数据转化成List,List中存放的是类对象
MapHandler :将ResultSet中第一行的数据存成Map映射
MapListHandler :将ResultSet中所有的数据存成List。List中存放的是Map
ColumnListHandler :将ResultSet中某一列的数据存成List,List中存放的是Object对象
KeyedHandler :将ResultSet中所有数据存成Map,Map中key为某一列的值,value为Map,存放key对应的行的数据
ScalarHandler :将ResultSet中一条记录的其中某一列的数据存成Object

查询的基本用法:
        String url = "jdbc:mysql://localhost:3306/blog";
        String jdbcDriver 
= "com.mysql.jdbc.Driver";
        String user 
= "root";
        String password 
= "root";
        DbUtils.loadDriver(jdbcDriver);
        Connection conn 
= null;
        
try {
            conn 
= DriverManager.getConnection(url, user, password);
            QueryRunner qr 
= new QueryRunner();
            List  results 
= (List)qr.query(conn, "select  *  from T_USER"new BeanListHandler(User.class) );
        } 
catch (SQLException e) {
            e.printStackTrace();
        } 
finally {
            DbUtils.closeQuietly(conn);
        }
该query方法执行后会自己关闭rs和stmt,但没有关闭连接。
如果传入dataSource, QueryRunner run = new QueryRunner( dataSource ),则执行不含conn参数的查询方法时,会自己关闭连接。
public <T> T query(String sql, ResultSetHandler<T> rsh, Object params)
        
throws SQLException {

        Connection conn 
= this.prepareConnection();

        
try {
            
return this.query(conn, sql, rsh, params);
        } 
finally {
            close(conn);
        }
    }


扩展ApacheCommos的DbUtils以支持字段名下划线映射
对 DBUtils 包中 BeanProcessor 的优化
修改DbUtils支持表名下划线映射
dbutils
Commons DbUtils 源码阅读四
让你的DBUtils支持enum
OSChina底层数据库操作的类(QueryHelper)源码
OSChina底层数据库操作的类(QueryHelper)源码2
基于JDBC+Oracle+Apache Dbutil的泛型DAO
日常数据库操作的烦恼及解药--DbUtils、MyBatis和Hibernate
基于dbutils支持annotation的简易orm

posted @ 2011-10-07 17:22 leekiang 阅读(841) | 评论 (0)编辑 收藏

1,SuppressWarnings的作用是抑制编译器产生警告信息。
@SuppressWarnings("unused")
@SuppressWarnings("unchecked")

eclipse支持的SuppressWarning的值如下,其他开发工具略有差异。
  • all to suppress all warnings
  • boxing to suppress warnings relative to boxing/unboxing operations
  • cast to suppress warnings relative to cast operations
  • dep-ann to suppress warnings relative to deprecated annotation
  • deprecation to suppress warnings relative to deprecation
  • fallthrough to suppress warnings relative to missing breaks in switch statements
  • finally to suppress warnings relative to finally block that don't return
  • hiding to suppress warnings relative to locals that hide variable
  • incomplete-switch to suppress warnings relative to missing entries in a switch statement (enum case)
  • nls to suppress warnings relative to non-nls string literals
  • null to suppress warnings relative to null analysis
  • restriction to suppress warnings relative to usage of discouraged or forbidden references
  • serial to suppress warnings relative to missing serialVersionUID field for a serializable class
  • static-access to suppress warnings relative to incorrect static access
  • synthetic-access to suppress warnings relative to unoptimized access from inner classes
  • unchecked to suppress warnings relative to unchecked operations
  • unqualified-field-access to suppress warnings relative to field access unqualified
  • unused to suppress warnings relative to unused code
2,注解
注解是加入到java源代码中的一些描述性的数据,本身不能执行。可利用反射(当RetentionPolicy=RUNTIME)或文本解析取得注解信息。
@Target,@Retention为元注解。
SuppressWarnings的源码如下:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();
}

package java.lang.annotation;

public enum RetentionPolicy {
    
/**
     * Annotations are to be discarded by the compiler.
     
*/
    SOURCE,

    
/**
     * Annotations are to be recorded in the class file by the compiler
     * but need not be retained by the VM at run time.  This is the default
     * behavior.
     
*/
    CLASS,

    
/**
     * Annotations are to be recorded in the class file by the compiler and
     * retained by the VM at run time, so they may be read reflectively.
     *
     * 
@see java.lang.reflect.AnnotatedElement
     
*/
    RUNTIME
}


package java.lang.annotation;
public enum ElementType {
    TYPE,
    FIELD,
    METHOD,
    PARAMETER,
    CONSTRUCTOR,
    LOCAL_VARIABLE,
    ANNOTATION_TYPE,
    PACKAGE
}

3,泛型

    public <T> T testT(List<T>  list){
        T t 
=(T) list;
        
return t;
    }

4,自动装箱(AutoBoxing

关于row type
http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it/
http://www.blogjava.net/sevenguin/archive/2011/04/20/348628.html

转:J2SE5中的最新注释功能SuppressWarnings
http://wenku.baidu.com/view/9d20440f844769eae009edf2.html
实战篇:设计自己的Annotation
Supported Values for @SuppressWarnings

posted @ 2011-10-07 15:05 leekiang 阅读(484) | 评论 (0)编辑 收藏

xp下使用mysql5.1,创建表空间时报错:
Creating database "blog" failed: SQL Error (23): Out of resources when opening file '.\blog\db.opt' (Errcode: 24)
解决办法:
在my.ini中添加一行
open_files_limit    = 1024
顺便把max_connections调大了一些

posted @ 2011-10-04 18:41 leekiang 阅读(737) | 评论 (0)编辑 收藏

并发与并行
并 发,英文单词是concurrent,是指逻辑上同时发生,有人做过比喻,要完成吃完三个馒头的任务,一个人可以这个馒头咬一口,那个馒头咬一口,这样交 替进行,最后吃完三个馒头,这就是并发,因为在三个馒头上同时发生了吃的行为,如果只是吃完一个接着吃另一个,这就不是并发了,是排队,三个馒头如果分给 三个人吃,这样的任务完成形式叫并行,英文单词是parallel。
回到计算机概念,并发应该是单CPU时代或者单核时代的说法,这个时候CPU要同时完成多任务,只能用时间片轮转,在逻辑上同时发生,但在物理上是串行的。现在大多数计算机都是多核或者多CPU,那么现在的多任务执行方式就是物理上并行的。
为了从物理上支持并发编程,CPU提供了相应的特殊指令,比如原子化的读改写,比较并交换。
并发编程的Java抽象

posted @ 2011-10-04 16:08 leekiang 阅读(683) | 评论 (0)编辑 收藏

仅列出标题
共54页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last