Linux进程——Linux进程间切换与命令行参数

前言:在上一篇了解完进程状态后,我们简单了解了进程优先级,然后遗留了一点内容,本篇我们就来研究进程间的切换,来理解上篇提到的并发。如果对进程优先级还有没理解的地方可以先阅读:

Linux进程优先级


在这里插入图片描述


本篇主要内容:

  • 进程间的切换
  • Linux进程调度队列
  • 命令行参数
  • 了解环境变量

在这里插入图片描述


目录

  • 1. 进程间的切换
  • 2. Linux进程调度队列
    • 2.1 活跃队列
    • 2.2 过期队列
  • 3. 命令行参数
  • 4. 环境变量
  • 5. 总结


1. 进程间的切换

在之前我们提到过CPU在调度进程时,每一个进程不是占有CPU就一直运行,每隔一段时间,自动被从CPU上剥离下来,因此必定会有进程与进程之间的切换!

但是进程没有运行结束就被剥离下来,那它的数据怎么办?

在这里插入图片描述
事实上:进程在切换时会不断对自己的数据进行保存和恢复,保存是保存寄存器中的数据,而不是寄存器本身,并且这些数据会被保存到进程的PCB里面

进程在进行高并发运行时,是通过多个进程间来回快速的切换,在一个时间段内,让多个代码同时推进这就是并发

而在CPU中当另一个进程切换过来时,CPU不会删除之前的数据,之前的数据会被新切换过来的数据覆盖!


2. Linux进程调度队列

下图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解,而我们主要讲的就是两个小框,也就是活跃进程过期进程

在这里插入图片描述


2.1 活跃队列

在LInux进程优先级那里我们提到过优先级的范围是[60 , 99]这40个等级,而在调度队列的140个等级中,前100个我们不用管,后面40个等级正好对应我们普通优先级的等级

在这里插入图片描述
CPU运行时,会从优先级高的往下扫描,依次扫描完队列,如果存在进程则运行。


当我们在运行到优先级为99的时候,这时出现了一个优先级为80的进程,该怎么办难道我们要重新返回吗?

  • 当然是不可能返回的,所以我们需要第二个队列 – 过期队列

2.2 过期队列

如果一个活跃进程的一个进程正在运行,但又出现了一个优先级高的进程,该进程是不会放入活跃队列中的,而是放入过期队列来等待调度。

  • 如果一直放入活跃队列的话,优先级低的可能永远不会调度,会造成进程饥饿
  • 所以一般出现优先级高的新进程时,只允许往过期队列插入

因此,在不断调度的过程中,活跃进程里面的进程不断在减少,过期队列的进程一直在增加,那么如果活跃进程里的进程调度完之后,该怎么继续调度呢?

void *active // 活跃队列
void *expired // 过期队列

事实上,我们活跃队列和过期队列是由这两个指针控制
在这里插入图片描述

当我们在调度完一个队列时,将活跃进程和过期进程的内容交换,CPU依然处理活跃队列的进程

在这里插入图片描述


3. 命令行参数

在我们之前的学习时,我们写的main函数都是不带参数的,但是其实它也是可以带参数的,那么让我们来了解以下!

    1 int main(int argc, char *argv[])2 {                                                                                                                                                                                    3     return 1;4 }  

而这两个参数就是我们要学习的命令行参数。这两个参数:
argv表示指针数组,
argc表示数组元素的个数

让我们通过一个例子来更好的了解命令行参数

  1  #include<stdio.h>2 #include<stdlib.h>3 4 int main(int argc, char *argv[])5 {6     int i = 0;7     for(i = 0; i < argc; i++)                                                                                                                                                          8     {9         printf("%d: %s\n",i, argv[i]);10     }11     return 1;12 }

在这里插入图片描述
在这里插入图片描述

当我们运行可执行程序时,它将所有的内容当成一个大的字符串,以空格为分隔符,分割多个字串

将命令行输入的字符串放入argv数组是操作系统干的


既然main函数有这个功能,我们不妨来写一段有趣的代码

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 int main(int argc, char *argv[])5 {6     if(argc != 4)7     {8         printf("Use error\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]);9         return 1;10     }11     // 程序一定会有4个命令行参数,第一个参数是程序名12     int x = atoi(argv[2]);13     int y = atoi(argv[3]);14     if(strcmp(argv[1],"-add") == 0)15     {16         printf("%d + %d = %d\n", x, y, x+y);17     }18     else if(strcmp(argv[1],"-sub") == 0)19     {    20         printf("%d - %d = %d\n", x, y, x-y);21     }22     else if(strcmp(argv[1],"-mul") == 0)23     {24         printf("%d * %d = %d\n", x, y, x*y);25     }26     else if(strcmp(argv[1],"-div") == 0)27     {28         if(y == 0)     29         {                               30             printf("div zero error\n");31         }32         else{                                                      33             printf("%d / %d = %d\n", x, y, x/y);                                                                                                                                       34         }                                                 35     }                                 36     else{                                             37         printf("Use error\n");38     }      39     return 1;40 }                 

让我们来看一下:

命令行参数实现计算机程序

当然,命令行参数使用必须带选项


我们也可以是用命令行参数来实现一个自己的touch指令

  1 #include<stdio.h>2 #include<stdlib.h>34 int main(int argc, char *argv[])  5 {  6     if(argc != 2)  7     {  8         printf("touch: missing file operand\n");9         return 1;10     }                                                                                                                                                                                  11     FILE *fp = fopen(argv[1], "w");                                                                                             12     fclose(fp); 13     return 1;14 }

我们来执行一下命令行参数下的touch指令

命令行参数实现touch

命令行参数,可以支持各种指令级别的命令行选项的设置


4. 环境变量

在学习环境变量之前,先解决几个问题。

  • 为什么在执行系统的指令时可以直接使用
  • 而我们自己写的程序需要加./

而这些其实都和环境变量有关系

抛开环境变量,直接来看,.代表当前目录,实则是让操作系统能够找到我们程序的位置。而系统指令正是由于环境变量的存在能让操作系统能够直接找到并执行。

而与这有联系的环境变量是PATH保存程序的默认搜索路径的环境变量

我们可以用指令查看环境变量PATH
指令:echo $PATH

在这里插入图片描述
每个冒号表示一段路径,执行程序时会默认搜索这些路径,而我们的程序不在这些路径所以要加上./,那如果我们将程序所在路径添加到环境变量下,能不能脱离./?

显而易见,当然是可以的!!!


那我们如何将自己的路径添加到环境变量中呢?

  • 其实环境变量是可以通过指令来修改的!

指令: PATH=$PATH:路径


先用pwd指令找到当前路径
在这里插入图片描述


再使用指令将当前位置添加到环境变量中
在这里插入图片描述


最后我们不带./执行一下可执行程序
**在这里插入图片描述
发现我们在执行刚刚编写的可执行程序时,已经不需要带上./


注意:在每次重启Xshell时,都会恢复默认路径!!!


5. 总结

本篇我们主要了解了以下知识:进程间的切换,Linux进程调度队列,命令行参数,环境变量,当然环境变量我们还只接触到了它的冰山一角,还有很多知识等待着我们发掘!让我们下篇了解剩下的几个环境变量!

谢谢大家支持本篇到这里就结束了

在这里插入图片描述

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

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

相关文章

Gmail邮箱怎么注册?2024年完整指南(包含跳过手机号验证)

一、为什么要注册Gmail邮箱&#xff1f; 全球通用性&#xff1a;Gmail是一个全球性的邮件服务平台&#xff0c;被广泛认可和信赖。因为客户对于Gmail的接受度高&#xff0c;无需担心邮件被自动标记为垃圾邮件。 整合营销工具&#xff1a;通过Gmail账号&#xff0c;你可以轻松…

C++之大数运算

溪云初起日沉阁 山雨欲来风满楼 契子✨ 我们知道数据类型皆有范围&#xff0c;一旦超出了这个范围就会造成溢出问题 今天说说我们常见的数据类型范围&#xff1a; 我们平时写代码也会遇到数据类型范围溢出问题&#xff1a; 比如 ~ 我们之前写的学生管理系统在用 int类型 填写…

stack的使用

1.栈的定义 我们可以看到模板参数里面有一个容器适配器 &#xff0c;什么是适配器&#xff1f;比如充电器就叫做电源适配器&#xff0c;用在做转换&#xff0c;对电压进行相关的转换适配我们的设备。栈&#xff0c;队列不是自己直接管理数据&#xff0c;是让其他容器管理数据&a…

java-函数式编程-语法

目录 1、函数表现形式 分类 lambda表达式 参数类型可以全写&#xff0c;也可以全不写&#xff0c;但不能一部分写&#xff0c;一部分不写lambda 的省略策略&#xff1a;凡是可推导&#xff0c;都可以省略 方法引用 练习-判断语法正确性 练习-写出与方法引用等价的lambda表达式…

新火种AI|马斯克聘用OpenAI泄密者,他们的梁子着实越结越深...

作者&#xff1a;小岩 编辑&#xff1a;彩云 就在最近&#xff0c;昔日就职于OpenAI的工程师Pavel Izmailov正式加入了马斯克的AI团队&#xff0c;他还在自己的推特上大张旗鼓的做着宣传&#xff1a;研究院xai。 AI工程师的跳槽本不值得惊讶&#xff0c;但Pavel的跳槽却在行…

LSTM神经网络 vs Transformer在量化中的应用

LSTM,全称Long Short-Term Memory,是一种特殊的递归神经网络。它通过巧妙的"门"结构,可以有效地捕捉时间序列数据中的长期依赖关系。这一特点,使得LSTM在处理股价这种具有时间序列特性的数据时,展现出了非凡的潜力。 这种特殊的递归神经网络 与一般的前馈神经网络不…

C++语法|如何写出高效的C++代码(一)|对象使用过程中背后调用了哪些方法(构造和析构过程)?

文章目录 再探拷贝构造函数和重载复制运算符实例化新对象和赋值操作强转为类类型指针和引用时临时对象的构造和析构过程 考考你问题答案 再探拷贝构造函数和重载复制运算符 实例化新对象和赋值操作 首先我们写一个类&#xff0c;实现它的拷贝构造并重载赋值运算符。 class T…

盘点四种计算数组中元素值为1的个数的方法

目录 一、引言 二、方法一&#xff1a;基础循环遍历 三、方法二&#xff1a;列表推导式 四、方法三&#xff1a;使用内置函数sum和生成器表达式 五、方法四&#xff1a;使用NumPy库 六、性能比较 七、性能结果分析与讨论 八、最佳实践 九、总结 一、引言 在编程和数…

银河麒麟QT项目打包详细教程

银河麒麟QT项目打包详细教程 一、QT项目打包 下载linuxdeployqt&#xff0c;下载地址&#xff1a;https://github.com/probonopd/linuxdeployqt/releases 安装Linuxdeployqt 2.1 为了安装方便&#xff0c;将下载下来的文件名称改短些 mv linuxdeployqt-6-x86_64.AppImage lin…

92、动态规划-最小路径和

思路&#xff1a; 还是一样&#xff0c;先使用递归来接&#xff0c;无非是向右和向下&#xff0c;然后得到两种方式进行比较&#xff0c;代码如下&#xff1a; public int minPathSum(int[][] grid) {return calculate(grid, 0, 0);}private int calculate(int[][] grid, int …

射频无源器件之巴伦

一. 巴伦的作用 Balun,balanced-unbalanced的缩写,即平衡-不平衡转换器,是一种三端口无源器件,其本质是通过电感线圈的相互耦合实现的信号转换。用于平衡信号(差分信号,即振幅相等、相位相差180 的两个信号)与非平衡信号(单端信号)的相互转换。 Balun是高频电路重要器…

Vmware虚拟机瘦身及Samba服务不可用问题解决

虚拟机磁盘空间膨胀是一个令人头疼的问题&#xff0c;特别是对许多搞开发的小伙伴。无论是做后台服务、嵌入式还是Android开发&#xff0c;都面临着这个难题。首先&#xff0c;操作系统本身就已占用不少空间&#xff0c;更新安装包&#xff0c;再下载一些开源软件&#xff0c;剩…

运行Spring Boot项目失败?显示java: 无法访问org.springframework.boot.SpringApplication,让我来看看~

idea项目运行报错截图&#xff1a; &#xff08;1&#xff09;查看错误提示“类文件具有错误的版本 61.0, 应为 52.0”&#xff0c;61.0对应的是jdk17&#xff0c;52.0对应1.8。 通过这个网址可以查询版本&#xff1a; https://stackoverflow.com/questions/9170832/list-of-ja…

网络编程入门之UDP编程

欢迎各位帅哥美女来捧场&#xff0c;本文是介绍UDP网络编程。在这里&#xff0c;你会见到最详细的教程&#xff1b;细致到每一行代码&#xff0c;每一个api的由来和使用它的目的等。 目录 1.UDP相关API 1.1.两个类 1.2.两个类中的方法 2.UDP编程 2.1.大体框架 2.2.内容构…

【项目学习01_2024.05.08_Day06】

学习笔记 5 新增课程5.1 需求分析5.1.1 业务流程5.1.2 数据模型 5.2 接口定义5.3 接口开发5.3.1 保存课程基本信息5.3.2 保存营销信息 5.4 接口测试 5 新增课程 5.1 需求分析 5.1.1 业务流程 5.1.2 数据模型 5.2 接口定义 5.3 接口开发 根据需求分析&#xff0c;新增课程表…

【智能楼宇秘籍】一网关多协议无缝对接BACnet+OPC+MQTT

在繁华的都市中心&#xff0c;一座崭新的大型商业综合体拔地而起&#xff0c;集购物、餐饮、娱乐、办公于一体&#xff0c;是现代城市生活的缩影。然而&#xff0c;这座综合体的幕后英雄——一套高度集成的楼宇自动化系统&#xff0c;正是依靠多功能协议网关&#xff0c;实现了…

韩国站群服务器提供高级安全防护以确保数据和网站的安全性

韩国站群服务器提供高级安全防护以确保数据和网站的安全性 在当今数字化时代&#xff0c;网站的安全性和数据保护已成为企业和个人不可忽视的重要议题。韩国站群服务器作为一个拥有发达科技和互联网基础设施的国家&#xff0c;通过提供高级安全防护措施&#xff0c;为用户的数…

Web服务器和Tomcat

Web介绍 对于http协议操作进行封装、简化web程序开发 部署web项目&#xff0c;对外提供上网信息浏览 Tomcat介绍 一个轻量级的web服务器 也称为web容器 Tomcat的文件夹介绍 下载地址&#xff1a;Apache Tomcat - Apache Tomcat 9 Software Downloads 安装&#xff1a;直…

十个数据安全最佳实践:保护数据的简单方法

在德迅云安全将介绍数据安全的主要原则&#xff0c;并了解适用于大多数行业的 10 种数据安全最佳实践&#xff0c;以及云端安全检测的重要性。 数据威胁和维护数据安全的好处 什么是数据安全&#xff1f; 数据安全是旨在保护组织敏感资产的流程和工具的组合。有价值的数据在…

JavaScript快速入门系列-1(JavaScript简介)

第一章:JavaScript简介 1. JavaScript简介1.1 什么是JavaScript1.2 JavaScript的历史与应用1.3 环境搭建:浏览器与Node.js2. JavaScript语言基础2.1 变量声明:let, const, var2.2 数据类型:字符串、数字、布尔值、对象、数组、null与undefined2.3 运算符:算术、比较、逻辑…