Paul's profileSoftware is my passionPhotosBlogLists Tools Help

Software is my passion

软件是我的挚爱
November 12

北京


北京

   从其他地方转来的,送给那些曾经和现在在北京生活过的北漂一族~~
   北京,是一个呆久了也许会烦,但离开了绝对会想念的地方
   土生土长的北京人,无法理解外地人对北京的情结。孩子们从小便唱着我爱北京天安门、学习着课本里《故都的秋》、看着一部接一部的清宫戏、盯着电视里的故宫、长城……北京就是这样慢慢在心里生根发芽开花的。
   过年回家,总有邻居家小孩问:北京是什么样?眼神中充满渴望与向往。也许只有等他们长大了,真正身临其中,才会明白。
   每年,都有千千万万的人们,从全国各地聚集到北京,上学、打工、创业……这个所谓政治、经济、文化的中心,对人们有太大的吸引力。来到北京的人,或多或少都怀揣梦想。
曾经有人跟我这么说:站在街道上,看到对面有一个商场。可是,不能直接接近,得找地下通道。等好不容易找到地下通道,过了马路,发现商场已经找不到了。
   的确,北京太大。从南到北、从东到西,所花的时间、车程,足够把一个中小城市绕上两圈。以至每个月的打车费都是一笔可观的数目。在东边住习惯了,便把中关村、海淀视为畏途。千里迢迢赶往那里,好似从北京到了河北。不过,这个城市里多的是一大早起床,绕大半个城市去上班的人们……A说,每次在西直门换乘,挤得人想死的心都有;B说,不要跟我提731路,一听我就恶心;C说,为了找一个座位,我必须提前半个小时起床,坐相反方向到始发站上车……
   北京什么都多,尤以人、车为甚。招聘会挤满了人,马路上挤满了车。每个人都在和你拼抢那一席之地。能忍,就后退。反正北京最不缺的就是人才;不能忍,就用尽全力争得上位。要学会打掉牙往肚里咽,眼泪哭泣,只会让亲者痛、愁者快。
很多人说北京气候不好,春天沙尘暴、夏天桑拿天、秋冬干燥不堪。不过,呆久的人总会爱上这种四季分明的气候。冷就是冷、热就是热,干脆利落,不拖泥带水。有一年冬天去过上海,阴冷潮湿,从此便吓怕了。
 人人都向往小城市的舒适生活,一边念叨着,一边拼命往北京跑。如果说舒适、安稳、一成不变的生活好像把人关进了一个小笼子,那么,北京绝对是一个适合放养的城市。它最大的一个好处,就是自由,且充满无限可能性。
  从一个满大街都是熟人的小城市来到北京,会突然发现:四周全是陌生人。任你哭任你笑、任你放肆谈恋爱,反正是没有人认识你。这种巨大的陌生感和不确定性,反而给人安全感
从某种程度来说,生活在北京的人很幸福。这里有最一流的展览、有最大型的演唱会、有最多的电影首映、有各式各样的新闻发布会……这里的咨询更新很快,这里的媒体很发达。报刊亭里摆满各种杂志报纸,下午两三点,就已经开始叫卖晚报……
   北京是一个美食不设防的城市。各路美食都可以在这里找到一席之地,你可以在奢华的酒店一掷千金,也可以在路边小摊花三五块吃个肚皮溜圆。与之类似的,还有时尚。你可以去国贸、王府、新光血拼,也可以在动物园淘十块钱的T恤。放心地把他们搭到一起吧!没有人会攀比品牌、没有人会笑话你不精致。最不羁的、最自由的、最放荡的,才是北京的时尚。甚至于北京本身,也是如此:这里有最现代化的建筑,也有残破的城墙和古老的四合院……
  北京的夜晚,很热闹。22:00,夜才刚刚开始。该玩地玩,该吃地吃,夜还长着呢!酒吧里的迷醉、迪厅里的狂欢……不管多晚出去,总有出租车、总有不睡觉的人们在游荡。
这个巨大的城市,以最宽容的姿态把各式各样的人包裹其中。建筑工地的工人、出入写字间的白领、商人、艺术家、流浪歌手……共享这座城市所有的资源。每一天,都有人一夜暴富、也有人一败涂地;有人离开,有人留下。生生死死、悲欢离合,都在一念之间。它接纳了所有的人,但是却无暇一一顾及。眼看着他们的喜怒哀乐,无动于衷。
   这个城市,有时候很漠然。我们依恋这个城市,其实很大原因是因为这个城市的人。这里有我们的朋友,有我们爱过、恨过的人。我们在这里留下了成长的轨迹,也埋葬了许多不知天高地厚的青春岁月。
August 18

51岁看到我想看的

美国研究机构:中国龙芯CPU只落后美国5年
    美国著名智囊机构兰德公司发布的一份报告称:中国落后美国40年,但20年就可赶超。在微电子技术方面,中国落后美国10-20年。虽然中国的64位龙芯CPU比美国的四核CPU只落后5年,但是在IC研发和生产的全局上中国落后美国10-20年。
    兰德公司列举的部分证据如下:
    航天方面,中国至少落后美国50年。1969年美国人就登月了,中国人至少要2020年才能登上月球。
    航空方面,中国的大飞机至少落后美国50年。美国的F-22已经服役,中国的歼14至少要2015年才能服役,落后10-20年。
    微电子技术方面,中国落后美国10-20年。虽然中国的64位龙芯CPU比美国的四核CPU只落后5年,但是在IC研发和生产的全局上中国落后美国10-20年。
    核技术方面中国落后美国5-10年,这主要体现在第四代核武器上。
    兰德公司认为从科技、教育、经济、文化、军事和政治等方面综合考虑,中国的确落后美国40年,但是中国在2028年就能超过美国,因为中国正在奇迹般地崛起!
    兰德公司的背景
    兰德公司是美国最重要的以军事为主的综合性战略研究机构。它先以研究军事尖端科学技术和重大军事战略而著称于世,继而又扩展到内外政策各方面,逐渐发展成为一个研究政治、军事、经济科技、社会等各方面的综合性思想库,被誉为现代智囊的"大脑集中营"、"超级军事学院",以及世界智囊团的开创者和代言人
April 19

MySQL交易引擎

MySQL的交易引擎目前只有InnoDB.
MySQL 6.0将会有一个叫做Falcon的新引擎.
一个叫作Maria(Michael Widenius)的引擎正在开发.
April 17

国事 (转)

西方国家这次为什么会如次的团结?欧洲的德国、法国,一般是不会冒着这样的风险得罪中国这个经济大国的。伊拉克战争时德国和法国都和中国站在一边,不支持美国对伊动武。为伊拉克而得罪美国,不符合他们的国家利益啊。法国10年前为了不得罪中国,终止了对台军售,损失了几十亿的收入。而为什么今天会冒着这么大的风险公然与中国为敌?难到就是为了和自己根本不相干的西藏和奥运?而另一个值得让人思考的问题是,一向是西方老大的美国,为什么这一次这么低调?让英、法、德在前台唱主角?对于西藏,西方国家很清楚,再怎么闹,中国也不可能做出让步。对于奥运,他们也很清楚,就算西方国家没有一个领导人出席北京奥运会,中国也就是面子上过不去罢了,对中国有实质影响吗?没有。所以,西藏只是一个幌子,奥运也只是一个幌子。那么他们到底想从中国得到什么?西方国家正面临着10年来经济陷入衰退的危险,他们需要有一个有实力的国家为这次西方经济的衰退买单。不言而喻,他们不约而同的想到了中国。做为一个普通老百姓,我对国际经济没有什么研究,但2008年一开始我还是隐约到中国经济面临的危险,现在也就想起了温总理说过的一句话:2008年也许是中国经济最困难的一年。现在想起正在进行的这场闹剧,真的有点让人毛骨耸然了。美国不是低调,是很冷静,他们早已经不露声色的出招了:
1、美元贬值。因为美元贬值,人民币升值,中国16000亿美元的外汇储备已经人间蒸发了3000亿美元,而且还在继续蒸发中。更要命的是,由于人民币升值,中国出口产品成本增加,沉重的打击中国的出口,许多企业面临倒闭的危险。因为中国企业的倒闭,西方国家生产企业就可以开始生产复苏。
2、通过高油价以拖跨中国经济。中国经济的高速发展需要大量的进品原油,而西方国家则不断的提高石油储备,造成高油价一直持续,以增加中国经济建设的成本。这就是美国为什么要打伊拉克、打伊朗的原因:控制石油就是控制了经济命脉。
3、足涨中国金融泡沫。人民币升值,大量热钱自然要涌入中国,造成中国高成本、高币值的经济泡沫。或许这就是为什么政府就算是背着千夫所指都绝不救市的原因,就是为了打击国际投机资本在中国的恶意圈钱行为,而另一方面却不得不面对成千上万痛不欲生的股民的唾骂而有可能造成国内社会动荡的危险。现在看了,什么西藏事件、抵制奥运都是不足为道的事。所以,“西藏”和“奥运”只是西方国家绑架的两个“人质”,他们真正的目的不是西藏,也不是奥运,而是以此为要挟,要中国为他们的经济衰退买单。不买单:搞乱你,要死大家一起死。买单:坐下来谈,你答应我我就息事宁人!中国政府的冷静是对的,死死抓住经济建设这个中心不动摇才是关键。经济如果一跨,那就什么都跨了。国民要冷静,要相互理解,不要给政府出难题。还是那句话:发展才是硬道理,压倒一切的是稳定。
一个普通的中国人都能预料到,我相信政府能从容应对。我们要支持政府打赢这场表面上看起来是舆论战,而事实上是经济的战争 我们需要更团结 希望大家奔走先告
1、多省油 多乘坐公共交通出行 能做车就不要开车 能开窗户就不要开 空调
2、多省电 路灯不用就关掉, 能用耳机就不要开音箱,家电不用就要把整个开关拔下来 又省电又安全 希望政府把夜景工程的灯光就关掉
3、支持国货 能买到国货就不要买外国货 促进内需 钱要给自己人赚
4、努力工作 多开发和制造更好的产品 实业才是救国之本
5、尊重自己 尊重国人 不要崇洋媚外
6、告诉台湾 西藏 包括其他民族的青年 为什么我们现在还这么痛苦别的国家看不起,因为我们的祖辈太喜欢窝里斗,。
7、告诉身边的每一个人 中国只有强大才会有更好的家 ,落后就要挨打挨骂
8、政府在进步 督促政府更快的进步 而不是推到他 那样高兴的是美日 痛苦的是自己
April 13

Innobase内存池小节

为什么使用内存池
http://www.ibm.com/developerworks/cn/linux/l-memory/
http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html
初始化主要工作
1 分配mem_pool_struct结构,其对象mem_comm_pool为全局单体对象.
2 分配大块内存,并由mem_comm_pool->buf指向.
3 将内存size按2的倍数从大到小分割,并保存在倍数对应的mem_comm_pool->free_list[i]中,i为倍数.
4 每个内存area头部为mem_area_struct结构.
主要接口函数
1 mem_alloc(N),
宏函数替代malloc,调用2,3函数,创建heap,并在其内分配内存.
2 mem_heap_create(N),
宏函数调用mem_heap_create_block,创建heap,并将这个heap块放入其自身的块链表中.
3 mem_heap_alloc(mem_heap_t* heap, ulint n),
在heap的块链表的最后一个块中分配内存,如果free的内存不足,调用mem_heap_add_block加入新块,再进行分配.
内部函数
1 mem_heap_create_block,
根据type值从三个地方创建块,mem pool,buffer pool,还有就是heap->free_block.多数调用mem_area_alloc,申请的内存size为:sizeof(mem_block_info_struct) + MEM_SPACE_NEEDED(实际申请的内存size).
2 mem_area_alloc,
2.1 现在我们要寻找的内存块大小为:sizeof(mem_area_struct) + sizeof(mem_block_info_struct) + MEM_SPACE_NEEDED(实际申请的内存size).根据该值,我们找到相应的mem_comm_pool->free_list[i],i的计算方法就不用我多说了吧:)
2.2 如果没有free块可供使用,向上在free_list[i+1]直到free_list[63]里,递归寻找free块,并逐级将其从原链表中删除,拆分为两个下一级块,加入相应free_list
2.3 将得到的块从free_list[i]删除,返回地址为内存首地址+sizeof(mem_area_struct).
2.4 如果内存池确已用尽,调用malloc从OS申请大小为:sizeof(mem_block_info_struct) + MEM_SPACE_NEEDED(实际申请的内存size)的内存,返回首地址.
3 mem_heap_add_block,
调用mem_heap_create_block,将返回的块加入heap块链表.

March 28

memory pool of innobase

mem pool 调用流程
#define mem_alloc(N)    mem_alloc_func((N), __FILE__, __LINE__) 89处调用
mem_alloc_func
 #define mem_heap_create(N)    mem_heap_create_func(\
      (N), NULL, MEM_HEAP_DYNAMIC,\
      __FILE__, __LINE__)
 #define mem_heap_create_in_buffer(N) mem_heap_create_func(\
      (N), NULL, MEM_HEAP_BUFFER,\
      __FILE__, __LINE__)
 #define mem_heap_create_in_btr_search(N) mem_heap_create_func(\
     (N), NULL, MEM_HEAP_BTR_SEARCH |\
      MEM_HEAP_BUFFER,\
      __FILE__, __LINE__)
 #define mem_heap_fast_create(N, B) mem_heap_create_func(\
      (N), (B), MEM_HEAP_DYNAMIC,\
      __FILE__, __LINE__)
 mem_heap_create_func 有四个代替它的宏,调用位置过百,也是主要接口.
 mem_heap_alloc 有140处调用
  mem_heap_add_block
   mem_heap_create_block
    mem_area_alloc
 
mem pool 初始化流程
innobase_start_or_create_for_mysql
 srv_boot
  srv_general_init
   mem_init(srv_mem_pool_size)
    mem_comm_pool = mem_pool_create(size);
 
主要数据结构
/* The info header of a block in a memory heap */
struct mem_block_info_struct {
 ulint magic_n;/* magic number for debugging */
 char file_name[8];/* file name where the mem heap was created */
 ulint line; /* line number where the mem heap was created */
 UT_LIST_BASE_NODE_T(mem_block_t) base; /* In the first block in the
   the list this is the base node of the list of blocks;
   in subsequent blocks this is undefined */
 UT_LIST_NODE_T(mem_block_t) list; /* This contains pointers to next
   and prev in the list. The first block allocated
   to the heap is also the first block in this list,
   though it also contains the base node of the list. */
 ulint   len;    /* physical length of this block in bytes */
 ulint  type;  /* type of heap: MEM_HEAP_DYNAMIC, or
   MEM_HEAP_BUF possibly ORed to MEM_HEAP_BTR_SEARCH */
 ibool init_block; /* TRUE if this is the first block used in fast
   creation of a heap: the memory will be freed
   by the creator, not by mem_heap_free */
 ulint   free;   /* offset in bytes of the first free position for
   user data in the block */
 ulint   start;  /* the value of the struct field 'free' at the
   creation of the block */
 byte*  free_block;
   /* if the MEM_HEAP_BTR_SEARCH bit is set in type,
   and this is the heap root, this can contain an
   allocated buffer frame, which can be appended as a
   free block to the heap, if we need more space;
   otherwise, this is NULL */
#ifdef MEM_PERIODIC_CHECK 
 UT_LIST_NODE_T(mem_block_t) mem_block_list;
   /* List of all mem blocks allocated; protected
   by the mem_comm_pool mutex */
#endif
};
/* Memory area header */
struct mem_area_struct{
 ulint  size_and_free; /* memory area size is obtained by anding with ~MEM_AREA_FREE;
 area in a free list if ANDing with MEM_AREA_FREE results in nonzero */ 
 struct {
 mem_area_t * prev; /* pointer to the previous node, NULL if start of list */
 mem_area_t * next; /* pointer to next node, NULL if end of list */
 } free_list;               /* free list node */
};
 
/* Data structure for a memory pool. The space is allocated using the buddy
algorithm, where free list i contains areas of size 2 to power i. */
struct mem_pool_struct{
 unsigned char* buf;  /* memory pool */
 ulint size;                 /* memory common pool size */
 ulint reserved;          /* amount of currently allocated memory */
 ib_mutex_t mutex;   /* mutex protecting this struct */
 struct {
 ulint count;               /* count of nodes in list */
 mem_area_t * start; /* pointer to list start, NULL if empty */
 mem_area_t * end;   /* pointer to list end, NULL if empty */
 } free_list[64];
/* lists of free memory areas: an area is put to the list whose number is the 2-logarithm of the area size */
};
March 16

innobase 初始化

innobase_start_or_create_for_mysql for Linux 的简单流程
 
一些兼容性测试
set file_flush_method
set max_threads
 os_sync_init();
 sync_init();
 mem_init(srv_mem_pool_size);这可能是个好玩的地方,需要继续花时间研究
 thr_local_init();
 init srv_sys,srv_conc_queue,srv_conc_slots 等重要数据结构
create monitor_file
create dict_tmpfile
create misc_tmpfile
set file_io_threads
os_aio_init
file_init(srv_max_n_open_files)
buf_pool_init 估计这也很有意思
fsp_init 暂时无用
log_init
lock_sys_create(srv_lock_table_size) 这个是我关心的地方
create io threads
open_or_create_data_files
open_or_create_log_files
file_open_log_and_system_tablespace_files
recv_reset_logs
if (create_new_db) {
  mtr_start(&mtr);
  fsp_header_init(0, sum_of_new_sizes, &mtr);  
  mtr_commit(&mtr);
  trx_sys_create();需要仔细研究的地方
  dict_create();
}else{
  recv_recovery_from_checkpoint_start();
  dict_boot();
  trx_sys_init_at_db_start();需要仔细研究的地方
  dict_check_tablespaces_and_store_max_id(recv_needed_recovery);
  recv_recovery_from_checkpoint_finish();
}
if (!create_new_db && sum_of_new_sizes > 0) {
  /* New data file(s) were added */
  mtr_start(&mtr);
  fsp_header_inc_size(0, sum_of_new_sizes, &mtr);  
  mtr_commit(&mtr);
  log_buffer_flush_to_disk();
}
create lock_timeout_and_monitor_thread
create error_monitor_thread
trx_sys_create_doublewrite_buf();需要仔细研究的地方
dict_create_or_check_foreign_constraint_tables();
create master_thread
tablespace_size_in_header = fsp_header_get_tablespace_size(0);
trx_sys_mark_upgraded_to_multiple_tablespaces();需要仔细研究的地方
ibuf_update_max_tablespace_id();

致订阅我blog的朋友们

由于我时常回头补充过去的主题,所以可能需要经常回头看看:)
February 08

黄金四年和以主观意识生活50年

最近听说的两个说法:
 
黄金四年,29-33,刚好来了加国,看来好象也干不了什么特别的,静心研究点好玩的吧。原来只知道VC的架构师曾隐居研究编译器。我这也算是大隐。
人以主观意识生活50年,20-70,对此观点表示严重怀疑。
January 24

MySQL存储引擎初始化

/mysql/sql/handler.cc
/*
  This array is used for processing compiled in engines.
*/
handlerton *sys_table_types[]=
{
  &myisam_hton,
  &heap_hton,
  &innobase_hton,
  &berkeley_hton,
  &blackhole_hton,
  &example_hton,
  &archive_hton,
  &tina_hton,
  &ndbcluster_hton,
  &federated_hton,
  &myisammrg_hton,
  &binlog_hton,
  &isam_hton,
  NULL
};

/mysql/sql/ha_innodb.cc
handlerton innobase_hton = {
  "InnoDB",
  SHOW_OPTION_YES,
  "Supports transactions, row-level locking, and foreign keys",
  DB_TYPE_INNODB,
  innobase_init,//存储引擎初始化函数
  0,                            /* slot */
  sizeof(trx_named_savept_t),   /* savepoint size. TODO: use it */
  innobase_close_connection,
  innobase_savepoint,
  innobase_rollback_to_savepoint,
  innobase_release_savepoint,
  innobase_commit,              /* commit */
  innobase_rollback,            /* rollback */
  innobase_xa_prepare,          /* prepare */
  innobase_xa_recover,          /* recover */
  innobase_commit_by_xid,       /* commit_by_xid */
  innobase_rollback_by_xid,     /* rollback_by_xid */
  innobase_create_cursor_view,
  innobase_set_cursor_view,
  innobase_close_cursor_view,
  HTON_NO_FLAGS
};
执行流程:
main                                                     /mysql/sql/mysqld.cc
init_server_components                          /mysql/sql/mysqld.cc
ha_init                                                   /mysql/sql/handler.cc
for (sys_table_types)
    sys_table_type->init
innobase_init                                      /mysql/sql/ha_innodb.cc
innobase_start_or_create_for_mysql        /mysql/innobase/srv/srv@start.c
srv_boot                                               /mysql/innobase/srv/srv@srv.c
srv_init                                                 /mysql/innobase/srv/srv@srv.c
 
June 13  
Photo 1 of 2