首页 > 编程语言 >【JavaEE】——线程的诞生(超详细、易理解)

【JavaEE】——线程的诞生(超详细、易理解)

时间:2024-09-17 11:50:43浏览次数:11  
标签:诞生 JavaEE 内存空间 调度 pcb 线程 内存 进程

一:进程对内存的管理

1:进程的独立性:

进程是如何管理内存的,核心:每个进程都有一块独立的内存,进程与进程之间的内存互不干扰,通常情况下,进程A的内存不能访问进程B的内存

好处“进程独立性”:如果进程A的内存超出了给分配的内存大小(即内存越界)或者出现某些bug导致进程A挂掉,不会影响到进程B的运行

二:“进程间的通信”

引入:虽然进程有独立性,但是有一些任务还需要进程与进程之间进行相互配合去完成

1:内存中的公共空间

进程与进程之间也可以通信,操作系统会在内存当中开辟一块特殊的公共空间,用来进程与进程之间进行“数据交换”,这与进程的“独立性”并不冲突。

2:网络通信

操作系统中提供的“进程间的通信”并不限于上述,在Java中,我们通常以文件和网络的形式来达到“进程间的通信”。后端也大同小异,一般是一组服务器之间进行通信

网络通信(简述)同一台计算机中的不同进程可以通过网络来进行通信,不同计算机的不同进程也可以达到通信的目的(泛用性更广)

三:进程的缺点

引入:对进程的管理和调度(对进程的调度)

前面我们已经学过,像单任务操作系统,并不需要考虑进程这个概念,即不需要对进程进行管理和调度。但是现在的操作系统一般都是多任务操作系统,在一些特殊的场景下,比如任务超多的时候,我们需要频繁地创建和销毁进程时,进程就暴露出它的缺点了

1:背景

在早期web开发的时候,PHP为前端霸主,当时的开发语言是C,开发服务器是基于一种叫(CGI)的技术来实现的,这种技术的模式是,多进程的编程模式。

服务器会在同一时刻收到许多请求,服务器基于每一个请求都会申请创建一个进程,然后为请求提供服务,服务完毕后返回响应,销毁进程释放资源。

这个过程中包含着大量频繁的进程的创建和销毁,但是进程的创建和销毁并不容易

2:索取内存资源

进程在创建之前,第一个要索取的资源就是内存。

过程:所以首先就需要向系统申请一块指定大小的内存资源,系统知道后就把所有空闲的内存块通过数据结构组织在一起,然后再在里面查找一个大小合适的内存,最后分配给进程,进程再把依赖的代码和数据通过硬盘加载到内存当中

四:线程

引入:

通过以上线程缺点的描述,我们针对“频繁创建和释放线程需要消耗大量的资源”这一问题,提出了“线程”这一概念来解决。

1:线程的概念和特点

线程也叫“轻量化进程”,线程在进程的基础上,保留了原有的独立调度执行的特点,这种“并发支持”,解决了“申请资源”和“释放资源”带来的额外开销这一问题。

回顾内存指针:在pcb中有一个属性叫内存指针,它可以指向一块内存空间,(即为pcb确定内存空间位置)

回顾进程的独立性:进程与进程间申请的内存空间是彼此独立的,内存空间互不干涉

2:进程在内存中的分配方式

在一个进程当中可以包含多个进程(即图中用一个大进程包含两个小进程来形象描述,可以理解成“进程组”),每个进程都是由pcb来描述的。对于每一个进程来说,它们分配的内存空间是独立的,互不干涉(即pcb的内存指针与内存空间都是一一对应的)

3:线程在内存中的分配方式

对于线程来说就不一样了,可以有多个线程的pcb指向同一块内存空间,重点来了!!!

这就意味着,第一个线程申请了内存空间后,后面的线程就不必在申请了,同样的第一个线程释放资源后,这块内存空间也不必回收,可以留着后面再复用(即多个线程共用一份资源)

同样线程中的pcb也有进程pcb的这些概念(状态,优先级,上下文,记账信息)

4:进程和线程的结合

5:进程和线程之间的关系

每个进程都可以包含一/多个线程,像有三个小线程的小pcb都指向了a,它们获取a中的代码指令的用途不一定相同(即各取所需)有一个线程申请了a这一块空间后,后面的线程就不必在申请了,大大降低了频繁申请空间和释放空间带来的资源浪费

6:线程的缺点

(1)设置线程是有限的

对于上述现成的了解,引入线程不仅可以大大提高进程运行的效率,也可以降低资源浪费,但是引入的线程是越多越好吗?不,有两个问题需要我们注意

①线程数量问题

看图四,有三个pcb的红色箭头(内存指针)指向内存a,共用内存a上的代码指令,那么如果增加箭头数呢(即有10个,100个pcb的内存指针指向a)此时线程与线程之间就会争夺cpu的内存空间,非但不会提高效率,反而会大大增加线程调度所耗费的资源。

②线程间优先级问题

看图四,有三个pcb的红色箭头(内存指针)指向内存a,共用内存a上的代码指令,那么涉及到一个问题,究竟“谁先用,谁后用”,线程和线程之间谈不拢就打一架呗,就可能会导致代码出现一些bug和逻辑上的错误(这就涉及到了线程的安全问题)!!

③线程异常问题

还是看图四:在②的基础上,A线程和B线程谈不拢打了一架,A线程打赢了,说:a内存上代码指令老子就先用了。B不服气,王德发!不让我用,那大家都别用了!!!于是B抛出异常,导致整个大进程都被终止了

7:前后对比

在有线程之前

进程所扮演的角色:既是资源分配的基本单位,也是执行调度的基本单位

在有线程之后

进程专注于资源分配(超大进程去申请B这一块空间)如4的图

线程专注于调度执行(线程去调度内存中的数据、代码)如4的图

8:总结

①两个基本单位

进程包含线程,进程是“资源分配”的基本单位,线程是“执行调度”的基本单位

②资源共享

每一个进程都有自己独立的资源(内存空间和文件描述符表),进程所包含的线程可以共享这一份资源

③独立执行

每一个线程都是一段独立的执行流,可以独立的被cpu进行调度(状态,上下文,文件描述符表,优先,记账信息,线程都有自己独立的一份)

④数量限制

线程不是越多越好,如果线程太多,执行调度的开销就会很大(船上装不下这么多人)

⑤线程安全

同一个进程中的线程可能会相互干扰(抢夺资源),引起线程安全问题(一条船上抢东西吃)

⑥线程异常

同一个进程中的线程如果抛出异常,会影响到其它线程,可能会把整个进程中的所有线程都异常终止(一条船上的人,要死一起死)

标签:诞生,JavaEE,内存空间,调度,pcb,线程,内存,进程
From: https://blog.csdn.net/2301_80133875/article/details/142306322

相关文章

  • C++11 线程同步接口std::condition_variable和std::future的简单使用
    std::condition_variable条件变量std::condition_variable有wait和notify接口用于线程间的同步。如下图所示,Thread2阻塞在wait接口,Thread1通过notify接口通知Thread2继续执行。具体参见示例代码:#include<iostream>#include<mutex>#include<thread>#include<queue>std......
  • Java多线程复习
    目录3种创建方式(现阶段推荐Runnable接口)下载网上的图片(利用了commons-io中的copyUrlToFiles方法)小结买票的例子(Thread的构造方法,获取当前线程的名称,线程休眠)龟兔赛跑的例子实现Callable接口线程停止线程休眠线程礼让Join方法(main线程与Thread子线程)线......
  • python多线程程序设计 之一
    python多线程程序设计之一全局解释器锁线程APIsthreading.active_count()threading.current_thread()threading.excepthook(args,/)threading.get_native_id()threading.main_thread()threading.stack_size([size])线程对象成员函数构造器start/runjoin线程子类实列......
  • 线程池是啥有啥用,怎么用,如何自己实现一个
    目录一、线程池是啥,有啥用二、线程池怎么用 1.构造方法 2.如何使用Java的线程池  三、简单实现一个线程池假设我是一个(好看+有才华)的妹子,那么我就会有很多追求者,这些也叫备胎们,我们若把他们放到一个地方,那就叫“备胎池”。同理,线程就叫“线程池”。一、线程池......
  • 【Java】深入理解Java中的多线程同步机制
    一、多线程的数据不一致    当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。    这个时候,一个在单线程模型下不存在的问题就会发生:如果多个线程同时读写共享......
  • 支持线程编排的并行框架AsyncTool
    它是由京东零售开源的项目,作者是天涯泪小武。如果大家想更深入理解可以去作者的博客看一下。为什么会学习这个框架最近在学习java并发中的CompletableFuture,它除了提供了更为好用和强大的Future特性之外,还提供了函数式编程、异步任务编排组合(可以将多个异步任务串联起来......
  • 基于springboot的图书商城管理系统。Javaee项目,springboot项目。
    演示视频:基于springboot的图书商城管理系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Maven+Layui+Thymeleaf来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁......
  • Springboot宠物领养管理系统。Javaee项目。Springboot项目。
    演示视频:Springboot宠物领养管理系统。Javaee项目。Springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。界面简洁,操作简单。系统......
  • 基于springboot的家庭理财管理系统。Javaee项目,springboot项目。
    演示视频:基于springboot的家庭理财管理系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Maven+Layui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。分为系统管理员,家主,用户三类身......
  • Springboot+vue汽车销售管理系统。Javaee项目,springboot vue前后端分离项目。
    演示视频:Springboot+vue汽车销售管理系统。Javaee项目,springbootvue前后端分离项目。系统介绍:本文设计了一个基于Springboot+vue的前后端分离的汽车销售管理系统,采用M(model)V(view)C(controller)三层体系结构,通过SpringBoot+Vue+maven+IDEA来实现。有经理和销售两种角......