【Linux篇】从冯诺依曼到进程管理:计算机体系与操作系统的核心逻辑

news2025/3/11 6:45:07

📌 个人主页: 孙同学_
🔧 文章专栏:Liunx
💡 关注我,分享经验,助你少走弯路!
在这里插入图片描述

在这里插入图片描述

文章目录

    • 1.冯诺依曼体系结构
      • 存储分级
      • 理解数据流动
    • 2. 操作系统(Operator System)
      • 2.1 概念
      • 2.2 设计OS的目的
      • 2.3 核心功能
        • 2.3.1 如何理解"管理"
      • 2.4 系统调用和库函数概念
    • 3. 进程
      • 3.1 基本概念与基本操作
      • 3.2 描述进程-PCB
        • 3.2.1 task_struct
      • 3.3 查看进程

1.冯诺依曼体系结构

我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。
在这里插入图片描述
截至目前,我们所认识的计算机,都是由一个个的硬件组件组成

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

再次强调:
程序运行时必须先从磁盘加载到内存,CPU获取写入只能从内存中拿数据,CPU执行我们的代码,访问我们的数据,数据从一个设备“拷贝”到另一个设备
体系结构的效率:由设备的拷贝效率决定
结论: CPU在数据层面只和内存打交道,外设只和内存打交道

存储分级

在这里插入图片描述
由于外设的速度比较慢,CPU的速度较快,所以外设和CPU之间就存在木桶原理,内存的出现让CPU和外设的速度更匹配。
冯诺依曼体系结构的存在使得电脑变便宜了。

理解数据流动

在这里插入图片描述
两个人如果在微信上面聊天,本质上是两个冯诺依曼体系之间的信息流通,发信息的人通过输入设备“键盘”进行输入。我们发微信首先得打开登陆微信,即把微信的可执行程序加载到内存。所以在键盘里输入根据冯诺依曼体系是把键盘数据搬到内存(硬件层面),软件层面是把数据交给微信 ,所以数据流动就从输入数据流到存储器。微信信息比如说要加密,把数据“你好”(发送的数据)经过运算器控制,运算器运算完毕之后把“你好”转化成了一个乱码的结构,然后再有CPU写入内存,再由微信把你自己的数据传输到输出设备 ,用户a的输出设备是网卡,网卡把数据交到网络里,通过网络再把数据交给用户b用户b的输入设备拿到数据,而用户b的输入设备只能是网卡,输入设备拿到数据放到内存里,用户b也必须启动微信,启动的微信也在内存里,在微信里读到的代码再交给CPU,将乱码数据解密成“你好”,再通过存储器刷新到输出设备上,这个输出设备就是显示器。
那如果是发送文件呢???
其实文件的本质也是数据,当我们把文件拖到微信程序时,在没拖之前文件是在磁盘上,本质上是把磁盘文件拷贝到微信里面,在经过运算器加密包装回到存储器,在经过网卡发送,对方通过网卡接受,接收后首先要把文件数据读到内存,通过运算器解包解密写回内存,然后把数据写到输出设备。
总结:

  • 聊天: 是把用户数据从键盘经过体系结构转发到对方显示器的工作。
  • 发送文件: 本质是把文件从本地磁盘经过体系结构拷贝至对方磁盘的过程。

2. 操作系统(Operator System)

2.1 概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:

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

操作系统本质是一款进行软硬件管理的软件
在这里插入图片描述

2.2 设计OS的目的

操作系统上面不仅有硬件,而且还有软件

  • 对下,与硬件交互,管理所有的软硬件资源
  • 对上,为用户程序(应用程序)提供一个良好的执行环境
    在这里插入图片描述
  1. 软硬件体系结构是一个层状的结构
  2. 访问操作系统,必须用系统调用–其实就是函数,只不过是系统提供的
  3. 我们的程序,只要判断出访问了硬件,那么它必须贯穿整个软硬件体系结构
  4. 库可能在底层封装了系统调用

2.3 核心功能

  • 在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件
2.3.1 如何理解"管理"
  • 管理的例子 - 学生(被管理者),辅导员(执行权),校长(决策权)

操作系统就如同校长一样具有决策权驱动程序就如同辅导员具有执行权底层硬件就如同学生被管理
在这里插入图片描述

  1. 要管理,管理者和被管理者不需要见面
  2. 管理者和被管理者,根据“数据”进行管理
  3. 不需要见面如何得到数据呢?由中间层(辅导员)获取

📌:操作系统通过数据对底层硬件进行管理,而数据是通过驱动程序获取的。
总结:
计算机管理硬件

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他高效的数据结构

 先描述,后组织

  • 操作系统对硬件的管理:
    操作系统在自己的内部先描述,再组织,把网卡,硬盘,显卡,键盘,显示器等,统一可以定义一个类,类里面可以包含每一个硬件对应的属性,属性包括硬件的名称,硬件的状态,硬件相关的信息。所以操作系统管理硬件转变成立对硬件的增删查改。
  • 操作系统对进程的管理:
    操作系统对进程的管理也类似,操作系统首先要对每个进程建立对应的struct类对象,然后把进程相关的属性放在结构体里,用链接节点连起来,对进程管理转化成对链表的增删查改。

2.4 系统调用和库函数概念

操作系统不相信任何用户或者人,操作系统要向上提供对应的服务,就好比“银行”
在这里插入图片描述
操作系统会把自己封装起来,所以系统调用本质上是操作系统提供给我们的系统调用。我们未来在操作系统获取信息等都是通过系统调用完成的。
系统调用的本质是用户和操作系统之间进行某种数据的交互。
结论:

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

3. 进程

3.1 基本概念与基本操作

  • 课本概念:程序的一个执行实例,正在执行的程序等
  • 内核观点:担当分配系统资源(CPU时间,内存)的实体。

因为操作系统内同时可能有许多的可执行程序加载到内存里,所以必然要对加载到内存中的程序做管理,答案是先描述(给每个可执行程序定义结构体(PCB)Liunx下叫struct task_struct进程控制块),与下一个可执行程序的结构体形成链表,这个链表就叫做进程列表

进程 = 内核数据结构对象 + 自己的代码和数据
进程 = PCB(task_strcut)+ 自己的代码和数据

✏️对进程的管理就变成了对链表的增删查改

✏️进程的所有属性都能直接或者间接在task_struct找到

3.2 描述进程-PCB

基本概念

  • 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
  • 课本上称之为PCB(process control block) ,Linux操作系统下的PCB是: task_struct

task_struct-PCB的⼀种

  • 在Linux中描述进程的结构体叫做task_struct
  • task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。
3.2.1 task_struct

内容分类

  • 标识符(PID)
    描述本进程的唯一标识符,用来区别其他进程。
  • 状态
    任务状态,退出代码,退出信号等。
  • 优先级
    相对于其他进程的优先级。
  • 程序计数器(PC)
    程序中即将被执行的下一条指令的内存地址。
  • 内存指针
    包括程序代码和进程相关数据的指针,以及与其他进程共享的内存块的指针。
  • 上下文数据
    进程执行时处理器的寄存器中的数据(需补充示意图:CPU 寄存器状态)。
  • I/O 状态信息
    包括显式的 I/O 请求、分配给进程的 I/O 设备和被进程使用的文件列表。
  • 记账信息
    可能包含:处理器时间总和、使用的时钟数总和、时间限制、记账号等。
  • 其他信息
    未明确分类的附加属性。

组织进程
可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。
在这里插入图片描述

3.3 查看进程

1.首先我们来自己创建一个进程,我们首先来认识一个进程指令getpid
在这里插入图片描述
我们历史上执行的所有指令,工具,自己的程序,运行起来全部都是进程!!
2. 写一个可以查看进程的程序在这里插入图片描述
3.运行程序
在这里插入图片描述
4.只要是一个程序我们就可以查看它的进程,但是还不够,我们再打开一个Xshell。在系统上我们有对应的指令让我们去查看当前的进程有哪些。这个指令就叫做ps,我们可以查所有的以特定格式显示的进程,比如ps axj其中的a表示所有进程的意思。

在这里插入图片描述
这展现的就是系统中所有的进程。
5. 我们若只想查看我们自己刚刚的进程呢?ps axj | grep myprocess

在这里插入图片描述

Linux中我们也可以两条指令同时输入,用;隔开,表示先执行前面的,再执行;后面的。出了这种写法我们也可以ps ajx | head -1 && ps ajx | grep myprocess,效果和上面一模一样
在这里插入图片描述
6. 当我们查进程时会发现这个grep一直存在,为什么呢?我们在查进程的时候grep也是个命令,当它把显示出来的结果做过滤的时候,grep命令一旦跑起来,它自己也是个进程,而它自己过滤关键字里本来就包含myprocess,所以它也会自己把自己查出来,我们如果不想看到grep呢,我们可以ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep,grep -v 表示反向匹配,包含grep的不要,不包含的留下来了
在这里插入图片描述
7. 只要是个进程,我们就可以杀掉它,如何杀呢?ctrl + c/kill -9 + pid,杀掉进程。(-9表示一个信号编号)

第二种查看进程的方式:

  1. 进程的信息可以通过 /proc 系统文件夹查看(以文件的形式查看进程)
    在这里插入图片描述
    每一个数字目录代表特定进程的pid,每个目录包含的内容是这个进程运行时的动态属性

如:要获取PID为3908132的进程信息,你需要查看 /proc/3908132这个文件夹。
在这里插入图片描述

  1. 3908132文件夹中的内容
    在这里插入图片描述
    在重重之中,我们只需要了解两个
    在这里插入图片描述

  2. 大多数进程信息同样可以使用topps这些用户级工具来获取

上面中我们还遗留了一个信息getppid,表示获取父进程Pid
在这里插入图片描述
下面我将讲如何不用指令而用代码创建进程,Linux中所有的进程都是被它的父进程创建的,Linux是一个单亲繁殖系统,只有父进程,没有母进程,所以Linux中所有的进程是一个进程树

  1. 获取父进程
    在这里插入图片描述
    运行
    在这里插入图片描述
    重新执行多次
    在这里插入图片描述
    我们看到的现象是他们的父进程都是一样的,那父进程是谁呢?
    在这里插入图片描述
    我们查到的父进程是一个bash,叫做命令行解释器,本质是一个进程,我们每次登陆我们的云服务器,操作系统会给我们每一个用户分配一个bash,-表示远程登陆。
    它先启动“printf”打印命令行,然后再“scanf”
    在这里插入图片描述
    我们历史上执行的命令,比如ls,pwd,mkdir都是进程,他们的父进程全都是bash

  2. 父进程如何创建子进程的呢?代码创建子进程的方式,fork是一个系统调用
    在这里插入图片描述

  3. 代码演示
    在这里插入图片描述
    在这里插入图片描述
    正常情况下代码刚开始运行都是一个执行流,执行完fork就会变成两个执行流,这两个执行流都会执行后续代码,这就是为什么进程开始运行会出现两次,原因是进程 = PCB + 自己的代码和数据,父进程再创建子进程的时候会把它的PCB拷贝一份给子进程(但子进程pid会被修改),所以子进程的代码和数据和父进程的一样,所以会运行两次,子进程没有自己的代码和数据,因为目前没有新的程序加载,所以会共享父进程的代码和数据。

  4. 让父子进程执行不一样的逻辑
    在这里插入图片描述
    运行结果
    在这里插入图片描述

  5. fork的返回值
    在这里插入图片描述

这里提出几个问题:

  1. 为什么fork给父子返回各自夫人不同返回值?
    父:子 = 1:n,因为父进程有多个孩子,一定要把子进程的pid返回给父进程,父进程才好区分子进程
  2. 为什么一个函数有两个返回值?
    一个函数执行到return,这个函数的核心功能已经做完了
    在这里插入图片描述

写时拷贝:
在这里插入图片描述
独立性是如何做到的?数据结构独立,代码共享(代码是只读的,不影响),数据以写时拷贝的方式各自私有一份

  1. 为什么一个变量即==0,又大于0,导致if else同时成立?
    返回的本质时写入变量,父和子谁先return谁就先会修改pid_t id这个变量

👍 如果对你有帮助,欢迎:

  • 点赞 ⭐️
  • 收藏 📌
  • 关注 🔔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件:/etc/docker/daemon.json(如果存在) /etc/systemd/system/docker.service&#xff…

【医院内部控制专题】7.医院内部控制环境要素剖析(三):人力资源政策

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院内部控制的重要性愈发凸显。内部控制作为医院管理的关键组成部分,对于保障医院资产安全、提高会计信息质量、提升运营效率以及实现战略目标起着至关重要的…

计算机网络——交换机

一、什么是交换机? 交换机(Switch)是局域网(LAN)中的核心设备,负责在 数据链路层(OSI第二层)高效转发数据帧。它像一位“智能交通警察”,根据设备的 MAC地址 精准引导数…

CentOS7离线部署安装Dify

离线部署安装Dify 在安装 Dify 之前,请确保您的机器满足以下最低系统要求: CPU > 2 核 内存 > 4 GiB 1.安装docker和docker compose 启动 Dify 服务器最简单的方式是通过docker compose。因此现在服务器上安装好docker和docker compose&#xf…

力扣hot100_二叉树(4)_python版本

一、199. 二叉树的右视图 思路: 直接复用层序遍历的代码,然后取每层的最后一个节点代码: class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:层序遍历取每层的第一个if not root: return []res []queue …

bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)

1.问题 Ant中使用a-select下拉框时,placeholder设置输入框显示默认值提示,vue2ant null与undefined在js中明确的区别: null:一个值被定义,定义为“空值” undefined:根本不存在定义 2.解决 2.1 a-select使…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界? 一、传统模型的世纪困境:当n-gram遇上"月光族难题" 令人震惊的案例:2012年Google语音识别系统将 用户说:“我要还信用卡” 系统识别&#xff…

练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关

这是题目,我已经画分好了网段,题目要求是这样的: 划分网段 我为什么一个网段划了6个可用IP(一个网段8个地址)呢,因为我刚开始吧环回接口理解成一个主机了,导致我认为两个环回主机在一个网段,其实每个网段只需要2个地址就可以完成这个练习,我懒得划了,就按第一张图的网段来吧…

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】

文章目录 一、前言二、使用说明2.1 引入依赖2.2 引入组件2.3 引入dhtmlx-gantt2.4 甘特图数据配置2.5 初始化配置 三、代码示例3.1 Vue2完整示例3.2 Vue3 完整示例 四、效果图 一、前言 dhtmlxGantt 是一款功能强大的甘特图组件,支持 Vue 3 集成。它提供了丰富的功…

音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式,这两个文档都可以从RFC官网下载: RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页,本文下面所说的“页数”是指在pdf阅读…

超分之DeSRA

Desra: detect and delete the artifacts of gan-based real-world super-resolution models.DeSRA:检测并消除基于GAN的真实世界超分辨率模型中的伪影Xie L, Wang X, Chen X, et al.arXiv preprint arXiv:2307.02457, 2023. 摘要 背景: GAN-SR模型虽然…

Ubuntu用户安装cpolar内网穿透

前言 Cpolar作为一款体积小巧却功能强大的内网穿透软件,不仅能够在多种环境和应用场景中发挥巨大作用,还能适应多种操作系统,应用最为广泛的Windows、Mac OS系统自不必多说,稍显小众的Linux、树莓派、群辉等也在起支持之列&#…

小程序事件系统 —— 33 事件传参 - data-*自定义数据

事件传参:在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参; 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成…

【Java学习】包装类

面向对象系列九 包装类变量 一、装箱 1.实例化包装对象 2.静态缓存池 3.写法 二、拆箱 包装类变量 每个基本数据类型都有对应的基本类型的包装类变量,将基本数据类型通过对应的包装类对象载入着进入到类与对象面向对象体系 一、装箱 Integer.valueOf(int) —…

中国自动化领域零部件研究报告

一、引言 1.1 研究背景与目的 随着科技的飞速发展,自动化技术已成为推动各行业转型升级的关键力量。中国自动化领域零部件行业在近年来取得了显著进展,市场规模持续扩大,技术水平不断提升。在政策支持与市场需求的双重驱动下,中…

MySQL数据集成:高效数据同步与监控

MySQL数据集成案例分享:user-钉钉部门树-名称刷新 在企业信息系统中,数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——将MySQL中的数据集成到另一个MySQL数据库中,方案名称为“u…

时序数据库TimescaleDB基本操作示例

好的&#xff01;以下是使用 TimescaleDB 的 Java 示例&#xff08;基于 JDBC&#xff0c;因为 TimescaleDB 是 PostgreSQL 的扩展&#xff0c;官方未提供独立的 Java SDK&#xff09;&#xff1a; 1. 添加依赖&#xff08;Maven&#xff09; <dependency><groupId&g…

【VBA】WPS/PPT设置标题字体

通过VBA&#xff0c;配合左上角的快速访问工具栏&#xff0c;实现自动化调整 选中文本框的 字体位置、大小、颜色。 配合quicker更加便捷 Sub DisableAutoWrapAndFormat()Dim shp As Shape 检查是否选中了一个形状&#xff08;文本框&#xff09;If ActiveWindow.Selection.Typ…

Qt:事件

目录 处理事件 鼠标事件 键盘事件 定时器事件 窗口事件 虽然 Qt 是跨平台的 C 开发框架&#xff0c;Qt 的很多能力其实是操作系统提供的 只不过 Qt 封装了系统的 API 事件 前面学习过信号槽&#xff1a; 用户进行的各种操作&#xff0c;就可能会产生出信号&#xff0c;可以…