进程(三)进程间的切换、环境变量

news2024/11/18 5:28:38

文章目录

  • 进程间的切换
  • Linux2.6内核进程调度队列
    • 一个CPU拥有一个runqueue
    • 优先级
    • 活跃进程
    • 过期队列
    • active指针和expired指针
  • 环境变量
    • 基本概念
    • 常见环境变量
    • 查看环境变量的方法
    • 测试PATH
    • 测试HOME
    • 和环境变量相关的命令
    • 通过代码如何获取环境变量
    • 通过系统调用获取环境变量

进程间的切换

我们知道在CPU进行调度的时候,并不是一个进程结束后才取消调度,而是不停地在多个进程之间进行调度。
那么我们引入几个问题
1、没运行完的进程的数据在哪???
2、当一个进程被取下时它在CPU的数据是否会被删除???

  • 第一个问题

当一个进程在没运行完的情况下被取下CPU时,肯定会保存一个信息,那就是当前进程运行到哪儿了?和C语言的代码相似,当前代码运行到哪儿了系统是怎么知道的?
在这里插入图片描述
1.为什么我们函数内定义的栈临时变量,会返回个给外部???
因为有eax这个寄存器(帮助函数返回一个值),充当代码的临时空间;
2.为什么我们的进程知道我们当前运行到了哪里???如何做到函数间的跳转???
因为CPU内有eip(程序计数器)。会保存当前指令的下一条指令的地址。

所以其实在进程运行时,是会使用到这些寄存器的!进程产生的各种数据会在寄存器中进行临时保存!

  • 第二个问题

一个进程被取下来时CPU并不会删除它的临时数据;
而是当下一个进程被放入时,用下一个进程的数据将上一个进程 的数据覆盖了!
各个进程在CPU寄存器中形成的临时数据(进程的硬件上下文),都是不一样!!互不影响!!!

将CPU内的寄存器保存到进程的PCB当中,本质:CPU寄存器的内容保存到了内容中!
总结: 当一个进程被调度时:如果之前被调度过了,那么它首先要做的事情是,将自己PCB中的硬件上下文恢复上来;如果之前没有被调度,那么直接让eip指向进程的初始代码。

Linux2.6内核进程调度队列

在这里插入图片描述

一个CPU拥有一个runqueue

如果有多个CPU就要考虑进程个数的负载均衡问题。

优先级

queue下标说明:

  • 普通优先级:100~139。
  • 实时优先级:0~99。
    我们进程的都是普通的优先级,前面说到nice值的取值范围是-2019,共40个级别,依次对应queue当中普通优先级的下标100139。

注意: 实时优先级对应实时进程,实时进程是指先将一个进程执行完毕再执行下一个进程,现在基本不存在这种机器了,所以对于queue当中下标为0~99的元素我们不关心。

活跃进程

在这里插入图片描述

时间片还没有结束的所有进程都按照优先级放在活动队列当中,其中nr_active代表总共有多少个运行状态的进程,而queue[140]数组当中的一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进程排队调度。

调度过程如下:

1、从0下标开始遍历queue[140]。
2、找到第一个非空队列,该队列必定为优先级最高的队列。
3、拿到选中队列的第一个进程,开始运行,调度完成。
4、接着拿到选中队列的第二个进程进行调度,直到选中进程队列当中的所有进程都被调度。
5、继续向后遍历queue[140],寻找下一个非空队列。
bitmap[5]:queue数组当中一共有140个元素,即140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5 × \times× 32个比特位表示队列是否为空,这样一来便可以大大提高查找效率。

过期队列

Q:当一个优先级为90的进程正在运行,但是此时突然多了一个优
先级为80的进程,那么这个多加入的进程也是放入活跃队列中和其中的进程抢占资源吗?
A:不会,优先级很高的进程加入进来,原本优先级比较低的进会迟迟得不到CPU的资源,会进程饥饿!
所以新加入进来的进程会被放进过期队列中!
活跃进程一样也是按照优先级排列!

  • 过期队列和活动队列的结构相同。
  • 过期队列上放置的进程都是时间片耗尽的进程。
  • 当活动队列上的进程被处理完毕之后,对过期队列的进程进行时间片重新计算。
那么当活跃队列中的进程被调度完了
此时CPU是去过期进程调度吗?

答案是不!系统直接使用swap()函数
将活跃进程和过期进程的内容交换
CPU还是在处理活跃队列的进程!

active指针和expired指针

  • active指针永远指向活动队列。
  • expired指针永远指向过期队列。

环境变量

基本概念

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

常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量的方法

我们可以通过echo命令来查看环境变量,方式如下:

echo $NAME //NAME为待查看的环境变量名称
在这里插入图片描述

测试PATH

为什么执行系统命令的时候不用带./就可以执行,而我们自己生成的二进制可执行程序必须要在前面带上./才可以执行?
当我们运行一个程序时,我们首先要知道他的位置,既然系统命令可以不使用./就可以运行,说明系统已经找到了它的位置

那么如何让我们的程序不带./也能运行呢?

  • 方法一

将可执行程序拷贝到环境变量PATH的某一路径下。

在这里插入图片描述

  • 方法二

将可执行程序所在的目录导入到环境变量PATH当中。

在这里插入图片描述

测试HOME

任何一个用户在运行系统登录时都有自己的主工作目录(家目录),环境变量HOME当中即保存的该用户的主工作目录。

普通用户示例:
在这里插入图片描述

超级用户示例:
在这里插入图片描述

和环境变量相关的命令

  • echo:显示某个环境变量的值。
    在这里插入图片描述
  • export:设置一个新的环境变量。
    在这里插入图片描述
  • env:显示所有的环境变量。
    在这里插入图片描述

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

方法一:main函数的第三个参数

#include <stdio.h>

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

在这里插入图片描述
方法二:通过第三方变量environ获取

#include <stdio.h>

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

在这里插入图片描述

通过系统调用获取环境变量

可以通过系统调用getenv函数来获取环境变量。getenv函数可以根据所给环境变量名,在环境变量表当中进行搜索,并返回一个指向相应值的字符串指针。

使用getenv函数获取环境变量PATH的值。

#include <stdio.h>
#include <stdlib.h>      
                                                                                                                                                 
int main(int argc, char *argv[])
{
     printf("%s\n", getenv("PATH"));
     return 0;
}

在这里插入图片描述

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

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

相关文章

错误票据-蓝桥杯

思路&#xff1a; 其实只是排序一下&#xff0c;然后遍历&#xff0c;如果两个值差2&#xff0c;则输出两个值的平均数&#xff0c;如果两个数差值为0 &#xff0c;那么则这个值就是重复的值 代码&#xff1a; #include <iostream> #include<vector> #include&l…

第二篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:添加组件和事件处理

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、添加组件和事件处理示例代码三、补全其余组件事件处理示例代码 系列短博文目录 鸿蒙开发技术点案例示例短博文系列 短博文目录 一、前言 有一必然会有二&#xff0c;有了第一个…

Java项目:基于SSM框架实现同城蔬菜配送管理系统(SSM+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm825基于SSM框架实现同城蔬菜配送管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&…

小程序系列--12使用 npm 包

一、Vant Weapp 1. 什么是 Vant WeappVant Weapp 是有赞前端团队开源的一套小程序 UI 组件库&#xff0c;助力开发者快速搭建小程序应用。它所使用的是 MIT 开源许可协议&#xff0c;对商业使用比较友好。 官方文档地址 https://youzan.github.io/vant-weapp 2. 安装 Vant 组…

《WebKit 技术内幕》学习之六(1): CSS解释器和样式布局

《WebKit 技术内幕》之六&#xff08;1&#xff09;&#xff1a;CSS解释器和样式布局 CSS解释器和规则匹配处于DOM树建立之后&#xff0c;RenderObject树之前&#xff0c;CSS解释器解释后的结果会保存起来&#xff0c;然后RenderObject树基于该结果来进行规范匹配和布局计算。当…

Unity 组合模式(实例详解)

文章目录 示例1&#xff1a;Unity中的图形界面元素组合示例2&#xff1a;Unity中的游戏对象层级组合示例3&#xff1a;Unity中的场景图节点组合示例4&#xff1a;Unity中的场景管理组合示例5&#xff1a;Unity中的角色技能树组合 在Unity中&#xff0c;组合模式&#xff08;Com…

哈希的基本概念(开散列和闭散列)(附代码)

哈希 哈希概念哈希冲突哈希函数常见的哈希函数 哈希冲突的解决闭散列开散列 哈希概念 传统的查找函数&#xff0c;搜索的效率取决于比较的次数。而hash算法&#xff1a;在理想情况下&#xff0c;可以不经过任何比较&#xff0c;一次就能得到要搜索的结果。 存储结构&#xff1…

四、MyBatis 动态语句

本章概要 动态语句需求和简介if 和 where 标签set 标签trim 标签(了解)choose/when/otherwise 标签foreach 标签sql 片段 4.1 动态语句需求和简介 经常遇到很多按照很多查询条件进行查询的情况&#xff0c;比如智联招聘的职位搜索等。其中经常出现很多条件不取值的情况&#…

电脑监控系统:企业网络安全解决方案

在当今数字化的世界里&#xff0c;企业的网络安全已经成为一项至关重要的任务。电脑监控系统作为一种有效的解决方案&#xff0c;正在被越来越多的企业所采用。 电脑监控系统是一种集成了多种安全功能的综合性解决方案&#xff0c;旨在为企业提供全面的网络安全防护。该系统能够…

【操作系统】实验七 显示进程列表

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Java 报错java.Net.UnknownHostException:raw.githubusercontent.com

1.问题 今天在vscode 学习如何使用 plantUML生成图片的时候&#xff0c;发生错误 java.util.concurrent.ExecutionException: java.net.UnknownHostException: raw.githubusercontent.com issue raw.githubusercontent.com java.util.concurrent.ExecutionException: java.n…

手写一个图形验证码

文章目录 需求分析 需求 使用 JS 写一个验证码&#xff0c;并在前端进行校验 分析 新建文件 VueImageVerify.vue <template><div class"img-verify"><canvas ref"verify" :width"state.width" :height"state.height&qu…

“研学测”好帮手,三步带你安装体验TDH社区开发版

星环科技TDH社区开发版&#xff0c;作为一款单机可部署、开箱即用的大数据基础平台产品&#xff0c;大幅降低了用户的资源成本和使用门槛。与此同时&#xff0c;TDH社区开发版兼顾此前TDH社区版&#xff08;分布式&#xff09;组件成熟、简单易用、易运维等特点&#xff0c;可以…

《剑指 Offer》专项突破版 - 面试题 28 : 展平多级双向链表(C++ 实现)

题目连接&#xff1a;LCR 028. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个多级双向链表中&#xff0c;节点除了有两个指针分别指向前后两个节点&#xff0c;还有一个指针指向它的子链表&#xff0c;并且子链表也是一个双向链表&…

深入理解MySQL InnoDB线程模型

当我们谈论数据库性能时&#xff0c;存储引擎的线程模型是一个不可忽视的方面。MySQL的InnoDB存储引擎&#xff0c;作为目前最受欢迎的存储引擎之一&#xff0c;其线程模型的设计对于实现高并发、高性能的数据操作至关重要。在本文中&#xff0c;我们将深入探讨MySQL InnoDB线程…

day31_CSS

今日内容 CSS概述引入方式 (where)选择器(how)属性(how) 1 CSS介绍 层叠样式表&#xff08;cascading style sheet&#xff09; CSS 用来美化HTML页面,可以让页面更好看,还可以布局页面. 好处 美化页面,布局页面使用外部css文件,可以实现样式文件和html文件分离,便于维护使用外…

JS进阶-内置构造函数(二)

小提示&#xff1a;这些内置函数在开发使用的频率非常的频繁&#xff0c;建议认真看一下&#xff0c;并背一下 目录 知识回顾&#xff1a; • Object 三个常用静态方法&#xff08;静态方法就是只有构造函数Object可以调用的&#xff09; Object.keys Object.values Obj…

【2024】下载安装Cisco Packet Tracer 8.2.1

一、注册账号 进入www.cisco.com 点击右上角的Log in 点击注册 之后输入邮箱和其他相关信息&#xff0c;正常注册即可 唯一注意的点&#xff1a;国家或地区 选项中别选China&#xff0c;否则之后登录软件时会有问题 二、下载安装包 进入packet-tracer下载&#xff0c;下…

【Tailwind】各种样式的进度条

基本样式进度条&#xff1a; <div class"mb-5 h-2 rounded-full bg-gray-200"><div class"h-2 rounded-full bg-orange-500" style"width: 50%"></div> </div>带文字的进度条&#xff1a; <div class"relativ…

品优购项目规划

1&#xff0c;网站favicon图标 favicon.ico 一般用于作为缩略的网站标注&#xff0c;它显示在浏览器的地址栏或者标签上 1&#xff0c;制作favicon图标 ①把品优购图标切成png图片 ②把png图片转换为ico图标&#xff0c;这需要借助于第三方转换网站&#xff0c;比如 比特虫…