免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9698 | 回复: 9
打印 上一主题 下一主题

进程间切换的开销 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-27 16:15 |只看该作者 |倒序浏览
最近看一些cache是单线程实现的,应该是为了降低进程间切换的开销,提高网络传输速度。那进程间切换的开销主要是什么?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2011-11-27 20:15 |只看该作者
进程切换的过程:
1。执行完转换前的最后一条指令
2。保留当前进程/线程p1的context, 应该是保留在其PCB里
3。调用scheduler选择下一个要运行的进程/线程p2
4。恢复p2的context (从其PCB里读取)
5。开始执行p2的指令(肯定是从上次停下来的地方接着运行)
中间的2~4步骤应该就是你所问的额外开销。

论坛徽章:
0
3 [报告]
发表于 2011-11-28 08:58 |只看该作者
1 选择下一个要执行进程的复杂度,最新的CFS调度算法从执行队列中选择需要O(lgn)的复杂度。
2 旧进程CPU执行上下文的换出,task_struct.thread_info,也就是linuxfellow兄提到的PCB.
3 新进程CPU执行上下文的换入。

论坛徽章:
0
4 [报告]
发表于 2011-11-28 09:33 |只看该作者
主要是保存进程的上下文和进程调度算法的开销

论坛徽章:
0
5 [报告]
发表于 2011-11-28 11:03 |只看该作者
回复 3# wangjl_sdu


    那如果是线程呢?现在用户态多线程的实现好像是1:1实现的吧,这样线程间切换的开销和进程间的差别是什么?还有一种情况:如果N个线程都打开socket写出,这样切换起来是不是更慢?

论坛徽章:
0
6 [报告]
发表于 2011-11-28 12:14 |只看该作者
回复 5# ggzwtj


    对于linux而言,线程和进程的区别就是,多个线程共享 虚拟存储空间和信号处理 等等。进程之间需要切换虚拟地址空间,重新装载CR3,线程不需要。
这个过程需要的开销貌似不大:

static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
                             struct task_struct *tsk)
{
        unsigned cpu = smp_processor_id();

        if (likely(prev != next)) {
                /* stop flush ipis for the previous mm */
                cpumask_clear_cpu(cpu, mm_cpumask(prev));
#ifdef CONFIG_SMP
                percpu_write(cpu_tlbstate.state, TLBSTATE_OK);
                percpu_write(cpu_tlbstate.active_mm, next);
#endif
                cpumask_set_cpu(cpu, mm_cpumask(next));

                /* Re-load page tables */
                load_cr3(next->pgd);

                /*
                 * load the LDT, if the LDT is different:
                 */
                if (unlikely(prev->context.ldt != next->context.ldt))
                        load_LDT_nolock(&next->context);
        }
#ifdef CONFIG_SMP
        else {
                percpu_write(cpu_tlbstate.state, TLBSTATE_OK);
                BUG_ON(percpu_read(cpu_tlbstate.active_mm) != next);

                if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next))) {
                        /* We were in lazy tlb mode and leave_mm disabled
                         * tlb flush IPI delivery. We must reload CR3
                         * to make sure to use no freed page tables.
                         */
                        load_cr3(next->pgd);
                        load_LDT_nolock(&next->context);
                }
        }
#endif
}

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
7 [报告]
发表于 2011-11-28 14:15 |只看该作者
回复 2# linuxfellow
除了这些明显的开销之外,还有很多隐藏的开销。
比如:TLB失效、cache失效等等

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [报告]
发表于 2011-11-29 09:01 |只看该作者
本帖最后由 linuxfellow 于 2011-11-29 09:04 编辑
回复  ggzwtj


    对于linux而言,线程和进程的区别就是,多个线程共享 虚拟存储空间和信号处理 等等 ...
wangjl_sdu 发表于 2011-11-28 12:14



    是的,线程和进程的区别就是,多个线程共享 虚拟存储空间和信号处理 等等。
使用线程,节省更多的是内存空间。并不会保证进程/线程转换时,可以省一些步骤。除非你的整个系统只有一个进程,一个地址空间,你才能省去那些步骤 。
一个进程/线程被停止时,谁也不知道下一被选入执行的是谁。如果下面被调度运行的线程全是自家的, 都在一个地址空间,可以不进行虚拟空间更换。如果下面被调度运行的只要有一次是其他进程,属于不同的地址空间,就必须全面保存。
一句话:除非你的整个系统只有一个进程(可派生出多个线程),一个地址空间才能简化context switch

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
9 [报告]
发表于 2011-11-29 09:07 |只看该作者
回复  linuxfellow
除了这些明显的开销之外,还有很多隐藏的开销。
比如:TLB失效、cache失效等等
瀚海书香 发表于 2011-11-28 14:15



    这些属于系统异常处理,随时随处都有可能发生,并不是有进程/线程转换本身引起的, 不应该算在进程/线程转换的开销内

论坛徽章:
0
10 [报告]
发表于 2011-11-29 09:16 |只看该作者
回复 9# linuxfellow


    还是有些影响的,进程切换时重新装载CR3会导致CPU的TLB全面刷新,另外不同进程访问的也应该是不同的页帧,对cache的刷新也会有些影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP