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.mfbz.cn/a/499598.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试产品经理,怎样描述过往经历,才能让面试官印象深刻?

金三银四求职季&#xff0c;你是不是也有面试的冲动&#xff01;但面试并不是头脑一热就能取得好结果&#xff0c;在此之前&#xff0c;必须得有周全的准备&#xff0c;才能应对好面试官的“连环问”&#xff01; 所以&#xff0c;给大家分享这篇产品经理面试干货文章&#xf…

搬运5款有趣又好用的软件

​ 如果你想让你的电脑使用更方便、更有趣、更专业&#xff0c;那么你一定要看看这篇文章&#xff0c;因为我要给你推荐五款好用又有趣的WIN10软件。 1. 文字识别——PandaOCR ​ PandaOCR是一款高效的文字识别软件&#xff0c;可快速将图片中的文字转化为可编辑的文本。其识…

2024年MathorCup数学建模思路B题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

刚刚,璞华科技、璞华易研PLM产品荣获智能制造领域两大奖项!

刚刚&#xff0c;在e-works数字化企业网于北京举办的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”上&#xff0c;璞华科技凭借在智能制造领域的雄厚实力和产品口碑&#xff0c;荣获两大奖项。 璞华科技被评为e-works【2023年度智能制造优秀供应…

20232831 2023-2024-2 《网络攻防实践》第4次作业

目录 20232831 2023-2024-2 《网络攻防实践》第4次作业1.实验内容2.实验过程&#xff08;1&#xff09;ARP缓存欺骗攻击&#xff08;2&#xff09;ICMP重定向攻击&#xff08;3&#xff09;SYN Flood攻击&#xff08;4&#xff09;TCP RST攻击&#xff08;5&#xff09;TCP会话…

为什么你的企业需要渗透测试

渗透测试是什么&#xff1f; 渗透测试是在安全、符合规定并且受控的条件下针对公司精心策划的经过批准的网络攻击。渗透测试人员努力发现和利用组织环境的设定范围内的漏洞&#xff0c;在黑客等犯罪分子利用它们之前提前分析弱点。 渗透测试通常是安全审计的一部分&#xff0…

大规模云存储展望|2024逐步复苏,2025全面恢复

SSD以其高速度和低延迟等优点&#xff0c;尤其在容量增长和每GB成本降低方面&#xff0c;SSD的增长速度预计将超过近线硬盘&#xff08;Nearline HDD&#xff09;。尽管HDD在大容量存储方面仍有一定优势&#xff0c;但由于SSD在访问速度、能耗及体积等方面的突出表现&#xff0…

fastapi学习记录

今天看了点fastap&#xff0c;简单记录下&#xff0c;fastapi是一个python下的后端框架。 参考学习网站菜鸟教程 安装 pip install fastapi pip install "uvicorn[standard]"安装好了以后就可以直接使用&#xff0c;最主要的使用方式就是写接口嘛&#xff0c;get&a…

FMEA与智能机器人:提升机器人可靠性与安全性的关键

随着科技的飞速发展&#xff0c;智能机器人已经深入到我们生活的方方面面&#xff0c;从工业生产到家庭服务&#xff0c;从深海探险到太空探索&#xff0c;处处都有它们的身影。然而&#xff0c;随着应用的日益广泛&#xff0c;机器人系统的复杂性和不确定性也在增加&#xff0…

速成软件书是神器还是焦虑?

一、背景 "速成软件书"通常是指那些宣称能帮助读者在短时间内掌握某种软件操作或编程技能的书籍。这类书籍往往以其高效、快捷的学习路径吸引读者&#xff0c;尤其适合有一定基础或者急需短期内提升特定技能的人群。 然而&#xff0c;“神器”之称则带有主观性和一…

双端队列deque和vector以及list的优缺点比较

参考:https://blog.csdn.net/TWRenHao/article/details/123483085 一、vector vector具体用法详情点这里 优点&#xff1a; 支持随机访问 CPU高速环缓存命中率很高 缺点&#xff1a; 空间不够&#xff0c;便需要增容。而增容代价很大&#xff0c;还存在一定的空间浪费。 头部…

数据可视化为什么能在智慧港口中发挥作用?

随着全球贸易活动日益频繁&#xff0c;港口作为国际贸易的重要节点&#xff0c;其运营效率与智能化程度直接影响着整个物流链的效能。在此背景下&#xff0c;智慧港口的概念应运而生&#xff0c;它借助先进的信息技术手段对传统港口进行改造升级&#xff0c;其中&#xff0c;数…

基于Arduino IDE 野火ESP8266模块 文件系统LittleFS 的开发

一、文件系统LittleFS的介绍 LittleFS是一个为微控制器设计的轻量级、可靠且高性能的文件系统。它专为嵌入式设备打造&#xff0c;拥有占用空间小、对硬件要求低的特点&#xff0c;同时保证在断电情况下数据的完整性和稳定性。 1.设计与特点 LittleFS的设计旨在提供嵌入式系统所…

第三十二天-Django模板-DTL模板引擎

目录 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 3.与jinja2区别 4.模板标签使用 1.循环 2.条件控制 3.注释 4.url解析 5.显示时间 5.模板的基础与包含 6.过滤器 内置过滤器 自定义过滤器 1.介绍 2. 使用 1.配置jinja2 2.DTL模板变量使用 与jinja2语法相似…

PHP图床程序优化版:图片外链服务、图床API服务、图片CDN加速与破解防盗链

图片免费上传 支持本地储存、FTP储存、第三方云储存&#xff08;阿里云 OSS、腾讯云 COS、七牛云等&#xff09;。 图片外链加速 一键转换第三方网站的图片外链地址为图床可分享的图片地址&#xff08;支持CDN&#xff09;。 图片解析服务 直接将第三方外链图片地址显示为…

Linux网络配置(超详细)

Linux网络配置大全 Linux网络配置一.网络地址配置网络地址查看–ifconfig使用网络配置命令设置网络接口参数-ifconfig禁用(临时)或者重新激活网卡设置虚拟网络接口 修改网络配置文件网络接口配置文件 IP命令详解OPTIONS选项OBJECT对象 ip link 二、获取和修改主机名hostname查看…

数对 离散化BIT

先把公式变个形&#xff0c;然后直接BIT 枚举右端点查询左端点累加答案 离散化好题&#xff0c;注意BIT写的时候右端点的范围是离散化区间的大小 #include<bits/stdc.h> using namespace std; #define int long long using ll long long; using pii pair<int,int&…

【IC前端虚拟项目】write_path子模块DS与RTL编码

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 read_path的代码完成之后,就可以开始整个项目里复杂度最高、bug最多、时序收敛最为困难的模块——write_path的开发了!我自己写过两次这个虚拟项目,每次都是在这里耗时最久,所以大家也可以挑战一下自…

MAC上好用的文件查找软件

和windows上的everything很像&#xff0c;不过就是要钱&#xff0c;我简单测试了一下还可以蛮好用的&#xff0c;

【QT入门】 QTabWidget各种常见用法详解

往期回顾&#xff1a; 【QT入门】 Qt代码创建布局之分裂器布局详解-CSDN博客 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解 一般来说&#xff0c;学一个新的控…
最新文章