【Linux】从零认识进程 — 中下篇

在这里插入图片描述
送给大家一句话:
人一切的痛苦,本质上都是对自己无能的愤怒。而自律,恰恰是解决人生痛苦的根本途径。—— 王小波

从零认识进程

  • 1 进程优先级
    • 1.1 什么是优先级
    • 1.2 为什么要有优先级
    • 1.3 Linux优先级的特点 && 查看方式
    • 1.4 其他概念
  • 2 命令行参数
  • 3 环境变量
    • 3.1 什么是环境变量
    • 3.2 见见更多的环境变量
    • 3.3 整体理解
  • Thanks♪(・ω・)ノ谢谢阅读!!!
  • 下一篇文章见!!!

今天我们继续学习Linux的进程,上两篇文章我们认识了什么是进程,如何创建进程,进程状态。今天我们主要讲解 进程优先级和环境变量。

1 进程优先级

学习优先级需要了解:

  1. 什么是优先级
  2. 为什么要有优先级
  3. Linux优先级的特点 && 查看方式

1.1 什么是优先级

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能
    其实很简单,就是指定进程的获取资源的先后顺序(在运行队列中的相对顺序)。
    在task_struct模块中的内部字段 存在 int prio = ??,优先级的本质是一个数字,数字越小,优先级越高

1.2 为什么要有优先级

因为CPU的资源是有限的,不得不排队(就像食堂打饭一样),系统大部分情况进程是比较多的,但是硬件只有一套。

操作系统关于的调度好优先级的原则:分时操作系统,基本的公平。如果进程因为长时间不被调度,就造成的饥饿问题。
我们来简单查看一下进程的优先级:

  1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6   while(1){7     printf("I am a process , pid: %d\n",getpid());                                 8     sleep(1);9   }10 }11 

这里介绍一下一个新指令: ps -l
在这里插入图片描述
运行是运行了,但是没有我们现在的进程,这是因为ps -l默认是显示当前终端的进程,我们使用ps -al就可以查看全部的了。
在这里插入图片描述
其中:

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,即父进程的PID
  • PRI : 进程优先级
  • NI : 进程优先级的修正数据,nice值,新的优先级 = 优先级 + nice值,达到对进程优先级的动态化处理(每次调用都可以更新nice值)

通过上图,可以看到我们进程(pid : 6000)的优先级是80。

1.3 Linux优先级的特点 && 查看方式

接下来我们来看如何查看修改优先级
用top命令更改已存在进程的nice:
进入top后按 r 输入进程PID –> 输入nice值,就可以修改nice值。来进行一下尝试:
在这里插入图片描述
可以看到,我们想要改到100,但是最终结果是99,这是为什么???
nice值不能随意调整,而是有范围的 [-20 , 19)共四十个数字(即四十 个 梯度)
我们通过ps-al查看的进程信息中,nice值就是最大值 19。
每次调整完优先级都是从80开始的,通过 新的优先级 = 优先级(80) + nice值进行计算。
注意:作为普通用户不能频繁调整优先级 想要多次调整需要root身份。

同时调整优先级也可以使用nicerenice命令,具体使用方法可以用那个男人 man 来进行查看(以renice 为例):

RENICE(1)                           User Commands                          RENICE(1)NAMErenice - alter priority of running processesSYNOPSISrenice [-n] priority [-gpu] identifier...DESCRIPTIONrenice  alters the scheduling priority of one or more running processes.  Thefirst argument is the priority value to be used.   The  other  arguments  areinterpreted as process IDs (by default), process group IDs, user IDs, or usernames.  renice'ing a process group causes all processes in the process  groupto have their scheduling priority altered.  renice'ing a user causes all pro‐cesses owned by the user to have their scheduling priority altered.
OPTIONS-n, --priority prioritySpecify the scheduling priority to be used for  the  process,  processgroup,  or  user.  Use of the option -n or --priority is optional, butwhen used it must be the first argument.-g, --pgrp pgid...Force the succeeding arguments to be interpreted as process group IDs.-u, --user name_or_uid...Force the succeeding arguments to be interpreted as usernames or UIDs.-p, --pid pid...Force the succeeding arguments to be interpreted as process  IDs  (thedefault).-h, --helpDisplay a help text.-V, --versionDisplay version information.

也就是使用 renice -n ? -p ?就可以完成修改优先级。

1.4 其他概念

  1. 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  2. 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  3. 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  4. 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

2 命令行参数

命令行参数其实很简单,我们已经用过许多次了。类似 rm -f grep -v 等等都是命令行参数。那么这本质到底是什么呢???

我们先从main函数讲起,我们都知道main函数有参数int main( int argc, char* argv[ ]),(但实际我们经常不带,今天不管这个问题)
下面我们来看具体是什么作用:

    1 #include<stdio.h>2 #include<unistd.h>3 
W>  4 int main(int argc , char* argv[])//这里的报错先忽视5 {6   for(int i = 0; i < argc ;i++ )7   {8     printf("argv[%d]-> %s\n",i,argv[i]);                                         9   }10   return 0;11 }                                                            12  

来看运行效果:
在这里插入图片描述
实际上main函数的参数就是命令行的参数,也就是命令行字符串。前面的./myprocess是程序的路径和名称,后面的-a -b -c -d就是该进程匹配的选项。
那为什么要这么干呢???又是谁干的呢???
来看下面一段代码:

  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 5 int main(int argc , char* argv[])6 {7   if(argc != 2)8   {9     printf("Usage:%s -[a,b,c,d]\n",argv[0]);10     return 1;11   }12 13   if(strcmp(argv[1],"-a") == 0)14   {15     printf("this is function1\n");16   }17 18   else if(strcmp(argv[1],"-b") == 0)19   {20     printf("this is function2\n");21   }22 23   else if(strcmp(argv[1],"-c") == 0)24   {25     printf("this is function3\n");26   }27 28   else if(strcmp(argv[1],"-d") == 0)29   {30     printf("this is function1\n");31   }                               32   else33   {34     printf("no this function!!!\n");35   }                                                                                36   return 0;                        37 }                                  38  

这样可以区分命令行输入了哪些信息,并执行相应功能。来看效果:

laik
为什么要有命令行参数???
本质:命令行参数的本质是交给我们不同程序的不同选项,用来定制不同功能,一般命令里会带许多选项

这样通过不同选项就执行程序的不同功能。这是不是有点像我们经常使用的哪些命令呢!?ll ls rm -f等等
那这个工作时是谁来干的呢???
我们进行一个小小的测试:

    1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 5 int g_val = 10000;6 
W>  7 int main(int argc , char* argv[])    8 {    9   printf("I am father process,pid : %d ,ppid: %d ,g_val: %d\n",getpid(),getppid(),g_val);10   sleep(5);11   12   pid_t id = fork();13   if(id == 0)14   {15     //child16     while(1)17     {18       printf("I am child process,pid: %d,ppid: %d,g_val: %d\n",getpid(),getppid(),g_val);19       sleep(1);   20     }21   }   22   else   23   {24     //father25        26       printf("I am father process,pid: %d,ppid: %d,g_val: %d\n",getpid(),getppid(),g_val);                                                                        27       sleep(1);                       28   }                                   29                                       30   return 0;                           31 }

来看效果:
在这里插入图片描述
可以看到子进程和父进程都成功使用了g_val,即父进程的数据默认可以被子进程看到并访问!!!
而其中的PID:10069是谁呢???
命令行中的程序都会变成进程,其实都是bash 的子进程!!!
所以那这个工作时是谁来干的呢???都是bash进行的,也就是main函数的参数是bash处理的

3 环境变量

3.1 什么是环境变量

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

系统中的很多配置,在我们登录Linux就已经被加载到bash进程中了。
来看一个(搜索路径的环境变量):
在这里插入图片描述
bash在执行命令的时候,需要先找到命令,因为未来要加载!!!
同样只要我们把我们写可执行程序拷贝到对应路径就可以不用再写./就可以执行。
当然这样太粗暴了,我们可以使用PATH = 路径这样就改变我们的环境变量了:
在这里插入图片描述

但是现在我们好多指令都不能正常使用了???啊???怎么办???原来的路径不一致,寻找不到了大部分指令。
这时候重启即可。
在这里插入图片描述
这样就恢复了,但是到底怎样才能把我们的程序路径加入进PATH呢???
应该使用PATH=$PATH : 路径即可。
在这里插入图片描述
这样就成功加入了!!!

注意 最开始的环境变量不是在内存中,而是在系统的对应的配置文件中
那配置文件在哪里呢???就在家目录的几个文件中
在这里插入图片描述

3.2 见见更多的环境变量

环境变量都是大写的英文字母,使用echo $名字即可
使用env就可以查看所有的环境变量:
在这里插入图片描述
这些都是环境变量!!!我们来认识其中几个:

  1. HOME:这个代表登录默认所处路径,即家目录
  2. PWD:这个会动态储存我们所在的目录
  3. SHELL:这个会默认启动命令行解释器,让我们可以输入命令
  4. HISTSIZE:这个是指历史命令的个数,意义是历史命令最多有多少条(一般是1000条)

等等都是环境变量
当然自己也可以定义环境变量。
使用export就可以进行:export THIS_IS_MY_ENV = hellobit这样就创建一个环境变量!!!
如果不加export 就会创建本地变量,与环境变量不同(需要对通信,多线程有一定了解才能理解)。

3.3 整体理解

    1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 5 int g_val = 10000;6 7 int main()8 {9   extern char** environ;10   for(int i = 0;environ[i];i++)11   {12     printf("env[%d]->%s\n",i,environ[i]);                                                                                                                                   13   }                                                                                                                                      14   return 0;                                                                                                                              15 }         

在这里插入图片描述
这样我们就通过C语言程序成功获取了环境变量。
然后因为我们的程序是一个进程,是bash的子进程,所以环境变量可以被子进程获取!!!
(环境变量在BASH中)

首先数据储存在磁盘中,运行时会加载到内存中,也就把环境变量存入内存中的bash/shell.
bash进程在启动的时候,默认会给子进程形成两张表:

  1. argv[ ] :命令行参数。
  2. env[ ] : 环境变量表,通过各种方式交给子进程。

环境变量具有系统级的全局属性,因为会被子进程继承下去!!!
esport , echo 等是内建命令,由bash执行,80%命令是bash创建的子进程实行

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

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

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

相关文章

目标检测的指标评估

目标检测模型的评价指标主要用于衡量模型的性能&#xff0c;特别是它在定位和识别目标方面的准确性。以下是一些常见的评价指标&#xff1a; 1. 精确度 (Precision): 表示检测到的目标中&#xff0c;正确检测到的目标所占的比例。精确度高意味着模型产生的误报&#xff08;错误…

通过jsDelivr实现Github的图床CDN加速

最近小伙伴们是否发现访问我的个人博客http://xiejava.ishareread.com/图片显示特别快了&#xff1f; 我的博客的图片是放在github上的&#xff0c;众所周知的原因&#xff0c;github访问不是很快&#xff0c;尤其是hexo博客用github做图床经常图片刷不出来。一直想换图床&…

Oracle 使用OGG(Oracle GoldenGate) 实现19c PDB与MySQL5.7 数据同步

OGG 是一种基于日志的结构化数据复制软件&#xff0c;它通过解析源数据库在线日志或归档日志获得数据的增删改变化。 OracleMysqlIP address192.168.80.100192.168.80.16DB version19.2.05.7host nametempmysql OS version&#xff1a; CentOS 7.9 一&#xff0c;Oracle 服务…

机器学习基础知识面经(个人记录)

朴素贝叶斯 特征为理想状态下的独立同分布&#xff0c;作为机器学习的重要基石和工具 由贝叶斯公式推导而来 是后验概率&#xff1a;在B发生的条件下A发生的概率。 是似然概率: 在 发生的条件下 发生的概率。 是先验概率: 发生的概率&#xff0c;而不考虑 的影响。 是…

静态综合实验

一.搭建拓扑结构 1.根据拓扑结构可以把网段分成14个网段&#xff0c;根据192.168.1.0/24可以划分出ip地址和环回地址 其中环回r1分别是 192.168.1.32/27 192.168.1.32/28 192.168.1.48/28 2.划分完后如图&#xff1a; 二.配置IP地址 注意&#xff1a;为了避免错误&#…

vulnhub prime1通关

目录 环境安装 1.信息收集 收集IP 端口扫描 目录扫描 目录文件扫描 查找参数 打Boss 远程文件读取 木马文件写入 权限提升 方法一 解锁密钥 方法二&#xff1a; linux内核漏洞提权 总结 环境安装 Kali2021.4及其prime靶机 靶机安装&#xff1a;Prime: 1 ~ Vul…

今天聊聊新零售

一、什么是新零售&#xff1f; 2016年&#xff0c;在杭州举行的“云栖大会”上&#xff0c;马云发表了讲话&#xff0c;首次提出了“新零售”这一概念。 1.1 新零售概念 新零售&#xff0c;英文是New Retailing&#xff0c;新零售是对人货场的重构。人是消费者、销售人员、…

Python 从0开始 一步步基于Django创建项目(3)使用Admin site管理数据模型

本文内容建立在《Python 从0开始 一步步基于Django创建项目&#xff08;2&#xff09;创建应用程序&数据模型》的基础上。 Django提供的admin site&#xff0c;使得网站管理员&#xff0c;能够轻松管理网站的数据模型。 本文首先创建‘管理员账户’&#xff0c;即超级用户…

Linux:Jenkins全自动持续集成持续部署(3)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…

利用免费 GPU 部署体验大型语言模型推理框架 vLLM

vLLM简介 vLLM 是一个快速且易于使用的 LLM&#xff08;大型语言模型&#xff09;推理和服务库。 vLLM 之所以快速&#xff0c;是因为&#xff1a; 最先进的服务吞吐量 通过 PagedAttention 高效管理注意力键和值内存 连续批处理传入请求 使用 CUDA/HIP 图快速模型执行 量…

C#,图论与图算法,用于检查给定图是否为欧拉图(Eulerian Graph)的算法与源程序

1 欧拉图 欧拉图是指通过图(无向图或有向图)中所有边且每边仅通过一次通路, 相应的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph), 具有欧拉通路而无欧拉回路的图称为半欧拉图。 对欧拉图的一个现代扩展是蜘蛛图,它向欧拉图增加了可以连接的存在点。 这给…

vue3对openlayers使用(加高德,天地图图层)

OpenLayers认识 WebGIS四大框架&#xff1a; Leaflet、OpenLayers、Mapbox、Cesium OpenLayers 是一个强大的开源 JavaScript 地图库&#xff0c;专注于提供可嵌入网页的交互式地图体验。作为一款地理信息系统&#xff08;GIS&#xff09;的前端开发工具&#xff0c;OpenLaye…

docker 和K8S知识分享

docker知识&#xff1a; 比如写了个项目&#xff0c;并且在本地调试没有任务问题&#xff0c;这时候你想在另外一台电脑或者服务器运行&#xff0c;那么你需要在另外一台电脑或者服务器配置相同的软件&#xff0c;比如数据库&#xff0c;web服务器&#xff0c;必要的插件和库等…

使用 chezmoi vscode, 管理你的 dotfiles

什么是 dotfiles In Unix-like operating systems, any file or folder that starts with a dot character (for example, /home/user/.config), commonly called a dot file or dotfile. 任何以 . 开头去命名的文件或者目录都可以称为 dotfile, 在 Unix-like 系统一般用的比较…

Mysql数据库深入理解

目录 一、什么是数据库 二、Mysql基本架构图 1.Mysql客户端/服务器架构 2.客户端与服务器的连接过程 3.服务器处理客户端请求 4.一条查询SQL执行顺序 4.1连接器 4.2查询缓存 4.3解析器 4.4执行器 4.4.1预处理阶段 4.4.2优化阶段 4.4.3执行阶段 5.一条记录如何存…

使用 Flink + Faker Connector 生成测试数据压测 MySQL

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

VMware Workstation Pro 17虚拟机超级详细搭建(含redis,nacos,docker)(一)

今天从零搭建一下虚拟机的环境&#xff0c;把nacos&#xff0c;redis等微服务组件还有数据库搭建到里面&#xff0c;首先看到的是我们最开始下载VMware Workstation Pro 17 之后的样子&#xff0c;总共一起应该有三部分因为篇幅太长了 下载地址 : VMware - Delivering a Digit…

Mora: Enabling Generalist Video Generation via A Multi-Agent Framework

目录 论文地址&#xff1a;Mora: Enabling Generalist Video Generation viaA Multi-Agent Framework github地址&#xff1a;https://github.com/lichao-sun/Mora 一、摘要 &#xff08;1&#xff09;Mora 的主要特点&#xff1a; &#xff08;2&#xff09;Mora的应用场景…

Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工程调试利器

一、前言 在安防视频监控行业&#xff0c;Onvif作为国际标准&#xff0c;几乎主要的厂商都支持&#xff0c;不仅包含了国内的厂商&#xff0c;也包括主要的国际厂商&#xff0c;由于有了这个标准的存在&#xff0c;使得不同设备不同安防平台之间&#xff0c;能够接入各个厂家的…

【Linux】Linux开发工具-vim / 编译器-gcc/g++ / 调试器-gdb / git操作 / 项目自动化构建工具-make/Makefile

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;Linux_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.在Linux写自己的第一个程序 1.1 nano指令 1.2 nano指令的使用 1.2.1 介绍 1.2.2 演示 1.2.2.1 创建.c文件 1.2.2.2 nano cod…