多线程(一): 进程 基础

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

前言:


上一个篇章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不太建议使用进程,而是使用线程。


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


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

相关文章
|
27天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第16天】进程、线程和协程是计算机程序执行的三种基本形式。进程是操作系统资源分配和调度的基本单位,具有独立的内存空间,稳定性高但资源消耗大。线程是进程内的执行单元,共享内存,轻量级且并发性好,但同步复杂。协程是用户态的轻量级调度单位,适用于高并发和IO密集型任务,资源消耗最小,但不支持多核并行。
40 1
|
6天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
11天前
|
Linux 调度 C语言
深入理解操作系统:进程和线程的管理
【10月更文挑战第32天】本文旨在通过浅显易懂的语言和实际代码示例,带领读者探索操作系统中进程与线程的奥秘。我们将从基础知识出发,逐步深入到它们在操作系统中的实现和管理机制,最终通过实践加深对这一核心概念的理解。无论你是编程新手还是希望复习相关知识的资深开发者,这篇文章都将为你提供有价值的见解。
|
8天前
|
Java
java小知识—进程和线程
进程 进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程 线程,与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间做切换工作时,负担要比
19 1
|
13天前
深入理解操作系统:进程与线程的管理
【10月更文挑战第30天】操作系统是计算机系统的核心,它负责管理计算机硬件资源,为应用程序提供基础服务。本文将深入探讨操作系统中进程和线程的概念、区别以及它们在资源管理中的作用。通过本文的学习,读者将能够更好地理解操作系统的工作原理,并掌握进程和线程的管理技巧。
28 2
|
15天前
|
调度 Python
深入浅出操作系统:进程与线程的奥秘
【10月更文挑战第28天】在数字世界的幕后,操作系统悄无声息地扮演着关键角色。本文将拨开迷雾,深入探讨操作系统中的两个基本概念——进程和线程。我们将通过生动的比喻和直观的解释,揭示它们之间的差异与联系,并展示如何在实际应用中灵活运用这些知识。准备好了吗?让我们开始这段揭秘之旅!
|
1月前
|
存储 消息中间件 人工智能
进程,线程,协程 - 你了解多少?
本故事采用简洁明了的对话方式,尽洪荒之力让你在轻松无负担的氛围中,稍微深入地理解进程、线程和协程的相关原理知识
41 2
进程,线程,协程 - 你了解多少?
|
25天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
28天前
|
消息中间件 并行计算 安全
进程、线程、协程
【10月更文挑战第15天】进程、线程和协程是操作系统中三种不同的执行单元。进程是资源分配和调度的基本单位,每个进程有独立的内存空间;线程是进程内的执行路径,共享进程资源,切换成本较低;协程则更轻量,由用户态调度,适合处理高并发和IO密集型任务。进程提供高隔离性和安全性,线程支持高并发,协程则在资源消耗和调度灵活性方面表现优异。
45 2
|
1月前
|
算法 安全 调度
深入理解操作系统:进程与线程的管理
【10月更文挑战第9天】在数字世界的心脏跳动着的,不是别的,正是操作系统。它如同一位无形的指挥家,协调着硬件与软件的和谐合作。本文将揭开操作系统中进程与线程管理的神秘面纱,通过浅显易懂的语言和生动的比喻,带你走进这一复杂而又精妙的世界。我们将从进程的诞生讲起,探索线程的微妙关系,直至深入内核,理解调度算法的智慧。让我们一起跟随代码的脚步,解锁操作系统的更多秘密。
37 1

热门文章

最新文章

相关实验场景

更多