在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用tracepoint梳理調(diào)度器框架及主要流程

Linux閱碼場(chǎng) ? 來(lái)源:Linuxer ? 作者:Linuxer ? 2020-10-30 14:36 ? 次閱讀

靜態(tài)tracepoint預(yù)埋在內(nèi)核的關(guān)鍵位置, 通過(guò)這些預(yù)埋的tracepoint, 可以比較容易梳理出相關(guān)模塊的框架及主要流程. 相比于直接鉆到scheduler的實(shí)現(xiàn)細(xì)節(jié)中去, 我們先通過(guò)tracepoint及其相關(guān)工具去理解實(shí)現(xiàn)背后的邏輯, 細(xì)節(jié)總是不停變化, 而分析方法往往相對(duì)固定, 也更容易沉淀下來(lái).

Tracepoint分類(lèi)

通過(guò)perf命令可以列出系統(tǒng)所有的tracepoint:

$ sudo perf list | grep sched: sched:sched_kthread_stop [Tracepoint event] sched:sched_kthread_stop_ret [Tracepoint event] sched:sched_migrate_task [Tracepoint event] sched:sched_move_numa [Tracepoint event] sched:sched_pi_setprio [Tracepoint event] sched:sched_process_exec [Tracepoint event] sched:sched_process_exit [Tracepoint event] sched:sched_process_fork [Tracepoint event] sched:sched_process_free [Tracepoint event] sched:sched_process_hang [Tracepoint event] sched:sched_process_wait [Tracepoint event] sched:sched_stat_blocked [Tracepoint event] sched:sched_stat_iowait [Tracepoint event] sched:sched_stat_runtime [Tracepoint event] sched:sched_stat_sleep [Tracepoint event] sched:sched_stat_wait [Tracepoint event] sched:sched_stick_numa [Tracepoint event] sched:sched_swap_numa [Tracepoint event] sched:sched_switch [Tracepoint event] sched:sched_wait_task [Tracepoint event] sched:sched_wake_idle_without_ipi [Tracepoint event] sched:sched_wakeup [Tracepoint event] sched:sched_wakeup_new [Tracepoint event] sched:sched_waking [Tracepoint event]

核心tracepoint

sched_switch

sched_wakeup

sched_waking

sched_migrate_task

Stat類(lèi)型

該類(lèi)型的tracepoint額外帶有delay的時(shí)間

sched_stat_blocked

sched_stat_iowait

sched_stat_runtime

sched_stat_sleep

sched_stat_wait

其他

sched_kthread_stop, sched_kthread_stop_ret. 在kthread_stop時(shí)產(chǎn)生, 一般不是scheduler性能調(diào)試的重點(diǎn)

sched_move_numa, sched_swap_numa, sched_stick_numa. NUMA相關(guān), 從性能分析角度上看, 它們必須在我們的checklist中, 一定程度可以把它們當(dāng)作是異常(USE)

sched_pi_setprio. 用于實(shí)現(xiàn)rt_mutex的優(yōu)先級(jí)繼承, 比如用在futex上.

sched_process_exec, sched_process_exit, sched_process_fork, sched_process_free. 進(jìn)程相關(guān)的主要事件

sched_process_hang. 進(jìn)程hang

sched_process_wait. 等子進(jìn)程的狀態(tài)變化

sched_wait_task. 等待其他任務(wù)unschedule, 比如用于ptrace.

sched_wake_idle_without_ipi. 如果target cpu上的任務(wù)設(shè)置了TIF_POLLING_NRFLAG標(biāo)記 (只有idle進(jìn)程會(huì)設(shè)置), 這樣idle進(jìn)程自己去poll TIF_NEED_RESCHED, 這樣就不用發(fā)ipi中斷去通知了

sched_wakeup_new. 同sched_wakeup, 但針對(duì)的是新創(chuàng)建的任務(wù)

核心Tracepoint

sched_switch

當(dāng)調(diào)度器決定schedule另一個(gè)task運(yùn)行的時(shí)候, 也就是任務(wù)切換的時(shí)候, 會(huì)觸發(fā)該tracepoint. 核心邏輯如下:

__schedule next = pick_next_task(rq, prev, &rf); if (likely(prev != next)) trace_sched_switch(preempt, prev, next); rq = context_switch(rq, prev, next, &rf);

我們稍微關(guān)注以下context_switch里面的切棧操作:

switch_to(prev, next, prev); prev = __switch_to_asm((prev), (next))); pushq %rbp, %rbx, %r12, %13, %14, %15 /* Save callee-saved registers */ movq %rsp, TASK_threadsp(%rdi) movq TASK_threadsp(%rsi), %rsp /* switch stack */ popq %15, %14, %13, %12, %rbx, %rbp /* restore callee-saved registers */ jmp __switch_to struct task_struct *__switch_to(struct task_struct *prev, struct task_struct *next);

注意這里的__switch_to_asm傳入了prev, 又返回了prev, 看似沒(méi)有必要, 但是因?yàn)閏ontext_switch函數(shù)涉及到2個(gè)task, 在切棧之前是A, 切棧之后就變成B了

對(duì)于切棧前的task A來(lái)說(shuō), prev指的就是A本身

對(duì)于切棧后的task B來(lái)說(shuō), prev指的還必須是A, switch到B之后還需要更新A的信息. 這里通過(guò)函數(shù)調(diào)用巧妙解決了2個(gè)task之間變量的傳遞.

ULK引入3個(gè)task來(lái)解釋switch_to, 我認(rèn)為反而復(fù)雜了.

sched_wakeup / sched_waking

內(nèi)核會(huì)通過(guò)try_to_wake_up把任務(wù)喚醒, 這會(huì)涉及到這sched_wakeup和sched_waking兩個(gè)tracepoint.

try_to_wake_up if (p == current) ... trace_sched_waking(p); if (p->on_rq && ttwu_remote(p, wake_flags)) goto unlock; rq = __task_rq_lock(p, &rf); if (task_on_rq_queued(p)) ret = 1; ttwu_do_wakeup(rq, p, wake_flags, &rf); check_preempt_curr(rq, p, wake_flags); p->state = TASK_RUNNING; trace_sched_wakeup(p); p->state = TASK_WAKING; cpu = select_task_rq(p, p->wake_cpu, SD_BALANCE_WAKE, wake_flags); if (task_cpu(p) != cpu) wake_flags |= WF_MIGRATED; set_task_cpu(p, cpu); ttwu_queue(p, cpu, wake_flags); return ttwu_queue_remote(p, cpu, wake_flags); if (sched_feat(TTWU_QUEUE) && !cpus_share_cache(smp_processor_id(), cpu)) if (llist_add(&p->wake_entry, &cpu_rq(cpu)->wake_list)) smp_send_reschedule(cpu); if (!set_nr_if_polling(rq->idle)) scheduler_ipi sched_ttwu_pending(); ttwu_do_activate(rq, p, p->sched_remote_wakeup ? WF_MIGRATED : 0, &rf); rq = cpu_rq(cpu); rq_lock(rq, &rf); ttwu_do_activate(rq, p, wake_flags, &rf); activate_task(rq, p, en_flags); enqueue_task(rq, p, flags); for_each_sched_entity(se) break; if (se->on_rq) enqueue_entity(cfs_rq, se, flags); update_curr(cfs_rq); update_stats_enqueue(cfs_rq, se, flags); __enqueue_entity(cfs_rq, se); if (!curr) se->on_rq = 1; p->on_rq = TASK_ON_RQ_QUEUED; ttwu_do_wakeup(rq, p, wake_flags, rf); check_preempt_curr(rq, p, wake_flags); p->state = TASK_RUNNING; trace_sched_wakeup(p);

上面需要關(guān)注的點(diǎn):

可以喚醒current task

喚醒on_rq的task比較直接, 在sched_waking和sched_wakeup之間的時(shí)間非常短

當(dāng)需要遷移到其他cpu時(shí)會(huì)有2種方案

通過(guò)ipi給target cpu發(fā)送中斷, 在中斷處理函數(shù)中完成wakeup的后面部分

直接在當(dāng)前cpu上操作target cpu, 所以需要先執(zhí)行rq_lock操作, 可能會(huì)有鎖沖突

從上面可以看出, sched_waking和sched_wakeup在wakeup task過(guò)程中肯定都會(huì)發(fā)生, sched_waking事件在ttwu開(kāi)始的時(shí)候觸發(fā), 而sched_wakeup在ttwu結(jié)束的時(shí)候觸發(fā). 一般情況下, 這2個(gè)tracepoint觸發(fā)的時(shí)間非常靠近, 但是不排除中間會(huì)有較大gap.

sched_migrate_task

從資源的角度看, 只有系統(tǒng)中存在多個(gè)同類(lèi)資源(這里是cpu), 為了最大化資源利用率, 就會(huì)涉及到migration. 從性能角度看, 這個(gè)的影響是比較大的, 也是性能調(diào)試的時(shí)候必須關(guān)注的, migration有沒(méi)有及時(shí), migration會(huì)不會(huì)太多 (locality).

Stat類(lèi)型

為了使用stat類(lèi)型的tracepoint, 我們需要先enable.

# sysctl kernel.sched_schedstats kernel.sched_schedstats = 0 # sysctl -w kernel.sched_schedstats=1 kernel.sched_schedstats = 1

stat_iowait / stat_sleep / stat_blocked

update_stats_dequeue if (tsk->state & TASK_INTERRUPTIBLE) __schedstat_set(se->statistics.sleep_start, rq_clock(rq_of(cfs_rq))); if (tsk->state & TASK_UNINTERRUPTIBLE) __schedstat_set(se->statistics.block_start, rq_clock(rq_of(cfs_rq))); update_stats_enqueue update_stats_enqueue_sleeper(cfs_rq, se); if (flags & ENQUEUE_WAKEUP) if (sleep_start) trace_sched_stat_sleep(tsk, delta); if (block_start) trace_sched_stat_iowait(tsk, delta); if (tsk->in_iowait) trace_sched_stat_blocked(tsk, delta);

stat_sleep用于記錄TASK_INTERRUPTIBLE的時(shí)間

stat_blocked用于記錄TASK_UNINTERRUPTIBLE的時(shí)間

stat_iowait用于iowait的場(chǎng)景, 這種情況下stat_iowait和stat_blocked值是一樣的

stat_wait

stat_wait和上面的stat不一樣的地方在于, stat_wait更反映調(diào)度器本身的執(zhí)行情況.

update_stats_wait_start() wait_start = rq_clock(rq_of(cfs_rq)); __schedstat_set(se->statistics.wait_start, wait_start); update_stats_wait_end delta = rq_clock(rq_of(cfs_rq)) - schedstat_val(se->statistics.wait_start); trace_sched_stat_wait(p, delta); if (entity_is_task(se))

wait的起始時(shí)間wait_start. 任務(wù)狀態(tài)切到runnable, 但是不能馬上在cpu上執(zhí)行

task被搶占了, 那么wait_start就是搶占點(diǎn). put_prev_entity并且prev->on_rq成立

task喚醒的時(shí)候, 從enqueue_entity進(jìn)入

wait的結(jié)束時(shí)間

任務(wù)馬上要在cpu上執(zhí)行了, set_next_entity

任務(wù)enqueue后壓根沒(méi)能在該cpu上執(zhí)行就被dequeue了, update_stats_dequeue

stat_runtime

記錄任務(wù)的執(zhí)行時(shí)間, 包括runtime, vruntime

Scheduler框架

__schedule()的主要邏輯

if (!preempt && prev->state) if (signal_pending_state(prev->state, prev)) prev->state = TASK_RUNNING; else deactivate_task(rq, prev, DEQUEUE_SLEEP | DEQUEUE_NOCLOCK); p->on_rq = (flags & DEQUEUE_SLEEP) ? 0 : TASK_ON_RQ_MIGRATING; dequeue_task(rq, p, flags); p->sched_class->dequeue_task(rq, p, flags); dequeue_entity(cfs_rq, se, flags); update_stats_dequeue(cfs_rq, se, flags); __dequeue_entity(cfs_rq, se); if (se != cfs_rq->curr) // 在move_queued_task中, moved task可能不是curr rb_erase_cached(&se->run_node, &cfs_rq->tasks_timeline); se->on_rq = 0; next = pick_next_task(rq, prev, &rf); fair_sched_class.pick_next_task(rq, prev, rf); // pick_next_task_fair put_prev_task(rq, prev); if (prev) put_prev_entity(cfs_rq, se); if (prev->on_rq) update_curr(cfs_rq); update_stats_wait_start(cfs_rq, prev); __enqueue_entity(cfs_rq, prev); cfs_rq->curr = NULL; se = pick_next_entity(cfs_rq, NULL); set_next_entity(cfs_rq, se); if (se->on_rq) // 什么時(shí)候不on_rq? update_stats_wait_end(cfs_rq, se); trace_sched_stat_wait(p, delta); __dequeue_entity(cfs_rq, se); // 'current' is not kept within the tree. update_stats_curr_start(cfs_rq, se); se->exec_start = rq_clock_task(rq_of(cfs_rq)); cfs_rq->curr = se; if (likely(prev != next)) trace_sched_switch(preempt, prev, next); rq = context_switch(rq, prev, next, &rf);

性能調(diào)試

即使不是調(diào)度器的開(kāi)發(fā)者, 有的時(shí)候也需要能夠?qū)φ{(diào)度器進(jìn)行調(diào)試, 比如應(yīng)用開(kāi)發(fā)者或者系統(tǒng)管理員, 升級(jí)內(nèi)核后性能退化, 修改線程模型后性能不滿(mǎn)足預(yù)期等, 最終可能只需要?jiǎng)幽硞€(gè)調(diào)度器的參數(shù)而已, 但是前提是能夠定位到這個(gè)參數(shù).

sched map

只要抓取sched:sched_switch一個(gè)tracepoint, 就可以抓到系統(tǒng)所有的切換事件, 以下perf sched map的輸出:

前面每列代表一個(gè)cpu, 后面2列是事件發(fā)生的時(shí)間戳和任務(wù)縮寫(xiě)的映射

點(diǎn)(.)表示cpu在idle

星號(hào)(*)表示有事件發(fā)生

. . . *J0 . . 40302.714499 secs J0 => containerd:1125 . . . J0 . *K0 40302.714507 secs K0 => containerd:1094 . . . J0 . *. 40302.714515 secs . . . *. . . 40302.714517 secs . . . . *L0 . 40302.714522 secs L0 => containerd:1121 . . . . *. . 40302.714527 secs . . . . . *K0 40302.714583 secs . . . . . *. 40302.714586 secs . . *M0 . . . 40302.738012 secs M0 => cron:911 . . *. . . . 40302.738043 secs . . . . . *N0 40302.802649 secs N0 => kworker/5706 . . . . . *. 40302.802657 secs . . . . *O0 . 40302.818889 secs O0 => chrome:1370

sched timehist

該命令可以獲得task的wait time, 特別地, 還能拿到sch delay. timehist統(tǒng)計(jì)的sch delay是通過(guò)sched_switch和sched_wakeup計(jì)算出來(lái)的, 而不是上面的stat_wait.

/* * Explanation of delta-time stats: * * t = time of current schedule out event * tprev = time of previous sched out event * also time of schedule-in event for current task * last_time = time of last sched change event for current task * (i.e, time process was last scheduled out) * ready_to_run = time of wakeup for current task * * -----|------------|------------|------------|------ * last ready tprev t * time to run * * |-------- dt_wait --------| * |- dt_delay -|-- dt_run --| * * dt_run = run time of current task * dt_wait = time between last schedule out event for task and tprev * represents time spent off the cpu * dt_delay = time between wakeup and schedule-in of task */ time cpu task name wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ ------------------------------ --------- --------- --------- 43721.001384 [0001] 0.000 0.000 0.000 43721.001401 [0001] avahi-daemon[950] 0.000 0.000 0.017 43721.001451 [0000] 0.000 0.000 0.000 43721.001468 [0000] Chrome_IOThread[2401/2383] 0.000 0.000 0.016 43721.001516 [0004] 0.000 0.000 0.000

sched latency

這里的delay同timehist的sch delay.

# perf sched latency -s max ----------------------------------------------------------------------------------------------------------------- Task | Runtime ms | Switches | Average delay ms | Maximum delay ms | Maximum delay at | ----------------------------------------------------------------------------------------------------------------- rcu_preempt:11 | 0.323 ms | 13 | avg: 0.020 ms | max: 0.141 ms | max at: 43721.824102 s kworker/110084 | 0.636 ms | 7 | avg: 0.047 ms | max: 0.141 ms | max at: 43721.716104 s ThreadPoolForeg:(3) | 1.148 ms | 20 | avg: 0.012 ms | max: 0.139 ms | max at: 43721.797089 s containerd:(7) | 1.863 ms | 46 | avg: 0.012 ms | max: 0.070 ms | max at: 43721.068446 s gnome-shell:1612 | 2.517 ms | 16 | avg: 0.011 ms | max: 0.054 ms | max at: 43721.982652 s

perf inject

通過(guò)關(guān)聯(lián)以下2個(gè)tracepoint, 我們可以得到任務(wù)sleep的時(shí)長(zhǎng)及其對(duì)應(yīng)的callchain

sched_iowait/sleep/blocked. 獲得sleep的時(shí)長(zhǎng)

sched_switch. 獲得調(diào)用棧

commit 26a031e136f4f8dc82c64df48cca0eb3b5d3eb4f Author: Andrew Vagin Date: Tue Aug 7 1604 2012 +0400 perf inject: Merge sched_stat_* and sched_switch events You may want to know where and how long a task is sleeping. A callchain may be found in sched_switch and a time slice in stat_iowait, so I add handler in perf inject for merging this events. My code saves sched_switch event for each process and when it meets stat_iowait, it reports the sched_switch event, because this event contains a correct callchain. By another words it replaces all stat_iowait events on proper sched_switch events.

其他

這里列出一些調(diào)試的想法, 暫時(shí)沒(méi)有整理和一一展開(kāi)

性能調(diào)試要考慮工具的開(kāi)銷(xiāo), 比如perf的開(kāi)銷(xiāo)是否會(huì)影響到應(yīng)用的性能. 我們可以使用eBPF重寫(xiě)上面的perf的功能, eBPF因?yàn)槟軌蛟趦?nèi)核中直接聚合, 開(kāi)銷(xiāo)相比perf會(huì)小

雖然tracepoint能提供更多更完整的調(diào)試信息, 但是其他的統(tǒng)計(jì)工具比如schedstat等對(duì)調(diào)試也會(huì)有幫助, 很多時(shí)候只能用這些一直在搜集的信息, 而不是所有場(chǎng)景都能復(fù)現(xiàn)然后上去通過(guò)tracepoint搜集信息的

以上涉及的工具都還是文本界面的, 圖形界面的工具會(huì)更有優(yōu)勢(shì). 文本的好處是可以再加工, 圖像的好處是更直觀, 更容易發(fā)現(xiàn)問(wèn)題

和scheduler相關(guān)的性能問(wèn)題主要是兩個(gè)方面, 一是怎么定位應(yīng)用程序的off-cpu, 二是scheduler自身的影響, 都有一些相對(duì)固定的方法

有了這些tracepoint以及動(dòng)態(tài)添加的kprobe, 我們很容易拿到應(yīng)用程序schedule相關(guān)的信息, 比如在context switch in/out時(shí)收集信息, 就可以生成帶callchain的off-cpu flamegraph

如果某個(gè)cpu忙應(yīng)該看到什么現(xiàn)象, 我們可以去獲取cpu runqueue的長(zhǎng)度

如果task的某個(gè)函數(shù)執(zhí)行時(shí)間過(guò)長(zhǎng), 我們可以檢查它是在cpu上執(zhí)行慢, 還是在等資源. 如果是調(diào)度不及時(shí), 我們可以看到當(dāng)時(shí)它runnable的時(shí)長(zhǎng), 以及其他cpu的狀態(tài)

如果我們已經(jīng)有了cpu視角和task視角, 我們看到大量cpu idle而只有某個(gè)task在跑, 那么一種合理的推測(cè)是該task是否阻塞其他task了

調(diào)試其實(shí)就是把很多現(xiàn)象關(guān)聯(lián)起來(lái), 也就是說(shuō)孤立地去看一種現(xiàn)象往往收獲不大. 一般來(lái)說(shuō)我們可以通過(guò)時(shí)間軸把這些事件關(guān)聯(lián)起來(lái), 從資源的角度(比如每個(gè)cpu的在任意時(shí)間的使用情況), 從消費(fèi)者的角度(比如每個(gè)進(jìn)程的運(yùn)行狀態(tài)/路徑)

如果某個(gè)cpu忙其他cpu閑會(huì)有什么現(xiàn)象, 以每個(gè)cpu為視角, 通過(guò)時(shí)間軸把所有的cpu關(guān)聯(lián)起來(lái), 使用不同的顏色表示runqueue的長(zhǎng)度, 這樣生成的圖可以很容易看出migration是否及時(shí), 這樣的資源利用圖是非常有必要的, 有點(diǎn)類(lèi)似htop, 但是更加精細(xì)

本文作者:J.FW

來(lái)源:https://zhuanlan.zhihu.com/p/143320517(閱讀原文可直達(dá))

責(zé)任編輯:PSY

原文標(biāo)題:透過(guò)Tracepoint理解內(nèi)核 - 調(diào)度器框架和性能

文章出處:【微信公眾號(hào):Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11012

    瀏覽量

    215285
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17744
  • 性能測(cè)試
    +關(guān)注

    關(guān)注

    0

    文章

    217

    瀏覽量

    21636
  • 調(diào)度器
    +關(guān)注

    關(guān)注

    0

    文章

    98

    瀏覽量

    5429

原文標(biāo)題:透過(guò)Tracepoint理解內(nèi)核 - 調(diào)度器框架和性能

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    車(chē)隊(duì)運(yùn)營(yíng)調(diào)度管理系統(tǒng)

    車(chē)隊(duì)運(yùn)營(yíng)調(diào)度管理系統(tǒng)作為無(wú)人駕駛車(chē)隊(duì)的云端大腦,承擔(dān)了打通業(yè)務(wù)層和無(wú)人駕駛車(chē)隊(duì)的重任。經(jīng)緯恒潤(rùn)車(chē)隊(duì)運(yùn)營(yíng)調(diào)度管理系統(tǒng)包含業(yè)務(wù)對(duì)接、車(chē)輛調(diào)度、作業(yè)管理引擎、交通調(diào)度、一體化監(jiān)控管理、運(yùn)營(yíng)數(shù)
    的頭像 發(fā)表于 01-09 10:25 ?732次閱讀
    車(chē)隊(duì)運(yùn)營(yíng)<b class='flag-5'>調(diào)度</b>管理系統(tǒng)

    SSM框架的源碼解析與理解

    SSM框架(Spring + Spring MVC + MyBatis)是一種在Java開(kāi)發(fā)中常用的輕量級(jí)企業(yè)級(jí)應(yīng)用框架。它通過(guò)整合Spring、Spring MVC和MyBatis三個(gè)框架,實(shí)現(xiàn)了
    的頭像 發(fā)表于 12-17 09:20 ?713次閱讀

    算力調(diào)度的基礎(chǔ)知識(shí)

    編者按 “算力調(diào)度”的概念,這幾年越來(lái)越多的被提及。剛聽(tīng)到這個(gè)概念的時(shí)候,我腦海里一直拐不過(guò)彎。作為底層芯片出身的我,一直認(rèn)為:算力是硬件的服務(wù)和集群,他在某個(gè)地方,就是固定的;根本就不存在算力
    的頭像 發(fā)表于 11-27 17:13 ?645次閱讀
    算力<b class='flag-5'>調(diào)度</b>的基礎(chǔ)知識(shí)

    HarmonyOS NEXT應(yīng)用元服務(wù)開(kāi)發(fā)Intents Kit(意圖框架服務(wù))習(xí)慣推薦方案接入流程

    一、總體流程 二、具體執(zhí)行 本文主要參考鴻蒙官方網(wǎng)站材料
    發(fā)表于 11-20 17:17

    數(shù)字設(shè)計(jì)ic芯片流程

    主要介紹芯片的設(shè)計(jì)流程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? &
    發(fā)表于 11-20 15:57 ?0次下載

    負(fù)載管理主要功能

    負(fù)載管理(Load Manager)是計(jì)算機(jī)系統(tǒng)中的一個(gè)關(guān)鍵組件,它負(fù)責(zé)分配和管理計(jì)算資源,以確保系統(tǒng)運(yùn)行的效率和穩(wěn)定性。負(fù)載管理主要功能包括任務(wù)調(diào)度、資源分配、性能監(jiān)控、故障恢
    的頭像 發(fā)表于 10-10 11:26 ?637次閱讀

    虛擬電廠如何優(yōu)化調(diào)度電動(dòng)汽車(chē)充電

    基于深度強(qiáng)化學(xué)習(xí)的交互式調(diào)度框架,以虛擬電廠內(nèi)電動(dòng)汽車(chē)用戶(hù)的總效益。虛擬電廠控制平臺(tái)作為智能體決策電動(dòng)汽車(chē)個(gè)體的充放電動(dòng)作,無(wú)需掌握個(gè)體詳細(xì)模型,而是通過(guò)與區(qū)域電網(wǎng)環(huán)境的交互,不斷學(xué)習(xí)和更新動(dòng)作策略,從而克服集中式優(yōu)化方法的局限性。該優(yōu)化
    的頭像 發(fā)表于 09-27 16:36 ?581次閱讀
    虛擬電廠如何優(yōu)化<b class='flag-5'>調(diào)度</b>電動(dòng)汽車(chē)充電

    集成電路設(shè)計(jì)流程主要有哪些步驟

    集成電路設(shè)計(jì)流程是一個(gè)復(fù)雜且精細(xì)的過(guò)程,主要包括以下幾個(gè)關(guān)鍵步驟: 一、規(guī)格定義 需求分析 :明確電路的需求、功能和性能指標(biāo),如成本、功耗、算力、接口方式、安全等級(jí)等。這是設(shè)計(jì)流程的基礎(chǔ),為后續(xù)
    的頭像 發(fā)表于 09-04 18:20 ?2204次閱讀

    Spring Cloud Gateway網(wǎng)關(guān)框架

    推出的第二代網(wǎng)關(guān)框架,取代Zuul網(wǎng)關(guān)。網(wǎng)關(guān)作為流量的,在微服務(wù)系統(tǒng)中有著非常作用,網(wǎng)關(guān)常見(jiàn)的功能有路由轉(zhuǎn)發(fā)、權(quán)限校驗(yàn)、限流控制等作用。 SpringCloud Gateway流程
    的頭像 發(fā)表于 08-22 09:58 ?641次閱讀
    Spring Cloud Gateway網(wǎng)關(guān)<b class='flag-5'>框架</b>

    深入探討Linux的進(jìn)程調(diào)度

    ,以及其運(yùn)行的順序。這篇文章將詳細(xì)探討Linux進(jìn)程調(diào)度的工作原理、主要算法、調(diào)度策略以及其在實(shí)際操作中的應(yīng)用。
    的頭像 發(fā)表于 08-13 13:36 ?1133次閱讀
    深入探討Linux的進(jìn)程<b class='flag-5'>調(diào)度</b><b class='flag-5'>器</b>

    bootstrap框架和vue框架的區(qū)別

    Bootstrap和Vue都是目前非常流行的前端開(kāi)發(fā)框架,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn)。 設(shè)計(jì)理念 Bootstrap是一個(gè)基于HTML、CSS和JavaScript的前端開(kāi)發(fā)框架主要用于快速構(gòu)建
    的頭像 發(fā)表于 07-11 09:55 ?1267次閱讀

    專(zhuān)家解讀 | NIST網(wǎng)絡(luò)安全框架(3):層級(jí)配置

    和配置的主要內(nèi)容,及其使用方法。 關(guān)鍵字:網(wǎng)絡(luò)安全框架;CSF層級(jí);CSF配置 ? 一 CSF層級(jí) 在組織的系統(tǒng)性風(fēng)險(xiǎn)治理過(guò)程中,CSF框架可以用于識(shí)別、評(píng)估和管理網(wǎng)絡(luò)安全風(fēng)險(xiǎn)。結(jié)合現(xiàn)有的管理
    的頭像 發(fā)表于 06-11 10:21 ?606次閱讀
    專(zhuān)家解讀 | NIST網(wǎng)絡(luò)安全<b class='flag-5'>框架</b>(3):層級(jí)配置

    車(chē)輛調(diào)度系統(tǒng)

    通過(guò)WIFI覆蓋,司機(jī)應(yīng)用車(chē)載交互終端,對(duì)隧道內(nèi)所有車(chē)輛信息了如指掌,司機(jī)間可做交互溝通。 【銘跡創(chuàng)新】隧道外車(chē)輛調(diào)度主要應(yīng)用GPS定位,分為狹窄道路的車(chē)輛調(diào)度,如單行的施工便道的會(huì)車(chē)讓車(chē)燈調(diào)
    的頭像 發(fā)表于 05-31 15:59 ?838次閱讀
    車(chē)輛<b class='flag-5'>調(diào)度</b>系統(tǒng)

    鴻蒙ArkUI-X框架開(kāi)發(fā):【開(kāi)發(fā)準(zhǔn)備】

    本文檔適用于ArkUI-X框架開(kāi)發(fā)的初學(xué)者。通過(guò)環(huán)境搭建、代碼下載、代碼編譯、API擴(kuò)展和使用,快速了解跨平臺(tái)項(xiàng)目開(kāi)發(fā)流程
    的頭像 發(fā)表于 05-23 21:02 ?671次閱讀
    鴻蒙ArkUI-X<b class='flag-5'>框架</b>開(kāi)發(fā):【開(kāi)發(fā)準(zhǔn)備】

    淺析FreeRTOS任務(wù)調(diào)度的三種調(diào)度算法和應(yīng)用

    FreeRTOS在MCU領(lǐng)域應(yīng)用非常廣泛,今天就給大家講解一下FreeRTOS調(diào)度中的三種調(diào)度算法,以及在瑞薩RZ/T2L MPU中的應(yīng)用。
    的頭像 發(fā)表于 05-10 14:02 ?8627次閱讀
    淺析FreeRTOS任務(wù)<b class='flag-5'>調(diào)度</b><b class='flag-5'>器</b>的三種<b class='flag-5'>調(diào)度</b>算法和應(yīng)用
    主站蜘蛛池模板: 色多多拼多多网站 | 四虎永久在线精品国产免费 | 特黄特色大片免费视频播放 | 黄色永久网站 | 午夜资源网 | 性欧美日本 | 国产aa| 色天使久久| 天天摸天天操天天射 | 精品亚洲国产国拍 | 欧美精品一区二区三区视频 | 婷婷综合激情网 | 国产精品久久精品福利网站 | 天天干免费视频 | 人人看人人做人人爱精品 | 天天操天天干视频 | 真人实干一级毛片aa免费 | 韩漫免费网站无遮挡羞羞漫画 | 国产网红主播chinese | 欧美日韩国产网站 | 免费观看黄视频 | 久久午夜宅男免费网站 | 免费人成在线观看网站品爱网 | 色性综合| 日夜操在线视频 | 511韩国理论片在线观看 | 国产99久9在线视频 国产99久久九九精品免费 | 天堂网www天堂在线资源链接 | ts视频在线观看 | 很黄网站 | xxx日本69| 美女视频很黄很a免费国产 美女视频很黄很暴黄是免费的 | 国产精品久久久久影院色老大 | 轻点灬大ji巴太粗太长了h | 日本最黄 | 精品一区二区三区免费爱 | 一级做a爱片久久毛片 | 五月月色开心婷婷久久合 | 午夜性福| 最黄毛片 | 爱操成人网 |