1. 进程
windows下进程开销极大。
而linux下相当轻量,特别是fork的子进程,句柄,代码段是共享的,数据段是copy-on-write的,开销都极小
2. 线程
资源可以共享,但是出错会影响整个进程,系统不清晰,相对难调试。
在linux下,有两种线程,一种是非内核态的,即用户态通过代码模拟多执行流,开销小,但是对smp支持差。一种内核态,一般一个线程底下对应一个轻量级进程。
比较两者的开销,线程主要是资源共享和通信更方便点。在windows下多进程性能会差很多;而linux下进程相对线程几乎就是增加页表切换那么点时间,这么点时间对线程或者进程要处理的事情实在太小了几乎可以忽略。
3. 内核态分时复用(UNIX/LINUX)
a. 内核线程
b. 硬中断(两段性,top halfs快速标志和结束,bottom halfs处理超时)
c. 软中断 (主要网络收包引起中断/net_rx_action),多处理器
d. tasklets (一个tasklet只能在跑一次[需要多次自己schedule一下],而且只能在一个处理器上执行完,多个在多个处理器。。。),引入主要是为了替换bottom halfs
e. bottom halfs(看#b),一个bottom half也只在一个cpu上,多个可以多CPU同时执行
NOTE:
yield,sleep等在处理忙等时调用一下,放弃时间片让其他执行体获得机会运行。spin_lock是忙等,单线程只能吃满一个CPU,所以多CPU下即使碰到这种情况下,其他任务还是有机会被调用,影响不是太大。
4. 其他平台的扩展
它们与执行体的映射关系都是m/n。跟linux中的纤程类似。
A. 协程
用户端控制并发,SMP支持良好。
B. 应用程序域
.net中引入的概念,对资源封装好,出现错误不会影响其他应用程序域,对外的表现行为跟进程没有两样。
C. Task
Android中引入的概念。对外表现跟一个进程差不多。其实它是可以配置是跟某某处于同一进程,这样它们间的通讯就无需经过binder之流(参见OS-进程通讯)来跨进程通讯。 手机端的线程或者进程对资源或者电源都是很大的消耗,android把这些全部接管了,以专业的平台来屏蔽这些细节。
......