91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

Linux中內(nèi)核搶占相關(guān)的基礎(chǔ)知識

Linux愛好者 ? 來源:老吳嵌入式 ? 作者:吳偉東Jack ? 2021-11-09 16:48 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

今天要分享的是搶占相關(guān)的基礎(chǔ)知識。本文以內(nèi)核搶占為引子,概述一下 Linux 搶占的圖景。我盡量避開細(xì)節(jié)問題和源碼分析。

什么是內(nèi)核搶占?

別急,咱們慢慢來。

先理解搶占 (preemption) 這個概念:

involuntarily suspending a running process is called preemption

奪取一個進程的 cpu 使用權(quán)的行為就叫做搶占。

根據(jù)是否可以支持搶占,多任務(wù)操作系統(tǒng) (multitasking operating system) 分為 2 類:

1、cooperative multitasking os

這種 os,進程會一直運行直到它自愿停下來。這種自愿停止運行自己的行為稱為 yielding。協(xié)作式多任務(wù)系統(tǒng),一聽就知道這是一個烏托邦式的系統(tǒng),只有當(dāng)所有進程都很 nice 并樂意經(jīng)常 yielding 時,系統(tǒng)才能正常工作。如果某個進程太傻或者太壞,系統(tǒng)很快就完蛋了。

2、preemptive multitasking os

這種 os,會有一個調(diào)度器 (scheduler,其實就是一段用于調(diào)度進程的程序),scheduler 決定進程何時停止運行以及新進程何時開始運行。當(dāng)一個進程的 cpu 使用權(quán)被 scheduler 分配給另一個進程時,就稱前一個進程被搶占了。

你可以把 sheduler 想象成非常智能的交警,交警按照一定的交通規(guī)則、當(dāng)前的交通狀況以及車輛的優(yōu)先級 (救護車之類的),決定了哪些車可以行駛、哪些車要停下來等待。

很明顯,現(xiàn)階段,preemptive os 優(yōu)于 cooperative os。所以 Linux 被設(shè)計成 preemptive。

搶占的核心操作包括 2 個步驟:

1、從用戶態(tài)陷入到內(nèi)核態(tài) (trap kernel),3 個路徑:

a. 系統(tǒng)調(diào)用,本質(zhì)是 soft interrupt,通常就是一條硬件指令 (x86 的 int 0x80)。

b. 硬件中斷,最典型的就是會周期性發(fā)生的 timer 中斷,或者其他各種外設(shè)中斷。

c. exception,例如 page fault、div 0。

2、陷入到內(nèi)核態(tài)后,在合適的時機下,調(diào)用 sheduler 選出一個最重要的進程,如果被選中的不是當(dāng)前正在運行的進程的話,就會執(zhí)行 context switch 切換到新的進程。

根據(jù)搶占時機點的不同,搶占分為 2 種類型:

1、user preemption

這里的 user 并不是指在 user-space 里進行搶占,而是指在返回 user-space 前進行搶占,具體的:

When returning to user-space from a system call

When returning to user-space from an interrupt handler

即從 system call 和 interrupt handler 返回到 user-space 前進行搶占,這時仍然是在 kernel-space 里,搶占是需要非常高的權(quán)限的事情,user-space 沒權(quán)利也不應(yīng)該干這事。

2、kernel preemption

Linux 2.6 之前是不支持內(nèi)核搶占的。這意味著當(dāng)處于用戶空間的進程請求內(nèi)核服務(wù)時,在該進程阻塞(進入睡眠)等待某事(通常是 I/O)或系統(tǒng)調(diào)用完成之前,不能調(diào)度其他進程。支持內(nèi)核搶占意味著當(dāng)一個進程在內(nèi)核里運行時,另一個進程可以搶占第一個進程并被允許運行,即使第一個進程尚未完成其在內(nèi)核里的工作。

支持內(nèi)核搶占 vs 不支持內(nèi)核搶占

在上圖中,進程 A 已經(jīng)通過系統(tǒng)調(diào)用進入內(nèi)核,也許是對設(shè)備或文件的 write() 調(diào)用。內(nèi)核代表進程 A 執(zhí)行時,具有更高優(yōu)先級的進程 B 被中斷喚醒。內(nèi)核搶占進程 A 并將 CPU 分配給進程 B,即使進程 A 既沒有阻塞也沒有完成其在內(nèi)核里的工作。

內(nèi)核搶占的時機:

When an interrupt handler exits, before returning to kernel-space

When kernel code becomes preemptible again

If a task in the kernel explicitly calls schedule()

If a task in the kernel blocks (which results in a call to schedule() )

為什么要引入內(nèi)核搶占?

根本原因:

trade-offs between latency and throughput

在系統(tǒng)延遲和吞吐量之間進行權(quán)衡。

并不是說內(nèi)核搶占就是絕對的好,使用什么搶占機制最優(yōu)是跟你的應(yīng)用場景掛鉤的。如果不是為了滿足用戶,內(nèi)核其實是完全不想進行進程切換的,因為每一次 context switch,都會有 overhead,這些 overhead 就是對 cpu 的浪費,意味著吞吐量的下降。

但是,如果你想要系統(tǒng)的響應(yīng)性好一點,就得盡量多的允許搶占的發(fā)生,這是 Linux 作為一個通用操作系統(tǒng)所必須支持的。當(dāng)你的系統(tǒng)做到隨時都可以發(fā)生搶占時,系統(tǒng)的響應(yīng)性就會非常好。

為了讓用戶根據(jù)自己的需求進行配置,Linux 提供了 3 種 Preemption Model。

CONFIG_PREEMPT_NONE=y:不允許內(nèi)核搶占,吞吐量最大的 Model,一般用于 Server 系統(tǒng)。

CONFIG_PREEMPT_VOLUNTARY=y:在一些耗時較長的內(nèi)核代碼中主動調(diào)用cond_resched()讓出CPU,對吞吐量有輕微影響,但是系統(tǒng)響應(yīng)會稍微快一些。

CONFIG_PREEMPT=y:除了處于持有 spinlock 時的 critical section,其他時候都允許內(nèi)核搶占,響應(yīng)速度進一步提升,吞吐量進一步下降,一般用于 Desktop / Embedded 系統(tǒng)。

另外,還有一個沒有合并進主線內(nèi)核的 Model: CONFIG_PREEMPT_RT,這個模式幾乎將所有的 spinlock 都換成了 preemptable mutex,只剩下一些極其核心的地方仍然用禁止搶占的 spinlock,所以基本可以認(rèn)為是隨時可被搶占。

搶占前的檢查

這里的檢查是同時針對所有的 preemption 的。如果你理解了前面的 4 種 preempiton model 的話,應(yīng)該能感覺到其實是不用太嚴(yán)格區(qū)分 user / kernel preemption,所有搶占的作用和性質(zhì)都一樣:降低 lantency,完全可以將它們一視同仁。

搶占的發(fā)生要同時滿足兩個條件:

需要搶占;

能搶占;

1、是否需要搶占?

判斷是否需要搶占的依據(jù)是:thread_info 的成員 flags 是否設(shè)置了 TIF_NEED_RESCHED 標(biāo)志位。

相關(guān)的 API:

set_tsk_need_resched() 用于設(shè)置該 flag。

tif_need_resched() 被用來判斷該 flag 是否置位。

resched_curr(struct rq *rq),標(biāo)記當(dāng)前 runqueue 需要搶占。

2、是否能搶占?

搶占發(fā)生的前提是要確保此次搶占是安全的 (preempt-safe)。什么才是 preempt-safe:不產(chǎn)生 race condition / deadlock。

值得注意的是,只有 kernel preemption 才有被禁止的可能,而 user preemption 總是被允許,因此這時馬上就要返回 user space 了,肯定是處于一個可搶占的狀態(tài)了。

在引入內(nèi)核搶占機制的同時引入了為 thread_info 添加了新的成員:preempt_count ,用來保證搶占的安全性,獲取鎖時會增加 preempt_count,釋放鎖時則會減少。搶占前會檢查 preempt_count 是否為 0,為 0 才允許搶占。

相關(guān)的 API:

preempt_enable(),使能內(nèi)核搶占,可嵌套調(diào)用。

preempt_disable(),關(guān)閉內(nèi)核搶占,可嵌套調(diào)用。

preempt_count(),返回 preempt_count。

什么場景會設(shè)置需要搶占 (TIF_NEED_RESCHED = 1)

通過 grep resched_curr 可以找出大多數(shù)標(biāo)記搶占的場景。

下面列舉的是幾個我比較關(guān)心的場景。

1、周期性的時鐘中斷

時鐘中斷處理函數(shù)會調(diào)用 scheduler_tick(),它通過調(diào)度類(scheduling class) 的 task_tick 方法 檢查進程的時間片是否耗盡,如果耗盡則標(biāo)記需要搶占:

// kernel/sched/core.c

void scheduler_tick(void)

{

[。..]

curr-》sched_class-》task_tick(rq, curr, 0);

[。..]

}

Linux 的調(diào)度策略被封裝成調(diào)度類,例如 CFS、Real-Time。CFS 調(diào)度類的 task_tick() 如下:

// kernel/sched/fair.c

task_tick_fair()

-》 entity_tick()

-》 resched_curr(rq_of(cfs_rq));

2、喚醒進程的時候

當(dāng)進程被喚醒的時候,如果優(yōu)先級高于 CPU 上的當(dāng)前進程,就會觸發(fā)搶占。相應(yīng)的內(nèi)核代碼中,try_to_wake_up() 最終通過 check_preempt_curr() 檢查是否標(biāo)記需要搶占:

// kernel/sched/core.c

void check_preempt_curr(struct rq *rq, struct task_struct *p, int flags)

{

const struct sched_class *class;

if (p-》sched_class == rq-》curr-》sched_class) {

rq-》curr-》sched_class-》check_preempt_curr(rq, p, flags);

} else {

for_each_class(class) {

if (class == rq-》curr-》sched_class)

break;

if (class == p-》sched_class) {

resched_curr(rq);

break;

}

}

}

[。..]

}

參數(shù) “p” 指向被喚醒進程,“rq” 代表搶占的 CPU。如果 p 的調(diào)度類和 rq 當(dāng)前的調(diào)度類相同,則調(diào)用 rq 當(dāng)前的調(diào)度類的 check_preempt_curr() (例如 cfs 的 check_preempt_wakeup()) 來判斷是否要標(biāo)記需要搶占。

如果 p 的調(diào)度類 》 rq 當(dāng)前的調(diào)度類,則用 resched_curr() 標(biāo)記需要搶占,反之,則不標(biāo)記。

3、新進程創(chuàng)建的時候

如果新進程的優(yōu)先級高于 CPU 上的當(dāng)前進程,會需要觸發(fā)搶占。相應(yīng)的代碼是 sched_fork(),它再通過調(diào)度類的 task_fork() 標(biāo)記需要搶占:

// kernel/sched/core.c

int sched_fork(unsigned long clone_flags, struct task_struct *p)

{

[。..]

if (p-》sched_class-》task_fork)

p-》sched_class-》task_fork(p);

[。..]

}

// kernel/sched/fair.c

static void task_fork_fair(struct task_struct *p)

{

[。..]

if (sysctl_sched_child_runs_first && curr && entity_before(curr, se)) {

resched_curr(rq);

}

[。..]

}

4、進程修改 nice 值的時候

如果修改進程 nice 值導(dǎo)致優(yōu)先級高于 CPU 上的當(dāng)前進程,也要標(biāo)記需要搶占,代碼見 set_user_nice()。

// kernel/sched/core.c

void set_user_nice(struct task_struct *p, long nice)

{

[。..]

// If the task increased its priority or is running and lowered its priority, then reschedule its CPU

if (delta 《 0 || (delta 》 0 && task_running(rq, p)))

resched_curr(rq);

}

還有很多場景,這里就不一一列舉了。

什么場景下要禁止內(nèi)核搶占 (preempt_count 》 0)

有幾種場景是明確需要關(guān)閉內(nèi)核搶占的。

1、訪問 Per-CPU data structures 的時候

看下面這個例子:

struct this_needs_locking tux[NR_CPUS];

tux[smp_processor_id()] = some_value;

/* task is preempted here.。. */

something = tux[smp_processor_id()];

如果搶占發(fā)生在注釋所在的那一行,當(dāng)進程再次被調(diào)度時,smp_processor_id() 值可能已經(jīng)發(fā)生變化了,這種場景下需要通過禁止內(nèi)核搶占來做到 preempt safe。

2、訪問 CPU state 的時候

這個很好理解,你正在操作 CPU 相關(guān)的寄存器以進行 context switch 時,肯定是不能再允許搶占。

asmlinkage __visible void __sched schedule(void)

{

struct task_struct *tsk = current;

sched_submit_work(tsk);

do {

// 調(diào)度前禁止內(nèi)核搶占

preempt_disable();

__schedule(false);

sched_preempt_enable_no_resched();

} while (need_resched());

sched_update_worker(tsk);

}

3、持有 spinlock 的時候

支持內(nèi)核搶占,這意味著進程有可能與被搶占的進程在相同的 critical section 中運行。為防止這種情況,當(dāng)持有自旋鎖時,要禁止內(nèi)核搶占。

static inline void __raw_spin_lock(raw_spinlock_t *lock)

{

preempt_disable();

spin_acquire(&lock-》dep_map, 0, 0, _RET_IP_);

LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);

}

還有很多場景,這里就不一一列舉了。

真正執(zhí)行搶占的地方

這部分是 platform 相關(guān)的,下面以 ARM64 Linux-5.4 為例,快速看下執(zhí)行搶占的具體代碼。

執(zhí)行 user preemption

系統(tǒng)調(diào)用和中斷返回用戶空間的時候:

它們都是在 ret_to_user() 里判斷是否執(zhí)行用戶搶占。

// arch/arm64/kernel/entry.S

ret_to_user() // 返回到用戶空間

work_pending()

do_notify_resume()

schedule()

// arch/arm64/kernel/signal.c

asmlinkage void do_notify_resume(struct pt_regs *regs,

unsigned long thread_flags)

{

do {

[。..]

// 檢查是否要需要調(diào)度

if (thread_flags & _TIF_NEED_RESCHED) {

local_daif_restore(DAIF_PROCCTX_NOIRQ);

schedule();

} else {

[。..]

} while (thread_flags & _TIF_WORK_MASK);

}

執(zhí)行 kernel preemption

中斷返回內(nèi)核空間的時候:

// arch/arm64/kernel/entry.S

el1_irq

irq_handler

arm64_preempt_schedule_irq

preempt_schedule_irq

__schedule(true)

// kernel/sched/core.c

/* This is the entry point to schedule() from kernel preemption */

asmlinkage __visible void __sched preempt_schedule_irq(void)

{

[。..]

do {

preempt_disable();

local_irq_enable();

__schedule(true);

local_irq_disable();

sched_preempt_enable_no_resched();

} while (need_resched());

exception_exit(prev_state);

}

內(nèi)核恢復(fù)為可搶占的時候:

前面列舉了集中關(guān)閉搶占的場景,當(dāng)離開這些場景時,會恢復(fù)內(nèi)核搶占。

例如 spinlock unlock 時:

static inline void __raw_spin_unlock(raw_spinlock_t *lock)

{

spin_release(&lock-》dep_map, 1, _RET_IP_);

do_raw_spin_unlock(lock);

preempt_enable(); // 使能搶占時,如果需要,就會執(zhí)行搶占

}

// include/linux/preempt.h

#define preempt_enable()

do {

barrier();

if (unlikely(preempt_count_dec_and_test()))

__preempt_schedule();

} while (0)

內(nèi)核顯式地要求調(diào)度的時候:

內(nèi)核里有大量的地方會顯式地要求進行調(diào)度,最常見的是:cond_resched() 和 sleep()類函數(shù),它們最終都會調(diào)用到 __schedule()。

內(nèi)核阻塞的時候:

例如 mutex,sem,waitqueue 獲取不到資源,或者是等待 IO。這種情況下進程會將自己的狀態(tài)從TASK_RUNNING 修改為 TASK_INTERRUPTIBLE,然后調(diào)用 schedule() 主動讓出 CPU 并等待喚醒。

// block/blk-core.c

static struct request *get_request(struct request_queue *q, int op,

int op_flags, struct bio *bio,

gfp_t gfp_mask)

{

[。..]

prepare_to_wait_exclusive(&rl-》wait[is_sync], &wait,

TASK_UNINTERRUPTIBLE);

io_schedule(); // 會調(diào)用 schedule();

[。..]

}

責(zé)任編輯:haq

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

    關(guān)注

    5199

    文章

    20454

    瀏覽量

    334251
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    4

    文章

    1468

    瀏覽量

    42888
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11763

    瀏覽量

    219084

原文標(biāo)題:內(nèi)核搶占,讓世界變得更美好

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    Linux內(nèi)核伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

    Linux 內(nèi)核,內(nèi)存管理是整個系統(tǒng)穩(wěn)定運行的基石,而伙伴系統(tǒng)(Buddy System) 作為內(nèi)核物理內(nèi)存分配的核心機制,更是驅(qū)動開發(fā)、內(nèi)核
    的頭像 發(fā)表于 02-10 16:58 ?3634次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>伙伴系統(tǒng)內(nèi)存申請函數(shù)詳解:從原理到實戰(zhàn)

    阻燃系列基礎(chǔ)知識

    我很榮幸有機會在這里與大家分享我對阻燃系列基礎(chǔ)知識的研究。今天,我們將探討的主題是“阻燃系列基礎(chǔ)知識”。在我們?nèi)粘I?b class='flag-5'>中,火災(zāi)事故頻發(fā),造成巨大的財產(chǎn)損失和人員傷亡。因此,了解阻燃材料的基礎(chǔ)知
    的頭像 發(fā)表于 02-06 08:07 ?317次閱讀
    阻燃系列<b class='flag-5'>基礎(chǔ)知識</b>

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計時?

    Linux 內(nèi)核的世界里,有一個默默工作的 "計時器"——jiffies。它不像我們手機上的時鐘那樣顯示年月日,卻掌控著內(nèi)核絕大多數(shù)時間相關(guān)
    的頭像 發(fā)表于 02-04 16:27 ?828次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計時?

    深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價值

    在 RK3588 芯片的 Linux 開發(fā),有一個文件始終是開發(fā)者繞不開的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。無論是首次
    的頭像 發(fā)表于 02-03 15:56 ?1171次閱讀
    深入RK3588<b class='flag-5'>內(nèi)核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用與調(diào)試價值

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀深入理解Linux內(nèi)核內(nèi)存分配

    每個內(nèi)存地址是虛擬的,不是直接指向RAM的任何地址。當(dāng)用戶訪問內(nèi)存的存儲單元時,都會進行地址轉(zhuǎn)換以匹配相應(yīng)的物理內(nèi)存。書籍的第10章討論了五個主題,對Linux內(nèi)核內(nèi)存分配進行詳細(xì)
    發(fā)表于 01-16 20:05

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】Linux內(nèi)核開發(fā)基礎(chǔ)

    感謝電子發(fā)燒友論壇提供的《Linux設(shè)備驅(qū)動開發(fā)(第2版)》閱讀機會,測評將從Linux內(nèi)核開發(fā)基礎(chǔ)、Linux內(nèi)核平臺抽象和設(shè)備驅(qū)動程序、
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)」閱讀體驗】+讀內(nèi)核處理的核心輔助函數(shù)

    上周收到《Linux 設(shè)備驅(qū)動開發(fā)(第 2 版)》書籍,這是一本介紹Linux內(nèi)核開發(fā)的指導(dǎo)性書籍。全面了解Linux內(nèi)核所提供的一些接口函
    發(fā)表于 01-10 22:08

    Linux驅(qū)動開發(fā)的必備知識

    內(nèi)核基礎(chǔ)知識: 1、熟悉 Linux 內(nèi)核的架構(gòu)、模塊系統(tǒng)、進程管理、內(nèi)存管理等。 了解內(nèi)核的編譯和加載過程。 2、C編程技能: 精
    發(fā)表于 12-04 07:58

    deepin亮相2025Linux內(nèi)核開發(fā)者大會

    11 月 1 日,第二十屆中國 Linux 內(nèi)核開發(fā)者大會(CLK)在深圳舉辦。CLK 作為國內(nèi) Linux 內(nèi)核領(lǐng)域極具影響力的峰會,由清華大學(xué)、Intel、華為、阿里云、富士通南大
    的頭像 發(fā)表于 11-05 17:59 ?831次閱讀

    【「Yocto項目實戰(zhàn)教程:高效定制嵌入式Linux系統(tǒng)」閱讀體驗】+基礎(chǔ)概念學(xué)習(xí)理解

    。為了對珠峰更了解些,開始接觸 Linux 系統(tǒng)開發(fā),并逐漸認(rèn)識到 Yocto 項目在定制嵌入式 Linux 系統(tǒng)方面的重要性。所以很想拜讀下此書。 二、書籍內(nèi)容概述 基礎(chǔ)知識 書中首先回顧了
    發(fā)表于 08-04 22:29

    國產(chǎn)!全志T113-i 雙核Cortex-A7@1.2GHz 工業(yè)開發(fā)板—Linux-RT應(yīng)用開發(fā)案例

    PREEMPT機制進行補丁。PREEMPT_RT補丁的關(guān)鍵是最小化不可搶占內(nèi)核代碼量,同時最小化必須更改的代碼量,以便提供這種附加的可搶占性。PREEMPT_RT補丁利用Linux
    的頭像 發(fā)表于 07-30 10:33 ?823次閱讀
    國產(chǎn)!全志T113-i 雙核Cortex-A7@1.2GHz 工業(yè)開發(fā)板—<b class='flag-5'>Linux</b>-RT應(yīng)用開發(fā)案例

    如何配置和驗證Linux內(nèi)核參數(shù)

    Linux系統(tǒng)運維和性能優(yōu)化,內(nèi)核參數(shù)(sysctl)的配置至關(guān)重要。合理的參數(shù)調(diào)整可以顯著提升網(wǎng)絡(luò)性能、系統(tǒng)穩(wěn)定性及資源利用率。然而,僅僅修改參數(shù)是不夠的,如何驗證這些參數(shù)是否生效同樣關(guān)鍵。
    的頭像 發(fā)表于 05-29 17:40 ?1164次閱讀

    Linux內(nèi)核編譯失???移動硬盤和虛擬機的那些事兒

    Linux開發(fā),編譯內(nèi)核是一項常見任務(wù),但不少開發(fā)者在移動硬盤或虛擬機環(huán)境下嘗試時會遭遇失敗。本文將簡要探討這些問題的成因,并介紹一些虛擬機使用技巧,幫助大家更好地應(yīng)對相關(guān)問題。在移
    的頭像 發(fā)表于 04-11 11:36 ?1003次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>編譯失???移動硬盤和虛擬機的那些事兒

    效果器的基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《效果器的基礎(chǔ)知識.doc》資料免費下載
    發(fā)表于 03-26 14:30 ?7次下載

    樹莓派4 性能大比拼:標(biāo)準(zhǔn)Linux與實時Linux 4.19內(nèi)核的延遲測試

    使用的是raspberrypi/linux倉庫的rpi-4.19.y-rt分支。同樣,在測試,我使用了實時Linux項目中的cyclictest程序。Cyclictest程序
    的頭像 發(fā)表于 03-25 09:39 ?823次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實時<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測試