一、💛
操作系统(浅浅概念):是用来搞管理软件的
1.对下,要管理各种硬件设备
2.对上,要给应用程序提供一个稳定的运行环境
二、💙
进程:正在运行的程序,假如程序没有运行就不叫程序,同一个程序运行多次,假如你开了三个QQ,那也就是产生了三个进程。
我们说的程序往往是可执行文件(exe)只是硬盘中的一个静态的东西(只有你双击程序,此时操作系统,就会把可执行文件的数据和指令,加载到内存中,并且让cpu去执行这里的指令,完成一系列相关工作,运行起来(动态的)进程。
进程能够干活,说明进程能够消耗一定的资源,可执行程序只是占据了硬盘空间,而进程会消耗cpu资源,内存资源,硬盘,网路带宽。
🌚这里我就要说一手,常常兄弟们会想一个问题,我假如下那种小电影软件 🌚,但是不安装就是玩,会不会有病毒啥的,只要他不成为进程,就没有任何问题。
♓️ 进程也是系统分配硬件资源的基本单位(如同发物资,按着一家一户这么发)
一台运行的计算机,大概率包含很多进程,一旦东西多了,就要考虑管理
在数量多的情况下:1.先描述:会使用一个结构体(C语言里面的,如同java中低配的类,没有方法啥的,操作系统主要是c/c++来实现)来记录进程里面的各个属性
这个结构体叫做PCB<-(进程控制块)💖 💖 💖
2.组织:会使用一系列数据结构(多为双向链表),把多个进程进行一个有效的组织,随时去遍历,查找,汇总数据
一旦使用双向链表这样的方式来进行组织的时候:
(a)查看进程的链表本质就是遍历该链表
(b)创建一个进程,就是创建一个PCB结构体,并且插入到链表上。
(c)销毁一个进程,就是把这个PCB结构体从链表中删除。
三、💚
PCB中大概有哪些消息:
1.♈️PID进程的标识,同一时刻,每个进程的PID一定都是不同的(正是我们之前在MySQL使用中遇到的没有PID的文件。
2.♉️内存指针:
表示了该进程,对应的内存资源是如何的
内存资源中要有什么捏?-最主要存储的就是从exe可执行文件中可载过来的指令和数据
指令:二进制的指令,都是程序猿开发这个程序的时候,最终编译生成的结果,也就是程序猿写的代码逻辑(进一步的再去交给cpu执行)
数据:执行的这些指令,会依赖一些数据
3.♊️文件描述表:
和硬盘资源有关了,硬盘是硬件,应用程序一般没法直接接触到硬件层 ,实际操作系统抽象成文件这样的概念,程序操作的是文件,文件实际上是存储在硬盘上的,每个进程就会有一个文件描述符来记录,当前这个进程正在使用哪些文件
也就是说 程序->文件->硬盘
操作系统打开一个文件,就会产生一个文件描述符(就像文件的身份标识一样,当然只在进程内部生效啦,)同时会使用文件描述表(类似于数组),把文件描述符组织起来。
补充:进程需要在cpu上执行指令,每个进程要是想完成任务,都要在cpu上一样执行
把进程比喻成演员,那么cpu就是表演场地,早期的cpu只有一个舞台,一个时间上只允许一个剧组在上面拍戏。
但是现在cpu 8核 16核···但是我们要处理的事务几十个,上百个
♐️并行:同一时刻两个进程,同时运行在两个cpu的逻辑核心上
♒️并发:两个进程,在同一个舞台上,轮着上,由于cpu切换进程极快,围观上,这俩进程串行执行的,宏观上,看起来,他俩就是同时进行的~
操作系统,在调度这些进程的时候,可能是按照并行的方式来调度,也可能是按照并发的方式来调度,~在应用程序这一层,感知不到的! (系统中内核能感知到)
由于感知不到哪种方式调度,这两种调度方式,宏观上体现效果都是一样的,通常用并发代替并发和并行(面试官说啥是啥,舔就完事了)
4. ♋️PCB中关于进程调度相关的属性(这些属性也就描述了进程对应的cpu资源使用情况)
(1)♌️状态 就绪状态—— 一个进程已经随时做好在cpu上执行的准备,)
阻塞状态/睡眠状态: 因为某些原因无法准备中。
状态之间都是相互转化的,实际上进程的状态有很多种,但是这两种事最重要的。
(2)♍️优先级
系统给进程进行调度的时候,也不完全是公平的,也会根据优先级不同,来决定时间分配的权衡,就可以把系统资源调配给更重要的进程上了。(例子:有钱>帅>舔)
(3)♎️ 上下文
这些进程是轮着上的,一次运行不完,就需要保证下次cpu运行的时候,能够从上次运行到的位置,继续往后运行。(游戏存档,读档)
(4)♏️记账信息:相当于统计信息
会统计每个进程,在cpu上执行了多久,执行了多少指令了,是对于进程调度的一个兜底。
上述这些属性,主要是有一个直观认识->认识进程调度大概是怎样的,后续编码有一定影响,每个进程,都需要一定的内存资源。
按照上述直接分配物理内存的模型,此时假如一个指针越界指向其他位置,很可能会影响别的进程的执行,非常影响系统的稳定性。
后来操作系统引入了“虚拟地址空间”这样的概念,有效解决上述的问题
⛎ 虚拟地址,并非物理内存中真实存在的地址,而只是在该进程内存在不同的进程,可以存相同的虚拟地址,但实际上对应得到的是不同的物理地址,虚拟地址和物理地址,操作系统可以灵活切换
🔯这样的设定之后,每个进程的有效的虚拟地址都是固定范围,进程使用虚拟地址的内存,都需要操作系统进行转换成物理地址,这个转换的过程中,就可以针对虚拟地址是否有效,做出校验
虚拟地址,和物理地址的区别就像是
1班有王强
2班有王强,区分这两个王强,要是区分就要看,年纪花名册(物理地址呗)
虚拟空间的加持下,进程有了独立性,每个进程有自己的虚拟空间->一个进程无法直接访问,或者修改其他进程,虚拟空间,独化了系统的独立性,
假如也要进程之间产生写配合,联系
进程间通信(进程隔离性的基础上,开个口子有限制的相互影响),在进程隔离之间开个口,本质相同,找一个公共区域(就像是做小区核酸,)借助公共区域来完成数据的交换
(以后介绍,本章先到这里)
最近会更新一些基本的知识,和算法,打算冲一下蓝桥杯加油啦