【Linux学习笔记】初识冯诺依曼体系和进程PCB
🔥个人主页:大白的编程日记
🔥专栏:Linux学习笔记
文章目录
- 【Linux学习笔记】初识冯诺依曼体系和进程PCB
- 前言
- 一. 冯诺依曼体系结构
- 1.1 关于冯诺依曼体系的要点:
- 二. 操作系统(Operating System)
- 2.1 概念
- 2.2 设计OS的目的
- 2.3 核心功能
- 2.4 如何理解“管理”
- 2.5 系统调用和库函数概念
- 三. 进程
- 3.1 基本概念与基本操作
- 3.1.2 描述进程 - PCB
- 3.1.3 task_struct
- 3.1.5 查看进程
- 3.1.6 通过系统调用获取进程标识符
- 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
- 基本概念
- 进程信息被放在一个叫做进程控制块(PCB)的数据结构中,是进程属性的集合
- 课本上称之为PCB(processcontrolblock),在Linux操作系统下的PCB是:task_struct。
- task_struct-PCB的一种
- 在Linux中描述进程的结构体叫做
task_struct
。 - task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
3.1.3 task_struct
- 内容分类:
- 标示符:描述本进程的唯一标示符,用来区别其他进程。
- 状态:任务状态,退出代码,退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
- I/0状态信息:包括显示的I/O请求,分配给进程的I/0设备和被进程使用的文件列表。
- 记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
- 具体详细信息后续会介绍
- 组织进程
所有运行在系统里的进程都以task_struct
链表的形式存在于内核中。
3.1.5 查看进程
- 进程信息可以通过
/proc
系统文件夹查看。例如,获取PID为1的进程信息,查看/proc/1
文件夹。 - 大多数进程信息也可以通过
top
和ps
等用户级工具获取。
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
有两个返回值:
- 父进程返回值为子进程的PID
- 子进程返回值为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){ // childprintf("I am child : %d!, ret: %d\n", getpid(), ret);}else{ // fatherprintf("I am father : %d!, ret: %d\n", getpid(), ret);}sleep(1);return 0;
}
后言
这就是初识冯诺依曼体系和进程PCB。大家自己好好消化!今天就分享到这! 感谢各位的耐心垂阅!咱们下期见!拜拜~