多线程(一): 进程 基础

简介: 多线程(一): 进程 基础

前言:


上一个篇章MySQL数据库就这些东西,不算多但还得需要多多练习,从本章开始又要开始新的篇章。


从本章开始就进入了JavaEE阶段,这个阶段将会持续很久,因为这整个内容非常多;我们将整个EE阶段分为初阶和进阶两个近阶段,我们一点点来了解,我会尽我所能将内容讲解清楚。

我们先来了解了解JavaEE 和 JavaSE 的区别:

1、领域不同

  • javase为平台标准版,可供任何领域使用。
  • javaee为平台企业版,主要供应企业的使用。

2、作用不同

  • javase提供了开发与运行Java软件的编译器等开发工具、软件库及Java虚拟机。它也是Java2平台、企业版本和Java网页服务的基础。
  • JavaEE不仅巩固了标准版中的许多优点,例如“编写一次、随处运行”的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等。同时还提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。


简单认识认识计算机

根据祖师爷 冯·诺依曼 提出的冯诺依曼体系可以知道,计算机分为五大类:

  • 运算器
  • 控制器
  • 存储器
  • 输入设备
  • 输出设备

我们又可以将控制器和运算器统称为:CPU(中央处理器)


如下图:

911613dbb578498f86fb02db0a1bf635.png


操作系统管理硬件分层视图: 



7d6ce04c2ef14cc7b080b88e7294f4ff.png


我们可以简单的将其分为硬件和软件。

而所有的软件都是基于操作系统的,如今常见的操作系统有 DOS ,Windows等等....

这个操作系统的本质其实就是一个软件,它的主要功能主要有两个:

  1. 对上:管理好各个硬件设备
  1. 对下: 给软件提供稳定的运行环境

操作系统它本身非常复杂,这里主要讨论的就是进程管理这一块里的内容。


进程


什么是进程


进程(Process)又名任务(Task)是关于某数据集合上的一次运行活动,进程是操作系统进行资源分配的最小单位(这是文章最最重要的要点之一)

-- 百度百科。


举个例子来解释以下:像 .exe 文件程序在现代系统上运行,操作系统会提供一种假象,好像系统行只有这个程序运行。程序看上去像是独占地使用处理器、主存和I/O设备。处理器看上去就像不间断地一条条执行程序的指令,这种假象是通过进程的概念来实现的。


我们试着通过任务管理器看看此时电脑上有啥程序在运行:


1deabbf2f85e4004a0c529d8363956ab.png


进程与程序的区别


进程是由多道程序的并发执行而引出来的,它和程序是两个截然不同的概念。



f49fc4aeb2d842508de7d728fe1b0e82.png

通过上图我们可以知道程进程与程序最大的区别就在于进程是动态的,同一个静态的程序可以对应多个不同的动态进程,例如:同一个QQ程序可以形成多个动态的QQ进程:


7c8fc32976844c34aac07d94d4e01f5c.png


所以我们可以作出如下总结:


  1. 进程是动态的,程序是静态的
  2. 进程是暂时的,程序是永久的
  3. 进程是可并发的,程序是不能并发的(并发本身就是借助了中断和通道技术,对于程序 一旦程序开始并发,则其程序就终止了,如果想要再执行该程序就需要再次启动,不能再接着前面的程序执行)(并发的概念后面会说)
  4. 进程是活跃在内存和cpu中的,而程序是静止放在存储器中的


进程管理系统


为什么需要进程管理系统这个东西?

现在市面上的电脑都是 几核几线程的,我们来看看我的电脑:


ff7ae0e86d4342fdb9232b6cca963462.png


一共六核十二线程,再来看看我们的进程情况:


0d5524e44fea480c91cf1a4db0d6d00d.png


此时我只有12个进程, 1 - 1 对应肯定是不够用的,那么这时就需要进程管理系统来对这些进程进行管理了。

如何进行进程管理呢?


  1. 描述一个进程,使用 类/结构体 将一个进程的全部信息表示出来;这个结构体又叫PCB(process control block)进程控制块
  2. 组织这个进程,使用一定的数据结构将其这个结构体对象放到一起(一般使用双链表)


进程属性


  1. Pid(操作系统里指进程识别号):P (Process)每个程序的id
  2. 内存指针:当前这个进程使用的进程使用的内存指的是那一部分(进程运行时,使用了哪些内存上的资源)
  3. 文件描述符:目前进程使用了哪些文件,对其进行简单的描述例如:



a495c8e4f1c249539526fd8270caf1dd.png


  1. 进程调度:咱们的程序能够运行,全依仗cpu,每个程序相当于一组’二进制指令’的集合,这些指令靠cpu运行.

我们一共 6 个核心, 12 个进程 , 对于上面一共近百个进程肯定时不够用的,这里就涉及到如何同时进行多个线程了。


进程调度


对计算机的调度主要有两种处理方式:

并发

  1. 并发是指两个或多个事件在同一时间间隔发生。
  2. 并发侧重于在同一实体上。
  3. 并发在一台处理器上“同时”处理多个任务。

并行

  1. 并行是指两个或者多个事件在同一时刻发生。
  2. 并行侧重于在不同实体上。
  3. 并行在多台处理器上同时处理多个任务。

这对应是二者的区别。

并发、并行和多线程的关系


并行需要两个或两个以上的线程跑在不同的处理器上,并发可以跑在一个处理器上通过时间片进行切换。


而如今的计算机采用的都是并行的方式,此并行非彼并行,这里提到的并行(宏观)指的是:一段时间内采用并发的状态,一段时间采用上面的并行(微观)的状态。


换句话说就是:一段时间内由 一台处理器上“同时”处理多个任务;一段时间内由 在多台处理器上同时处理多个任务,由这两种方式交替进行 统称为(并行),此后大部分的并行,说的都是这个并行。


进程调度的属性


这里提到的属性不是一个属性,而是指一组与CPU资源相关的属性。


  1. 进程状态:简单的认为主要是两个状态:就绪态和阻塞态                                                                  就绪态:该进程已经准备好了,随时可以上CPU执行                                                      阻塞状态:进程还没准备好,暂时无法上CPU执行
  2. 进程的优先级:进程的调度不一定公平,会遵循优先级,优先级调度
  3. 进程的上下文:就是记录进程运行到哪里的存档,当A进程突然离开CPU,那么B进程进入CPU执行,执行完后进程A回来继续执行,就从进程A的突然中断的地方继续执行 ;        在进程上来说,就是进程运行中,CPU内部的寄存器存储的值,寄存器有很多作用,在这里的作用就是保存当前进程执行的中间结果,包括了执行到哪一条指令 ,寄存器有一个存档和读档的操作。                                                                                                             所谓存档:进程在中途离开CPU的时候,寄存器会记录进程执行到哪一步了,那么CPU把寄存器上的值存到PCB的上下文中        
  4. 进程的记账信息:记录进程在CPU执行的时间长短,便于操作系统进行进程的调度


如何组织PCB

操作系统使用双向链表组织PCB

  • 进程的创建:创建一个链表结点
  • 进程的销毁:删除一个链表节点
  • 进程列表的遍历:遍历该链表


内存分配 —— 内存管理(Memory Manage)


操作系统对内存资源的分配,采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。

这里说的内存空间并不是指物理内存地址,而是说虚拟内存地址,为什么不采用真实的物理内存地址;接着往下看:


9be6c9371cf5413a9b4a27ad8baa8c89.png


假设这就是映射到真实的内存地址。

那么就会产生一个非常严重的问题,如果进程1 存在一个bug (例如野指针问题),那么进程2 就可以会被这个野指针影响,此时 进程1 的崩溃会导致线程2 的崩溃。

那么我们就采用虚拟地址的方式来 对内存资源的分配。

如下图:



44f16924a74f4ec1b60f1c6e07ecd8d6.png


由于创建、销毁、调度进程的开销特别大,我们Java不太建议使用进程,而是使用线程。


相比于进程,线程是一个更加高效的选择,一个进程可以包含多个线程,一个线程公用一份进程的资源,那么就意味着,对于线程而言,系统性资源已经分配好了,创建线程也就极大的节省了分配资源的开销。


具体的内容就留在下一章内容中讲到。

相关文章
|
20天前
|
UED 开发者 Python
探索操作系统的心脏:理解进程与线程
【8月更文挑战第31天】在数字世界的海洋中,操作系统犹如一艘巨轮,其稳定航行依赖于精密的进程与线程机制。本文将揭开这一机制的神秘面纱,通过深入浅出的语言和直观的代码示例,引领读者从理论到实践,体验进程与线程的魅力。我们将从基础概念出发,逐步深入到它们之间的联系与区别,最后探讨如何在编程实践中高效运用这些知识。无论你是初学者还是有经验的开发者,这篇文章都将为你的技术之旅增添新的航标。
|
26天前
|
Java 程序员 调度
【JAVA 并发秘籍】进程、线程、协程:揭秘并发编程的终极武器!
【8月更文挑战第25天】本文以问答形式深入探讨了并发编程中的核心概念——进程、线程与协程,并详细介绍了它们在Java中的应用。文章不仅解释了每个概念的基本原理及其差异,还提供了实用的示例代码,帮助读者理解如何在Java环境中实现这些并发机制。无论你是希望提高编程技能的专业开发者,还是准备技术面试的求职者,都能从本文获得有价值的见解。
33 1
|
5天前
|
开发者 Python
深入浅出操作系统:进程与线程的奥秘
【8月更文挑战第46天】在数字世界的幕后,操作系统扮演着至关重要的角色。本文将揭开进程与线程这两个核心概念的神秘面纱,通过生动的比喻和实际代码示例,带领读者理解它们的定义、区别以及如何在编程中运用这些知识来优化软件的性能。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和实用技巧。
|
24天前
|
数据采集 存储 安全
如何确保Python Queue的线程和进程安全性:使用锁的技巧
本文探讨了在Python爬虫技术中使用锁来保障Queue(队列)的线程和进程安全性。通过分析`queue.Queue`及`multiprocessing.Queue`的基本线程与进程安全特性,文章指出在特定场景下使用锁的重要性。文中还提供了一个综合示例,该示例利用亿牛云爬虫代理服务、多线程技术和锁机制,实现了高效且安全的网页数据采集流程。示例涵盖了代理IP、User-Agent和Cookie的设置,以及如何使用BeautifulSoup解析HTML内容并将其保存为文档。通过这种方式,不仅提高了数据采集效率,还有效避免了并发环境下的数据竞争问题。
如何确保Python Queue的线程和进程安全性:使用锁的技巧
|
29天前
|
存储 Java 编译器
进程和线程
进程和线程
103 25
|
13天前
|
存储 Java 数据处理
进程中的线程调度
进程是应用程序运行的基本单位,包括主线程、用户线程和守护线程。计算机由存储器和处理器协同操作,操作系统设计为分时和分任务模式。在个人PC普及后,基于用户的时间片异步任务操作系统确保了更好的体验和性能。线程作为进程的调度单元,通过覆写`Thread`类的`run`方法来处理任务数据,并由系统调度框架统一管理。微服务架构进一步将应用分解为多个子服务,在不同节点上执行,提高数据处理效率与容错性,特别是在大规模数据存储和处理中表现显著。例如,利用微服务框架可以优化算法,加速业务逻辑处理,并在不同区块间分配海量数据存储任务。
|
22天前
|
调度
深入理解操作系统:进程与线程的管理
【8月更文挑战第29天】在数字世界的每一次点击和滑动背后,都隐藏着操作系统的精妙运作。本文将带你探索操作系统的核心概念之一——进程与线程的管理。我们将从基础定义出发,逐步深入到它们在内存中的表示、状态变迁以及它们之间错综复杂的关系。通过简洁明了的语言和直观的比喻,即便是没有计算机背景的读者也能轻松理解这一主题。准备好了吗?让我们一起揭开操作系统神秘的面纱,探索那些看似晦涩却无比精彩的知识吧!
|
24天前
|
调度 Python
深入理解操作系统:进程与线程的奥秘
【8月更文挑战第27天】本文将带你走进操作系统的核心,探索进程和线程这两个基本概念。我们将从它们的定义开始,逐步深入到它们之间的联系和区别,以及在操作系统中的作用。通过本文,你将了解到进程和线程不仅仅是编程中的两个术语,它们是操作系统管理资源、实现并发和并行的关键。最后,我们还将通过一个代码示例,展示如何在Python中创建和管理线程。
|
23天前
|
算法 调度 开发者
深入理解操作系统:进程与线程管理
【8月更文挑战第28天】在数字世界的心脏跳动着的是操作系统,它是计算机硬件与软件之间的桥梁。本文将带你探索操作系统的核心概念——进程与线程,揭示它们如何协同工作以支持多任务处理和并发执行。通过实际代码示例,我们将深入了解这些抽象概念是如何在真实系统中实现的。无论你是编程新手还是资深开发者,这篇文章都将为你提供新的视角,让你对操作系统有更深刻的认识。
|
27天前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?

相关实验场景

更多