操作系统

Operating System,OS,人类对机器电算机赋予的灵魂。这部分稍微有点深度,你忍一下。

管理硬件,协调软件。为软件承担基础的运行环境,为用户提供交互操作入口。

在没有系统的日子

计算机很早就被设计出来了,那时候的人们像个机器一样为纸带打孔传递给机器处理固定的流程,像计算器那样拨弄着加减乘除。

后来,升级为了 批处理作业系统,可以递交作业任务,逐个执行。而输入输出也多了磁带,打印机等。

再后来,有了一个机器分多个终端出来供多人同时使用的分时系统。

最后,进化出现代化的操作系统。Unix,Linux,Mac,Dos,Windows。

80年代,互联网也诞生了。

电脑进万家在中国就是千禧年之后的事情了。

单片机,嵌入式佬自己的主子,简单型的没有系统,将代码编出二进程文件写入(烧录)单片机的存储,开机即执行写入的程序。

系统构造

系统的设计原则很简单,在电路板上能跑,能够正确执行人给出的指令,

操作系统分两大层,系统层+用户层

image-20250513105138877

系统层负责基本的使用环境,会初始化和载入各个系统功能模块,提供程序运行的接口API

系统层包含一个内核层,内核相当于心脏。系统加载首先载入内核。

用户层则是对应着用户的控制管理,无论通过桌面应用还是终端命令。

在讲程序章节时,程序也分为系统应用和普通应用,和这个没关系,应用只属于程序运行。

系统类型

根据用途分类,桌面端,移动端,服务器端。

根据规模分类,有分布式、集群、边缘计算、云上系统、微型。

资源调度

CPU调度分配

CPU执行指令,经常看到CPU的参数有 n GHz,Hz是次/秒,G就是10的9次方,10亿,意思是CPU的一个核心可以处理 n x 10亿次指令。当然多核CPU就能再乘个核心数就是整个CPU的性能最大了。

CPU一般情况下不会满载,尤其是个人电脑,开机后,CPU的使用率应低于5%。CPU的性能决定了数据的处理速度,并不会干扰程序运行,如果使用率100%即满载了,就可能出现卡顿,加载响应慢的问题。

CPU满载的情况多数情况并不会持续,所以不必焦虑性能,够用即可,除非影响到自己的使用效率。

CPU把使用资源根据时间分割成极短的时间片,根据特定的调度算法,每个程序都可随机获得CPU使用。看上去程序同时运行,实际上一个核心某个时刻只能跑一个程序。

Tip

如果你的笔记本风扇在没有大型任务程序运行的情况下狂转,不妨打开任务管理器看看哪个程序在疯狂吃CPU资源。

内存调度分配

系统启动载入内核,基本服务后台等程序,会占用一部分的内存空间。

程序运行需要关注的是可用内存。如何跑软件太多,内存吃满了,就一定会卡顿。CPU满载的情况很少见,但内存吃满的情况却常有的事。在常用的办公软件运行时,保证内存使用率在90%以下,不够就考虑加内存吧。

一个程序运行后,会启动多个进程,每创建一个进程,系统都会为其分配要求的内存空间。

image-20250513112846052

这张图是我的windows电脑的任务运行状况图,可以看到msedge.exe(微软浏览器)占用了3.9%的内存空间,但这只是一个进程显示,实际有很多个msedge.exe子进程,浏览器开几个网页一般会占用1G左右的内存。

程序运行如果内存不足会怎么样?

程序可能会停止运行!

系统当发现内存空间不够分,会把已分配给某些程序的内存挤出来分,系统通过算法判断哪些进程在摸鱼(零耗CPU),然后就会把这些进程的内存数据存到硬盘上,腾空间给新的运行程序。如果摸鱼的进程被激活了,就会把其他摸鱼的给清了,如此往复,俗名内存交换,硬盘上存内存数据的空间也叫虚拟内存、交换空间。硬盘的读写性能相对于内存太慢,故满载卡顿。

节省内存

系统没那么聪明,会尽可能的满足程序的要求,中国人开发的软件也可能不会注重内存的消耗,内存优化是一门艺术。

尽量减少更新,随着使用软件的升级,可能增加了更多的服务,而这些服务一旦在后台驻留,必然要增加更多的内存。对于程序,不必要的功能选项可以关闭以节省内存使用。

对于在后台的软件,不常用的就禁止开机自启动,并且用完即退。

最后发现一个真理,再怎么省都不如加钱升级内存。然而电脑厂商们很少考虑原装大内存(甚至连内存条都是焊死的),不然怎么换代更新啊。

系统权限

当普通应用需要访问隐私或者高级权限的文件夹或者修改系统级服务时,会向用户申请权限,用户需注意软件的安全合规性。

系统不是所有的权限都向用户开放,用户不应/谨慎修改(如通过一些黑魔法命令)去绕过系统的权限限制,否则后果自负。

路径与环境变量

文件路径file path,简称路径,指代一个资源的访问位置,由文件夹、文件、路径分隔符组成。

绝对路径,记录文件/文件夹的唯一确定位置信息,一个路径只能指代文件或文件夹。

在指定一个文件夹的路径时,可在最后附加文件路径分隔符(与文件区别)。

# Windows 绝对路径
C:\Windows\notepad.exe
D:\Download\github-repo-master\README.md
D:\Desktop\

# Mac & Linux 绝对路径表示
/etc/
/Users/mike/Desktop/love.jpg
/

根路径 /,这个在文件系统中处于最顶层的位置,一般只包含各个系统级的文件夹。

在命令行中,我们可以通过cd 文件夹路径 进入指定的文件夹,即是切换工作目录(当前程序或进程正在运行的目录)。

Windows还需要切换盘符,输入盘符(字母冒号)即可。PowerShell等程序也可兼容Unix风格路径解析。

pwd 命令可查看工作目录的绝对路径信息,程序的执行也会附带pwd信息。

在工作目录下,我们通常要操作当前文件夹下的文件和文件夹,如果使用绝对路径就显得冗长和繁琐。故使用相对路径,

相对路径,相对于某一位置的路径指引,引用介词为...

.,指代当前位置。

..,指代父级位置。

在这里我使用Unix风格的路径示例:

假如pwd为/home/steven/Code/algorithms/

相对路径 绝对路径
. /home/steven/Code/algorithms/
./class1_sort/bubble.c /home/steven/Code/algorithms/class1_sort/bubble.c
./class1_sort/./bubble.c /home/steven/Code/algorithms/class1_sort/bubble.c
.. /home/steven/Code/
../.. /home/steven/
../Videos/go_to_the_moon.av1 /home/steven/Videos/go_to_the_moon.av1
../../../../../.. /
  • 相对路径搞清楚相对点很重要,不同的相对点,同样的相对路径指定的路径信息可能不一样。
  • 合理的使用绝对路径和相对路径有助于作业项目转移以及存储分配。
  • 使用相对路径,可省略 ./或者.\.\多用于tab补全路径

~ 家目录,用户文件夹。操作系统创建用户后均会有对应的用户文件夹,用于存储用户个人的数据,~代指当前用户文件夹的路径,使用同相对路径。

错误的路径表示:

  • /home/userA/hello//world.txt – 重复出现 //
  • C:\D:\foo – 盘符错误
  • ./hello.txt/ – 文件后追加 /

文件通配符

*,代表任意长度的字符文本,

?,代表1个字符

[],匹配方括号内任意1字符。

用途:

  • cp /data/* ./data/
  • fd 2024-04-??.log

环境变量

在系统中,程序需要从系统中获取一些基本配置信息,或程序之间共享信息,因此有环境变量,由变量名和变量值组成。

  • 环境变量有系统层,用户层,应用层三种,优先级递增。系统层变量也称全局变量,所有的用户都可读取,用户层变量为用户个人所拥有,应用层变量为执行程序时,赋给运行程序的临时变量。

    如果系统层,用户层均定义了JAVA_HOME环境变量,那么以用户为优先,忽略系统层的JAVA_HOME变量。

  • 程序开始执行会获取所有的环境变量记录。

    Windows环境变量管理

    环境变量充当预定义了一些程序运行的基本设置。如这张图例的变量,多数定义了一些路径信息。

PATH变量

用于指定操作系统查找可执行文件的目录列表,当你在命令行中输入一个命令时,系统会根据 PATH 环境变量中列出的目录顺序去查找该命令对应的可执行文件。

  • 在Windows中的Path,编辑会看到有很多的路径,实际上它是一个用;分隔路径的文本。其中包含了%VAR%字样,这是对其他环境变量的引用。

  • Unix中使用PATH,我们在命令行可以通过 echo $PATH查看,可以看到它是用:分隔路径的文本。

确保在PATH中的文件夹都是存在的,不存在的目录有什么意义呢?

Warning

PATH环境变量非常重要,甚至影响程序的运行,修改PATH一定要确保PATH的语法正确,且包含基本的系统路径。

虚拟机与容器化技术

虚拟机,通过软件模拟的系统环境,与实体机环境隔离(可以文件系统互通)。

常见的虚拟机有VMWare、HyperV、WSL2、安卓模拟器、QEMU、Parallels Desktop

虚拟机一般是完备的系统环境,所以有独立的网卡等IO设备支持(也是模拟出来)。虚拟机的硬件模拟不能超过宿主机(虚拟机所依赖的实体机)。

宿主机一般通过网络通信与虚拟机进行程序间交互。(两台电脑之间通信的方式)

容器化技术

容器,container,指代满足功能服务的虚拟运行环境。虚拟机的性能开销比较大,每开一份虚拟机实例,都要初始化一份系统的内核层(完整的系统初始化)。容器化的技术即省去内核层的多开,共用宿主机环境的内核层,由于内核层与宿主机一样,故性能损耗极低,启动也快,近似等同于真机运行开销。

著名的容器技术布道者,Docker,后续独单开篇讲解。

Shell交互

可以不通过图形界面,纯命令行的方式操作管理系统。shell本意是壳,和系统的核 kernel 相呼应。

控制台,文本终端,命令行窗口一般都伴随着Shell的交互。

在Windows上,默认支持两种Shell,CMDPowerShell 缩写pwsh

在Linux上,默认的为Bash,亦有一些为sh

在Mac上,默认的为Zsh

我们通过终端与系统交互,均会有对应的初始化配置文件。

Poweshell默认的配置文件在个人用户的文档目录下的powershell文件夹。

bash 常用的为~/.bashrc

zsh 常用的为~/.zshrc

并行计算

通过同时执行多个计算任务来加速问题求解的计算范式。其核心思想是将大问题分解为多个小任务,并利用多个计算资源(如多核CPU、GPU、集群等)协同处理,从而显著提升效率。

同步&异步

同步的操作具有先后顺序性,常规的程序运行皆是同步操作。

异步的操作,具有任务队列,队列内的任务可以并行处理,并通过事件机制定义任务执行完后的操作。

常见的系统级错误

程序运行时触发的系统机制错误。

内存段错误

Segmentation Fault,段错误的本质是 程序试图突破操作系统的内存保护边界,触发原因:

  • 访问无效内存地址(如NULL指针解引用)
  • 写入只读内存(如修改代码段或字符串常量)
  • 栈溢出(递归过深或局部变量过大)
  • 堆内存越界malloc/free操作不当)
  • 多线程竞争(未同步的共享内存访问)

线程进程死锁

进程之间互相抢资源,互相限制对方运行。三个和尚没水喝。

内存泄露

一些程序,由于代码bug,导致会向系统多次的请求分配资源并且不主动释放掉,导内存占用逐渐变大。

磁盘空间不足

硬盘没剩余可用空间了,系统不能写入数据到硬盘。

权限不满足

无执行操作的对应的访问权限。