日升时奋斗,日落时自省
目录
一、操作系统
1、概念
操作系统是管理计算机硬件与软件资源的计算机程序,实际就是一个软件的管理性的软件
不是针对一方面的管理,电脑运转不仅仅基于程序,还有硬件设备
对下 :要管理硬件设备
对上:要给软件提供稳定的运行环境
所以 操作系统是软件 和 硬件用户之间交互媒介
对上为什么是硬件,对下为什么是软件 ,怎么理解,如图下理解:
提及到操作系统,最常见,与熟悉的操作系统就是Windows 系统
Windows系统又有很多版本 98,2000 ,px ,win7, win10 ,win11,。
操作系统 有多种,Windows 更像是针对普通用户使用的
Linux更专注于 程序员使用
Mac 也是苹果电脑的 操作系统
手机操作系统 :Andorra (本质上也是Linux)
2、进程
程序躺在文件里面,就是个程序
你双击运行以后就是一个进程(process)
可以启动一下当前的任务管理器,为啥看进程 要看任务管理器
任务(task)就是进程(process)
任务管理器有几个应用程序启动就是几个程序 ,进程是操作系统进行资源分配的基本单位,这时候你就不会认为,你电脑卡跟你的硬盘有什么关系了,开的程序多了,自然就卡,进程就自然就占满了,衡量 IO快慢就会用到带宽 带宽是个啥 (图来解释)
进程是做什么: 软件资源
刚刚提到 操作系统内核 是会负责管理 跑起来程序的就是进程
管理: 描述 +组织
2.1、描述:
解释:使用结构体 (C语言 的结构体) 来描述进程属性
操作系统上 基本都是C或者C++
这个结构体 在进程里起了一个特殊的 叫法 “PCB” (进程控制块)
注: 这里就是一个名字,被大佬们起来的,不好记 知道它是 用来描述进程的就行
结构体 里描述进程的那些特性
(1)pid 进程的身份标识符( 唯一数字)
(2)内存指针 指向 说自己的 内存有哪些
(3)文件描述附表 硬盘上的文件资源 【(2)(3)描述了进程的 硬件资源 】
(4)进程调度相关的属性
注:不要认为理论知识没有用, 原来 我也这么想 ,后来发现, 吃亏的很,对代码的理解性很低
第四条 进程调度 下面包含的比较多,单独解释:
并发与并行 一般统称为 并发
并发: 这里举一个例子:
相当于一个电脑同时开启了 游戏 ,QQ音乐, 等多个进程,一个核心只能运行一个进程,但是他们每个运行一下,先运行QQ音乐一下,再运行游戏一下,再运行一下同时开启的其他程序,切换速度足够快,人并不能感知到他们是一个一个运行,默认为是同时运行(是不太好理解)
对并发的理解:就像灯泡一样,我在学习物理的时候,有提及过灯泡,灯泡闪烁不是一直的,是有一定的频率,但是这个频率太高了,人眼无法捕捉到熄灭的那一下,也就被默认为灯泡在开启时是常亮的
进程调度相关的属性:有哪些
2.2、组织
解释:通过双向链表 ,把PCB连接在一起(以后再进程提到结构体就会用PCB来代替)
创建一个 进程,本质上就是创建一个 PCB 这样的结构体对象,把它出入到链表中。(开销较大)
销毁一个 进程, 本质上就是删除一个 PCB 这样的结构体 对象,删除一个节点(开销较大)
而任务管理器就 是遍历整个链表
注:这里的链表是真的就是我们 代码里面的那个简单的双链表就能实现的,实现功能比较复杂
3、内存管理
虚拟地址空间(增加隔离性)
程序所获得的的内存地址, 并不是真的物理地址,虚拟一个临时的存储空间(有点抽象)
C语言的指针 内存地址就是虚拟的内存地址
那先不了解这个虚拟地址,如果只用物理地址会带来什么缺陷
物理地址:这个地址好理解吧,硬件设备就是物理地址,硬盘里分好的文件路径,就是物理地址,真实存在的
虚拟地址:相当于临时帮你管理这部分地址,再由我们硬件设备进行操作 将虚拟地址转化为物理地址,将其隔离,
有虚拟地址时:
4、进程间通信(相互配合)
进程只具有隔离性是不行的,会引入另一个问题
有时候,确实进程之间,需要进行数据进行交互(相互配合)
隔离性 :将进程进行地址上的隔离
进程通信:与隔离性又很相仿,利用一个“共享空间”,基于这个空间 进行数据交换
这里公共空间 基于: 文件、 网络,共享内存等
公共空间理解:实例:一个家庭有多个孩子,孩子的父母对每个孩子都很好,小孩子之间有点小矛盾了,都会去找父母作为桥梁来解决,这里的父母就是孩子们公共空间。
5、线程
进程是为了解决 “并发编程”的问题,CPU虽然已经在多核时代,但是CPU想要再提高程序执行速度,就不能只停留在精进CPU了,当前的CPU很难再进一步精进,需要利用好CPU的多核资源,不是 CPU核心多了,程序就一下能跑的很快,要快前提是能都利用上
多进程就解决了刚刚的问题,可以调度CPU多核资源
进程提高了速度,但是也有缺点 :消耗资源太多了,开销比较大(创建、销毁、调度)
进程就是 难在了“ 资源分配/回收” (重量级)
线程就是为了解决进程的问题 ,线程也叫做 “轻量级进程”;
解决了并发编程 开销大的问题(创建 、销毁、调度)更快
如何轻的 :怎么做到轻量级 (把申请资源/释放资源的操作给省下了)
实例解释:还记得 现在的 CPU嘛 多核 多线程 举过一个例子:
8核 16线程 (超线程技术)
一个核 操纵一个进程 同时进行,一个进程下有多个线程
(1)进程开销大解释:
(2)涉及多线程之后(解决资源开销问题)
图解:可以看出 进程是包含线程的
一个进程是可以有多个线程的,可以只有一个线程 但是不能没有线程
只有启动第一个线程的时候开销比较大,后序的就省事情了
为什么第一个线程开销大:因为第一个线程 需要创建一个进程后才会有第一个线程
同一个进程中多个线程之间,公用了进程的同一份资源(主要是内存 和文件描述符表)
(1)内存 :同一个进程中的其中一个线程创建一个对象 在同一个进程的其他线程都可以直接使用
(2)文件描述符表:同一个进程中的其中一个线程打开的文件 在同一个进程的其他线程都可以直接使用
如果每个进程上都有多个线程,每个线程都是独立在CPU上调度的 (操作系统是以线程为单位进行调度的,所以调度只关心线程,不关心进程)
每个线程都是独立的,都有自己的执行逻辑(执行流)
注:一个进程有多个线程,但是一个线程是不能在多个进程中
前面说到进程是将多个PCB(控制块)通过双链表进行连接成的,这里的线程也是通过一个PCB来描述的
那线程是不是越多越好,其实不是,图解一下:
线程模型:资源共享是好处也是安全隐患, 多线程争抢同一个资源(同一个变量)易触发安全问题
进程模型:天然是资源隔离的:不容易触发,进行通信的时候,多个进程访问同一个资源,可能出现问题
线程没有进程安全,但是这个线程安全问题当前也不用担心,能保护的嘛。
注:多线程编程,本身关于线程的操作,操作系统提供的API
6、进程与线程的区别
数据共享、同步:(该方面基本是两者个有优势)
(1)多进程:数据隔离 ,共享复杂,同步简单
(2)多线程:共享同一个进程的数据,共享简单,同步复杂
内存 ,CPU,创建、销毁、调度多线程更占优势
占内存少,CPU利用率高,创建、销毁、调度更快
编程调试、可靠性进程更占优势
优势:(1)进程:编程简单,调试简单,进程隔离,不会相互影响(安全)
缺点:(2)线程:调试、编程复杂,一个线程崩塌可能会导致多线程瘫痪(不安全)