Linux操作系统——进程(四)进程切换与命令行参数

进程切换

概念引入

下面我们先了解几个概念:

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

每一个进程不是占有CPU就一直运行,每隔一段时间自动从CPU上被剥离下来,这里所说的每隔一段时间我们称之为时间片。

Linux内核是支持进程之间进行CPU资源抢占的!

如果CPU正在运行一个优先级为80的进程,然后呢,系统启动了一个优先级更高的进程,优先级为60的一个进程,此时CPU会强制性的将优先级为80的这个进程不管时间片到没到都会把该进程换下去,换成调度那个优先级为60的那个进程进行运行。所以我们的Linux内核的调度的原则呢是基于时间片的轮转式的抢占式内核。

进程这样来回的切换不停的来回切换我们用户是感知不到的看似是同时在运行,其实是因为他们的切换速度非常的快,我们就把这种进程的不断地来回切换不断地运行这种概念呢就叫做 并发。

并发是必定要考虑进程间的切换的!!!

CPU当中呢会存在很多很多的寄存器,比如说,eax,ebx,ecx,edx,ss,ds,cs,gs,fs,ebp,esp,eip,status_reg,cr0~cr4,......等等

假如有如下代码:

#include<stdio.h>

int func()
{
    int a = 10;
    return a;
}


int main()
{
    int c = func();

    return 0;
}

为什么我们所写的c语言的函数内定义在栈上的临时变量可以返回给外部?我们都知道栈上的临时变量出了作用域就会被销毁。

原因就在于我们的这个临时变量a的内容再return 的时候是把内容放到了一般是放在eax寄存器上,用来充当代码的临时空间。

那么我们的程序/进程,它怎么知道我们当前运行到了哪里呢?如何做到函数间的跳转的呢?

主要原因是因为呢,我们正常的代码是从上到下运行的,可是我们有循环啊,有判断啊,有函数要进行跳转啊,其实呢,在我们的CPU内有一个寄存器是eip叫做程序计数器,用来保存程序下一条要执行指令的地址。所以说,我们的进程在运行的时候是会使用我们的这些寄存器的,简而言之就是我们的进程会产生各种数据在寄存器内临时保存!

如果我们有多个进程呢?

各个进程在CPU寄存器中形成的临时数据都是不一样的。我们把这些在CPU寄存器中形成的临时数据叫做进程的硬件上下文。

那么CPU的寄存器有几套呢?答案是只有1套。

各个进程的上下文数据有几套呢?答案是多套。

所以你肯定会觉得寄存器只有一套,而进程需要临时保存的数据有多套该如何报错呢?

其实你应该要记住一个重点那就是寄存器!=寄存器的内容。寄存器只有一套但是寄存器保存的数据是可以有多份的。

那么我们下面通过一个故事来进行理解:

故事时刻:

大家呢在上大学的时候呢,我们读大一大二的时候呢,我们国家呢经常有碰到很多部队在学校里面来征兵,然后你可以去当一梁年兵,当了一年兵之后你还可以继续回来上学。到时候毕业的时候呢还可以有当兵经历和自己的学位证,也挺好啊,你和你舍友呢就高兴的去了。你自己可能小时候有一个当兵的梦想,你就去了,你去了之后呢,很不幸,就是比如身体不好,或者近视,或者小时候打架不小心留下了伤疤,总之呢,你没选上,把你刷下来了。你舍友呢选上了,很高兴。那么你舍友会不会在你们打游戏的时候跟你们道个别说:"我要撤了啊,你们玩的开心啊!"你的舍友转身直接第二天就去部队报道了,当他去报道的时候,完蛋了,当了两年兵回来发现他被学校给退学了。

难受的说:"你们怎么回事?我去当兵也不跟学校说一声"。看了下自己的学科学习情况,完蛋了,挂了二十多科,学校的老师每次上课的时候点你舍友名字的时候一直都不在,考试的时候分配座位发现人也不来。为什么舍友去当兵会出现这样的情况?很简单,你去当兵,最起码要跟学校说一声嘛,说一下比如说你的学习情况,当前大一,过了哪几门,有哪些科目正在学要学校给你保留一下学籍状态,比如说学校一共要求学50门课,你已经学了15门了,挂了一门。你像学校申请一下保留学籍,学校呢就说:行吧,你把这个学籍记录保留一下,自己带上吧。你跟舍友好好的吃了顿夜宵,第二天收拾好行李啥的,该带的带走。跟学校把招呼打好,这样去的才算顺利。然后呢,你室友当了一年兵回来了,回来之后直接去上课表里安排的课跟着班上的人上了一学期,到最后发现你室友的考试座位都没有安排,那不完蛋了,白学一学期。原因还是因为回学校了没有跟学校打招呼,回来应该把自己的档案袋上交给学校申请恢复自己的学习情况,这个时候学校会说:"那行吧,给你恢复一下,你的新宿舍给你安排一下,你的新室友给你安排一下" 至此,你室友的学籍状态就被恢复了。那么在这个过程当中,为什么当兵的时候要去保留学籍呢?保留的最终目的都是为了恢复。为什么要恢复呢?因为我们都不想从头再来。那么我们把去当兵之前保留我们的学籍这个过程呢就叫做保留我们进程的上下文,把当兵回来的时候恢复学籍就叫做恢复我们的进程上下文。

把保留学籍去当兵这个过程呢我们就可以理解为进程的切出,把当兵回来恢复学籍这个过程就叫做进程的切入。

不断地进行上述过程就叫做我们进程的上下文切换的过程。

接下来基于这个故事我们就要来谈一谈:

首先我们进程在运行的时候没有运行完的情况下为什么要被切下去?本质是因为调度器要比较均衡的调度运行一些长时间要运行的进程。

当我们进程运行要被切换的时候形成的进程上下文会被保存到寄存器上,那么保存的是寄存器还是寄存器中的内容呢?

答案肯定是寄存器的内容 

将CPU的寄存器数据保存到进程PCB当中(简单理解),本质就是CPU中寄存器的内容保存到了内存当中,因为PCB是在内存当中的。

Linux2.6内核进程调度队列

上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解

一个CPU拥有一个runqueue

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

优先级

普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
实时优先级:0~99(不关心)

活动队列

时间片还没有结束的所有进程都按照优先级放在该队列nr_active: 总共有多少个运行状态的进程
queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
从该结构中,选择一个最合适的进程,过程是怎么的呢?
1. 从0下表开始遍历queue[140]
2. 找到第一个非空队列,该队列必定为优先级最高的队列
3. 拿到选中队列的第一个进程,开始运行,调度完成!
4. 遍历queue[140]时间复杂度是常数!但还是太低效了!
bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!

过期队列

过期队列和活动队列结构一模一样
过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算。

active指针和expired指针

active指针永远指向活动队列
expired指针永远指向过期队列
可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!

命令行参数

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

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

相关文章

关于Smartbi登录代码逻辑漏洞的动态情报

一、基本内容 近日&#xff0c;思迈特软件核查发现存在“登录代码逻辑漏洞”问题&#xff0c;重点影响范围涉及Smartbi V9及其以上版本。该漏洞可能导致攻击者利用逻辑缺陷对目标系统进行攻击&#xff0c;造成敏感信息泄露和远程代码执行的风险。 二、相关发声情况 Smartbi是…

科技巨头的选择:为何不跟风用钉钉和企业微信?

引言 大家好&#xff0c;我是你们的小米&#xff01;今天&#xff0c;我想和大家聊一聊一个很有趣的话题——为什么大厂不同钉钉、企业微信等软件而自主研发IM&#xff08;即时通讯&#xff09;呢&#xff1f;难道这些明星产品还有什么不足之处&#xff1f;让我们一起揭开这个…

lv13 环境搭建之内核编译 4

一、开发板运行Linux 1. 网线连接开发板和主机 2. ubuntu下拷贝uImage、exynos4412-fs4412.dtb两个文件到/tftpboot目录下cd ~/fs4412cp uImage exynos4412-fs4412.dtb /tftpboot 3. rootfs.tar.xz解压到/opt/4412sudo tar xvf rootfs.tar.xz -C /opt/4412sudo chmod 777 /opt…

项目中关于地理位置相关需求的实现思路

实现思路&#xff1a;通过Redis中的GEO数据结构进行实现 一、GEO命令&#xff1a; 1.命令示例&#xff1a; GEOADD g1 116.378248 39.865275 bjn 116.42803 39.903738 bjz 116.322287 39.893729 bjx输出结果&#xff1a; 2.计算bjx&#xff08;北京西站&#xff09;到bjn&…

leetcode 6. N 字形变换(medium)(优质解法)

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {public String convert(String s, int numRows) {if(numRows 1) {return s;}int lengths.length();StringBuilder retnew StringBuilder();//获取…

【MATLAB】史上最全的17种信号分解+FFT+HHT组合算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 【MATLAB】EMD 信号分解算法 EMD 是一种信号分解方法&#xff0c;它将一个信号分解成有限个本质模态函数 (EMD) 的和&#xff0c;每个 EMD 都是具有局部特征的振动模式。EMD 分解的主要步骤如下&#xff1a; 将信号的…

HTTP 原理

HTTP 原理 HTTP 是一个无状态的协议。无状态是指客户机&#xff08;Web 浏览器&#xff09;和服务器之间不需要建立持久的连接&#xff0c;这意味着当一个客户端向服务器端发出请求&#xff0c;然后服务器返回响应(response)&#xff0c;连接就被关闭了&#xff0c;在服务器端…

微短剧,会成为长视频的“救命稻草”吗?

职场社畜秒变霸道总裁&#xff0c;普通女孩穿越成为艳丽皇妃.......这样“狗血”的微短剧&#xff0c;最近不仅在国内各大视频平台上异常火爆&#xff0c;而且还直接火出了国外。 所谓微短剧&#xff0c;就是单集时长从几十秒到十几分钟的剧集&#xff0c;有着相对明确的主题和…

sql_lab之sqli中的宽字节注入(less32)

宽字节注入&#xff08;less-32&#xff09; 1.判断注入类型 http://127.0.0.3/less-32/?id1 http://127.0.0.3/less-32/?id1 出现 \’ 则证明是宽字节注入 2.构成闭环 http://127.0.0.3/less-32/?id1%df -- s 显示登录成功则构成闭环 3.查询字段数 http://127.0.0.3/…

SpringMVC:整合 SSM 下篇

文章目录 SpringMVC - 05整合 SSM 下篇一、设计页面1. 首页&#xff1a;index.jsp2. 展示书页面&#xff1a;showBooks.jsp3. 增加书页面&#xff1a;addBook.jsp4. 修改书页面&#xff1a;updateBook.jsp5. 总结 二、控制层1. 查询全部书2. 增加书3. 修改书4. 删除书5. 搜索书…

Leetcode—86.分隔链表【中等】

2023每日刷题&#xff08;六十九&#xff09; Leetcode—86.分隔链表 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* partition(struct ListNode* head, int x) {struct ListNode…

Arduino平台软硬件原理及使用——PWM脉宽调制信号的原理及使用

文章目录&#xff1a; 一、先看百度百科给出的定义及原理 二、一图看懂PWM脉宽调制原理 三、Arduino中PWM脉宽调制信号的使用 一、先看百度百科给出的定义及原理 脉冲宽度调制是一种模拟控制方式&#xff0c;根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置&#xff0c;…

C预处理 | pragma详解

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

pci_enable_device()

前言 在 PCI 总线下&#xff0c;当 PCIe 设备和 PCIe 驱动匹配后&#xff0c;就会执行驱动的 probe() 函数来初始化设备&#xff0c;以让设备正常运行。 在 probe() 函数中&#xff0c;最先做的事情就是执行 pci_enable_device() 来使能设备。如果设备都无法使能的话&#xff…

MES系统是什么?MES系统的功能有哪些?

在现代制造业的快速发展中&#xff0c;所有规模的企业都面临着类似的挑战&#xff1a;如何提高生产效率、确保产品质量、减少浪费、降低成本&#xff0c;同时迅速响应市场变化。而在这个过程中&#xff0c;传统企业管理往往有以下几个典型痛点&#xff1a; 纸质文件堆叠如山&a…

框架面试题

文章目录 1. spring中的bean是线程安全的吗2. 事务的实现--AOP3. 项目中用到的AOP4.spring中事务的失效场景5. Bean的生命周期6.spring中的循环引用问题7. springMVC的执行流程8. springboot自动装配原理9. 常见注解10 Mybatis11 Mybatis一二级缓存 1. spring中的bean是线程安全…

约束-练习题

练习1 已经存在数据库test04_emp&#xff0c;两张表emp2和dept2 CREATE DATABASE test04_emp; use test04_emp; CREATE TABLE emp2( id INT, emp_name VARCHAR(15) ); CREATE TABLE dept2( id INT, dept_name VARCHAR(15) );题目: 向表emp2的id列中添加PRIMARY KEY约束向表d…

前端---css 的介绍

1. css 的定义 css(Cascading Style Sheet)层叠样式表&#xff0c;它是用来美化页面的一种语言。 没有使用css的效果图 使用css的效果图 2. css 的作用 美化界面, 比如: 设置标签文字大小、颜色、字体加粗等样式。控制页面布局, 比如: 设置浮动、定位等样式。 3. css 的基本语…

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作!

【2024 行人重识别最新进展】ReID3D&#xff1a;首个关注激光雷达行人 ReID 的工作&#xff01; 摘要&#xff1a;数据集&#xff1a;方法模型&#xff1a;多任务预训练&#xff1a;ReID Network&#xff1a; 实验结果&#xff1a;结论&#xff1a; 来源&#xff1a;Arxiv 2023…

[Linux] MySQL数据库之事务

一、事务的概念 事务就是一组数据库操作序列&#xff08;包含一个或者多个 SQL 操作命令&#xff09;&#xff0c;事务会把所有 操作看作是一个不可分割的整体向数据库系统提交或撤消操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 事务是一种机制、一个操作序…