从古老的System V进程调度器说开去

进程调度——优先数算法 自己写的小程序,实验作业,有什么不对的地方还请高手指导啊啊啊啊------------- #include #include typedef struct process {  int symbol;//进程号  struct process *conn;//指向下一个进程的指针,但是饿哦写的程序中没有用到,只是赋了值  int ordernum;//优先数 阅读详情

时至今日,我认为System V 的进程调度器设计得是十分精妙的,这个调度器可能直接影响到后来的windows nt 系统。
    
简单说System V 的调度器是基于多级反馈优先级队列的,每个进程在一个优先级队列被排队,然后可能在某些时间点被反馈到别的优先级队列,调度动作很简单,就是从最高优先 级队列取出一个进程,然后将当前进程反馈到一个优先级队列,随着进行的是进程切换。调度器的关键点有二:1. 如何排队;2. 如何反馈。
  System V
认为系统内部的执行绪本身在地位上就是不平等的,你不能把等待磁盘io 的任务和没啥事在计算i++ 的进程等同起来,如果说有两个相同的任务,显然它们的 优先级也相等,但是一个任务非常不巧的要等待磁盘io ,而另一个任务在执行i++ (因为任务是相同的,它一会也要执行磁盘io ,但是不是现在),那么这时 它们的优先级还能相等吗?System V 认为不能,但是它们一开始的优先级确实是相等的啊!这就是System V 中一切进程的优先级是一直在动态调整的,关键看当前执行的什么性质的任务,这只是“ 动态调整” 的意义之一,“ 动态调整” 的另一半就是无论如何,优先级随 着时间的流逝也会调整的,即使该进程执行的任务性质没有变化,举个例子就是说,如果一个进程在3 秒内一直执行i++ ,那么第一个一秒和第二个一秒以及第三 个一秒,这个进程的优先级是不同的。
 
定量的说一下,一个进程的优先级公式就是:
  0.cpu = cpu +1;
  1.cpu = cpu/2;
  2.priority = (cpu/2) + base level priority;
其 中,cpu 指的是一个进程最近使用的cpu 时间,每次时钟中断运行进程的cpu 时间都会加1 ,正如式子0 所示,那么式子1 是什么时候计算的呢,在 System V 中这是一个定量的测量时间,被规定为1 秒,每次过了1 秒,内核的时钟处理或其他地方会执行式子1 ,这里的cpu 变量当然是当前进程的cpu 变量。至于式 子2 的执行时刻,和式子1 是一样的,只不过就不是调整一个当前进程的优先级了,而是所有用户态进程的优先级,至于内核态的优先级,简单说有两种,运行在内 核态的进程要么不阻塞,要么阻塞,不阻塞的情况下,其优先级还是用用户态优先级,阻塞的情况下,解除阻塞时该进程的优先级和阻塞的原因相关联,也即是说, 如果一个进程因为磁盘io 被阻塞了,那么它被唤醒时被赋予的优先级就比因为等待缓冲区被阻塞的进程被唤醒时赋予的优先级要高,这是确定的,从最高到低的睡 眠优先级分别为:
3.
对换--> 等待磁盘io--> 等待缓冲区--> 等待索引节点--> 等待tty 输入--> 等待tty 输出--> 等待子进程退出....
 
如果一个进程由于一定原因睡眠了,那么根据这个原因在它被唤醒的时候就被赋予了不同的优先级然后一直运行下去,直到一个策略点。这个策略点不同的内核可以 有不同的实现,在非抢占内核,这个策略点可能就是这个进程返回用户空间的前夕,而在抢占式内核,这个策略点就是随便一个高优先级进程就绪或者就是该进程的 时间片用尽。在这个策略点上,抢占将发生。
 
只要一个用户进程在运行,那么它的cpu 变量就会增加,这样在内核计算上面式子2 的时候,该增量就会被加到进程的优先级上,从而使得进程优先级降低而被抢 占,但是不能这么无情,比如n 秒以前的cpu 计时变量不应该这么无情的增加到当前,那么就出现了一个衰减函数,该衰减函数就是式子1 。
 
我们可以看到式子0 ,1 ,2 以及序列3 实际上都是具体的策略,而机制就是1. 优先级和睡眠原因的联系;2. 优先级的动态反馈调整。机制1 保证了一些任务的 紧急性以及事实上的优先级,机制2 保证了用户进程的公平,实际上机制2 可以不用任何时间片的概念就可以做到公平调度,当今linux 内核的cfs 调度器就 是没有时间片的概念,而windows nt 内核使用的也是动态优先级调整的机制,它的内核还有中断请求级的概念,包括当今solaris 内核的中断优先级的概念,是不是也是和System v 的强大调度器关系很暧昧呢?

 

DeepSeek-V4终端编程助手:深思考+上下文感知的AI协作者 终端AI编程助手是近年来开发者效率工具的重要演进方向,其核心在于将大语言模型深度集成到命令行环境,实现对工程上下文(如Git状态、环境变量、项目结构)的原生感知与实时响应。相比传统IDE插件或Web端Copilot,终端方案具备更强的系统层控制力与隐私保障能力。DeepSeek-V4凭借‘deep thinking’推理架构和‘reasoning effort control’机制,在代码理解、错误预检、跨文件语义建模等关键任务上展现出显著优势,尤其适配Rust/Python/Go等多语言终端工作流。本文详 阅读详情

相关推荐

从“claude.exe”报错解析操作系统核心机制:可执行文件、系统调用与生态兼容

可执行文件是操作系统加载和运行程序的基本单元,其格式(如PE、ELF、Mach-O)是操作系统识别程序的“身份证”。操作系统通过系统调用机制为应用程序提供统一的硬件访问和服务接口,这是程序与内核沟通的“暗号”。理解文件格式与系统调用的差异,是解决跨平台兼容性问题的关键,例如通过WSL、Wine等兼容层实现不同系统间程序的运行。在信创和国产化背景下,基于Linux的国产操作系统(如麒麟OS、统信UOS)正构建自主生态,而嵌入式领域的RTOS(如Zephyr)则专注于实时性与轻量化。无论是桌面开发还是云端部署,

weixin_30595035的博客 458

【操作系统】unix 进程调度策略

这一周为了准备OS课程的Seminar而去研究了一下Unix的进程调度,从网上的资料和我查阅的纸质资料上看,研究System V的比较多,所以我就拿System V来做例子。需要注意的一点是,System V第一个版本是1983年发布的,Sytem V Release 4(1988)最成功的一个版本,离现在也有点久远了,*nix各种分支进化到现在和80年代比应该发生了比较大的变化,但是它们的设计思想

小辣抓 3609

Linux核心命令底层原理与国产化运维实战

Linux命令不是孤立的语法符号,而是操作系统分层架构(硬件/内核/文件系统/进程/网络)的交互接口。理解`find`如何穿透inode层、`systemctl`如何调度unit依赖、`telnet`与`ss`如何验证TCP连接本质,是突破‘命令记不住’困境的关键。这些命令承载着权限模型、进程状态机、日志索引机制等底层原理,其技术价值在于实现高可靠服务治理、精准故障定位和资源闭环审计。典型应用场景覆盖国产化服务器初始化(飞腾+麒麟)、政务云日志巡检、K8s节点网络诊断及等保合规检查。本文聚焦`type`环境

weixin_33800463的博客 502

进程调度算法(优先数法和简单轮转法)C/C++

一、算法描述 用优先数调度算法或简单轮转法对五个进程进行调度,每个进程处于运行(Run)、就绪(Ready)和完成(Finish)三种状态之一,并假定起始状态为就绪状态。二、进程控制块结构 进程控制块的链结构 其中:Run——表是当前运行进程指针 Ready——就绪队列头指针 Tail——就绪队列尾指针 Finish——完成队列指

g15827636417的博客 3万+

Any Router与环境变量:构建安全可控的AI API中转工作流

API中转服务是现代AI开发中保障凭证安全与调用治理的关键基础设施。其核心原理在于将敏感API密钥(如ANTHROPIC_API_KEY)从客户端剥离,通过环境变量注入到可信中间服务中,实现请求转发与身份代理。这种模式不仅规避了前端硬编码密钥导致的泄露风险,更支撑起可审计、可扩展的多模型统一接入能力。技术价值体现在凭证隔离、语义路由、跨平台环境适配三大维度,广泛应用于VS Code插件集成、企业级AI网关及本地化AI开发工作流。本文聚焦环境变量配置这一基础但极易出错的环节,详解Java/Python/Nod

anjichan4261的博客 460

深入解析Kernel32.dll:Windows核心DLL原理、常见问题与实战调试

动态链接库(DLL)是Windows操作系统的核心组件,它通过模块化设计实现了代码复用和内存共享。在Windows架构中,Kernel32.dll作为用户模式与内核交互的关键桥梁,封装了进程管理、内存分配、文件操作等基础系统服务。理解其工作原理对于诊断兼容性问题、优化程序性能至关重要,尤其在处理资源加载失败、API版本差异等场景时。本文通过一个典型的MFC窗口创建失败案例,结合Process Monitor等调试工具,剖析了DLL加载机制与错误处理流程,帮助开发者掌握系统级问题的诊断方法,提升Windows

weixin_33766805的博客 376

Linux进程间通信(IPC)机制详解:从管道到共享内存的实战选型指南

进程间通信是操作系统实现多进程协同工作的核心技术,它解决了进程间数据交换与同步的难题。其核心原理在于通过操作系统内核提供的多种机制,跨越进程间的内存隔离墙,实现信息的安全高效传递。这项技术的价值在于它是构建复杂软件系统的基石,从简单的命令行工具协作到大型分布式系统、微服务架构都离不开它。在实际应用场景中,开发者需要根据通信关系、数据格式、性能要求等因素,在匿名管道、命名管道、消息队列、共享内存、信号量、信号和域套接字等机制中做出选择。例如,对于需要传递结构化消息并希望具备内核持久化的场景,消息队列是理想选择

weixin_30522095的博客 291

Loop命令行工具:一行命令实现高效循环执行与实时监控

在命令行操作中,周期性执行与状态监控是开发运维的常见需求。传统方法依赖手动重复或编写脚本,存在效率低下和体验割裂的问题。其技术原理在于通过封装子进程调度与输出管理,实现命令的定时循环执行与结果对比展示。这种设计显著提升了操作效率,降低了认知负荷,使状态变化可视化。在应用场景上,它广泛适用于API调试、系统监控、日志跟踪和服务探活等场景。本文聚焦的Loop工具,正是这一理念的典型代表,它通过极简的`loop 'command'`语法,将watch命令的现代化实践与开发者的高频痛点结合,提供了开箱即用的优雅解决

weixin_33816946的博客 345

Linux进程生命周期精准追踪:从ps命令到/proc内核原理详解

在Linux系统运维与性能调优中,进程生命周期管理是理解系统行为、进行故障排查的核心基础。进程作为系统资源分配和调度的基本单位,其启动时间、运行时长等时间信息直接反映了系统的运行状态和服务的健康度。从原理层面看,Linux内核通过/proc虚拟文件系统暴露进程的详细状态,其中包含了进程创建时的时钟滴答数等原始计时数据。掌握这些底层机制的技术价值在于,能够超越命令行工具的表层输出,实现精准的资源监控、服务状态追踪和异常行为诊断。在实际应用场景中,无论是长期运行的服务守护进程、定时执行的批处理作业,还是突发的资

weixin_34228387的博客 1607

Linux,Windows和UNIX的进程调度的分析

Linux,Windows和UNIX的进程调度的分析

信息奥赛课课通(C++)p154-1近似排序

试题描述 读入一对正整数,将这两个数之间(包括这两个数本身)的所有数按下述特别规则排序后输出,该特别规则是按两数倒过来的值进行比较决定其大小,如30倒过来为3,29倒过来为92,则29大于30. 输入要求 1行,包含两个用空格隔开的自然数,这两个自然数给出了待排序数的范围,其中1≤第一个数≤第二个数≤999999999,两个数之差不超过100. 输出要求 输出排序后的数据,每行输出...

mengdicfm的博客 7281

OpenCode实战指南:基于MCP协议的AI工作流编排与DeepSeek-V4-Pro集成

AI工作流编排是当前开发者提升编码效率的核心技术路径,其本质是通过标准化协议协调大模型、搜索、浏览器自动化等异构能力。MCP(Model Communication Protocol)作为轻量级通信规范,解决了多AI服务间上下文传递、能力抽象与调试可见性三大工程难题;它不替代API调用,而是构建可复用、可调试、可组合的智能体调度层。结合DeepSeek-V4-Pro的长上下文稳定性、严格Function Calling支持及高精度中文语义理解,OpenCode得以实现从代码分析、漏洞检索到修复建议的端到端自

cnvdkx2837的博客 397

手把手教你用Qt和DSP28335实现串口Bootloader,附赠源码和避坑指南

本文详细介绍了如何使用Qt和DSP28335实现串口Bootloader,包括开发环境搭建、通信协议设计、Qt上位机开发、DSP端Bootloader核心实现以及应用程序工程的特殊配置。通过实战案例和源码分享,帮助开发者快速掌握嵌入式固件升级技术,提升工业设备远程升级的效率和可靠性。

weixin_29176179的博客 134

IPC管道

介绍进程间通信IPC,以及匿名管道和应用场景进程池,命名管道原理和应用场景,Client和Server通信以及文件拷贝

m0_74328241的博客 247

ffmpeg中av_read_frame阻塞的原因与解决方案

最近用到ffmpeg,想要av_read_frame立即返回,但是看网上的博客,都没有详细的解说,那就自己看源码。 两种方法: 设置回调打断函数和设置超时 超时,但是如果只设置该参数,依然会在av_read_frame中阻塞, av_dict_set(&inputDic, "stimeout", "2*1000*1000", 0); // milliseconds //打断回调 m_avformatCtx->interrupt_callback.callback = interru

weixin_43360707的博客 1万+

Halcon手眼标定实战:九点标定法从入门到精通(附完整代码)

本文详细介绍了Halcon环境下九点标定法的完整实现流程,从基础概念到实战技巧,帮助开发者快速掌握手眼标定技术。通过精确采集图像坐标与机械坐标,计算仿射变换矩阵,实现相机与机械臂坐标系的精确映射,适用于工业自动化中的平面定位场景。

v4w5x6的博客 411

OpenClaw:面向工程师的本地化AI编程操作系统

AI编程操作系统是一种将大语言模型与本地开发环境深度集成的新型工具范式,其核心在于通过命令行接口(CLI)实现确定性调度、以可审计的Skill单元封装真实世界操作能力,并依托本地部署保障数据主权与系统亲和力。相比传统代码补全工具,它强调Agent主动理解工作流而非被动响应光标;相比云端AI助手,它支持直接访问.gitconfig、SSH密钥、内网API等敏感上下文。OpenClaw正是这一范式的典型实践,提供YAML定义Skill、POSIX兼容执行、LLM后端灵活切换等关键能力,适用于运维提效、Agent

weixin_34377919的博客 439

基于电子海图的水面无人艇全局路径规划

Research and Implementation of Global Path Planning for Unmanned Surface Vehicle Based on Electronic Chart (基于电子海图的水面无人艇全局路径规划)   该论文已经在ICMIR2017会议上发表,附上springer的文献地址 Research and Implementation of Gl...

weixin_30797199的博客 1590

CentOS 8下Cron高可靠实践:SELinux、环境变量与日志审计全解析

Cron是Linux系统最基础的定时任务调度机制,其核心原理是基于守护进程监听时间表达式并触发命令执行。在企业级运维中,Cron的技术价值远超‘自动执行脚本’——它提供轻量、确定、可审计的无人值守能力,尤其适用于单机、低频、无状态任务。然而,真实生产环境(如CentOS 8)中,Cron失效往往源于环境隔离性(如PATH差异)、安全框架约束(如SELinux上下文限制)及日志可观测性不足等底层细节。本文聚焦CentOS 8平台,深入解析cronie服务与SELinux策略协同机制、crontab环境变量加载

weixin_34166472的博客 329

Langchain与Milvus集成中的pymilvus.exceptions.MilvusException: channel not found错误解析

本文深入解析了在Langchain与Milvus集成时常见的pymilvus.exceptions.MilvusException: channel not found错误。该错误通常由客户端配置错误、网络问题、服务端状态异常或版本不兼容导致。文章提供了从基础连通性测试到高级网络排查的完整故障排除指南,并针对本地Docker、远程服务器及Kubernetes等典型部署场景给出了具体解决方案,帮助开发者快速定位并修复这一连接层问题。

weixin_29229989的博客 217

CodeBuddy Code CLI 常用工作流:17个实战场景全解析

CodeBuddy Code CLI 17个实战场景解析 本文详细介绍了CodeBuddy Code CLI在17个开发场景中的高效应用,包括: 快速理解新代码库 高效修复Bug 安全重构代码 使用子代理系统处理专业任务 Plan Mode安全分析 自动化测试处理 创建合并请求 文档生成与维护 图片内容分析 文件目录快速引用 每个场景都配有具体命令示例和最佳实践,帮助开发者提升工作效率。

简简单单Onlinezuozuo 1078
上一篇: 从著名的list_head看linux内核中OO
下一篇: 从Unix分层内核栈以及中断处理看Linux内核的另类
linuxcode_turing
博客等级 码龄17年 0粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值