【Linux】进程概念(上)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

​🌠 作者@阿亮joy.
🎆专栏《学会Linux》
🎇 座右铭每个优秀的人都有一段沉默的时光那段时光是付出了很多努力却得不到结果的日子我们把它叫做扎根
在这里插入图片描述

目录

👉冯诺依曼体系结构👈

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

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

关于冯诺依曼体系结构必须强调几点

  • 这里的存储器指的是内存内存掉电易失。而磁盘输入外存其具有永久性存储能力。
  • 不考虑缓存情况这里的 CPU 能且只能对内存进行读写不能访问外设输入或输出设备。
  • 外设输入或输出设备要输入或者输出数据也只能写入内存或者从内存中读取。
  • 一句话所有设备都只能直接和内存打交道。
  • 有些硬件既是输入设备又是输出设备如磁盘和网卡。
  • 外设是相对于内存和 CPU 而言的。
  • 运算器 + 控制器 + 其他 = CPU。
  • 所有的外设有数据需要加载只能加载到内存中。内存写出数据也是写到外设中。
  • CPU 不和外设直接打交道只能和内存直接打交道。

CPU 在读取和写入数据的时候在数据层面上只和内存打交道是为了提高整机运算效率。因为磁盘的速度是较慢的内存的速度是较快的CPU 的速度是快的如果 CPU 直接向磁盘读取和写入数据就会降低了整机的运算效率。

CPU 很快但也很笨。它只能被动地接收别人的指令和数据然后执行别人的指令和计算别人的数据。CPU 中有自己的指令集分为精简指令集和复杂指令集。而编译代码的本质就是形成二进制可执行程序翻译成 CPU 能够认识的指令让 CPU 帮我们做计算。

在这里插入图片描述
程序要运行必须加载到内存中。那为什么要加载到内存中呢CPU 要执行我的代码访问我的数据只能从内存中读取这是冯诺依曼体系结构规定的

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

首先先将我们 QQ 程序加载到了内存CPU 再执行 QQ 程序的代码。如果我们从键盘中输入“你好”并点击发生“你好”这个信息先加载到内存然后再交给 CPU 处理最后 CPU 将结果交给内存内存再将结果交给显示器和网卡。经过网络传输后朋友电脑的网卡接收到信息然后交给其内存中然后经过 CPU 处理后再显示到朋友电脑的显示器上。

在这里插入图片描述

👉操作系统Operator System👈

在之前的博客我们提到过操作系统是一个进行软硬件资源管理的软件。为什么要管理呢操作系统要通过合理地管理软硬件资源手段为用户提供良好的稳定的、高效的和安全的执行环境目的。

那操作系统是如何将软硬件资源管理起来的呢为了更好地理解操作系统是如何管理软硬件资源的我们先来看一下生活中的例子在学校里假如校长管理者从未和学生被管理者进行过交流校长也能够很好地将学生管理起来。那么我们可以得出一个堆管理者的理解管理者不需要和被管理者进行直接交互也能够把被管理者管理起来。管理者对重大事宜有决策的权利的而决策是有依据的。那这是怎么做到的呢 虽然学生不直接和校长打交道但是学生的所有数据绩点、各科成绩等早已经被校方拿走了而且这些数据一直都在更新。那么校长只要管理好这些数据就能将学生管理起来了。总的来说管理的本质就是对数据做管理。

在这里插入图片描述

管理者是通过被管理者的数据来进行管理的。那管理者是如何一直拿到这些数据呢那么管理者和被管理者之间还有执行者执行者会执行管理者的决策以及和被管理者接触拿到被管理者的数据交给管理者。在学校里校长就是管理者辅导员就是执行者学生就是被管理者。而在计算机里操作系统就是管理者驱动程序就是执行者硬件就是被管理者。

在这里插入图片描述

  • 管理者通过对数据进行管理实现对被管理者的管理
  • 数据的采集和决策的执行由执行者来做

校长要管理的学生很多那么需要管理学生的信息也很多但是需要管理的信息种类是一样的。那么一个学生的各种信息可以定义成一个结构体每个学习的信息结构体链接在一起就形成了链表。那么现在对学生数据做管理就变成了对链表做管理。

在这里插入图片描述

那么以上的过程就是先描述面向对象再组织数据结构。其实所有的管理本质逻辑都是先描述再组织。

在这里插入图片描述

  • 管理的本质是对数据进行管理
  • 管理的方法是先描述再组织

以上是操作系统对硬件的管理方式其是操作系统对软件也是这样子进行管理的。软件能管理硬件也能够管理软件。

操作系统是不相信任何人的它是很容易受到伤害的但是操作系统也必须给上层用户提供各种服务。那如何解决呢那么在用户和操作系统之间还有一层系统调用接口而这些接口也是用C语言写的如fork 和 wait 等等。

在这里插入图片描述
在这里插入图片描述

在系统调用上面还有一层分别是 shell 、C / C++ 的库lib和界面等。shell 可以满足用户的指令操作C / C++库满足用户的编程操作它们都需要系统调用接口来完成相关操作。

系统调用和库函数的概念

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

计算机软硬件体系结构

在这里插入图片描述

👉进程👈

什么是进程

在课本上我们经常会看到一个运行起来加载到内存的程序就是进程、进程和程序相比具有动态性等等的说法。其实这些说法都是不全面的。那么接下来我们一起探讨什么是进程

我们写代码经过编译和链接后形成了可执行程序。而程序的本质是在磁盘上放着的文件。程序想要运行起来首先需要加载到内存。那么内存了肯定会有很多被加载进来的程序那么操作系统如何管理这些程序呢是不是先描述在组织啊

为了描述这些程序就引入了进程控制块Processing Control Block的概念。而进程等于内核数据结构struct task_struct+ 进程对应的磁盘代码。

在这里插入图片描述
在这里插入图片描述

task_ struct 内容分类

  • 标示符: 描述本进程的唯一标示符用来区别其他进程。
  • 状态: 任务状态退出代码退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。
  • 内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针。
  • 上下文数据: 进程执行时处理器的寄存器中的数据[休学例子要加图CPU寄存器]。
  • I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。
  • 记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。
  • 其他信息。

查看和杀死进程

在这里插入图片描述

ps ajx | head -1 && ps ajx | grep '进程名' #查看指定进程
kill -9 进程的PID #杀死指定进程

在这里插入图片描述

在这里插入图片描述
注PID Process ID是进程的标识符。grep 指令也是一个进程。进程在调度运行的时候进程具有动态属性

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注getpid 函数是获得当前进程的 PID而 getppid 函数是获得当前进程的父进程的 PID。

查看进程目录 ls /proc

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
注删掉进程对应的可执行程序进程还可以跑。因为进程跑起来就和可执行程序没有什么太大的关系了。Ctrl + C 可以退出前台程序。

如果我们把我们的进程退出再运行起来如此重复。我们会发现一个现象子进程的 ID 一直在变而父进程的 ID 一直不变。这是为什么呢

在这里插入图片描述
那么我们就来看看这个父进程是什么。

在这里插入图片描述
其实该父进程就是 bash该进程是云服务器开启时系统帮我们创建好的。一般情况下命令行上启动的进程的父进程都是 bash。shell 以创建子进程的方式来跑我们的程序子进程出问题了父进程不会受到任何的影响。那 shell 是如何创建子进程将我们的程序跑起来的呢这部分内容将在进程控制里讲解。接下来我们来学习一下如何创建子进程。

创建子进程

fork 是一个创建子进程的函数。

在这里插入图片描述

注vim 的批量化注释先摁下 Ctrl + V 键再连续摁下方向键j - 向下k - 向上至你想要注释的内容再摁下 Shift + i 键最后输入 // 就可以实现批量化注释了。
在这里插入图片描述

在这里插入图片描述

上面只是一个小小的例子我们通常不这么来写代码。

对于 fork 函数我们重点研究它的返回值。如果子进程创建成功将会给父进程返回子进程的 ID给子进程返回 0。如果子进程创建失败将会给父进程返回 -1。

在这里插入图片描述
知道了 fork 函数的返回值后我们对上面的代码再进行修改并让程序跑起来。

在这里插入图片描述
在这里插入图片描述

上图的结果很好地说明了子进程创建成功将会给父进程返回子进程的 ID给子进程返回 0。但我有一个问题为什么同一个变量 id在后续不会被修改的情况下有不同的内容呢现在这个知识点无法给大家讲解这里涉及了进程地址空间的内容。

fork 函数真正的用法是利用分支结构来让父子进程执行不同的代码那我们再把上面的代码修改一下。

在这里插入图片描述

在这里插入图片描述
现在父子进程在一起运行那么这就是多进程了。那现在问题来了如果是 C语言的话if - else if - else 结构能够同时成立吗很明显不能但是现在似乎可以了。其实真正的原因是 fork 函数执行之后会有父子进程两个进程在执行后续的代码也就是说 fork 函数之后的代码被父子进程共享。那么我们就可以通过返回值的不同让父子进程执行后续共享代码的一部分。

👉总结👈

本篇博客主要讲解了冯诺依曼体系结构什么是操作系统、库和函数调用的区别、什么是进程、如何查看和杀死进程以及如何创建子进程等等。那么以上就是本篇博客的全部内容了如果大家觉得有收获的话可以点个三连支持一下谢谢大家💖💝❣️

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: linux