linux操作系统的进程状态

这个博客只是为了自己复习用的!!!

冯诺依曼体系结构
在这里插入图片描述
计算机是由一个一个硬件组成的
输入设备:键盘,鼠标,扫描仪,写板等等
中央处理器(CPU):含有运算器和控制器等
输出单元:显示器,播放器等等

关于冯诺依曼,必须强调几点:
这里的存储器指的是内存
不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道。

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

键盘(输入设备)-》存储器-》cpu(加密,解密)-》输出设备 -》计算机网络 -》另一台的输入设备-》内存-》cpu(解密)->输出设备(显示屏)

那如果是发送文件呢?
在界面选择文件(这复杂)-》内存->cpu ->网络发送

操作系统(Operator System)os

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
内核(进程管理,内存管理,文件管理,驱动管理)
其他程序(例如函数库,shell程序等等)
设计OS的目的
与硬件交互,管理所有的软硬件资源
为用户程序(应用程序)提供一个良好的执行环境

在这里插入图片描述
我们讲一个故事来理解这个。我们假设上面这是一个银行,行长则表示操作系统。我们看到的银行操作是我们作为一个用户,我们去银行办理业务,我们作为开发操作(存款,取款业务)。我们有一个操作选项,选择我们想要的操作。这里的系统调用接口可以表示为银行有很多功能。但是他们肯定不会把所有的地方都开放,就只保留了柜台给我们用户操作,其他的仓库啊我们看都看不到我们要去取钱只能通过柜台去取钱,但是这个为什么会有一个用户操作接口呢?我们可以这样想,随着时间的变化,银行升级了,有些老婆婆和大爷无法同步操作,这时候有一个大堂经理,大堂经理就会负责这些人,说你把信息填好,我帮你去办理业务。这里就相当于是有人帮我们做了一些事,让我们去完成事情更简单了。常见的呢,bash窗口,窗户界面,C语言的库,我们只需要调用就好了,他会帮我们去做一些事,但是我们要自己做好准备,老婆婆和爷爷要去银行才能找大堂经理帮忙,那我们想使用c语言的库方便我们调用也要包含头文件。 以上就是人管理人,我们知道人也是可以管理机器的啊。这里代表的就是软件也可以管理硬件,首先我们要明确一个事实 ,就是说我们的键盘和电脑是分开买的,电脑里面有操作系统,底层硬件相当于是键盘。那怎么让他们连接呢?就是驱动呀,操作系统为了管理这些硬件,会预留规范,厂商只要实现规范就行了。然后操作系统就可以通过这些规范去调用底层硬件。

在操作系统中,驱动程序(通常简称为“驱动”)扮演着至关重要的角色,它们作为硬件设备和操作系统之间的桥梁。驱动程序是特定于硬件的软件代码,使操作系统和其他软件应用能够与硬件设备交互。不同的硬件设备,如打印机、显卡、网络适配器、输入设备等,都需要各自的驱动程序,以确保这些设备能够以正确和高效的方式工作。
驱动程序的主要角色和功能:
硬件设备通信:驱动程序提供了必要的指令集,使操作系统能够识别和控制硬件设备。没有正确的驱动程序,操作系统可能无法识别或不正确地使用某个硬件设备。
数据转换:驱动程序将操作系统的一般指令转换为硬件设备能够理解的专用指令。同样地,它也能将硬件设备的信号转换为操作系统能够理解的数据格式。
提供抽象层:驱动程序为硬件设备提供了一个标准化的抽象接口,使上层的软件(如操作系统内核、应用程序)不需要关心底层的硬件细节。这样,软件开发者就可以编写与硬件无关的代码,增加了软件的通用性和可移植性。
错误处理和设备管理:驱动程序负责监控硬件的状态和性能,处理硬件错误,以及执行必要的故障排除和维护任务。它们还可以提供接口来配置设备设置或更新固件。
性能优化:针对特定硬件优化的驱动程序可以显著提高该硬件的性能。这对于那些对性能要求极高的应用程序(如视频游戏、图形设计软件)尤其重要。

计算机管理硬件的步骤?
1 描述起来,用struct结构体
2 组织起来,用链表和其他高效的数据结构

简单理解:
驱动管理硬件的话为硬件设备提供了一个标准化的抽象接口,调用接口就能实现某些功能。但这里我们需要定义各种属性,比如说键盘的按键,按到了某个按键的话,某个电流就跳动一下。操作系统呢?就是我现在按了键盘的A键,那操作系统就要帮我去找A键对应的功能。

操作系统 -》要进行内存管理,驱动管理哦,进程管理,文件管理!

先将进程!
什么是pcb呢?
在这里插入图片描述
这里我们知道我们的磁盘存了两个程序,我们要运行这个程序需要将我们的数据和代码先放到内存,但是他不是直接把这个给cpu运行。
这里用了一个PCB块,是一个链表。链表里面有很多属性,其中一个属性指向的是下一个pcb块,其中一个属性是指向代码和数据。、这里是PCB的属性(task_struct)

在这里插入图片描述
数据结构+程序 (代码和数据)= pcb(个人理解)

进程有哪些 状态呢?

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

这里介绍 运行状态 挂起状态 阻塞状态

运行状态怎么解释呢?
上图: CPU会有一个执行队列。凡是在执行队列的的线程状态都为运行状态

在这里插入图片描述

这里的每一个硬件也会有一个执行队列,并且cpu的执行速度是远远大于硬件的执行速度。当我们执行到一个进程的时候,若这个进程需要磁盘的读写,但是这个时候磁盘有任务在做。因为磁盘的处理速度是比cpu运行慢很多的,cpu不会为了这一个进程而等。理解上面的例子可以通过这样理解。大堂经理喊你写表,把信息写完之后他就帮你处理,这时候,他会喊下一个,当你写完的时候就可以去找大堂经理去办业务了。
这里也是,cpu会把这个进程放进磁盘操作的队列里,当磁盘能执行这个进程的时候,会自动向操作系统反馈。并将状态改为阻塞状态。当磁盘能处理的时候,会放到cpu执行队列的末尾。并将状态改为运行状态。
在这里插入图片描述
那什么是挂起?

还是上面那个例子,当被放到内存中的硬件的队列的时候,如果这个时候内存不足了,那么操作系统就会做一件事,将加载进内存的代码和数据放到磁盘的一个地方保存,这个时候就叫做挂起状态。

disk sleep D状态
我们先想这样一个场景,操作系统A ,进程B ,磁盘C。有一天操作系统让B在C上保存10000条用户的信息。但是这个时候内存满了,操作系统很烦,根据指令,他要将一些正在运行的死进程给杀死掉。杀了很多看到B了,然后看到B不作为,直接就把B杀死掉了。这时候C很难受啊,当他写了一条数据之后,在喊B下一条数据,下一条数据。但是这个时候B已经被杀死了。C就说既然B都死了,我这个也没有存在的必要了。然后用户数据写入失败。这时候用户把ABC喊过来,问原因到底怎么回事。A说,我根据规则,我要将哪些占用内存,不做事情的杀死掉,保持我的运行,B说我好好的,我就被杀死了,C说,我只负责写入,其他都不管我的事。三个人互相推脱责任,但这样不行啊。用户就说,我给B一个D状态,在D状态的你就不能杀死他。

head -1 && ps axj | grep myproc

这里的STAT就是状态,+代表的是前台运行状态,就是占用Bash ,你在bash输入任何指令都不会生效的

在这里插入图片描述
有这样一段代码
在这里插入图片描述
发现结果一直在打印
在这里插入图片描述
但是我们打印状态确是阻塞状态。
在这里插入图片描述
为什么呢?因为io很慢很慢(相对于cpu来说),这里的cpu有很多进程。执行一个打印语句很快就要打印完了,然后就把这个进程阻塞在显示屏队列了,而这个速度差异为1000:1.我们几乎就是看到的是阻塞状态和挂起状态。没有+的表示后台进程,不能被杀死,ctrl+C命令杀掉,能通过kill命令杀掉。

stop状态 ,

kill -19 命令

继续stop的进程

kill -18 命令

你会发现,本来是S+的经过stop再重启之后,会变成S状态。

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

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

相关文章

【算法练习】27:冒泡排序学习笔记

一、冒泡排序的算法思想 原理:以升序为例,冒泡排序通过从左往右连续比较相邻元素,当发现左边比右边大就交换元素。从左往右依次比较完称为“一轮”,每轮结束之后就会固定一个元素。 时间复杂度:2层循环,所以…

不讲概念,讲实操,mysql 分表模糊查询、分页查询 及 merge 表的使用

1.Mysql merge合并表的要求 1.合并的分表必须是 MyISAM 引擎,MyISAN引擎是不支持事务的。2.Merge表只保证合表后数据唯一性,合表前的数据可能会存在重复。3.表的结构必须一致,包括索引、字段类型、引擎和字符集。4.删除 tb_member1 分表正确…

Python实现BOA蝴蝶优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝴蝶优化算法(butterfly optimization algorithm, BOA)是Arora 等人于2019年提出的一种元启发式智能算…

【蓝桥杯每日一题】4.4 扫雷

题目来源: 687. 扫雷 - AcWing题库 参考:y总视频讲解 问题描述: 找到解决扫雷游戏中的最小点击次数 思考: 为了保证胜利且每个格子只能走一次,所以当遇到地雷或检测到该格子周围存在地雷的时候就需要停止搜索&…

前端同学必备:教你如何安装、使用Chrome的vue-devtools插件

I. 介绍vue-devtools插件 Vue-devtools是一个Chrome浏览器插件,它是一个浏览器调试工具,用于开发Vue.js应用程序。它可以用于Vue.js应用程序的调试,可以更好地了解应用程序的结构和状态,以及帮助快速修复代码错误。 Vue-devtool…

[技术闲聊]我对电路设计的理解(三)

终于可以独立做项目了,是不是很激动,是不是为自己骄傲和自豪,应该的,奋斗那么久不就是为了站在山巅看看四周的风景嘛! 虽说山外还有山,但是此刻就在脚下的山巅上,怡然自得都是不过分的&#xff…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?实战演示(下篇)

引言 简介 编译Android可用的模型 转换权重 生成配置文件 模型编译 编译apk 修改配置文件 绑定android library 配置gradle 编译apk 手机上运行 安装 APK 植入模型 效果实测 0. 引言 清明时节雨纷纷,路上行人欲断魂。 小伙伴们好,我是《小…

9.动态规划——4.最长公共子序列(动态规划类的算法题该如何解决?)

例题——最长公共子序列(一) 分析 设最长公共子序列 d p [ i ] [ j ] dp[i][j] dp[i][j]是 S 1 S_1 S1​的前 i i i个元素,是 S 2 S_2 S2​的前 j j j个元素,那么有: 若 S 1 [ i − 1 ] S 2 [ i − 1 ] S_1[i-1]S_2[i-1] S1​[i−1]S2​[…

MFC 获取程序版本信息

在 MFC 应用程序中&#xff0c;可以使用 GetFileVersionInfo 函数来获取程序版本信息。这个函数能够获取一个指定文件的版本信息&#xff0c;并将其存储在一个缓冲区中。然后&#xff0c;可以使用 VerQueryValue 函数来解析版本信息并提取所需的信息。 #include <afxver_.h&…

leetcode刷题-代码训练营-第7章-回溯算法1

回溯法模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理结果} }理解 从…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

SpringAOP和AspectJ有什么关系 ?

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

Linux是什么,该如何学习

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux在现代计算机领域…

Golang 内存管理和垃圾回收底层原理(一)

一、这篇文章我们来聊聊Golang内存管理和垃圾回收&#xff0c;主要注重基本底层原理讲解&#xff0c;进一步实战待后续文章 1、这篇我们来讨论一下Golang的内存管理 先上结构图 从图我们来讲Golang的基本内存结构&#xff0c;内存结构可以分为&#xff1a;协程缓存、中央缓存…

Excel 粘贴回筛选后的单元格不能完全粘老是少数据 ,有些单元格还是空的

环境&#xff1a; excel2021 Win10专业版 问题描述&#xff1a; excel 粘贴回筛选后的单元格不能完全粘老是少数据 有些单元格还是空的 复制选择筛选后A1-A10单元格 &#xff0c;定位条件&#xff09;&#xff08;仅可见单元格&#xff09;来访问&#xff0c;或者你可以使用…

mybatis-plus 表字段存在关键字的处理办法

一、问题复现 当数据库表中字段出现关键字时&#xff0c;若不做其他处理&#xff0c;mybatis-plus的BaseMapper并不会做其他的处理&#xff0c;最终导致SQL执行时&#xff0c;抛出SQL 语法错误。示例如下&#xff1a; Java查询语句 QueryWrapper<User> userQuery new …

Kubernetes(k8s)核心资源解析:Pod详解

Kubernetes核心资源解析&#xff1a;Pod详解 1、什么是Pod&#xff1f;2、Pod 的组成3、Pod 如何管理多个容器4、Pod 的网络5、Pod 的存储方式6、Pod 的工作方式6.1 自主式 Pod6.2 监控和管理 Pod6.3 Pod 的创建流程 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

linux三剑客之流编辑器sed

sed&#xff08;stream editor&#xff09;是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下&#xff0c;直接对输入流进行操作&#xff0c;并且可以将结果输出到标准输出或文件。 基本语法&#xff1a; s…

C# Task任务详细讲解

Task基础讲解 在C#中&#xff0c;Task 是用于表示异步操作的类。它属于 System.Threading.Tasks 命名空间&#xff0c;并允许你以异步方式执行代码&#xff0c;从而不阻塞主线程。这对于I/O密集型操作&#xff08;如网络请求或文件读写&#xff09;或CPU密集型任务非常有用&am…

微信小程序——小程序和页面生命周期详解

小程序的生命周期 小程序的生命周期主要分为以下几个阶段&#xff1a; 创建&#xff08;onLoad&#xff09;&#xff1a; 当小程序启动时&#xff0c;或者从其他页面跳转到当前页面时&#xff0c;会触发 onLoad 生命周期函数。 这个阶段通常用于初始化页面数据&#xff0c;从服…