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>
  3
  4 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.mfbz.cn/a/604329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JAVA基础之时间API】自定义时间格式

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.Date类 1.1 概述 1.2 构造方法 1.3 常用方法 2.SimpleDateFormat类 2.1 概述 2.2 构造方法 2.3 格式规则 2.4 常用方法 3.Calendar类 3.1 概述…

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…

C++贪心算法

关于string的系统函数&#xff01; &#xff08;注&#xff1a;以下函数只可用于string&#xff0c;不适用其他类型的变量&#xff09; ① a.size(); 这个系统函数是用来获取这个string变量的长度的&#xff0c;我们通常会新建一个变量来保存他&#xff0c;以便之后使用。 …

在java类前添加上文档注释

第一步&#xff1a; 第二步 第三步 将下面代码粘上 /** *Author Lnn *Date ${DATE}/${TIME} *ClassName ${NAME} *Description */

ios苹果App上架到应用商店的操作流程

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;发现最近有许多想要上架App的小伙伴&#xff0c;但是又不知道要怎么操作&#xff0c;对于开发者而言&#xff0c;将精心打造的iOS应用程序成功上架到苹果的 App Store 是向全球用户展示咱们的产品和服务的…

《动手学深度学习》预备知识和安装环境

哈喽&#xff0c;欢迎来到自学深度学习小白的文章&#xff0c;本文将介绍anacoda是什么和有什么用&#xff0c;以及在win10环境下如何安装运行环境。 关于anaconda 1.环境 准备开始写代码了&#xff0c;教材总是先叫你配好环境&#xff0c;环境可以堪称一栋房子&#xff0c;…

MindSponge分子动力学模拟——软件架构

技术背景 在前面一篇文章中&#xff0c;我们介绍了MindSponge的两种不同的安装与使用方法&#xff0c;让大家能够上手使用。这篇文章主要讲解MindSponge的软件架构&#xff0c;并且协同mindscience仓库讲解一下二者的区别。 整体架构 首先我们来了解一下MindSponge独立仓库的…

Baidu Comate智能编码助手:提升软件生产力的高效工具使用教程

目录 一、前言 二、Comate助手概览 三、核心功能详解 智能推荐与自动补全 生成单元测试 代码注释生成 四、使用场景与优势 五、总结与展望 一、前言 随着信息技术的飞速发展&#xff0c;编程已经成为许多行业不可或缺的一部分。然而&#xff0c;编程过程中的繁琐和重复…

基于51单片机交通灯设计—汇编语言

基于51单片机的交通灯设计 &#xff08;仿真&#xff0b;程序设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.南北方向绿灯20s&#xff08;最后3s闪烁&#xff09;后转黄灯常亮5s&#xff0c;同时东西方向红灯25秒&#xff1b;东西方向绿灯20s&#xff08;最后3s闪烁…

【三】DRF序列化进阶

序列化器的定义与使用 多表关联序列化 【1】准备工作 # settings.py DATABASES {default: {# 数据库引擎选择使用MySQLENGINE: django.db.backends.mysql,# 指定数据库名字&#xff0c;需提前创建NAME: books,# 指定数据库用户名USER: root,# 指定数据库用户密码PASSWORD: …

Redis 主从复制 初步认识

文章目录 定义拓扑拓扑定义单从拓扑多从拓扑树型拓扑 使用原理建立流程持续复制 定义 Redis主从复制技术的主要满足的需求是①数据恢复②负载均衡 ①数据恢复的理解&#xff1a;将数据同步到多个Redis服务器中&#xff0c;其中一个节点数据损毁&#xff0c;可通过复制其他节点…

FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度 在任务优先级相同的时候&#xff0c;CPU会轮流使用相同的时间去执行它&#xff0c;即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期&#xff08;SysTick的中断周期可以修改&#xff09;。 比如有三个相同优先级的任务在运行…

一张贴纸50万,炒房炒币的怎么都来炒CSGO皮肤了

一张贴纸50万&#xff0c;为什么炒房炒币的都来炒CSGO饰品了&#xff1f; 一张贴纸50万&#xff0c;炒房炒币的怎么都来炒CSGO皮肤了&#xff1f; 经常有人问我&#xff0c;天天看你们买卖装备&#xff0c;买卖皮肤&#xff0c;说到底这都是虚拟产品&#xff0c;看得见摸不着的…

ue引擎游戏开发笔记(35)——为射击添加轨道,并显示落点

1.需求分析&#xff1a; 我们只添加了开枪特效&#xff0c;事实上并没有实际的效果产生例如弹痕&#xff0c;落点等等。所以逐步实现射击的完整化&#xff0c;先从实现落点开始。 2.操作实现&#xff1a; 1.思路&#xff1a;可以这样理解&#xff0c;每次射击的过程是一次由摄…

二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量。它可以帮助防止未经授权的访问&#xff0c;保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量&#xff0c;例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

Ansible-playbook剧本

目录 一、Ansible playbook简介 2.1 playbook格式 2.2 playbook组成部分 二、playbook示例 2.1 yaml文件编写 2.2 运行playbook 2.3 定义、引用变量 2.4 指定远程主机sudo切换用户 2.5 when条件判断 2.6 迭代 三、总结 Ansible中使用playbook脚本的作用和好处 一、A…

5月8日学习记录

_[FBCTF2019]RCEService&#xff08;preg_match函数的绕过&#xff09; 涉及知识点&#xff1a;preg_match函数绕过&#xff0c;json的格式&#xff0c;正则回溯 打开环境&#xff0c;要求用json的格式输入 搜索学习一下json的语法规则 数组&#xff08;Array&#xff09;用方括…

OpenMV 图像串口传输示例

注意&#xff1a;本程序根据 OpenMV采集图片通过串口发送&#xff0c;PC接收并保存为图片 更改。 一、例程说明 这个例程主要实现了以下功能: 1. OpenMV 端采集图像:使用OpenMV开发板上的摄像头采集实时图像数据。 2. 通过串口传输图像数据:将采集到的图像数据打包成字节流,…

智慧工地的5大系统是什么?SaaS化大型微服务架构(智慧工地云平台源码)可多端展示登录

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最终实现项目对人、机、料、法、环的全…

外企接受大龄程序员吗?

本人知乎账号同公众号&#xff1a;老胡聊Java&#xff0c;欢迎留言并咨询 亲身体会外企经历所见所闻&#xff0c;外企能接受大龄程序员。 1 大概是10年的时候&#xff0c;进一家知名外企&#xff0c;和我一起进的一位manager&#xff0c;后来听下来&#xff0c;年龄35&#xf…
最新文章