网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
文件:比如硬盘上存储的数据,往往就是以文件为单位进行整理的。进程每次打开一个文件,就会产生一个“文件标识符”(标识了这个被打开的文件)。一个进程可能会打开很多文件,对应了一组文件描述符。
把这些文件描述符放到一个顺序表这样的结构里,就构成了文件描述符表。 使用了哪些硬盘上的资源
我们可以得出结论:进程的运行需要从操作系统这里申请资源
进程是操作系统进行资源分配的基本单位。(重要概念!!记住!!)
此处涉及的资源包括不限于内存、硬盘、CPU等
4.接下来这一组属性,都是描述和CPU资源相关的属性,这些属性都是辅助进行,进程调度
我们的程序能运行全依仗CPU
每个程序相当于一组“二进制指令”的集合。
买电脑时,遇到8核心16线程的电脑,是什么意思呢?
CPU中有8个核心,相当于有8个干活的人。但是每个核心,能干两个人的活,8个人可以同时干16个人的活。
以我的电脑为例子,就是这8个人要同时干115(109+6)个活。
2.并行、并发
并行:同一时刻,两个核心同时执行两个进程,此时这两个进程就是并行执行的
并发:一个核心,先执行进程1,执行一会儿之后,再去执行进程2,再执行一会儿之后,再去执行进程3,此时只要这里的切换速度足够快,看起来,进程1 2 3就是“同时”执行的。这就是并发。
举我的电脑为例子,虽然我们只有8个核心,也可以同时执行115个任务,这是通过并发+并行的方式来完成的。
这个过程完全是操作系统自身控制的,程序员是感知不到的。所以很多时候,就把并行+并发统称为并发。
并发程度更高的话,就可以成为高并发。比如一个核心(主体)并发的执行1w个任务就可以成为高并发。不过,这是没有具体的数据限度的。
举个简单的例子,我很喜欢猫猫。
猫猫1
猫猫2
猫猫3
这三只猫猫看见我跟别的小猫咪玩,就会很难过。我最喜欢猫猫2,所以多陪它一天,一三五都陪猫猫2。猫猫3脾气很大,要多花点时间哄,陪它两天吧,就是二四陪它。周六就跟猫猫1那只呆猫猫一起玩。周日休息。
站在每一天的维度,此时,我是在陪同一只猫猫玩。
站在一个月/半年的维度里,我是陪三只猫猫一起玩~
调度的足够快,才能看起来是“同时”。
这就是并发。
如果并行的话,就是这三只猫猫碰面了,那就是修罗场了。😭
3、进程调度
a)进程状态
简单认为,进程状态主要是两个:
就绪态:该进程已经准备好,随时可以上cpu执行
阻塞态:该进程暂时无法上cpu执行
就比如猫猫2去猫咖打工一周给我赚钱花,那这一周猫猫2就相当于阻塞状态。我可以安排猫猫1和猫猫3陪我玩~猫猫1和猫猫3就是就绪状态。
b)进程的优先级
进程之间的调度不一定是“公平”,有的要优先调度。就比如猫猫2优先级最高,猫猫3其次,猫猫1最低。
c)进程的上下文
✨上下文,就是描述了当前进程执行到哪里这样的“存档记录”。进程在离开CPU的时候,就要把当前运行的中间结果。“存档”等到下次进程回来CPU上,再恢复之前的“存档”,从上次的结果继续完后执行。
如果进程结束,就不必存档了。如果是暂时离开,就必须存档。
具体到进程,所谓的上下文具体指就是进程运行过程中,CPU内部的一系列寄存器的值。
寄存器很多种,其中最典型的作用就是保存当前进程执行的中间结果,包括进程运行到哪一条指令。
进程离开CPU,就必须把这些寄存器的值保存到PCB的上下文字段中。(存档)
进程下次回来CPU,再把PCB中的值给恢复到寄存器中。(读档)
CPU上有哪些寄存器,这些寄存器的含义不需要过多考虑。
d)进程的记账信息
统计了每个进程,在CPU上执行了多久了,可以作为调度的参考依据。
比如,猫猫1觉得我陪它的时间少了,心里不开心,感情淡了。我发现以后,肯定要暂时多给猫猫1排点时间,巩固感情。
猫猫1
进程的调度,并发并行都是非常关键的属性。
操作系统往往使用 双向链表 这样的结构来组织pcb
1.创建一个进程,就是创建一个链表的节点
2.销毁一个进程,就是把链表的节点给删除了
3.遍历进程列表,也就是在遍历链表
4、内存分配——内存管理(Memory Manage)
操作系统给内存资源的分配,采用的是空间模式。不同进程使用内存中的不同区域,互相之间不会干扰。
操作系统给进程分配的内存是以“虚拟地址空间”的方式进行分配的。每个进程访问的内存地址,都不是真实的物理内存的地址。
简单介绍虚拟地址空间:
这个图,就是每个进程都直接访问物理内存的地址。此时如果进程1,代码bug(比如数组下标越界、野指针),可能进程2的内存里的内存也被搞坏了。
这就对操作系统的“稳定性”产生了巨大的挑战。
站在这两个进程的角度看,他们的代码中操作的内存地址就是0x00-0xff这一段。这里访问的内存就会被操作系统自动映射到真实的物理内存上,但是进程自身感知不到实际的物理地址是啥。这时,遇到野指针就没事了。任何一个内存操作,都通过页表来翻译一下。如果遇到野指针,0x2ff,拿着这个地址,发现页表上就没有这个地址,无法翻译,也就无法真正的修改物理内存,也就不会对别的进程的内存数据造成干扰。
一个进程无法直接干预另一个进程的内存内容,“进程的独立性”,“每一个进程有自己独立的地址内容”,大大提升了操作系统的“稳定性”。
5、进程间通信(Inter Process Communication)
有时候,需要进程之间进行交互,互相配合。如果每一个进程直接访问物理内存,其实是没有隔离性,也就不需要进程通信,进程1直接把算好的结果,写到进程2的内存就行,那跟入室抢劫,没啥区别。
所谓进程间通信,就是在隔离性的前提霞,找一个公共的区域,让两个进程借助这个区域来完成数据交换。就是在隔离的前提下,做了一个小小的妥协~
操作系统提供的进程间通信具体实现方式比较多,有很多种:管道、消息队列、共享内存、信号……
在Java圈子里,主要使用文件,socket这两种方式来完成进程通信。
6、线程
进程,是比较“重量的”,速度慢、消耗资源多。
创建一个进程,成本比较高。销毁一个进程,成本也比较高。调度一个进程,成本也比较高,多进程编程可以解决并发编程的问题,但不是一个高效的选择。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
Nyo-1715584592785)]
[外链图片转存中…(img-NnqmfJLH-1715584592785)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新