将大象装冰箱,总共分三步,一把冰箱门打开,二把大象转进去,三把冰箱门关上,简单粗暴。可惜我们的进程和线程的转换不是大象装冰箱问题,不扯淡了,回归正题。
一般的进程切换分为两步
首先
切换页目录使用新的地址空间
然后
切换内核栈和硬件上下文
对于我们Linux来讲,地址空间是线程和进程的最大区别,如果我们是线程切换的话,我们不需要做第一步,也就是切换页目录使用新的地址空间。但是切换内弧栈和硬件上下文则是我们线程切换和进程切换都需要做的。
两者的比较
总体来说,没有最好,只有最适合。
(1)需要频繁创建销毁的优先用线程。
eg:web服务器。来一个建立一个线程,断了就销毁线程。要是用进程,创建和销毁的代价是很难承受的。
(2)需要进行大量计算的优先使用线程。
所谓大量计算,就是要消耗很多cpu,切换频繁了。
eg:图像处理、算法处理
(3)强相关的处理用线程,若相关的处理用进程。
什么叫强相关、弱相关?我们给一个简单的例子来阐释:
一般的server需要完成如下任务:消息收发和消息处理。消息收发和消息处理就是弱相关的任务,而消息处理里面可能又分为消息解码、业务处理,这两个任务相对来说相关性就要强多了。因此消息收发和消息处理可以分进程设计,消息解码和业务处理可以分线程设计。
(4)可能扩展到多机分布的用进程,多核分布的用线程。
(5)都满足需求的情况下,用你最熟悉、最拿手的方式。