首页 > 其他分享 >MacOs前后台调度优先级观察

MacOs前后台调度优先级观察

时间:2023-05-26 17:24:23浏览次数:34  
标签:MacOs 优先级 Visiable 46 App 调度 线程 进程

场景构造

用swiftui写6个一摸一样的helloworld程序,间隔1s刷新展示一个不断递增的数字。分别将6个应用至于前台焦点(App_Foreground)、前台非焦点完全可见(App_Complete_Visiable)、半遮挡(App_Partially_Visiable)、被完全遮挡(App_Unvisiable)、最小化(App_Minimize)、隐藏(App_Hide)。如图所示,然后用instruments抓一段10s左右的trace:

注:隐藏应用指通过右键Dock栏点击隐藏这个动作。最小化即点击窗口左上角的最小化小圆圈。

优先级分布情况

打开每个进程观察它的Context Switch Points视图,里面可以看到每次线程上下文调度的优先级,依次对不同的可见状态下的应用进行分析。
注: 线程状态有好多种:Running、Runnable、Blocked等,这里先研究运行态的优先级和是否可见的关联关系,后文如果没有特殊说明,优先级的变化均指Running态的变化。

进程内的线程优先级的策略异同

这个简单的demo进程中包含很多个线程,不同的线程的优先级分布也是不一样的,各个进程包含的线程名及其个数罗列如下,可以看到,每个应用都有一个主线程、事件处理线程、workloop线程, 另外有n个start_wqthread线程,这个线程的用处暂无进一步进行研究:

线程名 App_Foreground App_Complete_Visiable App_Partially_Visiable App_Unvisiable App_Minimize App_Hide
Main Thread(UI线程) 1 1 1 1 1 1
com.apple.NSEventThread (事件处理) 1 1 1 1 1 1
dispatch_workloop_worker_thread(猜测定时器) 1 1 1 1 1 1
start_wqthread 4 2 3 2 2 2
以进程名命名的线程 1 1 1 1 1 1

线程切换running总次数和执行时间查看方法:

MainThread优先级比较

应用 优先级变化趋势 线程切换running总次数 总执行时间(ns)
App_Foreground trace记录中一开始主线程优先级为46,焦点点击到主线程后优先级变为稳定的47 4160 379980
App_Complete_Visiable 稳定46 960 92880
App_Partially_Visiable 稳定46 990 92790
App_Unvisiable 大部分优先级为4,少部分优先级为46 625 36460
App_Minimize 大部分优先级为4,少部分优先级为46 382 41740
App_Hide 大部分优先级为4,少部分优先级为46 283 38950

前台焦点进程的优先级变化趋势图(3.524s左右切换为焦点应用):

不可见进程的优先级变化趋势图:

com.apple.NSEventThread 线程的优先级比较

应用 优先级变化趋势 线程切换running总次数 总执行时间(ns)
App_Foreground 一开始线程优先级为46,切换为焦点后优先级变为稳定的47 4512 152360
App_Complete_Visiable 稳定46 692 27140
App_Partially_Visiable 稳定46 888 26750
App_Unvisiable 稳定46 12 274
App_Minimize 稳定46 4 203
App_Hide 稳定46 5 294

dispatch_workloop_worker_thread 线程的优先级比较

应用 优先级变化趋势 线程切换running总次数 总执行时间(ns)
App_Foreground 3%的46, 94%的37,2%的31 298 6050
App_Complete_Visiable 1次46,99%为37 63 2550
App_Partially_Visiable 12%的46, 52%的37,36%的31 26 1460
App_Unvisiable 4%的46, 96%的4 50 1600
App_Minimize 30%的46,70%的4 10 441
App_Hide 50%的46,50%的4 10 271

start_wqthread 线程的优先级比较

应用 优先级变化趋势 线程切换running总次数 总执行时间(ns)
App_Foreground 大部分37 1809 27622
App_Complete_Visiable 大部分37 233 4727
App_Partially_Visiable 大部分46,少部分37 21 611
App_Unvisiable 大部分46,1次4 6 145
App_Minimize 大部分46,少部分37 56 1170
App_Hide 大部分37、46,几次31 59 1363

明确的结论

这里的结论,前提是轻载,没有特意加压观察:

  • 焦点进程的主线程的优先级为47,非焦点可见进程(包括半遮挡)的主线程的优先级为46。不可见进程的主线程优先级会降低,大部分时间为最低的优先级4。
  • 焦点进程的事件处理线程的优先级为47, 其余进程的事件处理线程的优先级为46,均保持较高的优先级
  • workloop线程和start_wqthread线程(代表业务逻辑)大部分优先级低于UI和事件处理线程
  • 前台可见的进程执行的逻辑更多,运行时间更长,不可见和最小化进程包括UI、事件处理、业务逻辑都很少(Nap?)

遗留问题

  • 应用的线程模型的进一步研究,如workloop线程到底是不是定时器线程,start_wqthread线程的主要工作内容、以进程名字命名的线程名的主要功能等。
  • 线程状态的进一步研究,如Running、Runnable、Blocked的状态机模型是什么样的,网上没有找到对应的资料。
  • 重载下的线程优先级是否相比轻载会发生变化。
  • 可见应用除了优先级的区别,和大小核是否也有关联关系。
  • 不可见应用执行逻辑更少,是因为NAP机制?但是定时器的数字和前台基本一致。

标签:MacOs,优先级,Visiable,46,App,调度,线程,进程
From: https://www.cnblogs.com/mooooonlight/p/17435301.html

相关文章

  • 独立任务最优调度问题-动态规划
    问题描述:用2台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若由机器B来处理,则需要时间bi。由于各作业的特点和机器的性能关系,很可能对于某些i,有ai>bi,而对于某些j,j≠i,有aj>bj。既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规......
  • 流水调度问题-动态规划-Johnson法则-两种方法
    问题描述:n个作业{0,1,2,…,n}在2台机器上M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,后在M2上加工。在两台机器上加工的时间分别为ai和bi。 确定这n个作业的加工顺序,使得从第一台作业开始加工,到最后一个作业完成加工所需要的时间最少。 递归关......
  • Quartz.Net 调度器
    首先需要引入Quartz.Net的命名空间,例如: usingQuartz;usingQuartz.Impl;​然后创建一个调度器工厂(SchedulerFactory),并使用该工厂创建一个调度器(IScheduler)对象: ISchedulerFactoryschedulerFactory=newStdSchedulerFactory();ISchedulerscheduler=await......
  • macos的sha的数字摘要hash命令
    在macOS上,没有内置的`sha256sum`命令,但可以使用`shasum`命令来计算文件的SHA-256哈希值。`shasum`命令支持多种哈希算法,包括SHA-1、SHA-256、SHA-384和SHA-512。以下是`shasum`命令的基本语法:```bashshasum-a256FILE```其中,`-a256`指定要使用SHA-256算法,`......
  • macos 7z 使用
    在MacOS系统中,可以通过homebrew安装7zip,并在命令行中使用7z来压缩并加密文件。具体命令如下:1.安装7zip:```brewinstallp7zip```2.压缩并加密文件:```7za-p[密码]-mx=[压缩级别][压缩文件名].7z[待压缩文件或目录名]```例如:```7za-p123456-mx=9test.7z/Users/use......
  • css优先级
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><metahttp-equiv="X-UA-Compatib......
  • macos 链接windows 共享打印机
    WINDOWNS上操作:1.在windowns上安装打印机,共享打印机2.安装lpd,打开控制面板>启用或者关闭Windows功能>打印和文件服务>勾选LPD打印服务 MACOS上操作:1.打开系统偏好和设置>打印机与扫描仪  2.添加打印机1)加号添加打印机2......
  • go语言调度gmp原理(5)
    go语言调度gmp原理(5)线程管理go语言的运行时会通过调度器改变线程的所有权,它也提供了runtime.lockOSthread和runtime.UnlockOSthread,让我们能绑定goroutine和线程完成一些比较特殊的操作。goroutine应该在调用操作系统服务或者依赖线程状态的非go语言库时调用runtime.lockOSTh......
  • 皕杰报表设计器在macOS上启动的问题
    最近,很多皕杰报表的使用者遇到了下载MacOS版本后,报表设计器初次启动,不能正常打开的问题。这主要是由于报表设计器找不到Java导致的。可以打开BIOSStudio.app\Contents\Eclipse\下的BIOSStudio.ini,在-vmargs参数之前添加-vm参数来指定您操作系统安装的Java,即可如下所示:-startup......
  • 【macOS】brew update报错:fatal: unable to access xxx & LibreSSL SSL_connect 解决
    ✨报错提示fatal:unabletoaccess'https://mirrors.ustc.edu.cn/homebrew-cask.git/':LibreSSLSSL_connect:SSL_ERROR_SYSCALLinconnectiontomirrors.ustc.edu.cn:443fatal:unabletoaccess'https://mirrors.ustc.edu.cn/brew.git/':LibreSSL......