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

发布于:2025-04-06 ⋅ 阅读:(25) ⋅ 点赞:(0)

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

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

🔥专栏Linux学习笔记


前言

哈喽,各位小伙伴大家好!上期我们讲了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)
#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
#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分流
#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。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~