2012 不宜进入的三个技术点(中)

原创 2012年01月29日 22:49:44

赖勇浩(http://laiyonghao.com

线程

线程是指进程中的一个单一顺序的控制流,是操作系统能够调度的最小单位,一个进程中可以有多条线程,分别执行不同的任务。线程有内核线程和用户线程之分,但在本文中仅指内核线程。在软件开发中,使用线程有以下好处:
1、在多核或多路 CPU 的机器上多线程程序能够并发执行,提高运算速度;
2、把 I/O,人机交互等与密集运算部分分离,提升 I/O 吞吐量和增进用户体验。
线程的缺点也很明显:
1、创建一条线程需要较大的内存开销,导致不能创建海量的线程;
2、线程由操作系统调度(分配时间片),线程切换的 CPU 成本比较高,导致大量线程存在时大量 CPU 资源消耗在线程切换上;
3、同一进程的多条线程共享全部系统资源,在多线程间共享资源需要进入加锁,大量的锁开销不提,重要的是加大了编写程序的复杂性,这一点你看看有多少书名含有“多线程”三个字就明白写个多线程应用有多难了;
4、I/O 方面,多线程帮助有限,以 TCP Socket Server 为例,如果每一个 client connection 由一条专属的线程服务,那么这个 server 可能并发量很难超过 1000。为了进一步解决并发带来的问题,现代服务器都使用 event-driven i/o 了。
event-driven i/o 解决了并发量的问题,但引入了“代码被回调函数分割得零零碎碎”的问题。特别是当 event-driven i/o 跟 multi-threading 结合在一起的时候,麻烦就倍增了。解决这个问题的办法就使用绿色线程,绿色线程可以在同一个进程中成千上万地存在,从而可以在异步 I/O 上封装出同步的 APIs,典型的就是用基于 greenlet + libevent 开发的 python 库 gevent。绿色线程的缺陷在于操作系统不知道它的存在,需要用户进行调度,也就无法利用到多核或多路 CPU 了。为了解决这个问题,很多大牛都做出了巨大的努力,并且成果斐然,scala、google go 和 rust 都较好地解决了问题,下文以 rust 的并发模型为例讲一下。
rust 提出一个 Task 的概念,Task 有一个入口函数,也有自己的栈,并拥有进程堆内存的一部分,为方便理解,你可以把它看作一条绿色线程。rust 进程可以创建成千上万个 Tasks,它们由内建的调度器进行调度,因为 Tasks 之间并不共享数据,只通过 channels/ports 通信,所以它们是可并行程度很高。rust 程序启动时会生成若干条(数量由 CPU 核数决定或运行时指定)线程,这些线程并行执行 Tasks,从而利用多个 CPU 核心。

如上图,rust 应用程序不停地 spawn 出一个又一个 Tasks,它们由 tasks 调度器管理,在适当的时机,调度器会把某一个 Task 分配给原生线程执行,如果这个 Task 进入 I/O 等待或主动让出 CPU(sleep),那么这个 Task 会被交回给调度器,而相应的原生线程会执行另一个新分派的 Task。尽管使用 rust 编程语言是不能创建线程的(直接调用 C 函数不算),但 rust 应用程序实际上是多线程的(一般情况下),它能够充分地利用多核或多路 CPU。
综上,类似 rust 的 Task 的概念是比线程更好的并发模型,更安全,编写的代码也更加容易维护(关于维护性,我相信写过 gevent 程度或 go 程序的同学会认同的)。线程当然不会消亡,但随着 scala/go/rust 的成熟,在可以预见的将来,线程会退到它呆着的角落:远离普通程序员,只有少数人需要了解它的细节。

版权声明:本文为博主原创文章,未经博主允许不得转载。

2012 不宜进入的三个技术点

http://blog.csdn.net/lanphaday/article/details/72175062012 不宜进入的三个技术点(上) 赖勇浩(http://laiyong...
  • ztguang
  • ztguang
  • 2016年03月30日 10:33
  • 215

改变ActionBar右侧三个小点的颜色

使用的是Support v7 21+的兼容库来实现 material style,改变ActionBar右侧三个小点的颜色...
  • xujinyang1234
  • xujinyang1234
  • 2015年03月11日 13:20
  • 3608

c语言 可变参数 三个点 ...

1.函数中使用可变参数表C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, …); 它除了有一个参数...
  • believnjdvnkds
  • believnjdvnkds
  • 2016年07月29日 15:30
  • 239

JAVA的可变参数,参数中有三个点

许多Java新人在看到下面的这段代码的时候,都会问一个问题:dealArray方法里那三个小点点是什么啊? [java] view plaincopyprint? public...
  • gaojinshan
  • gaojinshan
  • 2014年06月19日 14:25
  • 8273

java参数后面跟三个点是什么意思

AVA中类型后面跟三个点是什么来的。   看代码中那个三点,这样做起到重载的作用,但这是什么意思?   class Father   {       public void foo(S...
  • xyy511
  • xyy511
  • 2015年03月20日 09:40
  • 1675

安卓开发小技巧--TextView 设置的文字过长,显示三个点或者滚动形式显示

开发经常用textview,有时候文字过长就跑到下一行或者宽度设为包裹内容时会挤在一起,这样看非常不美观,ios的文本控件会自适应显示不下时后面留三个点,那安卓的可不可以,当然可以效果 如图 ...
  • panghaha12138
  • panghaha12138
  • 2017年06月19日 15:31
  • 1708

Android之如何解决右上角不显示3个点的菜单

之前写过小例子,发现菜单栏右上角的那3个点老是显示不出来,今天终于解决了,不废话,先爆照。 我之前的代码menu_main.xml 文件如下 ...
  • u011068702
  • u011068702
  • 2015年11月25日 01:08
  • 5002

android程序右上角ActionBar上显示三个点(overflow)

很多的应用在ActionBar的右上角都有个三个点,在里面有什么设置,登陆等其他功能,如下所示: 这个三个点的设置是Activity类中一个方法,可以在想显示这个三个...
  • zhangjikuan
  • zhangjikuan
  • 2016年02月15日 14:49
  • 4623

es6 扩展运算符 三个点(...)

es6 扩展运算符 三个点(…)看了阮大大的文章,发现很多都有运算符【暂且叫运算符】三个点点。 于是查了一下。其实看起来这样用也很6 干货如下表面意思: 扩展运算符(spread)是三个点(…)...
  • qq_28008615
  • qq_28008615
  • 2017年03月02日 14:52
  • 535

安卓添加应用栏的菜单键(三个点)

前言 当新建android工程后,发现原来使用的ActionBar的屏幕右上角的三个点不再出现了(如图中3),它是因为什么原因不在出现了呢?如果不是我自己的原因,那怎么才能搞出来。这个问题通过下面的...
  • Watom_663
  • Watom_663
  • 2017年06月26日 15:20
  • 1273
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2012 不宜进入的三个技术点(中)
举报原因:
原因补充:

(最多只允许输入30个字)