【linux学习】进程的概念和在linux系统下的基本实现情况01
大家好,我是程序员小青蛙,下面分享进程的概念以及在linux下的实现情况
一、冯・诺依曼体系结构:计算机的底层骨架
1. 核心五大部件与工作流程
- 五大部件:运算器、控制器、存储器、输入设备、输出设备
- 核心规则(必背):
- 数据与指令都以二进制形式存放在 ** 存储器(内存)** 中,程序执行前必须加载到内存
- CPU(运算器 + 控制器)不直接和外设打交道,只和内存直接交互
- 外设数据必须先读入内存,CPU 才能处理;CPU 要输出的数据也必须先写入内存,再由内存传给外设
- 控制信号与数据信号分离:控制信号由控制器发出,数据信号在各部件间传输
2. 关键概念辨析
| 概念 | 定义 | 特点 |
|---|---|---|
| 存储器(体系中的) | 指内存(主存) | 掉电易失,速度快,临时存储数据 / 指令 |
| 外存(如磁盘) | 属于外设,永久存储设备 | 速度慢,掉电不丢数据,程序 / 数据的永久存放地 |
| 外设 | 输入设备(键盘、网卡)、输出设备(显示器、网卡) | 需通过驱动程序与操作系统交互 |
3. 生活案例理解(QQ 聊天)
- 你在键盘输入 “你好”,数据流程:键盘 → 内存 → CPU(处理) → 内存 → 网卡 → 对方电脑内存 → CPU → 对方显示器
- 前提:QQ 程序必须先加载到内存,CPU 才能执行代码、处理数据
二、操作系统:硬件资源的 “大管家”
1. 操作系统的本质与目标
- 定义:一个对计算机软硬件资源进行管理的系统软件
- 核心目标:
- 对下:合理管理硬件资源(CPU、内存、磁盘、外设),提高资源利用率
- 对上:为用户 / 应用程序提供稳定、高效、安全的执行环境
2. 操作系统的四大核心管理模块
- 进程管理:管理运行中的程序(进程),分配 CPU 时间片,实现多任务并发
- 内存管理:管理内存空间分配 / 回收,保证进程间内存隔离,避免冲突
- 文件系统:管理磁盘上的文件,实现数据的永久存储与高效访问
- 驱动管理:通过驱动程序与外设交互,屏蔽硬件差异,为上层提供统一接口
3. 管理的本质:先描述,再组织
操作系统对硬件 / 软件的管理,本质和我们用 C 语言写通讯录一样:
- 先描述:用结构体定义被管理对象的属性(如进程用
struct task_struct描述,包含 PID、状态、内存地址等) - 再组织:用数据结构(链表、数组等)将多个对象组织起来,实现增删改查管理
- 类比:校长管理学生 → 用结构体描述学生信息,用链表组织所有学生,通过管理链表实现对学生的管理
三、进程:运行起来的程序
1. 程序与进程的区别(核心考点)
- 程序:存放在磁盘上的静态文件,是指令和数据的集合(如 QQ.exe)
- 进程:程序加载到内存后,正在运行的实例,是动态的,有生命周期(创建、运行、终止)
- 一句话区分:程序是静态的文件,进程是程序的一次运行过程
2. PCB(进程控制块):进程的 “身份证”
- 定义:操作系统用
struct task_struct结构体描述进程,这个结构体就是 PCB - 核心作用:
- 保存进程的所有属性:PID(进程 ID)、状态、优先级、内存地址、打开的文件等
- 让操作系统可以管理进程:通过链表组织所有进程的 PCB,实现调度、终止等操作
task_struct内容分类
标示符:描述本进程的唯一标示符(PID),用来区别其他进程
状态:任务状态、退出代码、退出信号等
优先级:相对于其他进程的优先级
程序计数器:程序中即将被执行的下一条指令的地址、
内存指针:包括程序代码和进程相关数据的指针,以及和其他进程共享的内存块的指针
上下文数据:进程执行时处理器的寄存器中的数据(如 CPU 寄存器)
I/O 状态信息:包括显示的 I/O 请求、分配给进程的 I/O 设备和被进程使用的文件列表
记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等
其他信息
- 进程的组成:
进程 = PCB(内核数据结构) + 进程对应的代码和数据
解析进程标识符的作用
在 Linux 中,每个进程都有两个关键的标示符:
- PID(Process ID):进程 ID,当前进程的唯一数字编号
- PPID(Parent Process ID):父进程 ID,创建当前进程的进程编号
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { printf("pid %d\n", getpid()); // 获取当前进程的PID printf("ppid %d\n", getppid()); // 获取当前进程的PPID return 0; }
查看进程符
1.PID:操作系统识别进程的 “唯一身份证号”
- 作用:区分系统中所有进程,是进程的唯一标识
- 应用场景:
- 管理进程:用
kill PID命令发送信号(如终止、暂停进程)- 调试与监控:
ps aux、top等工具通过 PID 显示进程信息- 进程间通信:IPC 机制(如管道、信号)依赖 PID 定位目标进程
- 日志记录:系统日志、应用日志中用 PID 标识事件对应的进程
2.PPID:记录进程的 “父子关系”
- 作用:标识创建当前进程的父进程,构建进程间的层级关系
- 应用场景:
- 理解进程创建:通过 PPID 可以追溯进程的来源,例如命令行启动的进程 PPID 通常是
bash(终端进程)- 处理僵尸进程:父进程通过 PPID 识别子进程,调用
wait()回收其退出状态- 孤儿进程管理:父进程退出后,子进程会被
init进程领养,PPID 变为 1- 进程树管理:操作系统通过 PID 和 PPID 构建进程树,管理进程的创建与终止
3. 进程的动态属性
- 进程在调度运行时,会有不同状态(就绪、运行、阻塞等),可以被创建、调度、终止
- 常用操作:
getpid():获取当前进程的 PIDkill -9 进程ID:强制终止进程- 命令行启动的进程,父进程默认是
bash(终端进程)
4.fork():创建子进程
- 核心规则:
fork()执行前:只有父进程一个进程fork()执行后:产生父进程和子进程两个进程,后续代码被父子进程共享- 通过返回值区分父子进程:
- 父进程返回子进程的 PID(大于 0)
- 子进程返回 0
- 出错返回 - 1
- 作用:实现多任务并发,让父子进程可以执行不同的任务逻辑
创建子进程
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { int ret = fork(); printf("hello proc : %d!, ret: %d\n", getpid(), ret); sleep(1); return 0; }
子进程返回0
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main() { int ret = fork(); if(ret < 0){ perror("fork"); return 1; } else if(ret == 0){ //child printf("I am child : %d!, ret: %d\n", getpid(), ret); }else{ //father printf("I am father : %d!, ret: %d\n", getpid(), ret); } sleep(1); return 0; }
进程同时进行,并发
四、计算机的层次结构:从用户到硬件
1. 层次模型(从上到下)
- 用户层:用户通过命令行(shell)、应用程序、开发工具操作计算机
- 系统调用接口:操作系统提供的接口,用户程序通过它请求操作系统服务(如文件读写、进程创建)
- 操作系统内核:进程管理、内存管理、文件系统、驱动管理等核心模块
- 驱动程序:连接操作系统与硬件,实现对磁盘、网卡、显卡等外设的控制
- 底层硬件:CPU、内存、磁盘、网卡、键盘、显示器等物理设备
2. 关键理解:操作系统的 “隔离与服务”
- 操作系统不相信任何用户程序,不会让用户程序直接访问硬件
- 用户程序必须通过系统调用请求操作系统服务,操作系统再通过驱动程序控制硬件
- 类比:银行系统不允许用户直接进入仓库操作,必须通过银行柜台(接口)办理业务
复习重点清单
- 冯诺依曼体系的五大部件和核心规则(CPU 只和内存交互)
- 操作系统的定义、四大管理模块和 “先描述再组织” 的管理思想
- 程序与进程的区别,PCB 的概念和作用
fork()函数的执行逻辑和父子进程的区分- 计算机层次结构中,用户程序如何通过操作系统访问硬件
