如何确定网站建设 栏目/郑州网站seo服务
文章目录
- 1. 阻塞
- 1. 举例
- 2. 为什么要阻塞?
- 3.操作系统层面上如何理解进程等待某种资源就绪呢?
- 资源
- 进程
- 4. 总结
- 2.挂起
- 3.Linux进程状态
- 1. R状态
- 进程只要是R状态,就一定是在CPU运行吗?
- 证明当前进程运行状态
- 生成程序
- 查看进程
- 2. S休眠状态——可中断休眠
- 3.D休眠状态 ——不可中断休眠
- 4.T状态——暂停状态
- 使用kill命令,向指定的进程发信号
- 暂停进程
- 继续进程
- 带加号的问题
- 5. X状态(死亡状态)&&Z状态(僵尸状态)
- 查看当前进程退出码
- 对于Z状态的理解
- 举例
- 验证Z状态
- 僵尸状态危害
1. 阻塞
进程因为等待某种条件就绪,而导致的一种不推进的状态
1. 举例
- 有时候电脑卡,是因为开启了太多软件,为什么启动太多程序会卡呢?
- 启动了太多的程序相当于启动了太多的进程,操作系统在用你的cpu调度时,调度不过来了,当前正在调度的在运行,没有调度的相当于卡了
- 阻塞就是进程卡住了
2. 为什么要阻塞?
- 进程要通过等待的方式,等具体的资源被别人使用完成后,再被自己使用
- 阻塞:进程等待某种资源就绪的过程
- 以硬件为例,资源可以看作磁盘、网卡、显卡等外设,
比如去银行存钱,存钱申请的单子没了,直接去存,工作人员就会说因为存钱的单子没有就绪所以不能存,再去等一会,等有单子了再来存 - 没有继续执行存钱的行为,当前所处状态为阻塞状态
3.操作系统层面上如何理解进程等待某种资源就绪呢?
资源
操作系统对于磁盘、网卡、显卡等 资源通过 先描述,在组织进行管理,把设备用结构体描述起来,再用链表组织起来
管理的本质具体解释点击这里

进程
存在大量的进程,操作系统要进行管理,也要先描述,在组织,就存在了大量的task_struct的结构体,每一个进程都是由task_struct定义出来的对象
进程组成的理解点击这里
- 将dev结构体内添加一个队列指针,若进程需要在设备资源等待,则把task_struct链接到设备资源队列的尾部
4. 总结
阻塞:阻塞就是不被调度
一定是因为当前进程等待某种资源就绪
一定是进程task_struct结构体需要在某种操作系统管理的资源下进行排队
2.挂起
- 当进程被CPU调度时进行下载,由于网断了,导致下载终止,从而使进程链接到网卡设备队列的尾部,造成阻塞
从而使CPU调用其他进程
- 若系统中内存的资源特别紧张,把占有内存的并且闲置的数据和代码,交换到磁盘当中,把内存中这部分的代码和数据释放,当该进程等待的资源就绪时,再把存入磁盘的数据和代码换入内存中,并把进程放入CPU中运行
- 把代码和数据暂时性由操作系统交换到磁盘时,此时的进程称之为挂起状态
3.Linux进程状态
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 */
};
- Linux源码当中进程所对应的状态
struct task_struct
{
int status;//0代表R状态 1代表s状态 4代表T状态
//....
}
task_struct 是一个结构体,内部会包含各种属性,就有状态,通过0、1、2等数字找到对应的进程状态
1. R状态
进程只要是R状态,就一定是在CPU运行吗?
不一定
-
每个进程当中有自己的运行队列,只要该进程在队列中进行排队,运行的进程就会在运行的队列中排队,CPU调度进程时,从队列中挑选指定的进程运行就可以了,这种运行状态就叫做R状态
-
R状态不直接代表进程在运行,代表该进程在运行队列中排队
证明当前进程运行状态
生成程序
创建makefile并输入如下内容
1 mytest:test.c//nakefile2 gcc -o mytest test.c 3 .PHONY:clean 4 clean:5 rm -f mytest
创建test.c并输入如下内容
#include<stdio.h>//test.c2 int main()3 {4 while(1)5 {6 printf("我在运行吗\n"); 7 } 8 return 0; 9 }
[yzq@VM-8-8-centos my]$ make
gcc -o mytest test.c
[yzq@VM-8-8-centos my]$ ./mytest
make产生可执行程序mytest,./mytest执行可执行程序
查看进程
赋值SSH渠道生成终端2
在保证终端1中的mytest运行的情况下,在终端2中输入指令
ps axj | head -1 && ps axj | grep mytest | grep -v grep
创建终端的方法及指令具体含义点击这里
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 30533 30533 25615 pts/0 30533 S+ 1002 0:00 ./mytest
发现此时进程状态为S+ (+号后面会说)
S称为休眠状态,不是R状态
test.c代码修改如下
#include<stdio.h>//test.c2 int main()3 {4 while(1)5 {6 // printf("我在运行吗\n"); 7 } 8 return 0; 9 }
在保证终端1中的mytest运行的情况下,在终端2中再次输入指令ps axj | head -1 && ps axj | grep mytest | grep -v grep
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 31695 31695 25615 pts/0 31695 R+ 1002 0:10 ./mytest
- 发现进程状态由S+变为R+
- printf循环打印,就代表要频繁访问显示器设备,循环中的printf本质就是向外设打印消息,当CPU执行printf代码时,频繁打印外设不一定就绪,进程可能在外设中排队,等资源就绪时,再把进程放入CPU上把结果写入外设中
- 说明第一次查到的S状态是阻塞状态的一种,是以休眠状态进行阻塞的
2. S休眠状态——可中断休眠
本质是一种阻塞状态
修改test.c代码如下
1 #include<stdio.h>2 int main()3 {4 while(1)5 {6 int b=0;7 scanf("%d",&b);8 printf("%d\n",b);9 } 10 return 0; 11 }
- ./mytest运行,并输入10 10
在保证终端1中的mytest运行的情况下,在终端2中再次输入指令
ps axj | head -1 && ps axj | grep mytest | grep -v grep
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 5793 5793 25615 pts/0 5793 S+ 1002 0:00 ./mytest
- 进程状态为S,进程没有被调度,等键盘资源 即在键盘中输入数据
[yzq@VM-8-8-centos my]$ ./mytest
10
10
^C//可以被终止
- 在终端1中
ctrl c
,终止mytest运行,S状态被终止
3.D休眠状态 ——不可中断休眠
想要往磁盘写入100MB的数据,由于磁盘写入数据很慢,所以进程把自己设置成阻塞状态,若内存资源特别紧张,操作系统就想要把这个阻塞状态的进程干掉,可是此时磁盘依旧还在写入数据,这样做就会使磁盘写入数据失败,最终就会使100MB的数据丢失
- 若该进程的休眠状态为D状态,使操作系统无法干掉进程,就能解决这个问题
4.T状态——暂停状态
使用kill命令,向指定的进程发信号
[yzq@VM-8-8-centos my]$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- 9号信号SIGKILL 表示干掉 进程
- 18号信号 SIGCONT 表示让当前进程继续运行
- 19号信号 SIGSTOP 表示暂停一个进程
暂停进程
test.c内容如下
1 #include<stdio.h>
#include<unistd.h>2 int main()3 {4 int count=0;5 while(1)6 { 7 printf("还在运行吗:%d\n",count++);sleep(1);8 } 9 return 0;10 }
保证在保证终端1中的mytest运行的情况下,在终端2中再次输入指令ps axj | head -1 && ps axj | grep mytest | grep -v grep
,并输入 kill-19+PID值
,终端1自动停止运行
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 14791 14791 25615 pts/0 14791 S+ 1002 0:00 ./mytest
再次在终端2中查询进程,发现进程状态由S+变为T
继续进程
若想让进程继续运行,在终端2中使用 kill -18 +PID值
带加号的问题
yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 14791 14791 25615 pts/0 25615 S 1002 0:00 ./mytest
- 在暂停进程,又继续进程后,当前进程状态 为S,不带加号了

-
在终端1使用ctrl c,程序不停止了
-
进程状态带+,进程是在前台运行的,可以使用ctrl c 终止
-
进程状态不带+,进程是在后台运行的,可以正常执行shell指令,但在后台继续还会执行自己的代码
-
此时若想终止进程,使用
kill -9 +PID值
干掉进程
5. X状态(死亡状态)&&Z状态(僵尸状态)
- X死亡状态只是一个返回状态,你不会在任务列表里看到这个状态,所以这里这是举例时提及,但不会验证
- 我们创建进程,是为了进程帮我们办事,同时也关心结果,而main函数的返回值是进程的退出码
查看当前进程退出码
用于判定进程结果是否正确 echo $?
修改test.c的内容如下
include<stdio.h>2 #include<unistd.h>3 int main()4 {5 int count=2;6 if(count==2)7 {8 return 0;9 }10 else 11 {12 return 4;13 } 14 }
~
使用make生成可执行程序mytest,./mytest执行可执行程序
[yzq@VM-8-8-centos my]$ make
gcc -o mytest test.c
[yzq@VM-8-8-centos my]$ ./mytest
[yzq@VM-8-8-centos my]$ echo $?
0
- 说明mytest进程的退出码是0,进程结果正确
对于Z状态的理解
如果一个进程退出了,立马X状态,立马退出,你作为父进程,有没有机会拿到退出结果呢?
- linux当进程退出的时候,一般进程不会立即彻底退出,而是要维持一个状态叫做Z状态,也叫做僵尸状态
- 方便后续父进程读取子进程退出的退出结果
如何让我们看到僵尸状态呢?
- 子进程退出,但是不要回收子进程
举例
- 假设你在某一天看到路上有一个人躺着,你报了警,警察来了后,先封锁现场,再来人确认躺者是否死亡,法医确认这个人的死因,然后通知家属等一系列事情才能进行
- 被120、法医检查时,这个人所处的状态就叫僵尸状态
- 为了方便别人从他的残留信息中甄别他死亡的原因是什么
验证Z状态
修改test.c内容如下
#include<stdio.h>2 #include<unistd.h>3 int main()4 {5 pid_t id=fork();6 if(id==0)7 {8 //子进程9 while(1)10 {11 printf("我是子进程,我在运行,pid:%d,ppid:%d",getpid(),getppid());12 sleep(1);13 }14 }15 else if(id>0)16 {17 //父进程18 while(1)19 {20 printf("我是父进程,我在运行,pid:%d,ppid:%d",getpid(),getppid());21 sleep(1);22 } 23 }}
保证在保证终端1中的mytest运行的情况下,在终端2中再次输入指令ps axj | head -1 && ps axj | grep mytest | grep -v grep
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 18251 18251 25615 pts/0 18251 S+ 1002 0:00 ./mytest
18251 18252 18251 25615 pts/0 18251 S+ 1002 0:00 ./mytest
[yzq@VM-8-8-centos my]$ kill -9 18252
[yzq@VM-8-8-centos my]$ ps axj | head -1 && ps axj | grep mytest | grep -v grepPPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
25615 18251 18251 25615 pts/0 18251 S+ 1002 0:00 ./mytest
18251 18252 18251 25615 pts/0 18251 Z+ 1002 0:00 [mytest] <defunct>
- 当父子进程都运行时,两者进程状态都为S+
- 当使用
kill - 9 +PID值
将子进程干掉后,再次使用指令查询进程,发现子进程为僵尸状态,父进程为S+
僵尸状态危害
- 在父子进程中,若父进程一直不读取,子进程就会处于Z状态
- 在父子进程中,若子进程一直处于僵尸状态(即退出子进程,但不回收子进程),就会在内存中一直保留该进程
- 若父进程创建多个子进程,就是不回收,就会造成内存资源的浪费
相关文章:

【Linux】进程状态
文章目录1. 阻塞1. 举例2. 为什么要阻塞?3.操作系统层面上如何理解进程等待某种资源就绪呢?资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态,就一定是在CPU运行吗?证明当前进程运行状态生成程序查看进程2. S休眠状态…...

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…...

pygame8 扫雷游戏
一、游戏规则: 1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑: 主要逻辑即调用run_game, 然后循环检测事件…...

c/c++开发,无可避免的模板编程实践(篇四)
一、容器与模板 前文就说到,标准库基于模板编程,定义了许多容器类以及一系列泛型算法,使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器,这些容器通常包含一组数据或对象的集合,几乎可以和任何类…...

c++11 标准模板(STL)(std::unordered_set)(二)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

GEE学习笔记 七十二:【GEE之Python版教程六】命令行简介
这篇开始就要讲解GEE相关的内容,首先聊一下命令行的内容,这个在官方文档中有详细的介绍,这里我简单说一下常用的几个命令,剩余的大家在使用过程中如果又需要可以随时查看相关官方文档的介绍。官方文档地址:https://dev…...

DDD单根 聚合根 实体 值对象
前言2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD。快二十年的时间,领域驱动设计在不断地发展,后微服务时代强调的东西,在国…...

SpringMvc介绍。
目录 1、SpringMvc概述 1、基本介绍 2、工作流程 3、bean加载控制 二、请求 1、请求映射路径 2、请求方式 3、请求参数 4、请求参数(传递json数据) 5、日期类型参数传递 三、响应 四、REST风格 1、REST简介 2、RESTful入门案例 3、RESTfu…...

华为OD机试 - 最小传递延迟(JS)
最小传递延迟 题目 通讯网络中有N个网络节点 用1 ~ N进行标识 网络通过一个有向无环图进行表示 其中图的边的值,表示节点之间的消息传递延迟 现给定相连节点之间的延时列表times[i]={u,v,w} 其中u表示源节点,v表示目的节点,w表示u和v之间的消息传递延时 请计算给定源节点到…...

学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现
绪论: 本篇文章使结构体章节后的习题,如果你对C语言有问题,或者结构体有什么问题不妨看看我之前所写的文章(章回体),对于文件管理和内存分配问题我将在后面补上,对于这个学生信息管理系统我用了多种方法和…...

Python抽奖系统
#免费源码见文末公众号# 抽奖系统① def choujiang1():def write():with open(d:\\抽奖系统\\抽奖1.1.pickle,rb) as file:lst1pickle.load(file)namevar1.get()if name not in lst1 and name!录入成功! and name!录入失败! and name!:lst1.append(name)…...

真实景观渲染技巧【Three.js】
受到一些很棒的 three.js 演示、与 covid 相关的旅行禁令以及可能在 pinterest 上花太多时间看美丽的旅行照片的启发——我开始看看我是否可以使用 three.js 和r3f在浏览器中渲染一个令人信服的风景场景。 推荐:将 NSDT场景编辑器 加入你的3D开发工具链。 在过去一个…...

MySQL知识汇总:MySQL函数CASE WHEN用法详解
Case When的两种简单用法 用法一: CASE seasonWHEN Spring THEN 春天 WHEN Summer THEN 夏天 WHEN autumn THEN 秋天 else 冬天 end 用法二: CASE WHEN season Spring THEN 春天WHEN season Summer THEN 夏天WHEN season autumn THEN 秋天 els…...

Python学习-----模块1.0(模块的简介、定义与使用)
目录 前言: 1.什么是模块 2.模块的分类 (1)内置模块 (2)第三方模块 (3)自定义模块 3.模块的使用 4.自定义模块 5.模块和执行文件的判断 前言: 今天就开始讲Python中的模块篇…...

Linux进程学习【二】
✨个人主页: Yohifo 🎉所属专栏: Linux学习之旅 🎊每篇一句: 图片来源 🎃操作环境: CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…...

我问chatGPT,在JavaScript中构造函数和类的区别
问:构造器函数和面向中的类是同样的东西吗|? 答:构造器函数和面向对象中的类并不是同样的东西,它们之间有些许不同。 在面向对象编程中,类是一种抽象的概念,它描述了一类具有相同属性和行为的对象。类可以…...

软考高级-信息系统管理师之沟通管理(最新版)
项目沟通管理 1、项目沟通管理基础项目沟通管理的重要性项目沟通管理相关理论2、规划沟通管理3、管理沟通4、控制沟通项目沟通管理的技术和工具1、项目沟通管理基础 项目沟通管理的重要性 1、与1T项目成功有关的最重要的四个因素是:主管层的支持、用户参与、有经验的项目经理…...

PyQt5 自定义富文本编辑器
介绍 一款使用PyQt5和网页端框架wangEditor集成的富文本编辑器 代码片段 PyQt5客户端 与网页端建立连接def create_connect(self):self.web_view QWebEngineView()self.bridge JSBridge(self.web_view.page())self.web_view.load(QUrl.fromLocalFile(self.editor_path))w…...

【高可用系统架构设计】SLA服务可用性4个9是什么意思?如何保证服务的高可用性 HA(High Availability)?...
如何保证服务的高可用性 HA(High Availability)?高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。方法论上,高可用是通…...

微服务架构设计模式-(14)面向生产环境
生产环境要求 应用安全 数据权限 服务可配置性 不同环境的配置不一样,不能写死代码,所以要配置 可观测性 需要日志系统 应用安全 四个方面 身份验证 验证主体的身份解决方案 单体 cookie 微服务中 API Gateway 访问令牌 不透明令牌透明令牌ÿ…...

HTML5新增用法
新增语义化标签 并无特殊含义,是语义!语义!语义! <header> 头部区域 <nav> 导航区域 <main> 主体区域 <article> 内部标签 <section> 块级标签 <aside> 侧边栏标签 <footer> 尾部…...

富足金字塔:人的努力是为了扩大选择的范围
人的努力是为了扩大选择的范围,这是熵减的另一种表述。富足金字塔代表着人生的三重境界。第一层是温饱。人需要食物、水、住所。第二层是品质。能源、ICT、教育带来更有品质的生活,如智能门锁、智能马桶、扫地机、洗碗机、洗衣烘衣机。第三层是梦想。包括…...

C++类基础(十七)
类的继承——补充知识 ● public 与 private 继承(C Public, Protected and Private Inheritance) 改变了类所继承的成员的访问权限 //公有继承 struct Base { public:int x; private:int y; protected:int z; }; struct Derive : public Base //公有继承…...

LeetCode刷题复盘笔记—一文搞懂贪心算法之56. 合并区间(贪心算法系列第十四篇)
今日主要总结一下可以使用贪心算法解决的一道题目,56. 合并区间 题目:56. 合并区间 Leetcode题目地址 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间…...

Andriod入门级开发
这学期有个课设,我们组我负责一个手机APP的开发,虽然刚开始说要实现什么智能导航,类似高德地图那种,但最后阉割的只剩一个Socket通信了,因为之前没有接触过(可能之后也不会再接触),记…...

DCL 数据控制语言
1、简介 DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限。 2、管理用户 2.1 查询用户 select * from mysql.user;查询的结果如下: 其中 Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问…...

全网超详细的下载与安装VMware虚拟机以及为什么要安装VMware虚拟机
文章目录1. 文章引言2. 下载VMware3. 安装VMware1. 文章引言 我们使用最多的系统是windows系统,因为,国内电脑厂商的操作系统(os)基本是windows系统,比如华为、联想、华硕等电脑。 但线上的服务器大多是Linux系统,而我们经常使用…...

Python获取zabbix问题触发器
背景:阿里云的ECS服务器因为阿里云升级插件,导致安全防护程序重启,产生不同的端口。导致低自动发现注册的端口 大量报警。 解决:杀掉关于因为非业务 变更的端口检测的触发器。 相关文档: Zabbix监控之主机端口监控自…...

原型链污染
目录 前置知识 原型对象 prototype和__proto__的区别 原型链概念 原型链的继承 原型 链污染 原型链污染原理 javascript中可能会存在原型链污染的危险函数 原型链污染的实际应用 JavaScript中可以触发弹窗的函数 前置知识 原型对象 在JavaScript中,每个函…...

ClickHouse详解
一、概念ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。OLAP场景的关键特征绝大多数是读请求数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。已添加到数据库的数据不能修改。对于读取,从数据库中提取相当多的…...