【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. 计算机层次结构中,用户程序如何通过操作系统访问硬件
相关推荐
Aaswk3 小时前
网络体系结构 | 物理层:传输介质与编码
网络·网络协议·tcp/ip
守护安静星空3 小时前
websocket
网络·websocket·网络协议
EntyIU3 小时前
Python学习笔记
笔记·python·学习
你觉得脆皮鸡好吃吗3 小时前
HTTP 状态码体系 (AI)
网络·安全·web安全
铅笔小新z3 小时前
【Linux】基础IO
linux·服务器
魔法阵维护师3 小时前
从零开发游戏需要学习的c#模块,第二十四章(场景管理 —— 标题、游戏、结束画面)
学习·游戏·c#
wuxinyan1233 小时前
工业级大模型学习之路025:问题解决-检索质量全为0
人工智能·python·学习·langchain
灰子学技术3 小时前
Envoy gRPC HTTP/1 反向桥接功能实现分析
网络·网络协议·http
xiaoye-duck3 小时前
【Linux:文件】Linux 动静态库详解::制作、使用、原理与实战
linux