Linux 操作系统 进程(2)

news2024/11/26 14:50:38

上篇文章我们说过的操作系统进程的概念等(Linux 操作系统 进程(1)-CSDN博客),这篇我们就来了解进程最重要最直观的两个状态 : 进程状态 进程优先级

进程状态

kill命令

我们在查询进程的时候就可以看到当前进程的状态  “ “+”号 在进程状态信息中表示该进程属于前台进程组,即与当前终端相关联的进程组。不加就代表在后台运行,我们怎么让自己的程序在后台运行呢?

//使用死循环,保证程序不会因为自己原因退出
#include<unistd.h>    
#include<stdio.h>    
  
int main()    
{    
    while(1)    
    {    
        sleep(5);                                                                                                                            
    }    
    
    return 0;    
}  

 当我们直接运行时

符合我们预期,使用ps来查看他的进程状态

也就是说,我们直接运行程序,我们的程序都是在前台运行,当我们运行程序的时候加上 & 

  我们可以看到,程序给了我们一段数字,当我们使用ps查询时,

 这段数字就是进程的PID,我们会发现,进程的运行状态后面没有" + "号了,这个进程不与终端交互,但是 ,我们该如何 " 杀死 " 这个进程呢,由上面死循环程序可以知道这个进程是不会自己退出的,Kill命令就可以做到,因为我们前面让程序在后台运行时,得到了程序的PID,我们可以直接 kill + PID

 直接杀死进程

 我们同样可以使用man命令查询kill的其他用处,或者是 kill -l查询

进程状态在Linux系统中的定义

 在Linux对PCB的定义中可以看到

struct task_struct {
	volatile long state;	/* -1 unrunnable, 0 runnable, >0 stopped */
	...
}

state就是进程的运行状态,Linux中定义了表示各种状态的宏

#define TASK_RUNNING        0x0000  // 运行态
#define TASK_INTERRUPTIBLE  0x0001  // 可中断的睡眠态
#define TASK_UNINTERRUPTIBLE 0x0002 // 不可中断的睡眠态
#define TASK_STOPPED        0x0004  // 停止态
#define TASK_TRACED         0x0008  // 被跟踪态
#define EXIT_DEAD           0x0010  // 进程已经结束
#define EXIT_ZOMBIE         0x0020  // 僵尸进程

看着这些宏的定义,看起来跟我们学习的操作系统进程状态的转换并不一样,因为那个只是概念也就是理想的状态,当我们程序运行的时候,为了保护数据,维护进程IO,会多出来很多状态,用于操作系统处理,这些宏并不直观,我们可以使用这段代码直观解释

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
};

R(running) 程序运行的状态或者说是程序处于运行队列时的状态,不必多说 。

X(dead) :程序死亡。

S(sleeping):

概念意义上的阻塞状态,等待资源的过程,但是这个S可以被杀死,这个等待是操作系统层面的,是等待操作系统的资源,比如我们可以让进程等待我们输入数据 scanf

 其实,我们的进程大多数时间都是在等待资源,cpu运行速度太快,我们很难能观察到运行状态,所以我们很多时候查看进程都是S状态。

D(disk sleep)

等待硬件上的IO,或者说是等待硬件的资源,这个等待无法被打断,防止存储的数据丢失,操作系统在运行的时候,资源不够的情况下会把一部分处于等待状态的进程" 杀掉 "  (杀后台),用来给正在运行的程序或者说是优先级较高的程序分配资源,如果我们的进程正在与硬件进行IO,这时候被操作系统或者说kill命令" 杀掉 ",很大可能导致数据的丢失,而D状态就是为了避免这时候被操作系统" 杀掉 "

T (stopped)

阻塞状态,暂停进程,我们可以通过 kill 命令对其实现暂停

t 状态是程序调试的时候,现在一般理解与T,都是停止状体

Z(zombie)

僵尸进程,当子进程退出时,父进程不对子进程退出的状态进行接收,那么子进程就处于僵尸进程状态,维护退出状态需要数据维护,也属于进程信息,就保存在进程PCB里,如果进程一直不退出,这段PCB就需要操作系统一直使用资源维护,也就是资源浪费,那么父进程创建很多子进程但是不回收,就会浪费很多系统资源,就类似于指针指向的空间不释放,或者说是文件一直被打开,就是属于内存泄漏,这就需要父进程去接受子进程的退出信息。

孤儿进程

也就是父进程比子进程先退出,那么就需要进程去接收这个子进程的退出信息,那么当这个进程退出时,就会被其他父进程(也就是1号进程)领养,退出信息也就被这个进程回收

#include<unistd.h>    
#include<stdio.h>    
    
    
int main()    
{    
    pid_t id = fork();    
    
    if(id<0)    
    {    
        perror("进程创建失败");    
        return 1;    
    }    
    else if(id==0)//子进程    
    {    
        sleep(10);    
    }    
    else{    
        sleep(5);//父进程    
    }    
                                                                                                             
    return 0;    
}    

当父进程先退出后,子进程的PPID就变成了 1 号进程

进程优先级

一个进程在cpu上分配资源的前后就是进程的优先级,那么也就是说进程优先级高的会先执行,那么跟操作系统有关的进程先执行,可以大大改善操作系统的性能

查看优先级

PRI:就是进程优先级,NI(nice)就是优先级修正值,也就是说PRI的值越小,进程优先级越高,进程会先被配资源,先执行,那么系统给我们修正值的原因就是我们的程序,也可以通过更改NI来控制部分程序的优先值,让我们认为重要的程序先执行,但是这需要root权限

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

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

相关文章

港股通“大洗牌”,这是一场“双赢”还是一次“交易”?

最近的资本市场&#xff0c;可谓是“一石激起千层浪”。先有阿里完成香港双重主要上市&#xff0c;随后港股通进行“大洗牌”。 9月9日&#xff0c;上交所、深交所发布公告&#xff0c;阿里巴巴-W&#xff08;09988.HK&#xff09;、茶百道(02555.HK)、云音乐(09899.HK)、顺丰…

YB5090是一款 5V USB 输入,支持双节串联锂电池或锂离子电池的升压充电管理 IC

适用于TYPE-C接口,集成30V OVP功能 , 最大1.8A充电电流,带NTC及使能功能,双节锂电升压充电芯片 概述&#xff1a; 是一款 5V USB 输入&#xff0c;支持双节串联锂电池或锂离子电池的升压充电管理 IC。集成有 NTC 功能&#xff0c;其最大的充电电流可达 1.8A。 集成功率MOS,采用…

架构师备考的一些思考(二)

前言 以我的视野来看&#xff0c;部长或技术总监这种岗位还是比较难竞争的&#xff0c;换言之&#xff0c;程序员的上升空间比较窄&#xff0c;如果想要拿到高级岗位&#xff0c;最好的是工作三五年后就转项目经理&#xff0c;然后再往上爬。 架构师倒是也能晋升高级岗位&#…

git的快速合并fast-forward merge详解

文章目录 1. 什么是快进合并&#xff1f;2. 快进合并的前提条件3. 快进合并的工作原理3.1 示例场景&#xff1a;3.2 使用命令&#xff1a;3.3 快进合并的视觉效果&#xff1a; 4. 快进合并的优点5. 快进合并的缺点6. 快进合并 vs 非快进合并6.1 非快进合并&#xff1a;6.2 非快…

Promise详解、自定义

这里写目录标题 一、.Promise对象详解1. Promise是什么2. Promise的优点3. 异步编程4. then(onFulfilled, onRejected)&#xff1a;5. util.promisify 方法&#xff1a;6. promise的状态改变7.Promise 对象的值8. Promise的基本执行流程9. Promise的API10. Promise中的关键问题…

怎样训练一个自己的大语言模型?这可能是全网最简单易懂的教程!

Llama 2 是来自 Meta 的第二代开源LLM的集合&#xff0c;旨在处理各种自然语言处理任务&#xff0c;模型的规模从 7B&#xff08;70亿&#xff09;到 70B&#xff08;700亿&#xff09;个参数不等&#xff0c;可以商用。 Llama-2-Chat 针对对话进行了优化&#xff0c;显示出与…

你们准备好了吗?Python 入行 AI 的基础技术栈及学习路线

人工智能&#xff08;AI&#xff09;是当今技术发展的重要领域之一&#xff0c;而 Python 已成为 AI 领域的首选编程语言之一。Python 简单易学&#xff0c;具有丰富的生态系统和社区支持&#xff0c;特别是在 AI 和机器学习&#xff08;ML&#xff09;领域有大量强大的库和框架…

电商系统源码开发中的卷轴模式系统:当前技术面临的问题

随着互联网技术的飞速发展&#xff0c;电商系统已成为数字经济的重要组成部分。为了提升用户体验和平台活跃度&#xff0c;卷轴模式作为一种创新的用户参与机制&#xff0c;逐渐在电商系统中崭露头角。然而&#xff0c;在电商系统源码开发卷轴模式系统的过程中&#xff0c;仍面…

‌汽车的舒适进入功能是什么意思?

移动管家汽车的舒适进入系统是指无钥匙进入功能&#xff0c;它允许驾驶者在距离车辆一定范围内自动感应解锁车辆&#xff0c;并具备无钥匙启动功能‌。舒适进入系统的核心优势包括&#xff1a; ‌智能化操作‌&#xff1a;无需传统钥匙&#xff0c;通过智能感应实现车门解锁和…

@Transactional和@Synchronized的冲突

Transactional和Synchronized的冲突 场景 方法是先进行检查&#xff0c;然后新增&#xff0c;添加了事务注解&#xff0c;为了保证检查&#xff08;要求业务上唯一&#xff09;&#xff0c;添加了Synchronized注解 想法很简单&#xff0c;事务注解保证方法原子性&#xff0c…

基于Kithara实时套件的EtherCAT主站

第1章 Kithara实时套件概述 1.1 概述 Kithara Software是一家德国的软件公司&#xff0c;专注于实时技术和嵌入式解决方案。 他们为Windows操作系统提供了Kithara RealTime Suite&#xff0c;这是一套实时扩展模块&#xff0c;使Windows能够实现硬实时任务和控制。 Kithara R…

C++实现宏编译不同版本程序

1. #define的概念 #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。该命令有两种格式:一种是简单的宏定义,另一种是带参数的宏定义。 (1)简单的宏定义: #define <宏名>  <字符串…

JavaScript web API part2

web API 全选反选案例 需求&#xff1a; 勾选大复选框&#xff0c;勾选全部小复选框取消勾选大复选框&#xff0c;则取消勾选全部小复选框若有小复选框没有被勾选&#xff0c;则大复选框不被勾选若所有小复选框都被勾选&#xff0c;则大复选框被勾选 <!DOCTYPE html>…

Scratch中秋节贺卡——福满中秋

小虎鲸Scratch资源站-免费少儿编程Scratch作品源码,素材,教程分享网站! 中秋佳节即将到来&#xff0c;小虎鲸Scratch资源站为大家特别准备了一款精美的《Scratch中秋节贺卡——福满中秋》作品&#xff0c;带您轻松制作属于自己的节日贺卡&#xff0c;为亲朋好友送上最真挚的节日…

OpenBayes 教程上新 | FLUX ComfyUI 现已上线 ,让 SD 和 Midjourney 颤抖的文生图黑马!

横空出世的黑马 FLUX &#xff0c;以其强大的图像生成能力&#xff0c;让 Stable Diffusion 和 Midjourney 这 2 个「昔日顶流」倍感压力。 FLUX 与 Stable Diffusion 渊源颇深&#xff0c;其研发公司 Black Forest Labs 的创始人 Robin Rombach 是 Stable Diffusion 的共同开…

影刀RPA实战:自动化批量生成条形码完整指南

今天我们聊聊使用影刀来实现批量生成条形码&#xff0c;条形码在零售行业运用非常广泛&#xff0c;主要作用表现在产品识别&#xff0c;库存管理&#xff0c;销售管理&#xff0c;防伪保护等&#xff0c;这些作用使其成为现代商业和工业环境中不可或缺的工具&#xff0c;它极大…

HarmonyOS Next鸿蒙NDK使用示例

创建一个Native C项目 跟普通项目相比&#xff0c;主要区别是多了一个cpp文件夹、oh-package.json5中的dependencies引入还有build-profile.json5中的externalNativeOptions配置&#xff0c;abiFilters是支持的CPU架构&#xff0c;目前移动端项目只支持arm64-v8a、x86_64两种。…

微信支付开发--订阅号与服务号的区别

微信支付的开发&#xff0c;首先要搞明白订阅号与服务号的区别&#xff0c;其次就是要明白微信支付有很多通道&#xff0c;例如&#xff1a;JSAPI、APP、H5、Natice、小程序支付等。 微信支付系统的时序图 1、运营主体的不同 a、订阅号&#xff1a; 个人、媒体、企业、政府或其…

sheng的学习笔记-AI-序贯覆盖(sequential covering)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 规则学习&#xff1a;sheng的学习笔记-AI-规则学习&#xff08;rule learning&#xff09;-CSDN博客 剪枝&#xff1a;https://blog.csdn.net/coldstarry/article/details/137441167 基础知识 什么是序贯覆盖 规则学习…

论文翻译:arxiv-2022 Ignore Previous Prompt: Attack Techniques For Language Models

Ignore Previous Prompt: Attack Techniques For Language Models https://arxiv.org/pdf/2211.09527 忽略之前的提示&#xff1a;针对语言模型的攻击技术 文章目录 忽略之前的提示&#xff1a;针对语言模型的攻击技术摘要1 引言 摘要 基于Transformer的大型语言模型&#xf…