进程调度有可抢占 哪种开销更大_什么时候用多线程什么时候用多进程

进程调度有可抢占 哪种开销更大_什么时候用多线程什么时候用多进程线程调度为什么比进程调度更少开销?在对比进程调度与线程调度的开销前,我们需要明白两点:进程与线程的差异任务调度的开销进程与线程的差异我们首先要明白,线程和进程有什么关系?从概念上来讲,线程是进程的一部分,只是任务调度相关的部分,所以我们才说,“线程是调度的最小单位”。进程拥有着资源,这些资源不属于某一个特定线程,因为所有线程共享进程拥有的资源,所以我们才说,“进程是资源分配的最小单位…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

线程调度为什么比进程调度更少开销?

在对比进程调度与线程调度的开销前,我们需要明白两点:

  • 进程与线程的差异
  • 任务调度的开销

进程与线程的差异

我们首先要明白,线程和进程有什么关系?从概念上来讲,线程是进程的一部分,只是任务调度相关的部分,所以我们才说,“线程是调度的最小单位”。进程拥有着资源,这些资源不属于某一个特定线程,因为所有线程共享进程拥有的资源,所以我们才说,“进程是资源分配的最小单位”。需要特别说明的是,Linux在线程与进程的实现上与概念上有少许差别,这个等下再讨论。

进程与线程关系

所以,我们fork一个新的进程时,实际上“伴生”了一个线程,而这个唯一的线程,实际上代表了这个进程参与到任务调度。在执行的过程中,进程通过pthread_create创建了更多的线程,例如上图中的线程2,线程n。此时,不管线程1,线程2,还是线程n,他们都代表了进程进行任务调度。

既然我们知道了进程与线程有什么关系,那么实际的linux内核是怎么实现进程与线程的呢?

在linux中,不管进程还是线程,都用struct task_struct描述。

struct task_struct {
	...
	struct mm_struct *mm; /*内存资源*/
	...
}

既然都是用struct task_struct描述,那么进程和线程的关系怎么体现?资源指针!例如上面代码块描述的结构成员struct mm_struct *mm,这是一个指针,指向实际的内存资源。同一个进程内的所有线程,他们都使用相同的资源,只需要把对应的资源指针指向相同的地址。

Linux内核就好像淡化了“线程”的概念,每一个线程描述都是struct task_struct,他们都是一个独立的“进程”,都有着自己的进程号,都参与任务调度,只不过指向相同的进程资源。

任务调度的开销

既然我们知道了进程和线程在linux实现上的关系,我们再来分析,为什么说线程调度比进程调度开销更小?

或许你有这样的疑问,既然在linux实现上,线程都是独立的struct task_struct,都参与任务调度,那这里说的线程调度和进程调度怎么区分?

我们不妨这样定义:

线程调度:使用相同资源的`struct task_struct`之间的调度
进程调度:使用不同资源的`struct task_struct`之间的调度

基于这样的定义,为了方便分析问题,我们回顾一下任务调度的开销主要有什么?

1. CPU执行任务调度的开销,主要是进程上下文切换的开销
2. 任务调度后,CPU Cache/TLB不命中,导致缺页中断的开销

对于第1点的开销,不管是进程调度还是线程调度都是必须的,所以,两者的差异体现在第2点。

再看回我们对“进程调度”和“线程调度”的定义,有没觉得灵光一闪?既然线程调度的struct task_struct都使用相同的资源,是不是就意味着,我即使切换到了其他的线程,CPU Cache/TLB命中的概率会高很多?相反,进程调度使用的是不同的资源,每次换了个进程,就意味着原有的Cache就不适用了,没命中,就触发更多的缺页中断,开销自然就更多。

所以,我们明白了,线程调度为什么比进程调度更少开销。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194141.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java list去重_JAVA基础-List去重的6种方式[通俗易懂]

    java list去重_JAVA基础-List去重的6种方式[通俗易懂]简述java开发中经常会遇到List去重这个工作,现在就来整理一下List去重的6种方式。方法代码以及效率测试模拟测试数据相关代码:importjava.util.LinkedList;importjava.util.List;/***@ClassName:ListCleatMain*@Description:模拟数据进行List去重测试*@author:ssqxx*@date:…

    2022年5月25日
    33
  • Cpu流水线_cpu流水线预测

    Cpu流水线_cpu流水线预测原文网址:原文英文原文:AJourneyThroughtheCPUPipeline 编译:@deuso_ICT   作为程序员,CPU在我们的工作中扮演了核心角色,因此了解处理器内部的工作方式对程序员来说不无裨益。  CPU是如何工作的呢?一条指令执行需要多长时间?当我们讨论某个新款处理器拥有12级流水线还是18级流水线,甚至是更深的31级流水线时,这到些都意味着什么呢?…

    2022年4月19日
    54
  • sql语法:inner join on, left join on, right join on具体用法

    sql语法:inner join on, left join on, right join on具体用法

    2021年11月28日
    60
  • idea插件activate-power-mode-x

    idea插件activate-power-mode-xactivate-power-mode-x一、介绍可以写代码的时候有特效二、安装-安装完成后重启idea三、设置刚开始时右上角会有个计数器,每次到达到多少个单词后才会有效果触发,还有抖动效果可以根据自己的喜好进行设置(去掉shake没有抖动效果,去掉combo没有计数器)…

    2022年7月14日
    35
  • CentOs7查看系统已有的用户和用户组「建议收藏」

    CentOs7查看系统已有的用户和用户组「建议收藏」查看用户:cut-d:-f1/etc/passwd 查看用户组:cut-d:-f1/etc/group 删除xiaoluo这个用户:userdel-rxiaoluo

    2022年10月19日
    0
  • CSS选择器及优先级 总结

    CSS选择器及优先级 总结一、优先级不同级别在属性后面使用!important会覆盖页面内任何位置定义的元素样式。作为style属性写在元素内的样式id选择器类选择器元素选择器通配符选择器浏览器自定义或继承总结排序:!important>行内样式>ID选择器>类选择器>元素>通配符>继承&a

    2022年7月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号