当前位置: 首页 > news >正文

Linux:进程(四)

目录

一、进程优先级

二、Linux调度与切换

1.背景

2.进程切换


一、进程优先级

        背景:在计算机中,软硬件资源是有限的,而进程想要访问某一种资源,就得通过排队来保证访问资源的过程是有条不紊的。


        Linux下对优先级的定义。执行命令ps -la得到以下打印结果。

[euto@VM-4-13-centos 24921]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001 29067 28781  0  80   0 -  1054 hrtime pts/1    00:00:00 myprocess
1 S  1001 29068 29067  0  80   0 -  1054 hrtime pts/1    00:00:00 myprocess
0 R  1001 29078 28979  0  80   0 - 38332 -      pts/2    00:00:00 ps
  • UID:代表执行者的身份
  • PRI:priority的缩写,代表这个进程的优先级,Linux下优先级就是一个整型变量,默认值为80,取值范围为[60,99],值越小,优先级越高。
  • NI:nice的缩写,用来代表相对默认值的增量

        Linux下进程的优先级可以人为手动修改,但是需要我们手动修改优先级的场景几乎没有。


        下面演示如何修改优先级,首先可执行程序myprocess已经被运行了起来,执行ps -la查看。

[euto@VM-4-13-centos 24921]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  2310 28781  0  80   0 -  1054 hrtime pts/1    00:00:00 myprocess
0 R  1001  2330 28979  0  80   0 - 38332 -      pts/2    00:00:00 ps

        执行top命令进入任务管理器。

        进入任务管理器后,输入r

        得到一行提示,大致意思是“输入要重新设置nice值的PID”。

PID to renice [default pid = 5375]

        当前要修改优先级的程序myprocess的PID为2310,于是输入2310。

        弹出一行提示,大致意思是“输入新的nice值”,我们暂时输入10。

Renice PID 2310 to value 

        退出任务管理器后,再执行ps -la命令查看。

[euto@VM-4-13-centos 24921]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  2310 28781  0  90  10 -  1054 hrtime pts/1    00:00:00 myprocess
0 R  1001  7772 28979  0  80   0 - 38332 -      pts/2    00:00:00 ps

        我们发现myprocess的PRI由80变成了90,而NI由0变成了10

        因此,可以总结出来,Linux下修改优先级不能直接修改,而是通过加减某一个量来修正

        NI值是用来表示当前PRI值相对默认PRI值的增量,由于PRI的范围是[60,99],默认PRI值是80,故NI值的取值范围是[-20,19]

        PRI = 默认PRI(80)+ NI。


  • NI可以取范围外的值吗,如果可以,PRI会被修改为多少?

        在top中修改NI值的时候,输入100。

        执行ps -la查看结果。

[euto@VM-4-13-centos 24921]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001  2310 28781  0  99  19 -  1054 hrtime pts/1    00:00:00 myprocess
0 R  1001 13253 28979  0  80   0 - 38332 -      pts/2    00:00:00 ps

        可以总结出来,修改的NI值会被操作系统做检测,如果超出范围则修正到范围之内

        在上面结果的基础上,将NI值设置为-20,预期结果应该是99-20=79。

         执行结果如下。

[euto@VM-4-13-centos ~]$ ps -la
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1001 16994 16006  0  60 -20 -  1054 hrtime pts/1    00:00:00 myprocess
0 R  1001 18523 16091  0  80   0 - 38332 -      pts/2    00:00:00 ps

        这里我中断进程后,重新启动了程序,所以PID发生了变化,但是前提条件是一样的,不难看出来,NI值变成了-20,说明NI值是覆盖原来的值,但是PRI并不是我们预期的79,而是60。原因是每次调整优先级的NI值都是在默认的PRI值80上做加减


  • 为什么要让优先级的修改受限?

        操作系统中,存在很多必要的常规进程,如果进程的优先级可以无限大,必然会造成多数用户进程的优先级常规进程的优先级高,导致常规进程获取资源的优先度下降,造成系统卡顿。

        而把一个进程获取资源优先度不高的情况称为进程饥饿。 

二、Linux调度与切换

1.背景

  • CPU在执行一个进程的时候,是直接一次性把代码跑完吗?

        不是,现代操作系统设计的CPU执行代码,都是基于时间片轮转执行的。假设时间片大小是1ms,那么一个进程在CPU上执行1ms后,CPU会马上开始执行另外一个进程。

  1. 竞争性:系统进程数目众多,而CPU资源少量,甚至只有一个,所以进程之间是具有竞争性的,为了高效完成任务,合理竞争相关资源,便有了优先级。而为了保证优先级,便设计了调度器基于时间片轮转执行每一个进程
  2. 独立性:进程之间具备独立性,多个进程运行期间互不影响,这种不影响指的是一个进程不影响另一个进程的执行。
  3. 并行:多个进程在多个CPU下,同时运行,称为并行。
  4. 并发:多个进程在一个CPU下,通过高频进程切换的方式,让多个进程都得以推进运行,称为并发。

        如今多数人的个人电脑都只有一个CPU,因此多个进程之间是并发运行,如果把时间精确到CPU的一个时间单元上,那么CPU在这个时间单元上执行的指令是确定的只有一条,而用户感知到的是我们的电脑可以打游戏的同时听音乐,原因就在于我们的CPU非常快!!!(多核其实就是CPU内部有一个控制器,多个运算器)

2.进程切换

        CPU有一个运行队列,CPU要轮转切换多个进程。

  • CPU内部有大量寄存器,这些寄存器的种类不一。
  • 进程A正在CPU上被执行时,该时间片内,寄存器上会产生许多临时数据,这些临时数据是和当前的进程A相关的,这些大量临时数据称为进程的硬件上下文
  • 时间片结束,CPU要执行下一个进程B,在此之前,要把寄存器的数据拷贝到进程A的PCB内部(也有部分数据拷贝到了其他地方),这个过程称为保护上下文
  • CPU开始执行进程B,那么就有两种情况,如果进程B是首次被调度,那么进程B直接开始执行,在执行期间所产生大量临时数据直接覆盖寄存器原来的数据。如果进程B是非首次被调度,那么进程B会先把PCB保存的数据恢复到寄存器中,然后开始执行。这个过程称为恢复上下文。

        CPU的寄存器只有一套,但是寄存器要处理的数据有多套,这些大量临时数据不属于寄存器,而是属于进程!!!

相关文章:

Linux:进程(四)

目录 一、进程优先级 二、Linux调度与切换 1.背景 2.进程切换 一、进程优先级 背景:在计算机中,软硬件资源是有限的,而进程想要访问某一种资源,就得通过排队来保证访问资源的过程是有条不紊的。 Linux下对优先级的定义。执行命…...

CTC loss 博客转载

论文地址: https://www.cs.toronto.edu/~graves/icml_2006.pdf 为了对应这个图,我们假设一种符合的模型情况: 英文OCR,37个类别(26个小写字母10个汉字空格),最大输出长度8个字符 模型预测结果…...

TryHackMe 第3天 | Pre Security (中)

该学习路径讲解了网络安全入门的必备技术知识,比如计算机网络、网络协议、Linux命令、Windows设置等内容。上一篇中简短介绍了计算机网络相关的知识,本篇博客将记录 网络协议 部分。 How the web works? DNS in detail DNS (Domain name system&…...

c语言中“qsort函数”和“结构体成员访问变量”

qsort函数: qsort是c语言中的库函数,这个函数是对数据进行排序(对任意) 冒泡排序中排列整数顺序用的函数只适用于整形,而qsort函数适用与所有数据 排序算法 冒泡排序 插入 选择 快速 void qsort{ void * base&…...

【MySQL】在MySQL中STR_TO_DATE()

1.在MySQL中STR_TO_DATE() 在MySQL中,STR_TO_DATE() 函数用于将字符串转换为日期格式。这个函数非常有用,当你需要将文本数据转换为可由MySQL日期和时间函数处理的格式时。 1.1 语法 STR_TO_DATE() 函数的基本语法如下: STR_TO_DATE(date…...

PCIE集成验证(五)MSI/MSI-X中断

PCI 总线最早采用的中断机制是 INTx,这是基于边带信号的。后续的 PCI/PCI-X版本,为了消除边带信号,降低系统的硬件设计复杂度,逐渐采用了 MSI(Message Signaled Interrupt)/MSI-X(消息信号中断)的中断机制。…...

leetcode 380.O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…...

基于MicroPython的ESP8266控制PS2摇杆模块的设计方案

以下是一个基于MicroPython的ESP8266控制PS2摇杆模块的设计方案: 一、硬件准备: 1. 一块ESP8266开发板,如NodeMCU 2. 一个带有X、Y轴模拟输出和Z轴(按钮)数字输出的PS2摇杆模块 3. 杜邦线若干 4. 3.3V直流电源 二、硬件连接&#xff1a…...

Spring Boot 3项目使用Swagger3教程

Spring Boot 3项目使用Swagger3教程 Swagger&#xff1a;自动生成接口文档 添加依赖(pom.xml) <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.1…...

linux-系统备份与恢复-系统恢复

Linux 系统备份与恢复&#xff1a;系统恢复 1. 概述 Linux 系统的恢复是系统管理的重要组成部分&#xff0c;它指的是在系统崩溃、硬件故障、误操作或安全问题后&#xff0c;恢复系统到可用状态的过程。良好的系统恢复计划可以有效避免数据丢失和业务中断&#xff0c;并确保系…...

【Rust语言】std::collections::HashMap用法

HashMap用法文档 文章目录 创建键的要求 增删改查增: insert删: remove/remove_entry改单点修改 get_mut整体修改 values_mut/iter_mut 查集增改于一身的entry 遍历只读遍历into_values() 与 into_keys()容量、实际长度、判空导出清除重定容量 use std::collections::HashMap;创…...

使用SoapUI、Postman工具调用Webservice方法

SoapUI工具更适合调用Webservice使用。 1.使用SoapUI工具调用Webservice 创建“New SOAP Project” 自行定义一个项目名称&#xff0c;输入wsdl地址&#xff1a; 在左侧列表找到方法名&#xff0c;双击“Request 1”, 在请求数据中&#xff0c;添加对应的参数&#xff0c;然…...

js 与 C++引用和指针的关系

js 与 C引用和指针的关系 js 中既有引用的影子, 也有指针的影子。 1、引用用法 这里相当于C 中的引用, b是a的引用, 修改b ,a也改变。 var a { 1: 1 }var b a;a null;b[2] 2;console.error(b); // { 1: 1, 2: 2 }2、指针用法 这里 a,b应该按照指针理解。 var a undef…...

python --PyAibote自动化

官文: https://www.pyaibote.com/ 下载安卓集成环境: 可以看到开发的一些信息...

Ubuntu系统开发环境搭建

一&#xff0c;Android源码编译环境搭建 1 安装Java Development Kit (JDK) sudo apt-get update sudo apt-get install openjdk-8-jdk 2,确认JDK安装成功 java -version 3,安装编译所需的依赖项 sudo apt-get install git-core gnupg flex bison gperf build-essential zip cu…...

lvs-dr模式实验详解

华子目录 lvs-dr&#xff08;企业当中最常用&#xff09;dr模式数据逻辑dr模式数据传输过程dr模式的特点实验拓扑实验主机准备解决vip响应问题限制响应级别:arp_ignore限制通告级别:arp_announce 实验步骤1.client的ip设定2.router上的ip设定3.router开启路由转发功能4.lvs主机…...

【RDMA】mlxconfig修改和查询网卡(固件)配置--驱动工具

目录 简介 工具要求 语法 例子和参数 例子 更多参数 其他工具和查询 简介 mlxconfig 工具允许用户在不重新烧录固件的情况下更改某些设备配置。 配置在重启后仍然保留。 默认情况下&#xff0c;mlxconfig 显示将在下次启动时加载的配置。对于第五代设备&#xff0c;还…...

跨站请求伪造(CSRF)漏洞详解

免责申明 本文仅是用于学习检测自己搭建的DVWA靶场环境有关CSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法…...

Java+Spring Cloud +UniApp 智慧工地源码,用户PC端、移动端数据同步,支持多端展示

数字化给各行各业所带来的改变&#xff0c;在早些年间突出自动这一流程。但随着科技的发展&#xff0c;让人们也愈发了解可视化操作所带来的优势。智慧工地的诞生&#xff0c;相当于为建筑施工带来了一套较为完整的数字化流程&#xff0c;能够完善施工环节中的各部分内容。接下…...

【推广】图书|2024新书《大模型RAG实战:RAG原理、应用与系统构建》汪鹏、谷清水、卞龙鹏等,机械工业出版社

探索RAG系统新高度&#xff1a;《大模型RAG实战&#xff1a;RAG原理、应用与系统构建》 随着大模型技术的爆发&#xff0c;尤其是ChatGPT之后&#xff0c;以ChatPDF为首的知识库问答产品迅速走红&#xff0c;引发了RAG&#xff08;检索增强生成&#xff09;系统的广泛关注与讨论…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...