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


哈!抓住你了
别走啦啦啦啦啦啦~
JavaEE初阶 & 进程与线程初步认识_第1张图片


文章目录

  • JavaEE初阶 & 进程与线程初步认识
    • 1. 操作系统简单认识
    • 2. 进程(process)
      • 2.1 进程概念
      • 2.2 进程管理
        • 2.2.1 结构体有哪些属性呢?(部分)
        • 2.2.2 CPU
        • 2.2.3 CPU的核心们,是如何打工的?
        • 2.2.4 CPU打工仔们,如何有条不紊工作的
        • 2.2.5 PCB在操作系统中的存储
    • 3. 内存分配
    • 4. 进程间通信
    • 5. 线程与进程
      • 5.1 进程与线程的浅浅区别

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

1. 操作系统简单认识

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

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

JavaEE初阶 & 进程与线程初步认识_第2张图片

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

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

2. 进程(process)

2.1 进程概念

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

JavaEE初阶 & 进程与线程初步认识_第3张图片

  • 双击~

JavaEE初阶 & 进程与线程初步认识_第4张图片

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

JavaEE初阶 & 进程与线程初步认识_第5张图片

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

2.2 进程管理

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

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

  • 不代表偏高层就不适合多进程,比如python多进程的API也是做得很好的~

2.2.1 结构体有哪些属性呢?(部分)

PCB(process control block)

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

JavaEE初阶 & 进程与线程初步认识_第6张图片

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

JavaEE初阶 & 进程与线程初步认识_第7张图片

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

2.2.2 CPU

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

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

JavaEE初阶 & 进程与线程初步认识_第8张图片

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

JavaEE初阶 & 进程与线程初步认识_第9张图片

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

JavaEE初阶 & 进程与线程初步认识_第10张图片

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

2.2.3 CPU的核心们,是如何打工的?

  1. 并行
  • 同一时刻,两个核心,同时进行两个线程

JavaEE初阶 & 进程与线程初步认识_第11张图片

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

JavaEE初阶 & 进程与线程初步认识_第12张图片

  • 所以,这些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)

  • 操作系统分配的内存地址,都是“虚拟地址空间”,跟字面意思一样,每个进程访问的内存地址,不是真实的物理的内存地址
    JavaEE初阶 & 进程与线程初步认识_第13张图片

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

    • 即野指针等…

JavaEE初阶 & 进程与线程初步认识_第14张图片

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

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

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

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

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

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

    • 通过“隔离性”

4. 进程间通信

进程间通信(Inter Process Communication)

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

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

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

JavaEE初阶 & 进程与线程初步认识_第15张图片

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

5. 线程与进程

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

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

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

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

5.1 进程与线程的浅浅区别

  • 进程,是比较有重量的

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

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

JavaEE初阶 & 进程与线程初步认识_第16张图片


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

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

敬请期待吧~



你可能感兴趣的:(JavaEE,java,java-ee,开发语言,windows)