Java多线程专题之线程与进程概述

简介: Java多线程专题之线程与进程概述

前言

大家好,一直以来我都本着用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫。目前正在出一个Java多线程专题长期系列教程,从入门到进阶, 篇幅会较多, 喜欢的话,给个关注❤️ ~


适合人群

  • 有一定的Java基础
  • 想学习或了解多线程开发
  • 想提高自己的同学

大佬可以绕过 ~


背景

之前给大家讲了一些框架的使用,这些都属于业务层面的东西,你需要熟练掌握它并在项目中会运用它即可,但这些对自身技术的积累是远远不够的,如果你想要提高自己,对于语言本身你需要花更多的时间去挖掘而不是局限于框架的使用,所以之前为什么跟大家一直强调基础的重要性,框架可以千变万化,层出不穷,但是基础它是不变的,不管是学java还是前端或者是其它语言, 这一点大家还是需要认清的。


接下来的几期会专门讲多线程这一块,篇幅会较多,耐心看完你一定会有收获~


情景回顾

之前有给大家讲过Java的基础和进阶部分,如果这方面还薄弱的同学,可以到底部查看往期教程。那时本来想把多线程也出一些教程,但是可能对于大家会有点难度,特别是刚入门的同学,而且这方面的知识又比较多。或许平时项目开发,只是用用框架或者直接使用框架提供的一些多线程方法,很少会自己手写,即便这样,还是需要深入学习的,因为面试的时候,这个地方几乎是必问的,而且对于自身的提高还是有帮助的。


今天我们不涉及代码部分,先带着大家过一遍理论,一起来看一下什么是线程和进程 ~


什么是进程

在讲之前,先给大家讲一下,在早期,计算机是如何工作的。


在很早以前,计算机都是通过一个个指令去工作的,用户输入一个指令,计算机完成一个操作,这种效率是很低的。因为输入一个指令,计算机就等待。后来人们引入了批量处理,将一系列指令交给计算机处理,但是这个过程仍然是串行的,内部执行还是会阻塞。随着时间的发展,人们对于计算机的性能要求越来越高,因为时间就是金钱,如果能提高效率,老板当然高兴了~


后来,人们就提出了计算机进程的概念, 我们先看一下百科中是如何描述进程的:

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体


这里,仍然不给大家提线程的概念,我们接着看进程。我们从中可以得到一个核心点,它是计算机系统资源分配和调度的基本单位。那么它又是怎么去分配和调度的呢?


上下文切换

当程序通过某种手段(编程语言编写)被编译为一系列指令和数据集合后,此时,CPU采用时间片轮转的方式运行进程。CPU为每个进程分配一个时间段,称作它的时间片。如果在时间片结束时进程还在运行,则暂停这个进程的运行,并且CPU分配给另一个进程(这个过程叫做上下文切换)。如果进程在时间片结束前阻塞或结束,则CPU立即进行切换,不用等待时间片用完。


当进程暂停时,它会保存当前进程的状态(进程标识,进程使用的资源等),在下一次切换回来时根据之前保存的状态进行恢复,接着继续执行。


使用进程CPU时间片轮转方式,在宏观上看起来同一时间段执行多个任务,但在事实上,对于单核CPU来说,任意具体时刻都只有一个任务在占用CPU资源。


随着时间的推移,人们觉得这种方式还是有点效率低,不能够满足日常需求了。下面就是我们要讲的线程的概念了


什么是线程

我们知道进程在某一时刻只能处理一件事情,如果要处理其它的,只能等待前面的任务完成。于是呢,人们就提出了线程的概念。之前讲进程的概念的时候,其实还有一句话:

在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体


从中可知,线程是存于进程之中,一个进程可以有多个线程,一个线程可以处理一个子任务,它是并发程序的基础。有的人可能问了,我多进程处理不也可以吗?使用多线程有什么优势?


首先我们需要知道的是处理一个程序不单单是执行任务,完了就结束了,往往我们的执行的任务之间是互相依赖的,也就是说任务之间需要交互,在这里叫进程通信或者线程通信。下面我们就说说这两者的比较


进程通信 & 线程通信

首先我们要知道进程和线程的本质区别,线程是进程的子集,一个进程可以有多个线程。从运行环境上可以得知,进程是独立的运行环境, 线程是进程下分配的一个子任务,也就是说进程独占系统资源和内存空间。这样一想,如果开启多个进程是比较消耗系统资源的。进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及调度,开销较大。线程只需要保存寄存器和栈信息,开销较小,所以这也是使用线程的优势。


进程与进程之间是互相隔离的,一个进程出现问题不会影响其它进程的运行,而线程崩溃是有可能影响整个程序的。另外一个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位。


上下文切换过程

这个概念非常重要,大家一定要好好去理解~


寄存器

上面提到寄存器,那么它是啥呢?它和上下文切换脱不开关系。上下文切换是指 CPU 从一个进程(或线程)切换到另一个进程(或线程)。上下文是指某一时间点CPU寄存器和程序计数器的内容


寄存器是cpu内部的少量的速度很快的闪存,通常存储和访问计算过程的中间值提高计算机程序的运行速度。


程序计数器

程序计数器是一个专用的寄存器,用于表明指令序列中CPU,正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体实现依赖于特定的系统。


说的有点抽象,给大家举个例子。这里开启了两个线程A,B。那么线程A怎么切到B的呢?

  • 首先A线程挂起, 并将当前在cpu中的状态保存到内存中
  • 在内存中检索下一个线程B的上下文并将其在CPU的寄存器中恢复,执行B线程
  • 当B执行完,根据程序计数器中指向的位置恢复线程A


过程分析

CPU通过为每个线程分配CPU时间片来实现多线程机制,CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态,所以任务从保存到再加载的过程就是一次上下文切换。


⭐️上下文切换通常是计算密集型的,意味着此操作会消耗大量的CPU时间, 如果你面试被问到Redis为什么采用单线程I/O多路复用模型,这个地方是不是可以拿出来讲一讲呢?


结束语

本期到这里就结束了, 总结一下,本节主要讲了什么是线程,什么是进程,以及上下文切换的概念。这些概念性的东西,大家不要去背,要自己去理解,不懂的地方可以自己再去搜索,一定要理解,然后自己多总结总结~


下期预告

下期就带大家正式进入Java多线程讲解。关注我,不迷路, 下期不见不散 ~

相关文章
|
8天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
12天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
9天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
21 1
|
15天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
30 2
|
16天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
21天前
|
Linux 调度
探索操作系统核心:进程与线程管理
【10月更文挑战第24天】在数字世界的心脏,操作系统扮演着至关重要的角色。它不仅是计算机硬件与软件之间的桥梁,更是管理和调度资源的大管家。本文将深入探讨操作系统的两大基石——进程与线程,揭示它们如何协同工作以确保系统运行得井井有条。通过深入浅出的解释和直观的代码示例,我们将一起解锁操作系统的管理奥秘,理解其对计算任务高效执行的影响。
|
5月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
126 13
|
4月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
4月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
167 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
3月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。

热门文章

最新文章