一、冯诺依曼体系结构(了解即可)
1. 核心组成
-
输入单元:键盘、鼠标、扫描仪等,负责向系统输入数据。
-
中央处理器(CPU):包含运算器和控制器,是系统运算和控制核心。
-
存储器:此处特指内存,是数据交互的核心枢纽。
-
输出单元:显示器、打印机等,负责输出系统处理结果。
2. 关键原则
-
CPU 仅能直接读写内存,无法直接访问外设(数据层面,不考虑缓存)。
-
外设(输入/输出设备)需通过内存完成数据的输入或输出,所有设备仅能直接与内存交互。
3. 数据流动实例(QQ聊天/文件传输)
-
聊天场景:用户通过键盘(输入设备)输入消息 → 数据写入内存 → CPU 处理后将消息通过内存发送至网卡(外设)→ 网络传输至对方 → 对方网卡接收数据写入内存 → CPU 处理后通过显示器(输出设备)展示。
-
文件传输场景:本地文件从磁盘(外设)读入内存 → CPU 处理后通过内存发送至网卡 → 网络传输 → 对方网卡接收并写入内存 → 最终写入对方磁盘(外设)。
二、操作系统(OS)(了解即可)
1. 概念
-
狭义:内核(进程管理、内存管理、文件管理、驱动管理)。
-
广义:内核 + 外壳shell、glibc、原生库、预装系统级软件等。
2. 设计目的
-
对下:与硬件交互,管理所有软硬件资源。
-
对上:为应用程序提供良好的执行环境。
3. 核心功能:“管理”
-
描述被管理对象:通过 struct 结构体封装对象属性。
-
组织被管理对象:通过链表或其他高效数据结构整合管理。
4. 系统调用与库函数
-
系统调用:OS 暴露的底层接口,功能基础,供上层开发使用。
-
库函数:基于系统调用封装的高层接口,降低使用门槛,支持二次开发。
三、进程
1. 基本概念
-
课本定义:程序的一个执行实例,正在执行的程序。
-
内核观点:分配系统资源(CPU时间、内存)的实体。
-
本质:进程 = 内核数据结构(task_struct) + 程序代码和数据。
2. 进程描述 - PCB
-
定义:进程控制块(PCB),是进程属性的集合,Linux 下具体实现为 task_struct 结构体,装载于内存中。
-
task_struct 核心内容:
-
标识符:唯一标识进程,区分其他进程。
-
状态:任务状态、退出代码、退出信号等。
-
优先级:决定进程获取 CPU 资源的先后顺序。
-
程序计数器:存储下一条待执行指令的地址。
-
内存指针:指向程序代码、进程数据及共享内存块。
-
上下文数据:进程执行时 CPU 寄存器中的数据。
-
I/O 状态信息:I/O 请求、分配的 I/O 设备及使用的文件列表。
-
记账信息:CPU 占用时间、时钟数等。
-
-
组织方式:所有进程的 task_struct 以双链表形式存在内核中。
3. 进程相关操作
(1)查看进程
-
内核层面:通过 /proc 系统文件夹,如查看 PID 为 1 的进程信息:/proc/1。
-
用户层面:使用 top、ps 命令(如 ps aux、ps axj)。
(2)获取进程标识符
-
进程 ID(PID):进程唯一标识,通过 getpid() 函数获取。
-
父进程 ID(PPID):创建当前进程的父进程标识,通过 getppid() 函数获取。
(3)创建进程 - fork 函数
-
核心特性:
-
有两个返回值:父进程返回子进程 PID,子进程返回 0,出错返回 -1。
-
父子进程代码共享,数据私有(采用写时拷贝机制)。
-
-
常见用法:通过 if-else 分流,实现父子进程执行不同逻辑。
4. 进程状态
(1)Linux 内核定义的状态(task_state_array)
|
状态标识 |
状态名称 |
含义 |
|
R |
运行状态 |
进程正在运行或在运行队列中等待 CPU |
|
S |
睡眠状态 |
可中断睡眠,等待事件完成 |
|
D |
磁盘休眠状态 |
不可中断睡眠,等待 IO 结束 |
|
T |
停止状态 |
接收 SIGSTOP 信号暂停,可通过 SIGCONT 信号恢复 |
|
t |
追踪停止状态 |
被 ptrace 系统调用追踪时的状态 |
|
X |
死亡状态 |
进程退出后的返回状态,不显示在任务列表 |
|
Z |
僵尸状态 |
子进程退出,父进程未读取其退出代码时的状态 |
(2)特殊状态详解
-
僵尸进程(Z):
-
形成原因:子进程退出,父进程未通过 wait() 等系统调用读取其退出代码。
-
危害:子进程 PCB 持续占用内存,大量僵尸进程会导致内存泄漏。
-
-
孤儿进程:
-
形成原因:父进程提前退出,子进程仍在运行。
-
处理机制:孤儿进程被 1 号 init/systemd 系统进程领养,由其回收资源。
-
5. 进程优先级
(1)基本概念
-
定义:CPU 资源分配的先后顺序,优先级高的进程优先执行。
-
核心作用:改善多任务环境下的系统性能,可将进程绑定至指定 CPU 运行。
(2)PRI 与 NI
-
PRI(进程优先级):值越小,优先级越高。
-
NI(nice 值):进程优先级修正值,取值范围 -20~19(共 40 级)-> PRI取值范围 60~99。
-
关系:PRI(new) = PRI(old) + NI,NI 为负时提升优先级,为正时降低优先级 (PRI(old)为常数,一般为80)。
(3)优先级调整方式
-
命令:top(进入后按 r 调整)、nice、renice。
-
系统函数:getpriority()(获取优先级)、setpriority()(设置优先级)。
(4)补充概念
-
竞争性:进程数量远多于 CPU 资源,进程间竞争资源,优先级决定竞争能力。
-
独立性:多进程运行时独享资源,互不干扰。
-
并行:多个进程在多个 CPU 上同时运行。
-
并发:多个进程在一个 CPU 上通过切换机制,在一段时间内均得以推进。
6. 进程切换与调度
(1)CPU 上下文切换
-
定义:多任务内核切换任务时,保存当前进程的 CPU 寄存器数据(上下文)至进程堆栈,加载下一个进程的上下文数据至寄存器,恢复其运行的过程。
-
核心目的:保证进程切换后可继续按原有逻辑执行。
-
时间片:分时操作系统中为进程分配的 CPU 运行时间,时间片耗尽则进程被切换。
(2)Linux 2.6 内核 O(1) 调度算法
-
核心结构:每个 CPU 对应一个 runqueue(运行队列),包含 active(活动队列)和 expired(过期队列),均为 prio_array 结构。
-
队列组成:
-
普通优先级:100~139(与 nice 值对应)。
-
实时优先级:0~99。
-
queue[140]:按优先级存储进程的队列,下标即优先级,同优先级按 FIFO 调度。
-
bitmap[5]:用 5×32 位标识队列是否为空,提升非空队列查找效率。
-
-
调度逻辑:
-
active 队列存储时间片未耗尽的进程,expired 队列存储时间片耗尽的进程。
-
调度时从 active 队列的最高优先级非空队列中选取首个进程执行。
-
当 active 队列为空时,交换 active 与 expired 指针,重新计算过期队列中进程的时间片。
-
-
算法优势:查找待调度进程的时间复杂度为 O(1),不随进程数量增加而变化。
2.4&spm=1001.2101.3001.5002&articleId=158743826&d=1&t=3&u=3d4191e503994f8ead6f452e36734e4d)
2272

被折叠的 条评论
为什么被折叠?



