热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

线程的来龙去脉,你了解吗?

线程,的,来

进程最近有些烦恼,整日愁眉苦脸的,拜访内存的时候也有点心不在焉。

内存是个明眼人,开门见山的问道:“进程啊,最近遇到啥问题了?我看你最近情绪有点低落,有啥问题你就直接说出来嘛,我让大家伙儿来一起帮你想想办法。”

进程叹了口气,说道:“唉,最近不是说 CPU 单核频率到瓶颈了吗?人类就用多核芯来弥补单核处理器性能的不足,咱们的 CPU 不也升级到四核了嘛。”

“是啊,这是好事啊,现在最多能并行处理 4 个进程,效率比以前高多了,这还不好吗?”内存疑惑的问。

“好是好,可我每次上 CPU 运行的时候,都忍不住去想,要是单核频率不增加,我总的运行的时间不还是没有什么变化吗?以后的应用程序越来越大,越来越吃 CPU 资源,比如那些大型游戏进程,在短时间内需要进行大量计算,靠单核撑不住怎么办。不谈以后,就说说我自己,我也想能够早点运行完,早点休息啊。”

tobe 注:很明显单进程的运行时间是变小了的,不过这里主要强调的是进程占用 CPU 的时间。

内存点点头,赞同道:“这个问题我倒是没想到,多核处理器对单个进程确实不大友好。那咱得想办法让你能够同时使用几个核心。不过我一时间也想不到什么好办法,还是和大家一起讨论下吧。”

在讨论会上,内存向大家说明了进程现在遇到的问题。

“一个进程怎么并行?”进程调度器第一个发出疑问:“我总不能把一个进程放在四个核上吧,这样不仅毫无意义,还阻碍了其他进程的执行。”

操作系统见多识广,说:“把进程一次放在几个核上运行肯定是不可能的,我在想,咱们的目标,其实就是让多个核心不冲突地帮助一个进程运行嘛。那我们就得把进程「拆开」,然后放在几个核上。”

操作系统一边说,一边画了张图:

进程拆分

“你们看,假如说 fun1 和 fun2 这两个函数互不关联,我们就可以让两个核同时执行他们,这不就做到并行了吗?”

“你的意思是说把一个进程拆成好几个进程?”

操作系统摇摇头:“不是拆成多个进程,进程切换的代价太大了,再说了,这些拆出来的函数,他们是共用一个地址空间的,天生就能够数据共享,如果拆成进程,我们还得再考虑进程之间的通信问题,那多麻烦。不过为了跟进程区分,就叫他们「线程(Thread)」吧”

进程一惊,要把自己拆成线程?那自己不就没了?赶忙问道:“那我岂不是没有存在的余地了?”

进程调度器也慌了:“要是没了进程,我是不是也要被退休了?”

操作系统赶忙解释道:你们误会了,我要拆开的,是进程的执行流,进程不是包含了资源所有权执行流吗,资源所有权还是由进程来把控,执行流就分给几个线程,就像这样:

执行流

tobe 注:在进程模型里,进程拥有对内存、I/O 通道、I/O 设备和文件等资源的控制权,称之为「资源所有权」。「执行流」可以看做进程在 CPU 上的执行过程(直观一点就是高级语言里的语句)。

进程恍然大悟:“也就是说我仍然是资源的掌控者,那些线程就相当于帮我干活的小弟?”

“没错,而且从这种角度看,你本身还是一个单线程进程。”

听了这么久,内存发问了:“创建进程的时候,我要保存进程 PCB ,那为了创建线程,我是不是还得创建一个 TCB(Thread Control Block)?”

“当然了,线程切换需要的信息就得存在 TCB 里面。不过你放心,TCB 要比 PCB 小得多,所以线程切换会比进程切换快很多。”

多线程进程模型

大家听完,纷纷觉得「线程」这个模型完美的解决了当前的问题,说道:“要不我们现在就在操作系统里添上线程模型吧,早点解决进程的问题。”

但是操作系统面露难色,说:“线程模型只是我们的一个假想,贸然加进来的话,可能会出问题,系统崩溃可就不好了,还是要以稳定为主。。。但这个模型还是得试的,要不我们先创建一个线程库,靠一个用户级别的应用程序——线程调度器来管理这些线程吧。”

进程不解的问:“可是这样的话,我还是被分配在一个单独的核心上啊,即使是多线程,也只能在单核上运行。再说了,如果这些线程里有一个被阻塞,在你看来,是整个进程阻塞了,那其他线程,即使是就绪态,也得不到 CPU 资源。”

操作系统仔细想了下,说:“没办法,用户级线程确实有这两个缺点,但相比起让内核来实现线程,用户级线程也有他的好处——线程切换不需要我进行状态转换(从用户态到内核态),开销小,除此之外,线程库可以有多个调度算法,能够为应用程序量身定做调度算法。”

tobe 注:有一种解决线程阻塞的方案叫 jacketing,他可以把一个产生阻塞的系统调用转化成一个非阻塞的系统调用,比如说,不直接调用系统级的 I/O 例程,而是让线程调用应用级的 I/O jacket 例程,这个 jacket 例程会检查 I/O 设备是否忙,如果忙的话,就不执行 I/O 操作,转而调度其他线程,避免了因等待 I/O 设备而造成的进程阻塞。


用户级线程很快投入使用,Linux系统中的 pthread(POSIX thread)库可以说是大获成功,操作系统做出了一项重大决定——支持内核级线程。

内核级线程解决了进程并行的问题,除此之外,由于内核看得到线程的存在,一个线程阻塞了,位于同一个进程中的其它线程仍然能够运行。

用户级线程和内核级线程

并行的问题解决了,进程表示自己十分开心。


希望你在看完我的文章之后有所收获。

感谢你的阅读,我们后会有期!

声明:原创文章,未经授权,禁止转载


推荐阅读
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • CentOS 7 磁盘与文件系统管理指南
    本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文将详细介绍如何在Linux操作系统中执行PHP脚本,包括环境配置、命令使用及验证方法。对于需要在Linux环境下开发或部署PHP应用的用户来说,这是一篇非常实用的文章。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
author-avatar
懒训毛毛_770
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有