Linux学习笔记(冯诺依曼体系结构,操作系统,进程)2.4

一、冯诺依曼体系结构(了解即可)

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),不随进程数量增加而变化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值