EMIFA异步接口配置:从时序原理到NAND Flash硬件ECC实战
2026/7/22 16:06:55
进程是程序的一次执行过程,是操作系统分配内存、CPU 等资源的基本单位。简单来说:
a.out、ls命令);| 维度 | 程序 | 进程 |
|---|---|---|
| 状态 | 静态(永存) | 动态(暂时,有生命周期) |
| 特性 | 无状态变化、无并发 | 有状态切换、支持并发 |
| 资源 | 不占用系统资源 | 占用 CPU、内存、文件描述符等资源 |
| 运行关系 | 一个程序可运行多次,生成多个进程 | 一个进程可加载运行一个 / 多个程序 |
| 竞争关系 | 无资源竞争 | 多进程会竞争 CPU、内存等系统资源 |
示例:1.c编译为a.out(程序,静态),执行./a.out后生成一个 PID 为 xxx 的进程(动态),多次执行./a.out会生成多个独立进程。
Linux 系统通过PCB(Process Control Block,进程控制块)管理进程,PCB 是内核中的结构体,存储进程的所有核心信息,核心字段包括:
chdir修改);0002);Linux 对进程的资源使用有严格限制(可通过ulimit查看 / 修改),常见限制:
Linux 为每个进程分配独立的虚拟内存空间(默认 0-3G 用户空间 + 3-4G 内核空间),核心作用:
根据运行特性,Linux 进程可分为三类:
vim、bash、ssh,需等待用户操作(输入命令、点击按钮);crontab);nginx服务),通常以d结尾(如sshd、crond)。并发是操作系统的核心能力 ——宏观并行,微观串行:
进程在生命周期中会在多个状态间切换,通过ps aux可查看状态(STAT列):
| 状态标识 | 含义 | 说明 |
|---|---|---|
| R(Running) | 运行 / 就绪 | 正在 CPU 运行,或等待 CPU 时间片 |
| S(Sleeping) | 可中断休眠 | 等待事件触发(如 IO、信号),可被信号唤醒 |
| D(Uninterruptible Sleep) | 不可中断休眠 | 等待 IO(如磁盘读写),不可被信号唤醒 |
| T(Stopped) | 停止 | 被SIGSTOP信号暂停,可被SIGCONT唤醒 |
| Z(Zombie) | 僵尸进程 | 进程已终止,但父进程未回收其资源(PID 仍存在) |
Linux 内核需合理分配 CPU 时间片给多个进程,常见调度算法:
当进程的 CPU 时间片耗尽,内核会切换到下一个进程,这个过程称为 “上下文切换”:
a.out),将其状态(PCB、寄存器、PC 指针、内存数据)保存到硬盘 / 内存;b.out)的上下文数据到内存;上下文切换会产生一定开销,过度切换会降低系统性能。
| 命令 | 功能 | 示例 | |
|---|---|---|---|
ps aux | 显示所有进程的详细信息(PID、状态、CPU 占用等) | `ps aux | grep a.out(过滤a.out` 进程) |
top | 实时监控进程(Linux 版 “任务管理器”) | 按P按 CPU 排序,按M按内存排序 | |
pstree | 以树形结构显示进程间的父子关系 | pstree -p(显示 PID) |
| 命令 | 功能 | 示例 |
|---|---|---|
kill [信号] PID | 向指定 PID 进程发送信号 | kill -9 12345(强制终止 PID=12345 的进程) |
killall [信号] 进程名 | 终止所有同名进程 | killall -9 a.out(终止所有a.out进程) |
pkill 进程名 | 按进程名终止进程 | pkill -9 sshd(终止所有 sshd 进程) |
常用信号:
-9(SIGKILL,强制终止)、-15(SIGTERM,优雅终止,默认)。
fork():创建子进程fork()是 Linux 创建进程的核心函数,作用是从当前进程(父进程)克隆一个子进程。
c
运行
#include <unistd.h> pid_t fork(void);fork()函数的返回处开始执行;| 场景 | 返回值 | 说明 |
|---|---|---|
| 父进程中 fork 成功 | >0(子进程的 PID) | 可通过返回值区分父 / 子进程 |
| 子进程中 fork 成功 | 0 | 子进程无子进程,返回 0 |
| fork 失败 | -1 | 如资源不足、进程数超限 |
c
运行
#include <stdio.h> #include <unistd.h> int main() { pid_t ret = fork(); if (ret > 0) { // 父进程逻辑 printf("父进程:PID=%d,子进程PID=%d\n", getpid(), ret); } else if (ret == 0) { // 子进程逻辑 printf("子进程:PID=%d,父进程PID=%d\n", getpid(), getppid()); } else { perror("fork失败"); return 1; } return 0; }getpid():获取当前进程 PIDc
运行
#include <unistd.h> pid_t getpid(void);getppid():获取父进程 PIDc
运行
#include <unistd.h> pid_t getppid(void);fork()是创建进程的核心函数,父子进程独立运行,返回值是区分二者的关键;ps/top/kill是进程管理的常用命令,getpid()/getppid()是获取进程 ID 的核心函数。