哈!抓住你了
别走啦啦啦啦啦啦~
文章目录
- 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. 线程与进程
-
JavaEE初阶 & 进程与线程初步认识
1. 操作系统简单认识
操作系统简称OS(“operating system”)
- 其实就是一类软件,主流的有:Windows,Android, iOS…
- 对硬件,很好的管理
- 对软件,提供良好且稳定的运行环境
2. 进程(process)
2.1 进程概念
- 我觉得英文更能表达这个词的含义~
- process表示任务的运行过程~
- 我们常见的【.exe】文件,这是一个可执行程序
2.2 进程管理
- 描述进程:
- 组织进程:
为什么说结构体呢,因为操作系统底层就是由C/C++这种偏底层的语言写的,而这类语言适合进行多进程开发~
- 不代表偏高层就不适合多进程,比如python多进程的API也是做得很好的~
2.2.1 结构体有哪些属性呢?(部分)
PCB(process control block)
- pid,进程的id,进程的身份标识(唯一)
- 内存指针,即当前进程使用的内存是在内存条的哪一部分
- 文件描述符表,硬件存储的数据,一般以文件形式整理的
- 进程每次打开一个文件,就有一个文件描述符,那么打开很多文件,就有一组文件描述符。构成一个顺序表:文件描述符表~
- 描述进程使用了哪些硬盘资源
- 根据冯诺依曼体系结构,操作系统的重要作用就是“联系”
- 而进程的这个结构体的这些属性,在联系的时候,尤为重要
- 进程的运行需要通过操作系统,申请资源
- 所以进程就是操作系统进行资源分配的基本单位~
2.2.2 CPU
中央处理器(Central Processing Unit,简称CPU)
- 程序的运行,离不开CPU~
- 程序,相当于一组“二进制指令”的集合~
- 可以看到,一大堆二进制数,这些就是可以被CPU执行的二进制指令~
- CPU有一个概念,核心数
- 我的是12个内核,16个逻辑处理器
- 16(逻辑)核心~
- 即十二个打工仔,逻辑上干了十六个人的活
- 另一个说法:12核16线程~
- 为什么不是2的n次方呢
- 而核心数都远小于进程数(上好几百),那么这些“打工仔”,怎么处理这么多进程的~
- 当然,一些超级CPU(服务器CPU)核心数会很多~
- 而且,我们平时的体验知道,这些进程都是同时运行的~
2.2.3 CPU的核心们,是如何打工的?
- 并行
- ※ 并发
- 一个核心,先执行进程1,再执行进程2…
- 只要速度够快,肉眼感知不到,就认为是这些进程”同时“进行的~
- 所以,这些CPU打工仔,就是通过并发 + 并行的方式来完成的~
2.2.4 CPU打工仔们,如何有条不紊工作的
- 进程状态:
- 就绪态:进程时刻准备着,随时可以执行
- 这个就绪态,其实进程就是在运行中
- 只不过肉眼看不出它的间隔时期
- 所以也可以说“时时刻刻就绪”,“时时刻刻运行”
- 阻塞态:进程暂时无法执行
- 重点就是规划时间表,规划他们什么时候处于什么状态~
-
进程优先级:
- 进程的调度可能并不“公平”,即进程优先级调度~
- 谁先执行,谁后执行,谁更重要,谁时间空间占比多~
-
进程的上下文:
- 即,当前进程执行情况的“存档”
- 进程在离开CPU的时候,“存档”。下次回来的时候,“恢复”,继续执行。
- 比如关闭QQ,再重新执行的时候,可以继续之前的工作~
- 当然,每个进程都是独立的上下文,不然就信息错乱了。
-
这里的“文”指的是,CPU内部一大堆寄存器的值~
- 寄存器就是个“中介”
- 报错当前进程的“中间结果”
- 包括进程现在处在哪条指令~
-
另外,PCB有一个上下文字段
- “存档”:这些寄存器的值就存放在里面~
- “读档”:“恢复”的时候,就是把PCB此字段的值还给寄存器
- 进程的记账信息
- 统计每个进程,在CPU上执行了多久~
- 这个记账信息作为调度的参考依据
2.2.5 PCB在操作系统中的存储
- 在操作系统中其实就是一个双向链表
- 创建一个进程,就是多了一个节点
- 删除一个进程,就是删除节点
- 遍历一个进程,就是遍历链表
3. 内存分配
内存管理(Memory Manage)
4. 进程间通信
进程间通信(Inter Process Communication)
-
如果进程没有“隔离性”,那么就进程1直接在进程2的物理内存上,进行修改咯~,这样子做,不好!
-
进程间通信,本质上就是在“隔离性”前提下,找一个公共区域,让两个进程借助这个公共区域,进行数据交换,即“交互和配合”
- 当然,这个区域不是“虚拟内存地址”,虚拟内存地址不是公共的~
- 就相当于,外卖小哥送外卖和我在敲代码是两个线程,我点了外卖,小哥并不是直接过来宿舍喂我,而是放在学校外卖栏这个公共区域,而我去这个公共区域拿外卖吃~
-
就相当于,操作系统妥协了,虽然进程间必须具有“隔离性”,但是要进行交互,就必须“开一个小口子”~
- 操作系统在进程通信上有很多实现方式
- 如,管道,消息队列,共享内存,信号…
- 本质就是“开小口子”去进行进程间交互~
5. 线程与进程
-
多进程和多线程编程都能满足“并发编程”的需求~
-
进行这些编程,就需要有对应“API”
-
Java是特别鼓励多线程编程的~
- 为什么Java几乎没有多进程编程呢?
- 这个原因是个主观原因
- 制作jdk的大佬们,加入很多多线程API,而多进程几乎没有。
- 而C/C++,就有很多多进程API~
5.1 进程与线程的浅浅区别
-
进程,是比较有重量的
- 创建线程销毁进程,成本高~
- 调度进程,成本也高~
- 因为“隔离性”,资源分配,内存规模的比较大,通信…
- 多进程解决多并发
-
引入线程概念,是一个更轻量的进程,即轻量级进程
- 就是在一个进程里,开发出多条线程
- 这些线程共用同一份空间,同一进程不同线程没有“隔离性“
- 就相当于,你要搞一个企业,在一栋楼里,开多个房间给打工仔们工作,还是多建一栋楼~
文章到此结束!谢谢观看 !
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭!
后续会有几篇关联博客,进程与线程的区别、多线程编程…
敬请期待吧~