【Linux学习笔记】初识进程概念和进程PCB

【Linux学习笔记】初识冯诺依曼体系和进程PCB

🔥个人主页大白的编程日记

🔥专栏Linux学习笔记


文章目录

  • 【Linux学习笔记】初识冯诺依曼体系和进程PCB
    • 前言
    • [一. 冯诺依曼体系结构](#一. 冯诺依曼体系结构)
      • [1.1 关于冯诺依曼体系的要点:](#1.1 关于冯诺依曼体系的要点:)
    • [二. 操作系统(Operating System)](#二. 操作系统(Operating System))
      • [2.1 概念](#2.1 概念)
      • [2.2 设计OS的目的](#2.2 设计OS的目的)
      • [2.3 核心功能](#2.3 核心功能)
      • [2.4 如何理解"管理"](#2.4 如何理解“管理”)
      • [2.5 系统调用和库函数概念](#2.5 系统调用和库函数概念)
    • [三. 进程](#三. 进程)
      • [3.1 基本概念与基本操作](#3.1 基本概念与基本操作)
        • [3.1.2 描述进程 - PCB](#3.1.2 描述进程 - PCB)
        • [3.1.3 task_struct](#3.1.3 task_struct)
        • [3.1.5 查看进程](#3.1.5 查看进程)
        • [3.1.6 通过系统调用获取进程标识符](#3.1.6 通过系统调用获取进程标识符)
        • [3.1.7 通过系统调用创建进程 - `fork`初识](#3.1.7 通过系统调用创建进程 - fork初识)
    • 后言

前言

哈喽,各位小伙伴大家好!上期我们讲了gdb和cgdb 今天我们讲的是初识冯诺依曼体系和进程PCB。话不多说,我们进入正题!向大厂冲锋!

一. 冯诺依曼体系结构

我们常见的计算机,如笔记本,以及不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。计算机由以下硬件组件组成:

  • 输入单元:包括键盘、鼠标、扫描仪、写字板等
  • 中央处理器(CPU):含有运算器和控制器等
  • 输出单元:显示器、打印机等

1.1 关于冯诺依曼体系的要点:

  • 存储器指的是内存
  • CPU只能对内存进行读写,不能直接访问外设(输入或输出设备)
  • 外设要输入或输出数据,只能通过内存进行交互
  • 所有设备都只能直接和内存打交道

关于冯诺依曼,必须强调几点:

  • 这里的存储器指的是内存
  • 不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
  • 外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
  • 一句话,所有设备都只能直接和内存打交道。

📌 注意:

对冯诺依曼的理解,不能停留在概念上,要深入到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗口,开始给他发消息,到他的消息之后的数据流动过程。如果是在qq上发送文件呢?

二. 操作系统(Operating System)

2.1 概念

操作系统(OS)是计算机系统中一个基本的程序集合,包括:

  • 内核(进程管理、内存管理、文件管理、驱动管理)
  • 其他程序(如函数库、shell程序等)

2.2 设计OS的目的

  • 对下:与硬件交互,管理所有软硬件资源
  • 对上:为用户程序(应用程序)提供良好的执行环境


2.3 核心功能

操作系统在整个计算机软硬件架构中的定位是:一款存正"搞管理"的软件

2.4 如何理解"管理"

  • 管理的例子:学生、辅导员、校长
  • 描述被管理对象
  • 组织被管理对象

    总结
    计算机管理硬件:
  • 1.描述起来,用struct结构体
  • 2.组织起来,用链表或其他高效的数据结构

2.5 系统调用和库函数概念

  • 在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用
  • 系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。

承上启下

那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!

三. 进程

3.1 基本概念与基本操作

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间、内存)的实体
3.1.2 描述进程 - PCB
  1. 基本概念
  • 进程信息被放在一个叫做进程控制块(PCB)的数据结构中,是进程属性的集合
  • 课本上称之为PCB(processcontrolblock),在Linux操作系统下的PCB是:task_struct
  1. task_struct-PCB的一种
  • 在Linux中描述进程的结构体叫做task_struct
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
3.1.3 task_struct
  1. 内容分类:
  • 标示符:描述本进程的唯一标示符,用来区别其他进程。
  • 状态:任务状态,退出代码,退出信号等。
  • 优先级:相对于其他进程的优先级。
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
  • 上下文数据:进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
  • I/0状态信息:包括显示的I/O请求,分配给进程的I/0设备和被进程使用的文件列表。
  • 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
  • 其他信息
  • 具体详细信息后续会介绍
  1. 组织进程
    所有运行在系统里的进程都以task_struct链表的形式存在于内核中。
3.1.5 查看进程
  1. 进程信息可以通过/proc系统文件夹查看。例如,获取PID为1的进程信息,查看/proc/1文件夹。
  2. 大多数进程信息也可以通过topps等用户级工具获取。
3.1.6 通过系统调用获取进程标识符
  • 进程id(PID)
  • 父进程id(PPID)
c 复制代码
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    printf("pid: %d\n", getpid());
    printf("ppid: %d\n", getppid());
    return 0;
}


3.1.7 通过系统调用创建进程 - fork初识
  • 运行 man fork 认识fork
  • fork有两个返回值:
  1. 父进程返回值为子进程的PID
  2. 子进程返回值为0
c 复制代码
#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;
}
  • fork之后通常使用if分流
c 复制代码
#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;
}

后言

这就是初识冯诺依曼体系和进程PCB。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~

相关推荐
struggle20253 分钟前
LinuxAgent开源程序是一款智能运维助手,通过接入 DeepSeek API 实现对 Linux 终端的自然语言控制,帮助用户更高效地进行系统运维工作
linux·运维·服务器·人工智能·自动化·deepseek
FAREWELL000751 小时前
C#进阶学习(十六)C#中的迭代器
开发语言·学习·c#·迭代器模式·迭代器
无敌小茶1 小时前
Linux学习笔记之动静态库
linux·笔记
DXM05212 小时前
牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例
开发语言·笔记·学习·arcgis·c#·ae·arcgis engine
程序员JerrySUN2 小时前
驱动开发硬核特训 · Day 21(上篇) 抽象理解 Linux 子系统:内核工程师的视角
java·linux·驱动开发
雨声不在3 小时前
debian切换用户
linux·服务器·debian
不知名。。。。。。。。3 小时前
Linux—— 版本控制器Git
linux·运维·git
qsmyhsgcs3 小时前
Java程序员转人工智能入门学习路线图(2025版)
java·人工智能·学习·机器学习·算法工程师·人工智能入门·ai算法工程师
内网渗透3 小时前
OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享
linux·docker·容器·openwrt·软路由
Humbunklung3 小时前
PySide6 GUI 学习笔记——常用类及控件使用方法(常用类矩阵QRectF)
笔记·python·学习·pyqt