资讯专栏INFORMATION COLUMN

进程切换与线程切换的区别?

周国辉 / 2985人阅读

摘要:注意这个题目问的是进程切换与线程切换的区别,不是进程与线程的区别。进程切换与线程切换的区别进程切换与线程切换的一个最主要区别就在于进程切换涉及到虚拟地址空间的切换而线程切换则不会。

注意这个题目问的是进程切换与线程切换的区别,不是进程与线程的区别。当然这里的线程指的是同一个进程中的线程。

这个问题能很好的考察面试者对进程和线程的理解深度,有比较高的区分度。

要想正确回答这个问题,面试者需要理解虚拟内存。

虚拟内存解放生产力

对于程序员来说,我们在编程时实际上是不怎么操心内存问题的,对于使用Java、Python、JavaScript等动态类型语言的程序员来说更是如此,自动内存回收机制的引入使得使用这类语言的程序员几乎完全不用关心内存问题;即使对于编译型语言C/C++来说,程序员需要关心的也仅仅是内存的申请和释放。

总的来说,作为程序员(无论使用什么类型的语言)我们根本就不关心数据以及程序被放在了物理内存的哪个位置上(设计实现操作系统的程序员除外),我们可以简单的认为我们的程序独占内存,比如在32位系统下我们的进程占用的内存空间为4G;并且我们可以申请超过物理内存大小的空间,比如在只有256MB的系统上程序员可以申请1G大小的内存空间,这种假设极大的解放了程序员的生产力。

而这种假设实现的背后功臣就是虚拟内存。

什么是虚拟内存

虚拟内存是操作系统为每个进程提供的一种抽象,每个进程都有属于自己的、私有的、地址连续的虚拟内存,当然我们知道最终进程的数据及代码必然要放到物理内存上,那么必须有某种机制能记住虚拟地址空间中的某个数据被放到了哪个物理内存地址上,这就是所谓的地址空间映射,也就是虚拟内存地址与物理内存地址的映射关系,那么操作系统是如何记住这种映射关系的呢,答案就是页表,页表中记录了虚拟内存地址到物理内存地址的映射关系。有了页表就可以将虚拟地址转换为物理内存地址了,这种机制就是虚拟内存。

每个进程都有自己的虚拟地址空间,进程内的所有线程共享进程的虚拟地址空间。

现在我们就可以来回答这个面试题了。

进程切换与线程切换的区别

进程切换与线程切换的一个最主要区别就在于进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。

举一个不太恰当的例子,线程切换就好比你从主卧走到次卧,反正主卧和次卧都在同一个房子中(虚拟地址空间),因此你无需换鞋子、换衣服等等。但是进程切换就不一样了,进程切换就好比从你家到别人家,这是两个不同的房子(不同的虚拟地址空间),出发时要换好衣服、鞋子等等,到别人家后还要再换鞋子等等。

因此我们可以形象的认为线程是处在同一个屋檐下的,这里的屋檐就是虚拟地址空间,因此线程间切换无需虚拟地址空间的切换;而进程则不同,两个不同进程位于不同的屋檐下,即进程位于不同的虚拟地址空间,因此进程切换涉及到虚拟地址空间的切换,这也是为什么进程切换要比线程切换慢的原因。

有的同学可能还是不太明白,为什么虚拟地址空间切换会比较耗时呢?

为什么虚拟地址切换很慢

现在我们已经知道了进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB,Translation Lookaside Buffer,我们不需要关心这个名字只需要知道TLB本质上就是一个cache,是用来加速页表查找的。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

总结

虚拟内存是现代操作系统极其重要的一部分,当然在这里限于篇幅我们只能简单介绍,关于虚拟内存的详细讲解见后续操作系统教程,敬请期待 :)

更多计算机内功文章,欢迎关注微信公共账号:码农的荒岛求生

计算机内功决定程序员职业生涯高度

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/63167.html

相关文章

  • 一文让你明白CPU上下文切换

    摘要:所以,一次系统调用的过程,其实是发生了两次上下文切换。这些资源在上下文切换时是不需要修改的。发生线程上下文切换的场景前后两个线程属于不同进程。对同一个来说,中断处理比进程拥有更高的优先级,所以中断上下文切换并不会与进程上下文切换同时发生。 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短...

    paulquei 评论0 收藏0
  • 操作系统:多进程、多线程

    摘要:实际工作并不是非此即彼,往往都是进程线程结合的方式。操作系统会保证当线程数不大于数目时,不同的线程运行于不同的上改善程序结构。关于操作系统内部如何创建销毁进程线程,即为什么这些操作进程消耗会比线程大,还没有搞明白。 一、浅层理解 进程是资源分配的最小单位,线程是CPU分配的最小单位——简单明了的说明了进程与线程的区别特点,然而在实际工作中并没有什么卵用。 二、多个维度下,进程与线程的优...

    Java3y 评论0 收藏0
  • 王道操作系统(1-15)学习总结

    摘要:多道批处理系统操作系统引入中断,磁盘能够输出多道程序,并且程序可以通过操作系统来管理并发执行。输入完多道程序之后能够通过操作系统来进行调度,最后输出结果。分时操作系统以时间片为单位的轮流为每个用户作业服务。 ...

    amc 评论0 收藏0
  • Java 多线程编程基础——Thread 类

    摘要:程序执行时,至少会有一个线程在运行,这个运行的线程被称为主线程。程序的终止是指除守护线程以外的线程全部终止。多线程程序由多个线程组成的程序称为多线程程序。线程休眠期间可以被中断,中断将会抛出异常。 线程 我们在阅读程序时,表面看来是在跟踪程序的处理流程,实际上跟踪的是线程的执行。 单线程程序 在单线程程序中,在某个时间点执行的处理只有一个。 Java 程序执行时,至少会有一个线程在运行...

    zhoutk 评论0 收藏0
  • 操作系统进程线程笔记

    摘要:进程与线程声明文章均为本人技术笔记,转载请注明出处进程线程基本概念进程程序的执行实体,操作系统分配资源的最小单位线程被称为轻量级进程,是调度分配的最小单位。一个标准的线程由线程,程序计数器,寄存器集合和堆栈组成进程间线程间通信方式进程间通信 进程与线程 声明 文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall 进程&线程基本概念 进...

    suxier 评论0 收藏0

发表评论

0条评论

周国辉

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<