✏️作者:银河罐头
📋系列专栏:JavaEE
🌲“种一棵树最好的时间是十年前,其次是现在”
目录
- 操作系统介绍
- 操作系统的定位
- 进程
- 进程控制块
- 内存管理
- 进程间通信
- 思维导图总结
操作系统介绍
操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、
Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等
操作系统是一个软件,搞管理的软件。
1.对下,要管理硬件设备
2.对上,要给软件提供稳定的运行环境
操作系统是软件,硬件,用户之间交互的媒介
PC端:Windows,Linux,Mac
移动端:Android,IOS
- Windows
最熟悉的操作系统的是Windows.(使用门槛比较低)
Windows的发展:Windows98,2000,xp,vista,win7,win10,win11
- Linux
Linux特别适合于进行开发和部署
应用范围:
1.服务器(MySQL)
2.嵌入式设备(在设备中内嵌了一个计算机)
(举例:冰箱,洗衣机,投影仪,空调…)(可编程的)
3.移动端设备(手机)
- Mac
和Linux比较接近
- Android
本质上也是Linux
- 鸿蒙
本质上也是IOS
操作系统的定位
-
硬件设备:键盘,鼠标,内存,硬盘,风扇,电源。(电脑后盖打开看到的都是硬件设备)
-
驱动程序:(JDBC的驱动程序就是让JDBC和各个数据库厂商的API进行适配)
硬件设备种类繁多,厂商各异。硬件厂商在开发硬件的同时会提供驱动,电脑装了驱动才能让系统正确的识别硬件设备。
- 操作系统内核:操作系统的核心功能,管理。
- 系统调用:操作系统给应用程序提供的API。(比如有个程序想操作一下硬件设备,就需要通过系统调用,把操作命令告诉给系统内核,内核调用驱动程序,进一步的操作硬件设备)
举例:在显示器上打印helloworld应用程序通过系统调用,通知操作系统内内核,内核通过驱动程序找到显示器或显卡这个驱动,然后通过显卡把数据渲染到界面上
- 应用程序:举例Java程序。
进程
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
如果不是正在运行的程序就不是进程。
ctrl+alt+delete=>任务管理器
进程(process)也叫做任务(task)
句柄(handler)
系统中包括很多软件资源(进程是一种软件资源),写代码需要用到一些软件资源,软件资源在操作系统内核里。在应用程序的代码中不方便操作。
句柄相当于一个遥控器(简单的整数/编号),通过系统调用借助这个句柄就可以操作软件资源了
(指针也可以视为是句柄,不过它对应的是内存资源)
每个进程都对应一些资源
硬盘和网络统称为IO,硬盘和网络有各自的读写带宽
衡量IO快慢就会用带宽这个词,带宽是一秒能写多少字节
MB:这里的B是Byte
Mbps:这里的b是bit
影响电脑卡的原因是进程多,而不是占用硬盘内存多
进程是操作系统资源分配的基本单位
进程是一个重要的软件资源,由操作系统内核管理。这个管理是描述(属性特征)+组织(用数据结构把多个这样的基本单位组织起来)
- 描述
使用结构体(C语言)来描述进程属性(操作系统基本上都是C/C++写的)
用来描述进程的这个结构体叫做PCB(Process Control Block)进程控制块。
- 组织
通过双向链表把多个PCB组织起来(并不是一个单纯的双向链表)
创建一个进程,本质上是创建一个PCB结构体对象,把它插入到链表中
销毁一个进程,本质上是把链表的PCB结点删除
任务管理器查看进程列表,就是遍历PCB链表
进程控制块
PCB里有哪些描述了进程的特征:
- 1.pid进程的身份标识符(唯一的数字)
- 2.内存指针
指向了自己的内存是哪些
- 3.文件描述符表
硬盘上的文件等其他资源
内存指针和文件描述符表描述了进程持有哪些硬件资源
硬件资源,内存,硬盘,网卡都好分配,而CPU不好分配。
设备管理器=>处理器
8核,16线程。一个CPU分为8个核心,每个核心又能一个顶俩(超线程技术),这种情况视为16核
进程有上百个,而CPU就几个,不够分配。
这些进程是希望能够"同时运行",“分时复用”
并行:微观上同一时刻,两个核心上的进程是同时执行的
并发:微观上同一时刻,一个核心上只能运行一个进程,但是它能够对进程进行快速的切换。
只要切换速度足够快(2.4GHz,每秒执行24亿条指令),宏观上人是感知不到的。看起来这几个进程好像是同时运行的。
并行和并发是内核负责处理的,但是应用程序感知不到,因此把并行和并发统称为并发。(除非显式声明,否则提到并发都是并行+并发)
操作系统中有一个重要的模块 调度器,就负责让有限的CPU资源调度执行这么多进程。
- 4.进程调度相关的属性
1)进程的状态
就绪状态: 进程随时准备好了去CPU上执行
运行状态
阻塞状态: 短时间内无法到CPU上执行,比如进程在进行密集的IO操作,读写数据
很多操作系统不会明确区分就绪和运行状态
2)优先级
3)上下文
操作系统在进行进程切换的时候,就需要把进程执行的"中间状态"记录下来,保存好。下次这个进程再次运行的时候,就可以恢复上次的状态好继续向下执行。
“存档”,“读档”
上下文本质上就是你存档的内容,进程的上下文就是CPU中各个寄存器的值。(寄存器是CPU中内置的存储数据的模块,保存的就是程序运行过程中的中间结果)
保存上下文,就是把这些CPU寄存器的值,记录保存到内存(PCB)中。
恢复上下文,就是把内存中这些CPU寄存器的值恢复回去。
4)记账信息
操作系统统计每个进程在CPU上占用的时间和执行的指令数目,根据这个,来决定下一阶段如何调度。
内存管理
- 虚拟地址空间:程序中所获取到的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象,虚拟出的地址。
C语言里的指针提到的内存地址,就是虚拟的内存地址,并非真实的物理内存地址。
内存可以想象是一个大走廊,有很多房间,每个房间大小是1Byte,每个房间有个编号,从0开始依次累加
内存编号就是地址,这个地址是物理地址
内存有个特性:
随机访问:访问内存上任意地址的数据,速度都极快,时间上差不多
正是这个特点,造就了数组取下标操作是O(1)
为了避免这种情况,
针对进程使用的内存空间,进行"隔离",引入了虚拟地址空间。代码里不再使用真实的物理地址,而是使用虚拟的地址。由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。
MMU这个硬件设备能够让转换更快一点,很多时候集成在CPU里
CE是一个类似于"黑客"工具,功能是改另一个进程里的数据。
直接通过C里的指针操作,是无法针对另一个进程的内存进行修改的。
但是操作系统给我们提供了一些特殊的系统调用,通过这些系统调用我们就可以手动的操作另一个进程的内存数据了。
虚拟地址空间就是避免进程之间相互产生影响。
进程间通信
有时候进程之间需要进行数据的交互。需要实现一个多个进程都能访问到的"公共空间",基于这个公共空间来进行交互数据即可。
举例:外卖的"无接触配送"
外卖员把外卖放到约定好的位置,然后顾客去这个位置取外卖,两人没有接触,但是实现了外卖交接。
这里的通信方式有很多具体的体现方式
-
管道
-
共享内存
-
文件
-
网络
-
信号量
-
信号