[未写完](0x02)深入Linux内核架构总结----进程管理和调度

2024-06-04 00:18

本文主要是介绍[未写完](0x02)深入Linux内核架构总结----进程管理和调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



==============================
0.概述
1. 多任务、调度和进程管理
2. 物理内存的管理以及内核与相关硬件的交互
3. 用户空间的进程访问虚拟内存
4. 编写设备驱动程序
5. 模块机制以及虚拟文件系统
6. Ext文件系统属性和访问控制表的实现方式
7. 内核中网络的实现
8. 系统调用的实现方式
9. 内核对时间相关功能的处理
10. 页面回收和页交换的相关机制以及审计的实现
===============================

进程管理和调度

内核必须决定为各个进程分配多长时间,何时切换到下一个进程。这又引出了哪个进程是下 一个的问题。此类决策是平台无关的。

在内核从进程A切换到进程B时,必须确保进程B的执行环境与上一次撤销其处理器资源时完 全相同。例如,处理器寄存器的内容和虚拟地址空间的结构必须与此前相同。

这里的后一项工作与处理器极度相关。不能只用C语言实现,还需要汇编代码的帮助。

这两个任务是称之为调度器的内核子系统的职责。CPU时间如何分配取决于调度器策略,这与用于在各个进程之间切换的任务切换机制完全无关。

2.1 进程优先级

进程可以分为实时进程和非实时进程

> 硬实时进程有严格的时间限制,某些任务必须在指定的时限内完成

> 软实时进程是硬实时进程的一种弱化形式
大多数进程是没有特定时间约束的普通进程,但仍然可以根据重要性来分配优先级。

抢占式多任务处理(preemptive multitasking)

各个进程都分配到一定的时间段 可以执行。时间段到期后,内核会从进程收回控制权,让一个不同的进程运行,而不考虑前一进程所 执行的上一个任务。被抢占进程的运行时环境,即所有CPU寄存器的内容和页表,都会保存起来,因 此其执行结果不会丢失。在该进程恢复执行时,其进程环境可以完全恢复。时间片的长度会根据进程 重要性(以及因此而分配的优先级)的不同而变化。

完全公平调度器(completely fair scheduler)

2.2 进程生命周期

进程可能有以下几种状态。

 运行:该进程此刻正在执行。  等待:进程能够运行,但没有得到许可,因为CPU分配给另一个进程。调度器可以在下一次 任务切换时选择该进程。  睡眠:进程正在睡眠无法运行,因为它在等待一个外部事件。调度器无法在下一次任务切换 时选择该进程。 

抢占式多任务处理

Linux进程管理的结构中还需要另外两种进程状态选项:用户状态和核心态。

这反映了所有现代CPU都有(至少)两种不同执行状态的事实,其中一种具有无限的权利,而另一种则受到各种限制。

例如,可能禁止访问某些内存区域。这种区别是建立封闭“隔离罩”的一个重要前提,它维持着系统中现存的各个进程,防止它们与系统其他部分相互干扰。 进程通常都处于用户状态,只能访问自身的数据,无法干扰系统中的其他应用程序,甚至也不会注意到自身之外其他程序的存在。 如果进程想要访问系统数据或功能(后者管理着所有进程之间共享的资源,例如文件系统空间),则必须切换到核心态。显然这只能在受控情况下完成,否则所有建立的保护机制都是多余的,而且这种访问必须经由明确定义的路径。“系统调用”是在状态之间切换的一种方法

从用户状态切换到核心态的第二种方法是通过中断,此时切换是自动触发的。系统调用是由用户 应用程序有意调用的,中断则不同,其发生或多或少是不可预测的。处理中断的操作,通常与中断发 生时执行的进程无关。

内核的抢占调度模型建立了一个层次结构,用于判断哪些进程状态可以由其他状态抢占。 
 普通进程总是可能被抢占,甚至是由其他进程抢占。在一个重要进程变为可运行时,例如编辑器接收到了等待已久的键盘输入,调度器可以决定是否立即执行该进程,即使当前进程仍然在正常运行。对于实现良好的交互行为和低系统延迟,这种抢占起到了重要作用。 
 如果系统处于核心态并正在处理系统调用,那么系统中的其他进程是无法夺取其CPU时间的。 调度器必须等到系统调用执行结束,才能选择另一个进程执行,但中断可以中止系统调用。
 中断可以暂停处于用户状态和核心态的进程。中断具有高优先级,因为在中断触发后需要 尽快处理。 

2.3 进程表示

Linux内核涉及进程和程序的所有算法都围绕一个名为task_struct的数据结构建立,该结构定义在include/sched.h中。这是系统中主要的一个结构。见本人翻译的博客(528行) sched.h (版本4.16.7全部内容)

这篇关于[未写完](0x02)深入Linux内核架构总结----进程管理和调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028527

相关文章

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

mysql中的服务器架构详解

《mysql中的服务器架构详解》:本文主要介绍mysql中的服务器架构,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、mysql服务器架构解释3、总结1、背景简单理解一下mysqphpl的服务器架构。2、mysjsql服务器架构解释mysql的架

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基