Linux之冯诺依曼体系,操作系统,进程的理解,进程状态,以及进程的优先级

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    算法

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

目录

一.冯诺依曼体系

二.操作系统

2.1概念

2.2结构示意图(不完整)

2.3尝试理解操作系统

三.进程理解

3.1进程

3.2指令查看进程

3.3代码查看进程

3.4fork创建子进程

3.5进程退出指令

四.进程的状态

4.1休眠状态 (S)

4.2运行状态(R)

4.3暂停状态 (T/t)

4.4D状态​编辑

4.5僵尸状态(Z)

 4.6孤儿状态

4.6阻塞和挂起 

4.6.1阻塞态

4.6.2挂起

五.优先级

5.1什么是优先级

5.2为什么要有优先级

5.3优先级的查看与修改


一.冯诺依曼体系

        在冯诺依曼体系之前设备主要包括输入,cpu,输出,这三部分,没有存储器,冯诺依曼体系多了一个存储器,冯诺依曼体系的设备分类,冯诺依曼体系包括输入输出,存储器,运算器和控制器,输入设备包括鼠标,键盘,摄像头,网卡,磁盘等,输出设备有显示器,网卡,磁盘,声卡等。存储器主要是内存,cup指的是运算器和控制器。我们可以看下面的图,是冯诺依曼体系的具体图例:

在冯诺依曼体系中用户数据是从输入设备流入,流到存储器中,再从存储器流到cpu中,然后再从cup到存储器中,最后输出,数据在这些硬件中的流动实质是一种拷贝,因此设备间拷贝的速率决定了计算机的效率。在cpu中硬件可以看下面图片

从上到下容量越来越大,运算速率越来越低,成本越来越低。冯诺依曼体系和以前最大的区别就是增加了存储器,增加存储器有什么作用呢?存储器可以将数据预先加载到内存中,需要的时候取出来,这样计算机中运算速率最低的由输入设备改到了存储器这一步骤,这样也就加快了设备运行的速率。在程序运行时,为什么要加载到内存中呢?我们需要知道程序运行需要cpu进行处理,而cpu只和内存打交道,所以程序要加载到内存中时冯诺依曼体系规定的。下面我们还有一个场景,我们和别人用软件进行交流,这是怎么进行的?我们可以将我们看成一个冯诺依曼体系,另一个人也看成一个冯诺依曼体系,我们输入信息,信息加载到内存中,经过cpu处理,传回内存经过网卡传到另一台设备,在加载到内存中,经过cpu处理,回到内存中,输出到屏幕。这就是冯诺依曼体系的应用场景。

二.操作系统

2.1概念

        操作系统是软件,对软硬件资源进行管理,在广义上是操作系统的内核+系统的外壳和周边,狭义上是操作系统的内核。

2.2结构示意图(不完整)

        根据这张图我们可以进行理解,操作系统进行进程管理,文件管理,内存管理,驱动管理等对我们的软硬件资源进行管理,在硬件中遵循冯诺依曼体系,当我们想要修改硬件或一些资源时,我们要保证操作系统正常运行就得修改操作系统的一些信息,我们一换就得更新操作系统,这样显然是不可取的,这时候我们的驱动就出来了,这些硬件会出现对应的驱动来对这些硬件进行处理,保证操作系统的正常运行。我们还可以看到操作系统的体系是一种层状结构。那为什么要有操作系统呢?操作系统对下进行软硬件资源管理(手段),对上提供一个良好的,稳定的,高效的环境(目的)。

2.3尝试理解操作系统

        操作系统一个重要的作用就是管理,随着数据的增多,管理的难度也大大增加,我们可以定义一个结构体,将数据转换为结构体,但是由于数据多,且数据独立,因此操作系统中的信息以链表的形式进行存储,这样操作系统只需要知链表头的指针就可以进行管理,对数据的管理也就变成了对链表的增删查改。

        在操作系统的上方还有其他的,最重要的就是用户,我们需要知道为了防止操作系统的信息被修改,用户不可以直接访问操作系统,但是我们可以通过一些接口来访问我们的操作系统,比如我们在c语言时学的scanf和printf这两个函数就是可以访问操作系统的接口。

三.进程理解

3.1进程

        在进程中会有一个 struct PBC结构体,里面是进程的数据,进程就是PCB+代码和数据,在linux中进程的PCB时task_struct结构体。

进程运行时会在内存中形成一个调度队列,进程被调度时会被加载到内存中,在一段时间后进程没有运行完会再次加载的调度队列的后面等待被调度。 

3.2指令查看进程

        我们先写一段代码

#include<stdio.h>int main()
{while(1){printf("I am a process!!\n ");sleep(1);}return 0;
}

我们运行我们的代码可以看到

我们输入指令

ps axj | head -1 &&ps axj | grep process

其中./process.exe是我们代码的信息,PID是进程的进程标识符,PPID是这个进程的父进程下面那个是我们使用grep产生的进程。

3.3代码查看进程

        使用代码查看进程时我们需要一个预备知识getpid函数和gitppid的用法,我们可以通过man来查看。

我们看代码:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{pid_t id=getpid(),pid=getppid();while(1){printf("I am a pid: %d,ppid: %d\n ",id,pid);sleep(1);}return 0;
}

我们就可以看到代码运行时的进程信息。

3.4fork创建子进程

我们先看fork函数

fork函数返回失败时返回-1,子进程返回0,父进程返回1。我们写代码来进行实验,我们打开饿哦们的监控脚本

while :; do pa axj |head -1&&ps axj | grep process; sleep 1; done

我们运行程序可以看到

我们可以看到第二个是子进程,第一个是父进程,子进程的ppid是父进程的pid.注意,fork后的代码父子进程共享代码。

我们进入/proc目录下,可以查看进程,

我们可以看到

我们输入指令

ll 21389 -a

 可以看到

3.5进程退出指令

进程退出的指令为

kill -9 进程的pid

四.进程的状态

        进程的状态分为休眠状态,运行状态,暂停壮观,D状态,死亡状态,孤儿,僵尸这几种,我将会给大家用代码来演示这些状态的形成,由于D状态会引发xshell的卡顿,所以这里不做演示。

4.1休眠状态 (S)

我们看代码:

#include<stdio.h>int main()
{while(1){printf("I am a process\n");}return 0;
}

我们启动我们的监控脚本可以看到

其中STAT时进程的状态,.process.exe的状态是s+,这个+号是在后台运行,和我们的进程目前无关。如果运气好的话进程也可能是R状态,这个是由于由printf函数的原因,在执行printf语句时,会等待计算机资源,计算器进入输出设备,不在进程中,而且计算机运行很快,但是进入输出却比较慢,所以大部分时间在进行输出,所以进程大部分在S状态。

4.2运行状态(R)

我们看代码

#include<stdio.h>int main()
{while(1){//printf("I am a process\n");}return 0;
}

我们只需要将print语句著时掉,就不会调用其他资源,一直是R状态,启动监控脚本可以看到

 进程的STAT是R状态。

4.3暂停状态 (T/t)

        这个状态需要我们输入指令,我们用上面的状态来演示,我们输入指令

kill -19 pid

 我们可以看到是T状态

我们输入指令

kill -19 pid

进程就取消了暂停状态。

4.4D状态

 在进程进程传输数据时,一旦内存不够,会导致操作系统杀掉进程,由于进程杀掉,会导致数据丢失,造成很严重的损失,所以出现了D状态,这样就不会导致进程没有执行完被杀掉。

4.5僵尸状态(Z)

        僵尸状态就是子进程运行结束,父进程还在运行,子进程必须由父进程结束,我们知道进程时由task_struct以及代码和数据,这时候由于子进程结束,操作系统会将代码和数据进行释放,只剩下task_struct,这时候子进程就是僵尸状态。我们看下面代码:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{pid_t id=fork();if(id==0){int cur=5;while(cur--){printf("I am a childprocess , pid: %d ppid: %d\n",getpid(),getppid());sleep(1);}}else {while(1){printf("I am a parentprocess , pid: %d ppid: %d\n",getpid(),getppid());sleep(1);}}return 0;
}

我们可以看到子进程的STAT是Z状态

 4.6孤儿状态

        孤儿状态是父进程结束,子进程没有结束,由于子进程需要父进程结束,父进程结束,父进程的task_struct以及代码和数据被释放,子进程不会结束,子进程会被bash领养。我们看代码:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main()
{pid_t id=fork();if(id==0){while(1){printf("I am a childprocess , pid: %d ppid: %d\n",getpid(),getppid());sleep(1);}}else {int cur=5;while(cur--){printf("I am a parentprocess , pid: %d ppid: %d\n",getpid(),getppid());sleep(1);}}return 0;
}

我们可以看到子进程的ppid显示父进程,然后父进程结束后ppid变成bash。

4.6阻塞和挂起 

4.6.1阻塞态

我们知道cpu有一个运行队列,当一个进程拥有cpu时会一直占据cpu吗?显示不是 会有一个基于时间片的调度,一定时间后若进程没有结束,会回到调度队列的后面,等待再次被调度

当运行到scanf时会将scanf给操作系统中的调度队列,这时候就会进入阻塞状态。

4.6.2挂起

在磁盘中有一个swap分区,当处在阻塞态时,内存不足会让进程的task_struct以及代码和数据, 全部拷贝到swap分区(唤入),需要时在唤出,其中唤入的过程就是阻塞挂起

五.优先级

5.1什么是优先级

        优先级是指进程获取资源的先后顺序,在Linux中优先级数字越小,优先级越高,优先级和权限有什么区别?优先级是可以访问资源,权限是是否可以访问资源。

5.2为什么要有优先级

        进程访问的资源是有限的,而进程总是很多的,为了维持操作系统的正常运行,需要有优先级,如果进程长时间不被调度,会造成节问题。

5.3优先级的查看与修改

我们可以通过指令

ps -al |head -1 &&ps -al |grep process

进优先级的访问,其中的PRI就是优先级,我们运行一个进程,然后查看它的优先级

我们输入指令可以看到:

其中的PRI就是优先级,NI是nice值,新优先级等于优先级+nice值。对于渡河修改优先级,需要我们的top指令,我们输入

 sudo top

再输入

r

再输入进程的pid 

然后输入想要修改的nice值

输入q返回。

再次输入指令

ps -al |head -1 && ps -al |grep process

可以看到

我们想要再次修改需要重复上面的过程

我们想要再次修改,nice为-10,可以看到

 上次是90,这次-10不应该是80吗?其实不然,我们新的进程的优先级=进程的优先级+nice值,其中进程的优先级为80,每一次都按80去计算。其中nice值的范围是[-20,19],我们超过这个范围它就取到最大值,例如我们把nice修改为-100,可以看到

这样我们就可利用指令来查看与修改进程的优先级。 

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

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

相关文章

主流公链 - BCH BSV BTG

为什么出现分叉 BTC是自由的&#xff0c;BTC社区也是自由的&#xff0c;自然而然的会出现不同观点的群体 1. 比特币现金&#xff08;Bitcoin Cash&#xff0c;BCH&#xff09; 分叉日期&#xff1a; 2017年8月1日主要目的&#xff1a; 提高比特币的交易吞吐量和降低交易费用技术…

写作类AI推荐(一)

本章要介绍的写作AI如下&#xff1a; paperpal 特点&#xff1a; 面向科研人员的AI写作工具。可以选择自己的专业&#xff0c;如本科生/教授。 链接&#xff1a;Paperpal-专业AI论文润色与论文检测平台 笔灵 特点&#xff1a; 面向专业写作领域的AI写作工具。可以选择要写的文章…

人事管理系统|基于springboot人事管理系统的设计与实现(附项目源码+论文)

基于springboot人事管理系统的设计与实现 目录 基于springboot人事管理系统的设计与实现 一、摘要 二、相关技术 三、系统设计 3.1 整体功能结构图 3.2 功能具体细节设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取&#xff1a; 一、摘要 传统信息…

【ripro美化】全站美化包WordPress RiPro主题二开美化版sucaihu-childV1.9(功能集成到后台)

使用介绍 1、【宝塔】删除ripro文件&#xff0c;上传最新ripro版本&#xff0c;然后上传压缩包内的ripro里面的对应文件到ripro主题对应内覆盖&#xff08;找到对应路径单个文件去覆盖&#xff09;。 2、然后上传ripro-chlid子主题美化包到/wp-content/themes路径下 3、注意顺…

npm卸载不掉的解决方案

不管怎么重装重启都报错 真服了&#xff0c;npm卸载不掉绝对是有缓存存在&#xff0c;用where npm查到d盘 实际上根本不在这个地方&#xff0c;这个是我安装的6.14.12版本的npm的地方&#xff0c;我说我怎么怎么重装怎么导包都不行呢&#xff0c;偷偷隐藏在这个目录里面&#…

GRE_MGRE综合实验

目录 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有IP地址。 IP配置 配置公网全网通 2、&#xff08;1&#xff09;R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方。 PAP认证 &#xff08;2&#xff09;R2与R5之间使用ppp的CHAP认证&am…

如何修改IDEA的代码样式配置+代码格式化快捷键配置

目录 问题现象&#xff1a; 问题分析&#xff1a; 温馨提示&#xff1a; 1、IDEA的代码样式配置 1.1、Use tab character - Smart tabs 配置&#xff1a; 1.2、Tab Size 配置&#xff1a; 1.3、Indent 配置&#xff1a; 1.4、Continuation Indent 配置 1.5、应用并保存 2、…

openstack 不能调度到某主机上分析

dashboard显示有足够资源创建虚拟机 创建一个1c2g20g配置的虚拟机&#xff0c;在过滤时把10-197-0-2这个主机过滤掉了&#xff0c;日志如下&#xff1a; 2024-03-25 17:52:14.087 26 DEBUG nova.scheduler.filters.disk_filter [req-8f2f32fb-1efe-4e5d-81fc-618210c7c76d 773…

【LeetCode: 面试题 16.05. 阶乘尾数 + 阶乘】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

俄罗斯深陷芯片自主困境,良率仅5成 |百能云芯

俄罗斯的芯片产业一直以来都面临着诸多挑战&#xff0c;尤其是在当前的国际形势下&#xff0c;这些挑战更加凸显。随着俄乌冲突的爆发&#xff0c;西方国家对俄罗斯实施了一系列经济制裁&#xff0c;导致俄罗斯科技产业受到了严重影响。据了解&#xff0c;俄国最大的本土芯片厂…

[Java、Android面试]_14_Retrofit的作用

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

基于Arduino IDE 野火ESP8266模块 MQTT 的开发

一、库介绍 Arduino常用的MQTT库主要有PubSubClient。  PubSubClient库是一个广泛使用的MQTT客户端库&#xff0c;它基于MQTT 3.1.1版本&#xff0c;并且支持ESP8266和ESP32等Arduino兼容的硬件平台。PubSubClient库允许Arduino设备连接到MQTT服务器&#xff0c;发布和订阅MQT…

electron+VUE Browserwindow与webview通信

仅做记录 前言&#xff1a; electronVUEVITE框架&#xff0c;用的是VUE3.0 主进程定义&#xff1a;用于接收webview发送的消息 ipcMain.on(MyWebviewMessage, (event, message) > {logger.info(收到webmsg message)//转发给渲染进程}) porelaod/webPreload.js定义 cons…

C语言编译与链接

前言 我们想一个问题&#xff0c;我们写的C语言代码都是文本信息&#xff0c;电脑能直接执行c语言代码吗&#xff1f;肯定不能啊&#xff0c;计算机能执行的是二进制指令&#xff0c;所以将C语言转化为二进制指令需要一段过程&#xff0c;这篇博客讲一下编译与链接&#xff0c;…

Day26 手撕各种集合底层源码(一)

Day26 手撕各种集合底层源码&#xff08;一&#xff09; 一、手撕ArrayList底层源码 1、概念&#xff1a; ArrayList的底层实现是基于数组的动态扩容结构。 2、思路&#xff1a; 1.研究继承关系 2.研究属性 3.理解创建集合的过程 – 构造方法的底层原理 4.研究添加元素的过程…

vue实现把Ox格式颜色值转换成rgb渐变颜色值(开箱即用)

图示&#xff1a; 核心代码&#xff1a; //将0x格式的颜色转换为Hex格式&#xff0c;并计算插值返回rgb颜色 Vue.prototype.$convertToHex function (colorCode1, colorCode2, amount) {// 确保输入是字符串&#xff0c;并检查是否以0x开头let newCode1 let newCode2 if (t…

关系型数据库mysql(5)存储引擎

目录 一.存储引擎的概念 二. MyISAM 和 InnoDB 2.1MyISAM介绍 2.2MyISAM支持的存储格式 2.2.1静态表&#xff08;固定长度表&#xff09; 2.2.2动态表 2.2.3压缩表 2.3场景举例 2.4.InnoDB 2.4.1场景举例 2.4.2企业选择存储引擎依据 三.查看存储引擎 3.1查看当前数…

C++中的STL简介与string类

目录 STL简介 STL的版本 STL的六大组件 string类 标准库中的string类 string类的常用接口 string类对象对容量的操作 size()函数与length()函数 capacity()函数 capacity的扩容方式 reserve()函数 resize()函数 string类对象的操作 push_back()函数 append()函数 operator()函数…

【01-20】计算机网络基础知识(非常详细)从零基础入门到精通,看完这一篇就够了

【01-20】计算机网络基础知识&#xff08;非常详细&#xff09;从零基础入门到精通&#xff0c;看完这一篇就够了 以下是本文参考的资料 欢迎大家查收原版 本版本仅作个人笔记使用1、OSI 的七层模型分别是&#xff1f;各自的功能是什么&#xff1f;2、说一下一次完整的HTTP请求…

记录何凯明在MIT的第一堂课:神经网络发展史

https://www.youtube.com/watch?vZ5qJ9IxSuKo 目录 表征学习 主要特点&#xff1a; 方法和技术&#xff1a; LeNet 全连接层​ 主要特点&#xff1a; 主要特点&#xff1a; 网络结构&#xff1a; AlexNet 主要特点&#xff1a; 网络结构&#xff1a; Sigmoid Re…