Linux进程理解(冯诺依曼体系结构,操作系统,进程概念和基本操作)

Linux进程理解[冯诺依曼体系结构,操作系统,进程概念和基本操作]

  • 一.冯诺依曼体系结构
    • 1.冯诺依曼体系结构的说明
    • 2.冯诺依曼体系结构的价值
      • 1.冯诺依曼之前的计算机的局限
      • 2.为什么在计算机体系结构当中要存在内存?
  • 二.操作系统
    • 1.什么是操作系统
    • 2.操作系统如何进行管理
    • 3.为什么要有操作系统
    • 4.系统调用接口和用户操作接口
  • 三.进程理解
    • 1.进程的概念
    • 2.task_struct结构体独特的链接方式
    • 3.task_struct内容分类(粗略的谈一下)
  • 四.进程基础的相关操作
    • 1.查看进程
    • 2.杀死进程
  • 五.进程PID
    • 1.getpid()和getppid()
    • 2.fork()函数创建进程
      • 1.fork()函数
      • 2.演示
      • 3.几点说明
        • 1.进程的独立性
        • 2.关于fork函数返回值的几个问题
            • 1.为何给父子进程的返回值是不同的?
            • 2.fork函数为何会返回2次?
            • 3.为何id作为同一个变量既可以表示父进程id,又可以表示子进程id呢?
      • 4.创建多个子进程(观察进程的创建和退出的全过程)
  • 六.另一种查看进程的方法
    • 1./proc
    • 2.exe链接文件
    • 3.如何改变cwd呢?
  • 七.总结

要了解进程,我们首先要先了解两大知识点:

1.冯诺依曼体系结构(从硬件的角度来谈)
2.操作系统(从软件的角度来谈)

一.冯诺依曼体系结构

1.冯诺依曼体系结构的说明

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

2.冯诺依曼体系结构的价值

要了解冯诺依曼体系结构的价值,首先我们要先明确两点:
在这里插入图片描述

1.冯诺依曼之前的计算机的局限

可是在基于冯诺依曼体系结构设计的计算机出现之前
计算机有两大不足之处:
1.效率低
2.贵
为什么会这样呢?
在这里插入图片描述
这是从网上找的一张计算机的存储金字塔
它详细的说明了一个道理:
在这里插入图片描述
当时的计算机只有CPU和输入设备,输出设备
而且大家可能都听说过木桶原理
在这里插入图片描述
在这里插入图片描述

2.为什么在计算机体系结构当中要存在内存?

在这里插入图片描述
因此内存的引入使得我们的计算机的整体效率还不错,而且还比较便宜,这也就利于计算机的传播
使用计算机的人越来越多,因此才出现了互联网
在这里插入图片描述
在这里插入图片描述
至此,我们就将理解进程前冯诺依曼体系结构相关的前置知识介绍完毕

下面我们来谈一下第二个前置知识:操作系统

二.操作系统

1.什么是操作系统

在这里插入图片描述
在这里插入图片描述
这里的驱动程序是指:
操作系统可以通过调用对应底层硬件对应的驱动程序的接口来实现对底层硬件的访问与控制
因此把操作系统可以通过驱动程序来保证对硬件管理的高效性和成功率

2.操作系统如何进行管理

在这里插入图片描述
在这里插入图片描述
至此,我们就了解了操作系统是如何进行软硬件资源管理的了
那么接下来的问题是:
操作系统跟用户之间是什么关系呢?
下面我们就说明操作系统跟用户之间的关系:

3.为什么要有操作系统

在这里插入图片描述

4.系统调用接口和用户操作接口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,大家对于这张图片的理解就会更加深刻了
我们将理解进程前操作系统相关的前置知识介绍完毕了
下面我们正式进入进程的学习当中

三.进程理解

1.进程的概念

我们大家应该都知道我们windows系统当中的任务管理器
在这里插入图片描述
程序被加载到内存变成进程的时候,操作系统会给每一个进程分配一个用来存放该进程的结构体对象的数据,方便操作系统对进程进行管理!

下面这个就是描述进程信息的结构体
在这里插入图片描述
至此操作系统成功将进程的属性用PCB对象描述好了,
因此操作系统对于进程的管理就变成了对PCB对象的管理

因此:

进程=内核数据结构(不仅仅是PCB对象)+可执行程序

因此,所有对进程的控制和操作都只和进程的PCB对象有关,和进程的可执行程序无关
只要你愿意,你可以把PCB对象放入任何数据结构中进行管理!

2.task_struct结构体独特的链接方式

请注意:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一个task_struct可以被连入多种数据结构中!!!

这一点很重要,因为我们以后还要介绍运行队列,
这就是在不改变task_struct已经形成的链表结构的同时
还可以将其放入队列当中的原因

3.task_struct内容分类(粗略的谈一下)

那么task_struct里面都是什么呢?
我们先来粗略的谈一下
在这里插入图片描述
关于这里的这个pc指针或者eip寄存器
我们介绍一下它的作用
在这里插入图片描述
这些内容我们以后会详细介绍的
你说了这么多,总得让我们见一见进程吧
下面我们先来看一下进程基础的相关操作

四.进程基础的相关操作

1.查看进程

先生成一个process可执行程序
在这里插入图片描述
在这里插入图片描述

ps ajx | head -1 && ps -ajx | grep 可执行程序名字

在这里插入图片描述
在这里我们先执行了一个可执行程序:process
然后查看这个进程
在这里插入图片描述

ps ajx | head -1 && ps -ajx | grep 可执行程序名字 | grep -v grep

2.杀死进程

刚才我们说了ctrl+c退出一个进程
有些时候ctrl+c并不可行(下面我们就会见到这种情况的)
此时就需要我们去使用

kill -9 进程的PID

来杀死指定的进程
在这里插入图片描述

五.进程PID

1.getpid()和getppid()

在这里插入图片描述
注意:pid_t的值都是正整数或0
在这里插入图片描述
下面我们来在代码当中查看一下process的进程ID和其父进程ID
在这里插入图片描述

while :; do ps ajx | head -1 && ps ajx | grep 可执行程序名字 | grep -v grep; sleep 1;done

这个shell命令可以死循环查看含有指定可执行程序名字的进程
每次while循环都会休眠1秒
按ctrl+c退出
在这里插入图片描述
根据进程ID查看对应进程的信息:

ps ajx | head -1 && ps ajx | grep 进程ID | grep -v grep

下面我们多次执行这个进程,发现:
在这里插入图片描述

2.fork()函数创建进程

1.fork()函数

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

2.演示

下面我们来演示一下

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

3.几点说明

1.进程的独立性

(任意)进程之间是具有独立性的,互相之间不能影响

即使父进程和子进程亲如父子,但是当我们的子进程和父进程都运行起来之后,
子进程挂了,代码也仍会存在,对父进程无影响
父进程挂了,代码也仍会存在,对子进程无影响

杀死父进程,子进程依然运行
在这里插入图片描述
不过此时因为父进程被杀死了,所以子进程无法通过ctrl+c退出
只能使用kill -9杀死子进程
在这里插入图片描述
杀死子进程,父进程依然运行,
右上方的窗口显示了子进程处于defunct(也就是关闭)的状态
说明子进程被杀死了,按ctrl+c后父进程可以正常退出
在这里插入图片描述
关于父子进程的话题,我们以后在介绍僵尸进程和孤儿进程的时候会进行详细说明的
在这里我们只需要知道:进程之间是具有独立性的,互相之间不能影响

2.关于fork函数返回值的几个问题
1.为何给父子进程的返回值是不同的?

通过fork函数的返回值区分父子进程,利用if else判断来让父子进程做不同的事情

2.fork函数为何会返回2次?

在fork函数内部,在执行到return语句之前,子进程已经被创建好了
又因为父子进程的代码是共享的
而且return语句本身也属于代码
所以return语句既会被父进程执行,也会被子进程执行

3.为何id作为同一个变量既可以表示父进程id,又可以表示子进程id呢?

这就涉及到写时拷贝的知识点了,先在这里提一下,以后我们还会提到的:
在这里插入图片描述
因此,我们可以得出:

在Linux中,可以用同一个变量名来表示不同的内存

4.创建多个子进程(观察进程的创建和退出的全过程)

下面我们创建多个子进程
观察一下进程的创建和退出的全过程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后所有的子进程都退出了,只剩下一个父进程最后休眠了15秒之后才退出
这样我们就能够看到进程从创建到退出的全过程了
这里的子进程处于defunct(也就是关闭)的状态就表示该进程已经退出了

六.另一种查看进程的方法

1./proc

进程的信息可以通过 /proc 系统文件夹查看

ls /proc

在这里插入图片描述
查看具体某一个进程的信息:

ls /proc 进程id

在这里插入图片描述
下面我们用mycmd这个可执行程序来测试一下
在这里插入图片描述
我之前在Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)这篇博客中提到过链接文件
在这里插入图片描述
接下来我们还会见到链接文件

2.exe链接文件

在这里插入图片描述
在这里插入图片描述
不过这个进程就只能执行这一次了,当这个进程结束之后,就无法再执行了
在这里插入图片描述
当我把mycmd这个可执行程序删除之后,这个进程依旧再运行
但是这个exe执行的那个可执行程序已经显示deleted了
在这里插入图片描述

3.如何改变cwd呢?

我们可以使用chdir函数
在这里插入图片描述
下面我们来实验一下
当前是在这个路径下
在这里插入图片描述
我想让它到

/home/wzs/wzsdir/systemlearndir

这个路径下
在这里插入图片描述
在这里插入图片描述
下面我们来创建一个文件
加深一下对cwd和fopen函数的理解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现test.txt的确被创建在了

/home/wzs/wzsdir/systemlearndir

这个路径下

七.总结

这篇博客我们主要介绍了
1.冯诺依曼体系结构
2.操作系统
3.进程的概念,task_struct结构体
4.进程基础的相关操作:查看进程,杀死进程,改变进程所在工作目录
5.进程PID,fork函数创建进程

以上就是Linux进程理解(冯诺依曼体系结构,操作系统,进程概念和基本操作)的全部内容,希望能对大家有所帮助!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S部署mongodb-sharded-cluster(7.0.2)副本分片

添加源 helm repo add bitnami https://charts.bitnami.com/bitnami指定版本拉取 helm pull --repo https://charts.bitnami.com/bitnami mongodb-sharded --version 7.0.5安装时选择SCRAM-SHA-1默认是SCRAM-SHA-256 helm install -n prod mymongodb mongodb-sharded --value…

react大文件上传

目录 大文件上传优点: 大文件上传缺点: 大文件上传原理: 为什么要用md5 实现流程: 部分代码1: 部分代码2:​ 大文件上传优点: 文件太大分片上传能加快上传速度,提高用户体验能断点续传 如果上次上传失败…

vue2中的props属性

vue2中的props属性 props传递&使用 调用子组件是创建子组件的实例 传递属性::a"a",非字符串都用v-bind created: 属性 状态 computed watch都处理好了 会被挂载到实例上get/set劫持:get获取最新,set目的抛出错误 修…

uniapp实现表单弹窗

uni.showModal({title: 删除账户,confirmColor:#3A3A3A,cancelColor:#999999,confirmText:确定,editable:true,//显示content:请输入“delete”删除账户,success: function (res) {console.log(res)if(res.confirm){if(res.contentdelete){console.log(123123123213)uni.setSto…

如何让Python2与Python3共存

安装 首先分别安装Py2和Py3,我都安装到C盘根目录里了,然后分别将Py2和Py3都配置到系统环境变量中去:C:\Python36\Scripts\;C:\Python36\;C:\Python27\;C:\Python27\Scripts; 配置 修改两个版本的可执行文件名字 验证 重新配置一下pip …

前端数组方法汇总集锦

前言 数组主要使用场景有: 存储和处理数据:数组是一种有序的数据结构,可以用来存储和处理多个相关的数据。在前端开发中,我们经常使用数组来存储和处理列表、表格、选项等数据。 循环和遍历:数组提供了循环和遍历的功能…

柱形图:制作图表时,有时会遇到柱形图系列没有居中显示,例如:

问题描述 制作图表时,有时会遇到柱形图系列没有居中显示,例如: 原因分析 柱形图的「分类」和「系列名」均选择了「地区」,导致分类下存在不同的系列,那么当前分类下没有的系列就会存在「空白占位」。 解决方案 此时…

vue diff算法原理以及v2v3的区别

diff算法简介 diff算法的目的是为了找到哪些节点发生了变化,哪些节点没有发生变化可以复用。如果用最传统的diff算法,如下图所示,每个节点都要遍历另一棵树上的所有节点做比较,这就是o(n^2)的复杂度,加上更新节点时的…

2023年中国高压驱动芯片分类、市场规模及发展趋势分析[图]

高压驱动芯片是一种能在高压环境下工作的集成电路,主要用于控制和驱动各种功率器件,如继电器、电磁阀、电机、变频器等。高压驱动芯片根据其输出电流的大小和形式可分为两类恒流型和开关型。 高压驱动芯片分类 资料来源:共研产业咨询&#x…

el-input限制输入整数等分析

文章目录 前言1、在 Vue 中,可以使用以下几种方式来限制 el-input 只能输入整数1.1 设置input 的 type为number1.2 使用inputmode1.3 使用自定义指令1.4 使用计算属性1.5 使用 onafterpaste ,onkeyup1.6 el-input-number 的precision属性 总结 前言 input 限制输入…

LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」

原文:LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 当前阶段对开发者来讲,一个让人感到舒服的开发流程应该具备这么五特性: 支持 LCEL,让人赏心悦目又可以简化开发…

坚鹏:中国工商银行数字化转型发展现状与成功案例培训圆满结束

中国工商银行围绕“数字生态、数字资产、数字技术、数字基建、数字基因”五维布局,深入推进数字化转型,加快形成体系化、生态化实施路径,促进科技与业务加速融合,以“数字工行”建设推动“GBC”(政务、企业、个人&…