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

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

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

Linux进程优先级


本篇主要内容:

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


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 }                 

让我们来看一下:

image.png

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

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


我们也可以是用命令行参数来实现一个自己的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指令

image.png

命令行参数实现touch

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


4. 环境变量

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

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

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

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

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

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

指令:echo $PATH

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

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


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

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

指令: PATH=$PATH:路径


先用pwd指令找到当前路径


再使用指令将当前位置添加到环境变量中


最后我们不带./执行一下可执行程序

发现我们在执行刚刚编写的可执行程序时,已经不需要带上./


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


5. 总结

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

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

目录
相关文章
|
14天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
39 1
|
3天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
35 13
|
9天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
17天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
23天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
27天前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
20 3
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
61 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
7月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
4月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
43 1
下一篇
DataWorks