Linux进程概念(下)

1. 进程的状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。

下面的状态在kernel源代码里定义:

/*
* 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): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠


D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。

T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。


 Z(zombie)-僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲)没有读取到子进程退出的返回代码时就会产生僵死(尸)进程。 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

其他的一些概念:

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进

2 僵尸进程

2.1 什么是僵尸进程

我们可以使用上文中的脚本开启进程监视器,同时使用上文使用的代码来监视父子进程的状态。

while : ; do ps axj | head -1 && ps axj | grep process.exe | grep -v grep;sleep 1;done

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>int main()
{printf("process is running,pid(): %d,ppid: %d\n",getpid(),getppid());pid_t id=fork();//fork创建子进程,子进程fork返回0,父进程返回pidsleep(2);int num=100;if(id==0){//子进程int cnt=10;while(cnt--){num=999;printf("child running! id: %d, pid(): %d, ppid(): %d, num: %d\n",id, getpi    d(),getppid(),num);sleep(1);}}else{while(1){sleep(1);printf("parent running!id: %d, pid(): %d,ppid(): %d, num: %d\n",id,getpid(    ),getppid(),num);}}return 0;}

监视结果如下,我们看到刚开始两个进程都是睡眠状态??

不是的,是因为进程并非时时刻刻都在运行的,cpu运算速度太快,进程大部分时间都在等待其他资源,因此我们监视到的大部分都是睡眠状态。对我们而言他就是在运行的。

到后面子进程状态变为Z+(状态后有+代表进程已经就绪),这是因为子进程退出后,需要父进程接收他的退出信息,如果父进程一直没有接收,他就会一直处于僵尸状态。 (ps:kill杀不掉,ctrl+c也无法终结

2.2 僵尸进程的危害 

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

内存泄漏?是的!

2.3 如何避免僵尸进程的出现

这里需要父进程调用waitpid接口接收子进程的退出信息。后面细说。 

3 孤儿进程 

 孤儿进程是父进程创建子进程后,父进程比子进程先退出,此时子进程就会成为孤儿。

 3.1 看看孤儿进程

这里我们对上面的代码略作改动。我们在子进程结束前杀死父进程,这里用到 kill -9 pid命令。

我们发现,当杀死父进程后,子进程的父进程变为1,也就是OS。 

3.2 孤儿进程被谁回收 

子进程要有父进程回收,否则变为僵尸进程持续占有系统资源,那如果他的父进程死了子进程被谁回收呢?

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,由init进程回收。

4. 进程优先级

4.1 基本概念 

cpu资源分配的先后顺序,就是指进程的优先权(priority)。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

4.2 查看系统进程

我们使用ps -l命令 

 我们很容易注意到其中的几个重要信息,有下:

UID : 代表执行者的身份

PID : 代表这个进程的代号

PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号

PRI :代表这个进程可被执行的优先级,其值越小越早被执行

NI :代表这个进程的nice值

4.3 PRI与NI 

PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高

那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值

PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice

这样,当nice值为负值的时候,那么该程序将会优先级值变小,即其优先级会变高,则其越快被执行。

所以,调整进程优先级,在Linux下,就是调整进程nice值,nice其取值范围是-20至19,一共40个级别

注意:Linux下默认优先级为80,且每一次调整优先级都是从基准80开始。 

4.4 更改优先级的命令top

进入top后按“r”–>输入进程PID–>输入nice值(不过一般不建议修改)。

5. 环境变量

5.1 基本概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(即环境变量是可以被子进程继承的)

5.2 常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash

5.3 如何查看环境变量 

1. env

env会在屏幕上显示出所有环境变量 

2. echo $【环境变量名】 

5.3 PATH

PATH是一个环境变量,用于指定系统在哪些目录中查找可执行文件。当你在终端中输入一个命令时,系统会根据PATH环境变量中列出的目录顺序逐个查找,直到找到匹配的可执行文件为止。

通常,PATH的默认值包含了一些系统预定义的目录,比如/bin/usr/bin等。你也可以自定义PATH变量,将自己的目录添加到其中,以便系统能够在这些目录中查找到你自己编写的或者下载的可执行文件。

 当我们在终端命令行键入ls ,pwd等命令可以直接执行,但我们自己写的代码为什么需要加./呢?

这是因为ls等可执行文件的路径在PATH环境变量中保存着,如果将我们的代码路径也添加到PATH环境变量中,那么我们的可执行文件也可以直接执行。

这里用到了export命令,稍后再谈。这个案例充分说明了PATH的重要性,那么如果我们一不小心修改了他该怎么办?

比如下面,我们一怒之下将PATH修改成了hahaha,发现我们的命令都没法用了。

这里不用担心,重新打开xshell,我们会发现PATH又重置成了开始的样子。

5.4 和环境变量相关的命令

1.echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

5.5 环境变量的组织方式 

这里我们写一个示例代码。

我们并没有定义env,但我们的main函数却能使用。 

同时fork出的子进程也是可以使用的。

 5.6 通过系统调用获取环境变量

getenv();

#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}

 


 

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

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

相关文章

数对 离散化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&…

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…

UE5数字孪生系列笔记(三)

C创建Pawn类玩家 创建一个GameMode蓝图用来加载我们自定义的游戏Mode新建一个Pawn的C&#xff0c;MyCharacter类作为玩家&#xff0c;新建一个相机组件与相机臂组件&#xff0c;box组件作为根组件 // Fill out your copyright notice in the Description page of Project Set…

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

Golang实战:深入hash/crc64标准库的应用与技巧

Golang实战&#xff1a;深入hash/crc64标准库的应用与技巧 引言hash/crc64简介基本原理核心功能 环境准备安装Golang创建一个新的Golang项目引入hash/crc64包测试环境配置 hash/crc64的基本使用计算字符串的CRC64校验和计算文件的CRC64校验和 高级技巧与应用数据流和分块处理网…

Jmeter 配置说明之线程组

一、线程组介绍&#xff1a; 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件都必须在某个线程组下。所有的任务都是基于线程组&#xff1a; 通俗理解&#xff1a; 线程组&#xff1a;就是一个线程组&#xff0c;里面有若干个请求&#xff1b; 线程&am…

vue3.0 + ts + eslint报错:error Parsing error: ‘>‘ expected

eslint报错 这里加上对应的 eslint配置即可&#xff1a; parser: vue-eslint-parser, parserOptions: {parser: "typescript-eslint/parser",ecmaVersion: 2020,sourceType: module, }具体如下&#xff1a; module.exports {parser: vue-eslint-parser,parserOpti…

​马来语翻译中文去哪比较好?

据了解&#xff0c;马来语是马来西亚、文莱的官方语言&#xff0c;也是新加坡的官方语言之一&#xff0c;马来语跟印尼语是同一种语言&#xff0c;它在整个东南亚有着极大的影响力。如今在国内市场上&#xff0c;马来语翻译的需求也是供不应求&#xff0c;那么&#xff0c;如何…

【Go】三、Go指针

文章目录 1、指针2、说明 1、指针 &符号变量 就可以获取这个变量内存的地址*int 是一个指针类型 &#xff08;可以理解为 指向int类型的指针&#xff09; package main import("fmt" ) func main(){var age int 18//&符号变量 就可以获取这个变量内存的地…

第十五章 Nginx

一、Nginx 1.1 Nginx 相关概念 1.1.1 正向代理 正向代理类似一个跳板机&#xff0c;代理访问外部资源。 比如我们国内访问谷歌&#xff0c;直接访问访问不到&#xff0c;我们可以通过一个正向代理服务器&#xff0c;请求发到代理服&#xff0c;代理服务器能够访问谷歌&am…

TBSI模型论文解读及代码分析

前往我的主页以获得更好的阅读体验 简介 论文来源: Bridging Search Region Interaction With Template for RGB-T Tracking 现有的搜索算法通常会直接连接 RGB 和 T 模态搜索区域, 该方法存在大量冗余背景噪声. 而另一些方法从搜索帧中采样候选框, 对孤立的 RGB 框和 T 框进…

TongWeb7.0-8.0Java代码使用JMX获取应用通道端口

以下通过java代码实现获取TongWeb7.0/8.0应用通道端口使用到的JMX均为TongWeb自带的JMX功能。 一、TongWeb7.0 1、使用本地JMX获取应用通道端口 public String getTw7PortByLocalJmx() { try { MBeanServer beanServer ManagementFactory.getPlatformMBeanServer(); Set&l…

SOLIDWORKS二次开发参数化设计软件 慧德敏学

SOLIDWORKS参数化设计软件-SolidKits.AutoWorks专为规格变化多、变化规律强的产品开发&#xff0c;将变化规律集成到三维设计软件&#xff0c;通过一键点击实现自动化产品再设计&#xff0c;如智能选型、自动化修改产品属性、产品参数、产品状态、图纸更新、重命名、并自动打包…

LeetCode:300最长递增子序列 C语言

300. 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子…

小程序中使用less

在vscode中安装插件 找到左下角齿轮的设置&#xff0c;点击右边图标&#xff0c;进入“settings.json” 加上以下代码配置 "less.compile":{"outExt": ".wxss"}

Mysql数据库:日志管理、备份与恢复

目录 前言 一、MySQL日志管理 1、存放日志和数据文件的目录 2、日志的分类 2.1 错误日志 2.2 通用查询日志 2.3 二进制日志 2.4 慢查询日志 2.5 中继日志 3、日志综合配置 4、查询日志是否开启 二、数据备份概述 1、数据备份的重要性 2、备份类型 2.1 从物理与…

镜舟普元揭秘数据中台新范式,引领企业数智化转型与创新实践

在当前数字化浪潮中&#xff0c;数据中台的角色越发重要&#xff0c;承担着将一切业务数据化的重任。近日&#xff0c;北京镜舟科技有限公司&#xff08;简称“镜舟”&#xff09;与普元信息技术股份有限公司&#xff08;简称“普元”&#xff09;联合举办“数据中台新范式”云…

matplotlib 绘图

matplotlib 绘图 方便设置legend图例的位置 ax1.legend(loc‘upper center’, bbox_to_anchor(0.3, -0.1)) ax2.legend(loc‘upper center’, bbox_to_anchor(0.6, -0.1)) import numpy as np import matplotlib.pyplot as plt from scipy.stats import norm from scipy.inter…

【SpringCloud】Ribbon负载均衡

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 …

解决Chrome浏览器打开flags页面时出现黑屏问题的方法

当我们在使用Chrome浏览器并尝试访问flags页面时&#xff0c;遇到屏幕短暂闪烁或变黑的情况&#xff0c;这可能与启用的硬件加速功能有关。硬件加速是Chrome浏览器的一个功能&#xff0c;旨在利用计算设备的GPU来提高视频播放和图形渲染的性能。然而&#xff0c;在某些情况下&a…