2010-04-25

Netty/NIO和多线程杂谈.

 
  近来貌似无所事事.
 
  能写的东西也不多.

  在新单位遇到个"好领导",于是倒也乐得清闲,没事就翻翻Netty的代码.
  虽然,看来也没什么大的收获.
  但至少有事情做.

  当然,眼下的事情貌似应该是考虑试用期过之后怎么办了.
  毕竟,按照目前的情况,继续被冷处理的话,试用期是过不了的.
  除非上上级给面子.

  这些都是后话了.
 
  这里扯两句Netty这东西.

  说是Netty,但基本还是NIO的内容吧.

  以前单纯美好地认为NIO也不过如此.
  也不过是轮询select各个socket.

  但了解过之后才知道,这其实是跟平台相关的.
  准确点说,这是跟jvm的配置有关.
  
  默认地,JVM或根据所在的平台选择相应的nio provider.
  在linux kernel 2.6下,这个provider使用的select策略是epoll.

  当然,这是文档的说法.
  具体它怎么用epoll是jvm的事情了.
  
  要从openjdk里找出来,也不容易.
  
  顺手去翻了下这个epoll的一些资料.
  稍微有点明白大概的实现机制.

  以前的poll确实是轮询处理的.
  而epoll用高级点的话说,就是事件机制,通过注册相应的事件,来响应io.
  减少无谓的时间消耗.

  看了一些资料和代码的结论是,这种事件也是通过回调完成的.

  猜测可能kernel在处理io的时候被插入了一些回调函数.
  当io ready的时候触发这些函数,通知注册事件.

  这点有写ajax的味道.
  或者说用ajax模拟的server push.方式.
  
  当然,明显可能是后者模仿前者.

  这样做的结果就是cpu从io等待中解脱出来了.
  等待io的事情交给了最底层的io硬件.
  
  反正都是要等的,就不在乎等完之后多做点事情.

  这里想起来线程复用的问题.

  Java里面有个cachedthradpool之类的东西.
  说是可以线程复用.(Excutor的概念).

  进Java代码里看来下,也不过是将线程进队列,依次start.
  作用貌似只是保证同时运行的线程不过超过一定数量.

  当时很好奇,所谓线程复用怎么做的.

  于是就尝试写了个thread去跑,跑的内容是一个植入的回调函数.
  让它跑两次.中间替换一次植入函数.

  结果当然是抛异常.

  顺便说句,在做上面这件事情的时候无比渴望有lambda支持.
  省得写多几行代码.

  看来下Thread的start,里面会有个标记为看是否是新创建的线程.
  一个threadstate的int型.
  
  在java里并没有看到有改动这个值的,想想,应该是在native里实现的.

  总是,大概是启动之后这个值就被改变了吧.
  于是当再次调用语言级别的start之后,异常就抛出了.

  也就是说,当一个线程执行完之后,自然是交给gc了.
  因为从java来看的话,并不能使它再次运行.

  当然,也许cachedthreadpool是用来native的方法去改变threadstate.
  这自然也可以.

  不过要从纯Java角度来看的话,也不是不可能,只不过要做的事情比较多罢了.

  考虑对run()这个thread的实现做一个回调植入.
  比如
  public void run()
  {
     while(true)
     {
       this.getFunction().excute();
     }
  }
  
  这样,很roughly地,就让一个线程不死了.
  也就能实现所谓的reused了.

  当然,这里能改善的地方还很多.
  比如对this.getFunctin()做个改变,让他是从一个queue里pop出来的.
  这样,在while就变成看queue是否为空来选择是执行呢,还是wait一下.

  愿意的话,还可以在queue空的时候,把thread注册到一个free queue里.
  然乎run里直接wait()或者yeild()或者sleep()退出时间片的竞争.
  当需要的时候,再从queue里激活.

  想想,这个memory pool 其实是差不多的道理.

  说了这么多,貌似跟Netty没太大的关系.

  其实就目前的进度来说,netty还真没什么可以说的.

  总的来说,这是一个流水作业的io框架.

  有一个sendUpstream和sendDownstream,来分别处理上行下行的ChannelEvent.
  event在一个pipelien里流动.
  自上而下,自下而上.

  pilieline其实就是一个由ChannelHandler组成的queue,或者说list.
  当然,pileline也不一定会把io在chain里流过handler.
  有时候也会通过ChannelHandlerContext这一类的东西改变流向.

  ChannelHandlerContext里面其实也是ChannelHanlder.
  只不过带来一些附属品而已.
  也就是说,其实它只是一个有状态的channelhandler.

  具体的read write操作最后归结到sendUpstream和sendDownstream里.
  当然,最后还是通过NIO的selector来做的.

  不过这个过程是由一群IOWorker线程来完成传递的.

  大致浏览量下,boss线程组貌似是专门用来accpet的.ioworker是用来读写的.
  这个目前不确定.
  不过也有道理.
  因为貌似这两个线程组netty是尝试分到不同的cpu上面的.
  
  具体还是未知.

2010-04-12

流思

所谓生老病死.

本还是年轻人,不该早早谈论这些.
只是世事无常,不想不代表不需.

大学也不过恍然还在昨天.
却接连地有人或离去,或病倒.

当鲜活的东西忽然黯然了,才突然觉醒如何生活.

漫漫地在这世间爬着.
忽然然间见到有人倒了,才抬起头来看看天空.

这便是这一代人.

某个他,曾经是个很努力的人,在终于要毕业了,才离绝了这个尘世.
才抛弃了他所肩负所重压的东西.

又某个他,终于大学毕业,进来个颇有前途的企业.
当他父母遥想着如何过些悠闲日子的时候,却不意地,孩子病倒了.

20几年往往,换来的却是一次次不期而遇地玩笑.

年轻的时候,总想着有挥霍不完的资本.
年复年日复日.
却不曾想到也许青春已经慢慢远离.

但那种挥霍的态度却依然不去.

也许并不是不懂生活,而是没得选择.

现实的经历便是在一步步往前走,往上爬.
这是时代赋予的人生意义.

20年一孝子.
30年一成人.

云云总是眼盼着这俗套的成长过程.
受着当下的苦,去等待未来的点点滴滴.

所谓的生活希望.

有时候也许并不是生命太脆弱.
只是生活让它变得不堪一击.

在瀚海小舟上.
即便钢铁身躯,也只难逃覆舟的命运.

社会夹缝这个词其实很确切.

只有前后的选择.
没有左右其他.

即便你不往前走,最终不是被后来的人推着便是被踩在脚下.

从出生到教育到社会.

有时候人们会笑放羊的故事.
子子孙孙无穷尽地牧羊.

其实笑的便是自己.

成家立业.
娶妻买房生子养老.
反反复复.

而愈见疯癫的社会,也逐渐将这单调乏味的模式惊起来阵阵波澜.

如履薄冰.
大致如是.

整个社会机器对于个体的倒下无能为力.
却又时刻地要求着个体的奉献.

如奴隶般.

所谓的社会保障,空许了个美好的前程.
却在人祸天灾纷沓的时候,破灭如肥皂.

每每望着日渐华丽高耸的楼层.
却想起来里面多少外表光鲜,内力疲惫的灵魂.

有多少人是能超然于这个社会枷锁的?

每天蝼蚁般忙碌着.
为了什么.

仅仅为了家庭自我能求得一个立足之地.

却不曾想过为之付出过多少.

只是淳朴地想活着.
却被绑到一个空妄宏大的蓝图里.

成为机器的零件.
消耗着自己.

人本因有着诸多希望.
却凭凭地被生活现实所压抑着.

父母拼死地养大孩子.
教育心血.
战战兢兢.

到头来,也许便是一场空.

不单人脆弱.
连希望也如此易碎.

2010-04-05

Social的电子商务

说到social network,还有一个可以考虑的东西是电子商务.

看上去这是两个不太靠谱的东西.
唯一相同的大概是都是互联网的东西.

其实换个角度看,social network谈的是人.
电子商务虽然表面上是种营销,但骨子里还是要看人的因素.

毕竟,转化率,跳率等等,最终还是取决于人.

所以,电子商务其实应该是social network应用的一个前沿.

groupon某种程度上说就是电子商务.
或者根本就是电子商务.

所理解的电子商务就是利用互联网做营销.
groupon不但是用互联网做营销,而且是用互联网最前沿的东西做营销.

在目前,social network讲究的是去中心话.
这跟传统的营销观念好像有点背道而驰.

经典的营销理论应该是有一个好的从中心到四周的扩散.
也就是说,有一个中心媒体却影响受众.
报纸,电视,乃至于丛立各处的广告,某种程度上说都是这个媒体.

groupon看上去是在构建一个新的平台或者说媒体.
事实上,确实可以这么理解.

"中心媒体"和"去中心化"并不像看上去那么风马牛不相及.

考虑下所谓的长尾.

一个群体的是否去中心化,其实很难衡量.
毕竟,去中心化并不是完全地割裂各个个体间的联系.
而是把一个大的整体碎片化.

由里面的个体自由组合而成的小群体.

因此,在一个面向所有人的模型里,去中心化本身是没有什么意义的.
它只不过是长尾的另一个表述而已.

而电子商务不就是关注长尾么?

当然,时下的电子商务已经远远超出了最初的关注长尾的范畴了.

一些"精准化"的电子商务模式也有.
但最终还是脱离不了长尾的影子.

因为,电子商务最终目的是营销.
营销在于尽可能多的用户,尽可能多的目标用户.

基数永远是越大越好.
尤其是当转化率是万年不变的时候.
大的基数就代表着更多的用户.

回到social network.
说它适合电子商务,不单在于它能提供非常理想的能够不断增长的长尾.
还在于,它是基于人的.

考虑下Amazon的模式.
推荐系统,评论系统.
这都是基于人的行为主导的.

长尾是一个因素,能挖掘出数据,找对长尾,才是关键.
Amazon做到了.

事实上,amazon也算是利用了social network.
只不过它是一个比较封闭的,传播度比较低的网络.

更重要的一点是,它的关系性很弱.

中国有个词叫口碑.
amazon用的就是口碑效应.
只不过是线上的口碑效应.

而如果能够把social netowrk引入,线上线下就统一了.

对于电子商务来说,利用social network某种程度上是一种回归.
一种通过虚拟网络的营销,变为回到以人为本的营销.

只不过区别在于,不再是单纯的线上线下营销.而是渗透 到人的日常生活的方方面面的营销.

所谓把广告做到生活的每一个方面.
潜移默化.

将每个转化成功的用户变成一个宣传点,像病毒一样复制.
这是有点恐怖的事情.

聊聊卡布里尼

最近看了部片叫卡布里尼,算是可能这段时间来比较有意思的一部电影. 故事也不算复杂,就是一个意大利修女去美国传教,建立慈善性质医院的故事. 某种程度上来说,也很一般的西方普世价值主旋律. 但是如果换一套叙事手法,比如共产国际的社会主义革命建立无产阶级广厦千万间的角度来看的话,也不是...