【Linux】进程优先级

Linux 进程优先级

  • 为什么要有优先级的划分?
  • Linux 环境设置优先级的具体做法
  • 并发运行
  • 环境变量
    • 如何通过代码获取环境变量
  • 环境变量的来源

为什么要有优先级的划分?

优先级的规定就是为了确定某种资源获取的先后顺序。
本质原因是因为CPU资源是有限的。进程数量太多时,就会对资源形成竞争,就需要有优先级的划分来分配资源。
优先级反映到程序中也只是 PCB 结构体(LInux环境下是 task_struct)中定义的一些数据。

Linux 环境设置优先级的具体做法

以下面代码为例查看优先级。

#include <stdio.h>                                                                                    
#include <unistd.h>    
    
int main()    
{    
    while(1)    
    {    
        printf("hello world: %d\n", getpid());    
        sleep(1);    
    }    
    return 0;
}

一个进程的优先级有 PRI 和 NI 共同决定。
PRI 越小,优先级越高,也越先被执行。
NI 是对 PRI 做调整的,也就是说 Linux 下的优先级是可变的。
NI 的取值范围为 -20~19
在这里插入图片描述
修改 NI 的方法有很多,这里使用top命令来修改。
在这里插入图片描述
在这里插入图片描述
下面是对 NI 值进行修改后查看到的进程的 PRI。从这里可以体现出 NI 对于进程优先级的调整方式。
在这里插入图片描述

并发运行

并行是指多个进程在多个CPU下分别同时运行。
并发是指多个进程在一个CPU下采用进程切换的方式,在一段时间内,多个进程都得以推进。
这里要谈的一点是,进程被切换之后,进程如果还没有被执行结束,那这个进程之后在CPU上恢复执行的时候,它是从头开始执行,还是从之前未执行完的地方开始执行?如果是从未执行完的地方恢复执行,又是如何做到这种恢复的呢?
首先回答第一个问题,肯定不能是从头开始执行了。
要知道用户所使用的计算机通常都只有一个CPU。
假如进程A正在被执行,CPU内的寄存器一定保存的是进程A的执行的各种临时数据。(寄存器中的临时数据,叫做进程的上下文数据)
当进程A被切换下来的时候,进程A需要同时带走自己的上下文数据暂时保存。
这是为了等下次回来继续被运行的时候,能根据这些保存的上下文数据,继续按照之前执行的逻辑向后执行,就好像没有被中断过一样。
所以CPU只有一个,寄存器中的数据也只能存储一份,但是上下文数据可以有多份,这些数据对应不同的进程,从而能够实现并发的运行。

环境变量

先以一个问题作为切入。
在这里插入图片描述
我们所写的可执行程序,和系统的可执行程序其实都是一样的存在。
这些可执行程序在执行的时候,都可以带全路径。
但是系统的可执行程序还可以直接执行,不用指定具体路径。而我们所写的可执行程序就必须指明路径(./路径)。
这是为什么呢?我们所写的可执行程序能不能不指定具体路径就执行呢?
首先要明确的是,系统要执行一条命令,必须要先找到它。
我们所写的可执行程序如果不带路径,就无法被找到。而系统的命令是默认可以被找到的。
因为这些系统命令已经是在环境变量PATH中存放的路径下的。
在这里插入图片描述
ls命令就存放在/usr/bin路径下。
所以要想让我们所写的可执行程序不带路径,有两种做法。
第一种是将我们所写的可执行程序配置进PATH环境变量的路径下(不推荐,可能会污染命令池)。
第二种是将我们所写的可执行程序的路径放进PATH环境变量中。
在这里插入图片描述
这里要说明一下命令行中改环境变量只在本次登录期间有效。当退出重新登陆后又会恢复修改前的样子。
PATH只是环境变量的一种。
要查看Linux下所有的环境变量,可以使用env命令。
在这里插入图片描述
这些环境变量在系统当中都是以键值对的形式存在着。
set命令也可以查看环境变量。同时还可以显示本地定义的shell变量。
在这里插入图片描述
在这里插入图片描述

如何通过代码获取环境变量

#include <stdio.h>
#include <unistd.h>

int main(int argc, char* argv[], char* env[])
{
	/*
	* 方法一
	* argc argv 命令行参数
	* env 环境变量参数
	*/
    for (int i = 0; env[i]; ++i)
    {
        printf("env[%d]: %s\n", i, env[i]);
    }
	
	/*
	* 方法二
	* environ 全局的第三方变量
	*/
	extern char** environ;
	for (int i = 0; environ[i]; ++i)
	{
		printf("env[%d]: %s\n", i, env[i]);
	}

	return 0}

上面的代码获取的是所有的环境变量。
还可以使用getenv指定要获取的环境变量。
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

int main()
{
	// 获取 PATH 环境变量
	printf("%s\n", getenv("PATH"));
	
	return 0;
}

这里再介绍一下 main 函数的argcargv参数。

#include <stdio.h>

int main(int argc, char* argv[], char* env[])
{
	for (int i = 0; i < argc; ++i)                                                                      
	{
	    printf("argv[%d]: %s\n", i, argv[i]);
	}
	
	return 0;
}

这里可以看到,argc 表示在命令行中传入的参数个数,而argv内则会保存这些传入的参数。
这里就可以理解,指令对应不同的参数选项,所具有的不同的功能是如何做到的了。
在这里插入图片描述

环境变量的来源

环境变量具有全局属性。
任何在命令行上启动的进程,他的环境变量都来自父进程。
默认,所有的环境变量都会被子进程继承。
下面的执行结果给出了一定的证明。

#include <stdio.h>

int main()
{
	printf("%s\n", getenv("helloworld"));
	
	return 0;
}

在这里插入图片描述
而追溯到源头,命令行shell外壳的环境变量来自操作系统,操作系统会将配置文件中的环境变量进行装载。

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

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

相关文章

KMP算法

KMP KMP 算法是一个快速查找匹配串的算法&#xff0c;它的作用其实就是本题问题&#xff1a;如何快速在「原字符串」中找到「匹配字符串」。 而 KMP 算法的复杂度为 O(mn)实际上是O(N),因为O(M)不可能大于O(N) KMP 之所以能够在 O(mn)复杂度内完成查找&#xff0c;是因为其能…

CentOS环境下的MYSQL8安装

MySQL 安装 参考连接&#xff1a;https://www.cnblogs.com/jasonx1an/p/16690866.html 下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 卸载 mariadb 查看 mariadb rpm -qa|grep mariadb卸载 mariadb rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps再…

概率栅格

欢迎访问我的博客首页。 概率栅格 1. miss 表与 hit 表 1. miss 表与 hit 表 miss 表和 his 表是一维数组&#xff0c;它们存放的都是空闲值。其下标 i i i 代表旧空闲值&#xff0c;元素 t a b l e [ i ] table[i] table[i] 代表旧空闲值 i i i 的新空闲值。表的更新可以用…

Maven —— 项目管理工具

前言 在这篇文章中&#xff0c;荔枝会介绍如何在项目工程中借助Maven的力量来开发&#xff0c;主要涉及Maven的下载安装、环境变量的配置、IDEA中的Maven的路径配置和信息修改以及通过Maven来快速构建项目。希望能对需要配置的小伙伴们有帮助哈哈哈哈~~~ 文章目录 前言 一、初…

安全防御 --- SSL VPN

附&#xff1a;无线项目介绍 SSL VPN 有浏览器的设备就可以使用SSL&#xff0c;进而使用SSL VPN。无需担心客户端问题&#xff0c;所以SSL VPN也称为无客户端VPN。SSL VPN在client to lan场景下特别有优势。 实际实现过程&#xff08;基于TCP实现&#xff09; &#xff08;1&…

MYSQL执行一条SELECT语句的具体流程

昨天CSDN突然抽风 我一个ctrlz把整篇文章给撤掉了还不能复原 直接心态崩了不想写了 不过这部分果然还是很重要,还是写出来吧 流程图 这里面总共有两层结构Server层 储存引擎 Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现&#xff0c;主要包…

Java-API简析_java.lang.ProcessBuilder类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131729933 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

什么是Docker

容器技术和虚拟机 虚拟机 和一个单纯的应用程序相比&#xff0c;操作系统是一个很重的程序&#xff0c;刚装好的系统还什么都没有部署&#xff0c;单纯的操作系统其磁盘占用至少几十G起步&#xff0c;内存要几个G起步。 在这台机器上开启三个虚拟机&#xff0c;每个虚拟机上…

Failed to connect to github.com port 443: Connection refused问题解决

文章目录 一、问题描述&#xff1a;Failed to connect to github.com port 443: Connection refused问题解决二、解决方法一&#xff1a;排查代理问题1、尝试重置代理或者取消代理的方式2、添加全局代理 三、解决方法二&#xff1a;排查DNS解析问题1、第一步&#xff1a;查找gi…

Redis解决Session共享问题

文章目录 一、集群Session共享问题二、Redis存储验证码和对象三、解决状态登录刷新问题 一、集群Session共享问题 session共享问题&#xff1a;多台Tomcat并不共享session存储空间&#xff0c;当请求切换到不同tomcat服务器时导致数据丢失的问题 tomcat可以进行多台tomcat进行…

蓝牙技术|低功耗蓝牙和LE Audio助力游戏设备行业发展

去年&#xff0c;蓝牙技术联盟官方宣布推出LE Audio&#xff0c;它以BLE为基础&#xff0c;旨在更好地兼顾音频质量和低功耗&#xff0c;以在多种潜在应用中显著增强用户体验。这在游戏行业中引起了轰动&#xff0c;由于其延迟显著降低&#xff0c;LE Audio在增强游戏体验方面展…

连接一个JavaScript文件

● 首先&#xff0c;本章我们会使用一个起始文件&#xff0c;代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

unidbg或者java层解密方法IDEA中打包成jar包供python调用方法

一、导出jar包方法 &#xff08;1&#xff09;配置jar包参数 &#xff08;2&#xff09;创建生成jar包 成功生成&#xff01; 二、Python代码调用 import jpypejvmPath jpype.getDefaultJVMPath() d unidbg-android.jar # 对应jar地址 jpype.startJVM(jvmPath, "-ea&q…

apple pencil一代的平替有哪些品牌?苹果平板的触控笔

随着苹果Pencil系列的推出&#xff0c;平替电容笔在国内市场得到了较好的发展&#xff0c;随之的销量&#xff0c;也开始暴涨&#xff0c;苹果pencil因为价格太高&#xff0c;导致很多人买不起。目前市场上&#xff0c;有不少的平替电容笔&#xff0c;可以替代苹果的Pencil&…

opencv-06 使用numpy.array 操作图片像素值

opencv-06 使用numpy.array 操作图片像素值 **1&#xff0e;二值图像及灰度图像****利用item 读取某一个像素值****利用itemset 修改像素值****彩色图像numpy.arry 像素值操作** numpy.array 提供了 item()和 itemset()函数来访问和修改像素值&#xff0c;而且这两个函数都是经…

C基础day9(2023.7.11)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;实现字符串逆置 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {char str[]"hello";char *pstr;char *qstrstrlen…

【Android知识笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

CSDN-AI小组2023-半年-研发总结

目录 1.丐版「大模型」&#xff0c;Proof of concept2. LLM和AIGC的各种综述3. 基于Embedding的应用&#xff0c;问答&#xff0c;AI编程4. 评论区的AI助手5. 结合AIGC的各种数据自动计算6. 个性化推荐的系统重构7. 基于AIGC的个性化博客创作鼓励8. 博客质量分V5: 可解释性计算…

vulnhub靶机渗透:PWNLAB: INIT

PWNLAB: INIT 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描扫描总结 80端口目录爆破LFI利用 3306端口回到80端口文件上传 获得立足点横向移动提权总结参考 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP&#xff1a;192.168.56.103 kali IP&#xff…

Linux信号机制

转自&#xff1a;深入理解Linux信号机制(1.0)_城中之城的博客-CSDN博客 一、信号机制概览 相信大家对信号并不陌生&#xff0c;很多人都用过kill命令或者CtrlC组合键杀死过进程&#xff0c;或者遇到过程序因为收到SIGSEGV信号而崩溃的。而对信号的基本原理&#xff0c;估计很…