工具
精华
|
战斗力 鹅
|
回帖 0
注册时间 2011-4-4
|
既然提到了本专业的来科普一下
进程是资源分配的最小单元,线程是CPU调度最小单元, 顺便说一下最近炒的很火的纤程(fiber)实际只是逻辑层面的与内核无关.
进程与线程创建与销毁的时间复杂度在5-7倍,现在主流家用PC创建销毁一个进程的开销在0.0几毫秒这个数量级,以1万个进程为例,创建销毁大约要多花1秒不到的时间(事实上即使是超高并发的服务器,这点差异也不足以成为技术选型的决定性因素)
进程创建本身的资源(ipc表项,页表项等等)也只是在几Byte到几十Byte这个数量级,1万个进程也就是几十KB到几百KB,注意这里只提操作系统创建一个进程所需的资源不包括进程所持有的资源,对于unix系的folk,现代的*nix系统在folk的处理上都是与父进程持有同一份拷贝,差异化内容才单独存储
以上数字你可以在自家电脑上用C写个最简单的一万次folk和一万次pthread_create来比较
实际上你可能会发现,高复杂度的并发任务有时候多线程甚至效率不如多进程,这个跟线程栈有关,超出内核默认的上限将会导致频繁segment fault,嘛,这个扯远了而且跟系统进程库实现有关,就此打住.
进程的优势在哪里?首先就是简单,多线程无论在编码还是调试上都比多进程要方便.对于浏览器来说最大的好处就是稳定了,当掉一个进程不会当整个浏览器.再就是网络并行的优势了,也许不久的将来浏览器本地渲染跟云渲染可以并用,用线程来做这件事显然要复杂得多.
再来说虚拟内存,的确"虚拟内存"这个名字容易引起误会,叫做页面文件或者页仓库会好理解得多.
页面文件是没法直接寻址的,当内存里面找不到当前页项的时候系统会触发一个page fault.
page fault后unix的做法是顺序从queue里面找,见1设0,见0swap出去(程序执行时每引用一个页面系统置为1).这样的话其实可以看到虚拟内存寻址的消耗并不只是swapping的消耗这么简单,这就是大多数人的误区吧,以为虚拟内存就是拿硬盘去当内存.
这就好比一个超市,货架是内存,仓库是虚拟内存,若一个超市需要频繁从仓库里面拿东西给顾客效率可想而知了.
以上还是理想的paging模型,实际的swap要更为复杂,如本楼的例子一个tab不可能只占一个页面,这就牵扯到segment和buddy system的寻址和管理,既然是科普就不多扯了.
回到本楼的问题,多tab的主要消耗其实是每个渲染后页面的内存快照(snapshot),tab之间的切换实际上就是把内存快照通过显示设备再一次输出,快照无疑是占用很多内存的,进程或是线程本身所消耗的资源相对来说可以忽略不计.而且就网页渲染这个任务来说是没什么东西需要同步的,因此对多线程同步的复杂度也没太多顾虑,进程还是线程,对于浏览器的多tab实现其实没什么明显的优劣,这也不是一个非此即彼的问题,两者共用也许是更好的办法吧,但我不认为chrome只用进程或是safari只用线程就是"脑子有病" |
|