马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
进程这个概念在初学时最容易停在一句「正在运行的程序」上,但真正理解进程要往上追一层:为什么程序要进内存、操作系统怎么描述它、task_struct 里到底装了什么。这篇从冯诺依曼体系结构和存储金字塔讲起,把进程的概念、PCB 和 task_struct 串成一条完整的认知链。
一、冯诺依曼体系结构
我们常见的计算机,大部分都遵守冯诺依曼体系结构。有几条要点必须先说清:
- 这里的「存储器」指的是内存。
- 不考虑缓存的情况下,CPU 能且只能对内存读写,不能直接访问外设(输入/输出设备)。
- 外设要输入或输出的数据,也只能写入内存或从内存读取。
- 所以所有设备都只能直接和内存互动。
1.1 硬件部分
- 存储器:就是内存,硬件级别的缓冲空间,在体系中处于核心地位。为什么要加它?因为外设和 CPU 的速度差太大——输入设备慢悠悠敲字,CPU 一瞬间算完,如果直连,CPU 只能干等。加一层内存做缓冲,整机的吞吐才跟得上。
- 输入设备:鼠标、键盘、摄像头、麦克风,磁盘(写入文件),网卡(收数据)等。
- 输出设备:显示器、扬声器,磁盘(保存文件),网卡(发数据)等。
- 运算器:对输入的数据进行计算(算术运算、逻辑运算)。
- 控制器:对计算硬件流程进行控制。运算器 + 控制器 = CPU。
这些设备都是独立个体,彼此之间用「线」连起来,分为系统总线和 I/O 总线。
1.2 存储金字塔
- 离 CPU 越远的设备,容量越大、效率越低。
- 存储是分级的:寄存器 → L1/L2/L3 缓存 → 内存 → 磁盘 → 网络,越往上越快越小越贵。
1.3 软件部分
一个程序要运行,必须先加载到内存里跑。原因很直接:程序代码和数据必须由 CPU 运算,而 CPU 只从内存中取数据,所以程序得先从外设调入内存——这是冯诺依曼体系结构的规定。
二、操作系统
操作系统是一款做管理的软件。「管理」要回答三件事:为什么管、管什么、怎么管。
2.1 概念
任何操作系统都包含一个基本的程序集合,称为 OS。笼统理解还包括:内核(进程管理、内存管理、文件管理、驱动管理),以及其他程序(函数库、shell 程序等)。
2.2 设计 OS 的目的
- 与硬件交互,管理所有软硬件资源,帮用户管好下面这些资源。
- 为用户程序(应用程序)提供一个良好的运行环境。
所有访问操作系统的行为,都只能通过系统调用完成。
2.3 怎么管:先描述,再组织
- 管理者和被管理者不需要见面。
- 管理者不见被管理者也能管好,前提是先拿到管理信息——管理的本质是通过对数据的管理,达到对人的管理。
- 那怎么拿到数据?操作系统里的方法就是先描述、再组织:管理任何对象,最终都可以转化成对某种数据结构的增删查改。
2.4 系统调用与库函数
- 从开发角度看,操作系统对外表现为一个整体,但会暴露部分接口供上层使用,这些由系统提供的接口叫系统调用。
- 系统调用功能比较基础、对用户要求高,所以有些开发者对部分系统调用做封装形成库,方便上层二次开发。
三、进程到底是什么
3.1 基本概念
一个已经加载到内存中的程序,就叫进程。说得再直白点:正在运行的程序就是进程。
3.2 描述进程:PCB
任何一个进程加载到内存、形成真正的进程时,操作系统要先创建描述进程的结构体对象——PCB(进程控制块)。描述进程的 PCB 结构体和该进程对应的代码与数据合起来就叫进程:
进程 = 内核 PCB 数据结构对象(描述你这个进程的所有属性值)
+ 本身的代码和数据
PCB 由操作系统维护,代码和数据由程序员维护。
3.3 task_struct 里有什么
Linux 里描述进程的结构体叫 task_struct,它是内核的一种数据结构,被装载进 RAM 并包含着进程信息。内容大致分八类:
- 标识符:本进程的唯一标识,用来区别其他进程(也就是 PID)。
- 状态:任务状态、退出代码、退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和相关数据的指针,以及和其他进程共享的内存块的指针。
- 上下文数据:进程执行时处理器寄存器中的数据。
- I/O 状态信息:包括显示的 I/O 请求、分配给进程的 I/O 设备和被进程使用的文件列表。
- 记账信息:处理器时间总和、使用的时钟数总和、时间限定、账号等。
Linux 内核中,构造进程最基本的做法是采用双向链表——所有运行在系统里的进程都以 task_struct 链表的形式存在内核里。
四、一句话串起来
冯诺依曼体系规定了「程序必须进内存才能被 CPU 算」,操作系统为了管理这块内存里的运行实体,先用一个结构体(PCB / task_struct)把它描述出来,再用链表把它组织起来——这个被描述、被组织好的运行实体,就是进程。理解到这一层,后面学进程状态、fork、地址空间就都有抓手了。
qidao123.com企服评测-应用市场 编辑提示 |