文章目录
- 一、计算机本质理解
- 二、操作系统设计原则
- 三、进程状态理解
- 四、命令行参数理解
一、计算机本质理解
1.本质:计算机的本质是为人类服务,计算机要服务于人,那么就需要实体,也就是硬件,
而该实体(硬件)是通过电信号做出不同的行为,从而服务于人
2.电信号:可以理解为计算机硬件中是由一堆小格子组成,有电=1,没电=0,按顺序排好
就是电信号,所以计算机是二进制,计算机本质上,就是对二进制电信号进行搬运、计算、
转换与控制的系统
3.为了正常工作,计算机必须具备存储电信号的能力,这种能力分为两类:
(1). 运行时临时存储电信号------内存
(2). 长期持久存储电信号------硬盘
二、操作系统设计原则
1. 内核能简单就绝不复杂,追求最小必要逻辑内核只做管理软硬件所必须的事情,不做任
何多余、花哨、可省略的操作。
2.操作系统设计时,只设计最简单,最原子,最通用的操作,目的是为了简化操作系统和
方便维护复用,至于比怎么将这些原子整合起来成为一个更复杂的操作,这是上层需要做
的,上层愿意怎么组织怎么封装就怎么干,操作系统只搭建原子操作
3.用户态能做的事,绝对不放到内核态
内核只保留特权级才能完成的核心机制,
解析、封装、格式处理这类策略性工作,全部丢给用户态。
4. 根本原因:
操作系统本身任务极重,要同时管理 CPU、内存、中断、外设,还要服务成百上千个进
程,内核必须轻量、高效、稳定,任何多余逻辑都会放大全局开销,拖累整个系统。
5. 分时系统的特性进一步支持这种设计:
进程在系统调用返回后,并不需要立刻处理结果,
用户态完全可以在自己的时间片内、按自己的节奏去解析数据,
不抢占内核资源,整体效率更高。
6. 历史接口遗留问题:
很多早期设计(如 status 打包)源于当年硬件资源紧张,
现代内核内部已经优化重构,但对外接口不敢改。
工业级软件生态庞大,旧程序、旧库、旧工具链极多,
接口一旦变动,代价不可接受,因此只能保留兼容,留下看似冗余的设计。
三、进程状态理解
1. 进程要执行,必须持续使用各种硬件资源(CPU、内存、磁盘、键盘、网络等)。
2. 硬件数量有限,进程却很多,因此 OS 必须对进程进行管理与排队。
3. 每个硬件都对应自己的等待队列,按优先级、先后顺序组织进程。
4. 为了统一描述进程"当前在等哪个硬件、能不能上 CPU",操作系统抽象出进程状态。
5. 正在占用/竞争 CPU → 对应运行相关状态;
正在等待 CPU 之外的其他硬件 → 对应阻塞状态。
6. 之所以在 PCB 中专门记录状态,是因为操作系统需要随时快速判断:
这个进程现在需要什么资源、处于什么阶段,而不必每次都去遍历各个硬件队列。
进程执行依赖各类硬件资源,而硬件具有独占性与稀缺性,因此操作系统必须对请求同一硬
件的进程进行排队管理。
为了统一标识进程当前的资源需求与执行条件,内核抽象出进程状态:
进程当前竞争或占用 CPU,称为运行/就绪状态;
进程因等待 CPU 以外的硬件资源(I/O、设备、数据等)而无法执行,称为阻塞状态。
硬件队列用于事件触发时批量唤醒进程,而 PCB 中的状态字段用于操作系统随时查询进程
当前的资源依赖情况,二者共同完成进程的并发管理。
四、命令行参数理解
1.理解:
在命令行操作中,一个命令拥有多种功能(因为很多功能本身就是一个功能的延伸),目的是
为了实现一个命令可以有多种功能,首先命令是特定路径下的可执行二进制文件,也就是程
序,目的更加清楚了就是为了可以让程序自动分辨用户输入来执行不同的子功能,用户的输
入是交给bash/系统的,程序也是bash/系统来启动的,那么就可以通过bash/系统将用户输
入传递过程序,那么程序就需要接收,而程序也是被调用的,也就是程序的main函数是被
调用的,main函数是每一个程序都拥有的所以就可以通过bash/系统传递给程序的main函
数,main函数使用参数来接收,所以main函数的参数称作命令行参数
2.解析用户输入的方式:
将用户输入的一个长字符串以空格为分隔符即使是多个空格人为是一个空格为分隔符,划分
为一个个子串一个字符也是字符串,然后创建一个指针数组,数组的每一个元素都是一个
char*指针,然后每一个元素指向一个子串
3.细节:
(1).命令行参数 至少是1,argc>=1,argv[0]一定会有元素,指向到就是程序名
(2).选项,以空格为分隔符,一个字符,也是字符串
(3).argc个,argv[argc-1]是最后一个,argv[argc]==NULL
(4).写法:
int main(int argc,char* argv[])