【linux学习】进程的概念和在linux系统下的基本实现情况01

大家好,我是程序员小青蛙,下面分享进程的概念以及在linux下的实现情况

一、冯・诺依曼体系结构:计算机的底层骨架

1. 核心五大部件与工作流程

  • 五大部件:运算器、控制器、存储器、输入设备、输出设备
  • 核心规则(必背)
    1. 数据与指令都以二进制形式存放在 ** 存储器(内存)** 中,程序执行前必须加载到内存
    2. CPU(运算器 + 控制器)不直接和外设打交道,只和内存直接交互
      • 外设数据必须先读入内存,CPU 才能处理;CPU 要输出的数据也必须先写入内存,再由内存传给外设
    3. 控制信号与数据信号分离:控制信号由控制器发出,数据信号在各部件间传输

2. 关键概念辨析

概念 定义 特点
存储器(体系中的) 内存(主存) 掉电易失,速度快,临时存储数据 / 指令
外存(如磁盘) 属于外设,永久存储设备 速度慢,掉电不丢数据,程序 / 数据的永久存放地
外设 输入设备(键盘、网卡)、输出设备(显示器、网卡) 需通过驱动程序与操作系统交互

3. 生活案例理解(QQ 聊天)

  1. 你在键盘输入 "你好",数据流程:键盘 → 内存 → CPU(处理) → 内存 → 网卡 → 对方电脑内存 → CPU → 对方显示器
  2. 前提:QQ 程序必须先加载到内存,CPU 才能执行代码、处理数据

二、操作系统:硬件资源的 "大管家"

1. 操作系统的本质与目标

  • 定义:一个对计算机软硬件资源进行管理的系统软件
  • 核心目标
    • 对下:合理管理硬件资源(CPU、内存、磁盘、外设),提高资源利用率
    • 对上:为用户 / 应用程序提供稳定、高效、安全的执行环境

2. 操作系统的四大核心管理模块

  1. 进程管理:管理运行中的程序(进程),分配 CPU 时间片,实现多任务并发
  2. 内存管理:管理内存空间分配 / 回收,保证进程间内存隔离,避免冲突
  3. 文件系统:管理磁盘上的文件,实现数据的永久存储与高效访问
  4. 驱动管理:通过驱动程序与外设交互,屏蔽硬件差异,为上层提供统一接口

3. 管理的本质:先描述,再组织

操作系统对硬件 / 软件的管理,本质和我们用 C 语言写通讯录一样:

  1. 先描述 :用结构体定义被管理对象的属性(如进程用 struct task_struct 描述,包含 PID、状态、内存地址等)
  2. 再组织:用数据结构(链表、数组等)将多个对象组织起来,实现增删改查管理
  • 类比:校长管理学生 → 用结构体描述学生信息,用链表组织所有学生,通过管理链表实现对学生的管理

三、进程:运行起来的程序

1. 程序与进程的区别(核心考点)

  • 程序:存放在磁盘上的静态文件,是指令和数据的集合(如 QQ.exe)
  • 进程:程序加载到内存后,正在运行的实例,是动态的,有生命周期(创建、运行、终止)
  • 一句话区分:程序是静态的文件,进程是程序的一次运行过程

2. PCB(进程控制块):进程的 "身份证"

  • 定义 :操作系统用 struct task_struct 结构体描述进程,这个结构体就是 PCB
  • 核心作用
    1. 保存进程的所有属性:PID(进程 ID)、状态、优先级、内存地址、打开的文件等
    2. 让操作系统可以管理进程:通过链表组织所有进程的 PCB,实现调度、终止等操作
    3. task_struct 内容分类

      标示符:描述本进程的唯一标示符(PID),用来区别其他进程

      状态:任务状态、退出代码、退出信号等

      优先级:相对于其他进程的优先级

      程序计数器:程序中即将被执行的下一条指令的地址、

      内存指针:包括程序代码和进程相关数据的指针,以及和其他进程共享的内存块的指针

      上下文数据:进程执行时处理器的寄存器中的数据(如 CPU 寄存器)

      I/O 状态信息:包括显示的 I/O 请求、分配给进程的 I/O 设备和被进程使用的文件列表

      记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等

      其他信息

  • 进程的组成进程 = PCB(内核数据结构) + 进程对应的代码和数据

解析进程标识符的作用

在 Linux 中,每个进程都有两个关键的标示符:

  • PID(Process ID):进程 ID,当前进程的唯一数字编号

  • PPID(Parent Process ID) :父进程 ID,创建当前进程的进程编号

    cpp 复制代码
    #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 auxtop 等工具通过 PID 显示进程信息
    • 进程间通信:IPC 机制(如管道、信号)依赖 PID 定位目标进程
    • 日志记录:系统日志、应用日志中用 PID 标识事件对应的进程
    1. PPID:记录进程的 "父子关系"
  • 作用:标识创建当前进程的父进程,构建进程间的层级关系

  • 应用场景:

    • 理解进程创建:通过 PPID 可以追溯进程的来源,例如命令行启动的进程 PPID 通常是 bash(终端进程)
    • 处理僵尸进程:父进程通过 PPID 识别子进程,调用 wait() 回收其退出状态
    • 孤儿进程管理:父进程退出后,子进程会被 init 进程领养,PPID 变为 1
    • 进程树管理:操作系统通过 PID 和 PPID 构建进程树,管理进程的创建与终止

3. 进程的动态属性

  • 进程在调度运行时,会有不同状态(就绪、运行、阻塞等),可以被创建、调度、终止
  • 常用操作:
    • getpid():获取当前进程的 PID
    • kill -9 进程ID:强制终止进程
    • 命令行启动的进程,父进程默认是 bash(终端进程)

4. fork():创建子进程

  • 核心规则
    1. fork() 执行前:只有父进程一个进程
    2. fork() 执行后:产生父进程和子进程两个进程,后续代码被父子进程共享
    3. 通过返回值区分父子进程:
      • 父进程返回子进程的 PID(大于 0)
      • 子进程返回 0
      • 出错返回 - 1
  • 作用:实现多任务并发,让父子进程可以执行不同的任务逻辑

创建子进程

cpp 复制代码
#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

cpp 复制代码
#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. 层次模型(从上到下)

  1. 用户层:用户通过命令行(shell)、应用程序、开发工具操作计算机
  2. 系统调用接口:操作系统提供的接口,用户程序通过它请求操作系统服务(如文件读写、进程创建)
  3. 操作系统内核:进程管理、内存管理、文件系统、驱动管理等核心模块
  4. 驱动程序:连接操作系统与硬件,实现对磁盘、网卡、显卡等外设的控制
  5. 底层硬件:CPU、内存、磁盘、网卡、键盘、显示器等物理设备

2. 关键理解:操作系统的 "隔离与服务"

  • 操作系统不相信任何用户程序,不会让用户程序直接访问硬件
  • 用户程序必须通过系统调用请求操作系统服务,操作系统再通过驱动程序控制硬件
  • 类比:银行系统不允许用户直接进入仓库操作,必须通过银行柜台(接口)办理业务

复习重点清单

  1. 冯诺依曼体系的五大部件和核心规则(CPU 只和内存交互)
  2. 操作系统的定义、四大管理模块和 "先描述再组织" 的管理思想
  3. 程序与进程的区别,PCB 的概念和作用
  4. fork() 函数的执行逻辑和父子进程的区分
  5. 计算机层次结构中,用户程序如何通过操作系统访问硬件
相关推荐
假如梵高是飞行员13 分钟前
WSL2 从 img 镜像文件启动特定 Linux 发行版完整指南
linux·windows·wsl
tachibana21 小时前
hot100 回文链表(234)
java·网络·数据结构·leetcode·链表
瓶中怪2 小时前
ROS2 机器人软件系统
linux·c++·python·ubuntu·vmware·ros2·机器人软件开发
iangyu2 小时前
linux配置时间同步
linux·运维·服务器
天空'之城2 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
从零开始的代码生活_2 小时前
NAT、代理服务与内网穿透详解
linux·服务器·网络·c++·http·智能路由器
云栖梦泽在2 小时前
Claude Code / Codex 使用卡顿怎么办?AI 编程 Agent 连接失败与网络排查思路
网络·人工智能·网络协议·chatgpt·性能优化
灯厂码农2 小时前
C语言内存管理——内存对齐与共用体union
linux·服务器·c语言
Jeremy_WW2 小时前
QSFP-DD MSA Hardware协议解读(二)
网络·模块测试·智能硬件
深盾科技_Virbox2 小时前
加密狗授权能力选型:从授权模型到全生命周期管理
java·网络·数据库