【JavaEE初阶】进程与线程初步认识


JavaEE初阶 & 进程与线程初步认识

1. 操作系统简单认识

操作系统简称OS(“operating system”

  • 其实就是一类软件,主流的有:Windows,Android, iOS…
  1. 对硬件,很好的管理
  2. 对软件,提供良好且稳定的运行环境

在这里插入图片描述

  • 可见,操作系统是硬软联系的必由之路~

  • 而我要讲的其实是它与我们密切相关的功能模块,进程管理

2. 进程(process)

2.1 进程概念

  • 我觉得英文更能表达这个词的含义~
  • process表示任务的运行过程~
  • 我们常见的【.exe】文件,这是一个可执行程序
    • 我们只要双击一下,在系统之中就开启了一个进程~

在这里插入图片描述

  • 双击~

在这里插入图片描述

  • 打开任务管理器(登录后~)
    • 开始页面就是搜到~

在这里插入图片描述

  • 这些就是此时电脑的一些进程~

2.2 进程管理

  • 进程很多,当然就需要管理~
  1. 描述进程:
    • 使用结构体/类,把进程的属性信息表示出来
  2. 组织进程:
    • 使用一些数据结构,将结构体/对象,放到一起~

为什么说结构体呢,因为操作系统底层就是由C/C++这种偏底层的语言写的,而这类语言适合进行多进程开发~

  • 不代表偏高层就不适合多进程,比如python多进程的API也是做得很好的~
2.2.1 结构体有哪些属性呢?(部分)

PCB(process control block)

  • 在硬件圈子里就是个板子
  • 在软件里,就是个结构体
  1. pid,进程的id,进程的身份标识(唯一)
  2. 内存指针,即当前进程使用的内存是在内存条的哪一部分
    • 描述进程使用了哪些内存资源
  3. 文件描述符表,硬件存储的数据,一般以文件形式整理的
    • 进程每次打开一个文件,就有一个文件描述符,那么打开很多文件,就有一组文件描述符。构成一个顺序表:文件描述符表~
    • 描述进程使用了哪些硬盘资源

img

  • 根据冯诺依曼体系结构,操作系统的重要作用就是“联系”
  • 而进程的这个结构体的这些属性,在联系的时候,尤为重要

img

  • 进程的运行需要通过操作系统,申请资源
    • 内存,硬盘,CPU等…
  • 所以进程就是操作系统进行资源分配的基本单位~
2.2.2 CPU

中央处理器(Central Processing Unit,简称CPU)

  • 程序的运行,离不开CPU~
  • 程序,相当于一组“二进制指令”的集合~
    • QQ.exe为例

在这里插入图片描述

  • 可以看到,一大堆二进制数,这些就是可以被CPU执行的二进制指令~

在这里插入图片描述

  • 查看你得电脑的CPU
    • 在任务管理器就能看到~

在这里插入图片描述

  • CPU有一个概念,核心数
  • 我的是12个内核,16个逻辑处理器
    • 16(逻辑)核心~
    • 即十二个打工仔,逻辑上干了十六个人的活
    • 另一个说法:12核16线程~
  • 为什么不是2的n次方呢
    • 内核分大小核,大核一个顶俩~
  • 而核心数都远小于进程数(上好几百),那么这些“打工仔”,怎么处理这么多进程的~
    • 当然,一些超级CPU(服务器CPU)核心数会很多~
  • 而且,我们平时的体验知道,这些进程都是同时运行的~
    • 那么,我们就要谈谈CPU的核心,是如何打工的~
2.2.3 CPU的核心们,是如何打工的?
  1. 并行
  • 同一时刻,两个核心,同时进行两个线程

在这里插入图片描述

  1. ※ 并发
  • 一个核心,先执行进程1,再执行进程2…
  • 只要速度够快,肉眼感知不到,就认为是这些进程”同时“进行的~

在这里插入图片描述

  • 所以,这些CPU打工仔,就是通过并发 + 并行的方式来完成的~
2.2.4 CPU打工仔们,如何有条不紊工作的
  • 重点重点重点:进程调度~
  1. 进程状态:
    • 就绪态:进程时刻准备着,随时可以执行
      • 这个就绪态,其实进程就是在运行中
      • 只不过肉眼看不出它的间隔时期
      • 所以也可以说“时时刻刻就绪”,“时时刻刻运行”
    • 阻塞态:进程暂时无法执行
  • 重点就是规划时间表,规划他们什么时候处于什么状态~
  1. 进程优先级:

    • 进程的调度可能并不“公平”,即进程优先级调度~
    • 谁先执行,谁后执行,谁更重要,谁时间空间占比多~
  2. 进程的上下文:

    • 即,当前进程执行情况的“存档”
    • 进程在离开CPU的时候,“存档”。下次回来的时候,“恢复”,继续执行。
      • 比如关闭QQ,再重新执行的时候,可以继续之前的工作~
    • 当然,每个进程都是独立的上下文,不然就信息错乱了。
  • 这里的“文”指的是,CPU内部一大堆寄存器的值~

    • 寄存器就是个“中介”
    • 报错当前进程的“中间结果”
    • 包括进程现在处在哪条指令~
  • 另外,PCB有一个上下文字段

    • “存档”:这些寄存器的值就存放在里面~
    • “读档”:“恢复”的时候,就是把PCB此字段的值还给寄存器
  1. 进程的记账信息
    • 统计每个进程,在CPU上执行了多久~
    • 这个记账信息作为调度的参考依据
      • 一些进程对应数据不太好,就进行调度的调整~
2.2.5 PCB在操作系统中的存储
  • 在操作系统中其实就是一个双向链表
    1. 创建一个进程,就是多了一个节点
    2. 删除一个进程,就是删除节点
    3. 遍历一个进程,就是遍历链表

3. 内存分配

内存管理(Memory Manage)

  • 操作系统分配的内存地址,都是“虚拟地址空间”,跟字面意思一样,每个进程访问的内存地址,不是真实的物理的内存地址
    在这里插入图片描述

  • 如果直接访问内存,挑战“进程之间的稳定性”

    • 即野指针等…

在这里插入图片描述

  • 这样设计,每个进程就只能访问自己的虚拟内存地址,而这个独立的空间,通过页表翻译,会被操作系统映射到对应的物理内存空间上~

    • 即使虚拟地址是一样的,但是被页表翻译也会发生不同的映射
  • 进程的”世界“,就这有那一部分虚拟内存空间!

    • 世界观也仅限于此~
  • 自然也不可能影响别的进程的”世界“

    • 出现越界访问,页表无法翻译,直接报错给你个机灵~

    • 这有就不会给真实的物理内存空间有所影响~

  • 大大提升了操作系统的“稳定性”!

    • 通过“隔离性”

4. 进程间通信

进程间通信(Inter Process Communication)

  • 有的时候,进程之间要进行交互与配合~
  1. 如果进程没有“隔离性”,那么就进程1直接在进程2的物理内存上,进行修改咯~,这样子做,不好!

  2. 进程间通信,本质上就是在“隔离性”前提下,找一个公共区域,让两个进程借助这个公共区域,进行数据交换,即“交互和配合”

    • 当然,这个区域不是“虚拟内存地址”,虚拟内存地址不是公共的~
    • 就相当于,外卖小哥送外卖和我在敲代码是两个线程,我点了外卖,小哥并不是直接过来宿舍喂我,而是放在学校外卖栏这个公共区域,而我去这个公共区域拿外卖吃~
  3. 就相当于,操作系统妥协了,虽然进程间必须具有“隔离性”,但是要进行交互,就必须“开一个小口子”~

在这里插入图片描述

  • 操作系统在进程通信上有很多实现方式
    • 如,管道,消息队列,共享内存,信号…
    • 本质就是“开小口子”去进行进程间交互~

5. 线程与进程

  • 多进程和多线程编程都能满足“并发编程”的需求~

  • 进行这些编程,就需要有对应“API”

  • Java是特别鼓励多线程编程的~

    • 为什么Java几乎没有多进程编程呢?
    • 这个原因是个主观原因
    • 制作jdk的大佬们,加入很多多线程API,而多进程几乎没有。
    • 而C/C++,就有很多多进程API~

5.1 进程与线程的浅浅区别

  • 进程,是比较有重量的

    • 创建线程销毁进程,成本高~
    • 调度进程,成本也高~
    • 因为“隔离性”,资源分配,内存规模的比较大,通信…
    • 多进程解决多并发
  • 引入线程概念,是一个更轻量的进程,即轻量级进程

    • 就是在一个进程里,开发出多条线程
    • 这些线程共用同一份空间,同一进程不同线程没有“隔离性“
    • 就相当于,你要搞一个企业,在一栋楼里,开多个房间给打工仔们工作,还是多建一栋楼~
      • 前者耗时少,成本低,员工交互容易~

在这里插入图片描述


文章到此结束!谢谢观看 !
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!

后续会有几篇关联博客,进程与线程的区别、多线程编程…

敬请期待吧~



  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

s:103

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值