前言大家好,一直以来最通俗的说法就是理解核心知识点,我认为所有的难点都离不开“基础知识”的基础。目前正在发布一个长期的Java多线程系列教程。从入门到高级,会有更大的空间。喜欢就点个关注吧??~适合有一定Java基础的人。想学习或了解多线程开发。想提升自己的同学。背景之前给大家讲了一些框架的使用。这些都是业务层面的东西。你需要精通它们并在项目中使用它们,但是这些对于你自己的技术积累来说是不够的。要想提升自己,就需要花更多的时间去钻研语言本身,而不是局限于框架的使用,那么之前为什么一直向大家强调基础的重要性呢?框架可以千变万化,层出不穷,但基础是不变的。不管是学习java、前端还是其他语言,大家还是需要认清这一点。后面几期专门讲多线程,篇幅会比较长。耐心看完,你一定会有收获的~在场景回顾之前,给大家讲了Java的基础和高级部分。如果你在这方面还比较薄弱,可以到底部查看之前的教程。当时本来想发一些多线程的教程,但是对大家来说可能有点难,尤其是刚入门的同学,这方面的知识比较多。可能在平时的项目开发中,我只是使用框架或者直接使用框架提供的一些多线程的方法,自己写的很少。自我提升还是有帮助的。今天我们先不涉及代码部分,先带大家理论一下,再看看什么是线程和进程~什么是进程在讲之前,先说说计算机是怎么工作的早些年。很久以前,计算机是一条一条地执行指令。用户输入一个指令,计算机完成一个操作。这种效率很低。因为输入了命令,所以计算机等待。后来人们引入了批处理,把一系列的指令交给计算机处理,但是这个过程还是串行的,内部执行还是会阻塞。随着时间的发展,人们对计算机性能的要求越来越高,因为时间就是金钱。如果能提高效率,老板会高兴的~后来人们提出了计算机进程的概念。我们先看看百科。如何描述过程:过程是计算机中的程序对一定数据集的操作。它是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期的计算机结构面向过程的设计中,进程是程序的基本执行实体。在这里,线程的概念还是没有给大家提一下。接下来我们看看这个过程。从中我们可以得出一个核心点,就是计算机系统资源分配和调度的基本单位。那么它是如何分配和调度的呢?上下文切换当程序通过某种手段(编程语言)编译成一系列的指令和数据集时,此时CPU以循环方式运行进程。CPU为每个进程分配一段时间,称为它的时间片。如果时间片结束时进程还在运行,则进程被挂起,CPU被分配给另一个进程(这个过程称为上下文切换)。如果进程在时间片结束前阻塞或结束,则CPU立即切换,不等待时间片用完。当进程挂起时,会保存当前进程的状态(进程ID、进程使用的资源等),下次切换回来时,按照之前保存的状态恢复,然后继续执行。使用进程和CPU时间片轮换的方法,宏观上看起来是多个任务在同一时间段内执行,但实际上对于单核CPU来说,在任意特定时间只有一个任务在占用CPU资源。久而久之,人们觉得这种方式还是有点低效,不能满足日常需求。下面就是我们要讲的线程的概念。什么是线程?我们知道一个进程一次只能处理一件事。想要处理其他的事情,只能等前面的任务完成了。于是,人们提出了线程的概念。之前在讲进程的概念时,其实还有一句话:在当代面向线程的计算机体系结构中,进程就是一个线程容器。程序是对指令、数据及其组织形式的描述,进程是程序的实体。由此可见线程存在于进程中,一个进程可以有多个线程,一个线程可以处理一个子任务,这是并发程序的基础。可能有人会问,我可以做多进程处理吗?使用多线程有什么好处?首先,我们需要知道的是,处理程序不仅仅是执行任务。任务是相互依赖的,也就是说任务之间需要交互,这里称之为进程通信或者线程通信。下面说说两者的比较。ProcessCommunication&ThreadCommunication首先我们要知道进程和线程的本质区别。线程是进程的子集,一个进程可以有多个线程。从运行环境可以知道,进程是一个独立的运行环境,线程是进程下分配的子任务,也就是说进程独占系统资源和内存空间。这样一想,如果启动了多个进程,会消耗更多的系统资源。进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源分配、回收和调度,代价高昂。线程只需要保存寄存器和栈信息,开销小,所以这也是使用线程的一个优势。进程彼此隔离。一个进程出现问题不会影响其他进程的运行,但线程崩溃可能会影响整个程序。另一个重要区别是进程是操作系统分配资源的基本单位,而线程是操作系统调度的基本单位,即CPU分配时间的单位。上下文切换过程的概念非常重要。大家一定要仔细理解哦~上面说了寄存器,那又是什么呢?离不开上下文切换。上下文切换是指CPU从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某个时间点CPU寄存器和程序计数器的内容。寄存器是cpu内部的少量快速闪存,通常用于存储和存取计算过程的中间值,以提高计算机程序的运行速度。程序计数器程序计数器是一个特殊的寄存器,用来指示CPU正在执行的指令序列中的位置。存储的值是正在执行的指令的位置或下一条要执行的指令的位置。具体实现取决于具体的系统。有点抽象,我举个例子吧。这里开启了两个线程A和B。那么线程A如何切换到B呢?首先,线程A挂掉,将当前在CPU中的状态保存到内存中。在内存中检索下一个线程B的上下文并将其恢复到CPU的寄存器中,执行B线程。当B执行完后,线程A根据程序计数器指向的位置恢复。流程分析CPU通过为每个线程分配CPU时间片来实现多线程机制。CPU通过时间片分配算法循环执行任务。当前任务执行完一个时间片后,会切换到下一个任务。但是在切换前会保存上一个任务的状态,以便下次切换回这个任务时可以再次加载这个任务的状态,所以从保存到重新加载一个任务的过程就是一个上下文切换。??上下文切换通常是计算密集型的,这意味着这个操作会消耗大量的CPU时间。如果在面试中被问及Redis为什么采用单线程I/O多路复用模型,能说说这个地方吗?怎么样?结语本期到此结束。综上所述,本节主要讲什么是线程,什么是进程,以及上下文切换的概念。这些概念性的东西不要死记硬背,要自己去理解,不懂的可以搜索,一定要理解,然后自己总结~
