色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

把進程綁定到某個 CPU 上運行是怎么實現?

Linux愛好者 ? 來源:Linux內核那些事 ? 作者:songsong001 ? 2021-07-02 09:55 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

昨天在群里有朋友問:把進程綁定到某個 CPU 上運行是怎么實現的。

首先,我們先來了解下將進程與 CPU 進行綁定的好處。

進程綁定 CPU 的好處:在多核 CPU 結構中,每個核心有各自的L1、L2緩存,而L3緩存是共用的。如果一個進程在核心間來回切換,各個核心的緩存命中率就會受到影響。相反如果進程不管如何調度,都始終可以在一個核心上執行,那么其數據的L1、L2 緩存的命中率可以顯著提高。

所以,將進程與 CPU 進行綁定可以提高 CPU 緩存的命中率,從而提高性能。而進程與 CPU 綁定被稱為:CPU 親和性。

設置進程的 CPU 親和性前面介紹了進程與 CPU 綁定的好處后,現在來介紹一下在 Linux 系統下怎么將進程與 CPU 進行綁定的(也就是設置進程的 CPU 親和性)。

Linux 系統提供了一個名為 sched_setaffinity 的系統調用,此系統調用可以設置進程的 CPU 親和性。我們來看看 sched_setaffinity 系統調用的原型:

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

下面介紹一下 sched_setaffinity 系統調用各個參數的作用:

pid:進程ID,也就是要進行綁定 CPU 的進程ID。

cpusetsize:mask 參數所指向的 CPU 集合的大小。

mask:與進程進行綁定的 CPU 集合(由于一個進程可以綁定到多個 CPU 上運行)。

參數 mask 的類型為 cpu_set_t,而 cpu_set_t 是一個位圖,位圖的每個位表示一個 CPU。:

例如,將 cpu_set_t 的第0位設置為1,表示將進程綁定到 CPU0 上運行,當然我們可以將進程綁定到多個 CPU 上運行。

我們通過一個例子來介紹怎么通過 sched_setaffinity 系統調用來設置進程的 CPU 親和性:

#define _GNU_SOURCE#include 《sched.h》#include 《stdio.h》#include 《string.h》#include 《stdlib.h》#include 《unistd.h》#include 《errno.h》int main(int argc, char **argv)

{

cpu_set_t cpuset;

CPU_ZERO(&cpuset); // 初始化CPU集合,將 cpuset 置為空

CPU_SET(2, &cpuset); // 將本進程綁定到 CPU2 上

// 設置進程的 CPU 親和性

if (sched_setaffinity(0, sizeof(cpuset), &cpuset) == -1) {

printf(“Set CPU affinity failed, error: %s

”, strerror(errno));

return -1;

}

return 0;

}

CPU 親和性實現知道怎么設置進程的 CPU 親和性后,現在我們來分析一下 Linux 內核是怎樣實現 CPU 親和性功能的。

本文使用的 Linux 內核版本為 2.6.23

Linux 內核為每個 CPU 定義了一個類型為 struct rq 的 可運行的進程隊列,也就是說,每個 CPU 都擁有一個獨立的可運行進程隊列。

一般來說,CPU 只會從屬于自己的可運行進程隊列中選擇一個進程來運行。也就是說,CPU0 只會從屬于 CPU0 的可運行隊列中選擇一個進程來運行,而絕不會從 CPU1 的可運行隊列中獲取。

所以,從上面的信息中可以分析出,要將進程綁定到某個 CPU 上運行,只需要將進程放置到其所屬的 可運行進程隊列 中即可。

下面我們來分析一下 sched_setaffinity 系統調用的實現,sched_setaffinity 系統調用的調用鏈如下:

sys_sched_setaffinity()

└→ sched_setaffinity()

└→ set_cpus_allowed()

└→ migrate_task()

從上面的調用鏈可以看出,sched_setaffinity 系統調用最終會調用 migrate_task 函數來完成進程與 CPU 進行綁定的工作,我們來分析一下 migrate_task 函數的實現:

static int

migrate_task(struct task_struct *p, int dest_cpu, struct migration_req *req)

{

struct rq *rq = task_rq(p);

// 情況1:

// 如果進程還沒有在任何運行隊列中

// 那么只需要將進程的 cpu 字段設置為 dest_cpu 即可

if (!p-》se.on_rq && !task_running(rq, p)) {

set_task_cpu(p, dest_cpu);

return 0;

}

// 情況2:

// 如果進程已經在某一個 CPU 的可運行隊列中

// 那么需要將進程從之前的 CPU 可運行隊列中遷移到新的 CPU 可運行隊列中

// 這個遷移過程由 migration_thread 內核線程完成

// 構建進程遷移請求

init_completion(&req-》done);

req-》task = p;

req-》dest_cpu = dest_cpu;

list_add(&req-》list, &rq-》migration_queue);

return 1;

}

我們先來介紹一下 migrate_task 函數各個參數的意義:

p:要設置 CPU 親和性的進程描述符。

dest_cpu:綁定的 CPU 編號。

req:進程遷移請求對象(下面會介紹)。

所以,migrate_task 函數的作用就是將進程描述符為 p 的進程綁定到編號為 dest_cpu 的目標 CPU 上。

migrate_task 函數主要分兩種情況來將進程綁定到某個 CPU 上:

情況1:如果進程還沒有在任何 CPU 的可運行隊列中(不可運行狀態),那么只需要將進程描述符的 cpu 字段設置為 dest_cpu 即可。當進程變為可運行時,會根據進程描述符的 cpu 字段來自動放置到對應的 CPU 可運行隊列中。

情況2:如果進程已經在某個 CPU 的可運行隊列中,那么需要將進程從之前的 CPU 可運行隊列中遷移到新的 CPU 可運行隊列中。遷移過程由 migration_thread 內核線程完成,migrate_task 函數只是構建一個進程遷移請求,并通知 migration_thread 內核線程有新的遷移請求需要處理。

而進程遷移過程由 __migrate_task 函數完成,我們來看看 __migrate_task 函數的實現:

static int

__migrate_task(struct task_struct *p, int src_cpu, int dest_cpu)

{

struct rq *rq_dest, *rq_src;

int ret = 0, on_rq;

。。。

rq_src = cpu_rq(src_cpu); // 進程所在的原可運行隊列

rq_dest = cpu_rq(dest_cpu); // 進程希望放置的目標可運行隊列

。。。

on_rq = p-》se.on_rq; // 進程是否在可運行隊列中(可運行狀態)

if (on_rq)

deactivate_task(rq_src, p, 0); // 把進程從原來的可運行隊列中刪除

set_task_cpu(p, dest_cpu);

if (on_rq) {

activate_task(rq_dest, p, 0); // 把進程放置到目標可運行隊列中

。。。

}

。。。

return ret;

}

__migrate_task 函數主要完成以下兩個工作:

把進程從原來的可運行隊列中刪除。

把進程放置到目標可運行隊列中。

其工作過程如下圖所示(將進程從 CPU0 的可運行隊列遷移到 CPU3 的可運行隊列中):

如上圖所示,進程原本在 CPU0 的可運行隊列中,但由于重新將進程綁定到 CPU3,所以需要將進程從 CPU0 的可運行隊列遷移到 CPU3 的可運行中。

遷移過程首先將進程從 CPU0 的可運行隊列中刪除,然后再將進程插入到 CPU3 的可運行隊列中。

當 CPU 要運行進程時,首先從它所屬的可運行隊列中挑選一個進程,并將此進程調度到 CPU 中運行。

總結從上面的分析可知,其實將進程綁定到某個 CPU 只是將進程放置到 CPU 的可運行隊列中。

由于每個 CPU 都有一個可運行隊列,所以就有可能會出現 CPU 間可運行隊列負載不均衡問題。如 CPU0 可運行隊列中的進程比 CPU1 可運行隊列多非常多,從而導致 CPU0 的負載非常高,而 CPU1 負載非常低的情況。

當出現上述情況時,就需要對 CPU 間的可運行隊列進行重平衡操作,有興趣的可以自行閱讀源碼或參考相關資料。

編輯:jq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1416

    瀏覽量

    41484
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11087

    瀏覽量

    217288
  • Linux
    +關注

    關注

    87

    文章

    11518

    瀏覽量

    213993

原文標題:圖解:進程怎么綁定 CPU

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    STM32IDE如何設定代碼ITCM中運行

    摸索到了如何將變量定義某個地址,但是不清楚如何讓代碼在指定RAM中運行。按照設定變量的方式設定代碼,程序直接進入了異常中斷{:16:}。
    發表于 06-24 06:45

    Linux后臺進程管理詳解

    當我們在終端或控制臺工作時,可能不希望由于運行一個作業而占住了屏幕,因為可能還有更重要的事情要做,比如閱讀電子郵件。對于密集訪問磁盤的進程,我們更希望它能夠在每天的非負荷高峰時間段運行(例如凌晨)。為了使這些
    的頭像 發表于 04-25 11:04 ?436次閱讀
    Linux后臺<b class='flag-5'>進程</b>管理詳解

    無法在iMX8啟動gpsd:GPSD綁定怎么解決?

    3.19) gpsd:錯誤:無法綁定 IPv4 端口 gpsd,地址已在使用 gpsd:ERROR: 也許 gpsd 已經在運行了! gpsd:錯誤:無法綁定
    發表于 04-04 07:58

    請問如何在Python中實現多線程與多進程的協作?

    () thread.join() process.join() 我的問題是:**如何合理地組合多線程和多進程以獲得更好的性能?**特別是在I/O密集型任務和CPU密集型任務混合的情況下,如何避免性能瓶頸,確保程序的高效運行? 希
    發表于 03-11 06:57

    CPU怎么降頻 bios中如何cpu調低頻率

    CPU降頻是一種有效的節能措施,同時也有助于降低設備的溫度和功耗,提高系統的穩定性和使用壽命。以下將詳細介紹如何在操作系統中、BIOS設置里以及使用第三方軟件來實現CPU降頻。 一、在操作系統中降低
    的頭像 發表于 02-01 15:02 ?2w次閱讀

    深入解析Linux程序與進程

    關于某個數據集合的一次運行活動。作為系統進行資源分配和調度的基本單位,是操作系統結構的基礎。 程序與進程的關系 進程的狀態 基礎進程狀態 創
    的頭像 發表于 12-18 11:01 ?496次閱讀
    深入解析Linux程序與<b class='flag-5'>進程</b>

    Linux之CPU調度策略和CPU親和性

    一、調度策略 調度進程 單個 CPU一次只能執行一個進程,雖然 Linux 系統通過使用多任務同時處理多個進程,但當多個進程同時
    的頭像 發表于 12-05 16:38 ?1142次閱讀
    Linux之<b class='flag-5'>CPU</b>調度策略和<b class='flag-5'>CPU</b>親和性

    fpga 管腳不讓綁定的問題,綁定時提示: Not assignable

    fpga 管腳不讓綁定的--提示 如下圖: 網上說將復用管腳設置成 普通I/O,我這也沒找到我要綁定的管腳,怎么設置。該管腳是和NOR_Flash相關的,無法綁定,我想實現掉電存儲一些
    發表于 12-05 15:30

    怎么綁定IP地址和MAC地址

    本篇文章主要說一說怎么在本地計算機上綁定IP和MAC地址以及通過路由器綁定IP和MAC地址,并且這兩者綁定可以解決什么問題。 ? 先來說說怎么去綁定 本地計算上
    的頭像 發表于 12-01 22:48 ?1423次閱讀

    程序和進程的區別

    比如: 開發寫的代碼我們稱為程序,那么將開發的代碼運行起來。我們稱為進程
    的頭像 發表于 11-25 16:03 ?1263次閱讀
    程序和<b class='flag-5'>進程</b>的區別

    一文搞懂Linux進程的睡眠和喚醒

    的代碼和數據,進而去執行這個進程。下面列舉了一些進程狀態: 注意:沒有+時,默認是后臺進程 進程調度(進程狀態切換)
    發表于 11-04 15:15

    【軟件干貨】Android應用進程如何保活?

    在Android應用程序中,為了保證應用的正常運行和穩定性,有時需要對應用進程進行保活。以下是一些實現進程保活的方法:
    的頭像 發表于 10-15 17:05 ?1238次閱讀
    【軟件干貨】Android應用<b class='flag-5'>進程</b>如何保活?

    TLV320AIC3104接在高通的CPU,采集的效果很差,為什么?

    我們TLV320AIC3104接在海思的CPU,在PCB設計的時候也沒有太注意,感覺效果還好,能接受,TLV320AIC3104接在高通的C
    發表于 10-15 07:49

    CPU時鐘周期的組成和作用

    CPU時鐘周期是計算機體系結構中一個至關重要的概念,它直接關聯CPU運行速度和性能。以下是對CPU時鐘周期的定義、組成和作用的詳細解析。
    的頭像 發表于 09-26 15:32 ?1952次閱讀

    機智云智家APP的設備掃描與綁定限制

    版應用,旨在實現對智能設備的管理和控制。通過智家APP,用戶可以方便地與支持的設備進行互動,享受智能家居帶來的便利。然而,綁定設備的能力并非對所有用戶開放。Q綁定設備的條件
    的頭像 發表于 09-22 08:02 ?605次閱讀
    機智云智家APP的設備掃描與<b class='flag-5'>綁定</b>限制
    主站蜘蛛池模板: 国产精品99AV在线观看 | 国产视频这里只有精品 | 空姐内射出白浆10p 空姐厕所啪啪啪 | 韩国伦理电影在线神马网 | 亚洲 日韩经典 中文字幕 | 丰满的女友1在线观看 | 男女后进式猛烈xx00动态图片 | 2017最新伦理伦理片67 | 亚欧免费观看在线观看更新 | 久久精品热在线观看85 | 大香伊蕉在人线国产最新 | 中国老太性色xxxxxhd | 国产成人在线视频 | 久久欧洲AV无码精品色午夜麻豆 | 亚洲国产精品无码2019 | 亚洲AV无码乱码国产麻豆P | 成人18视频在线 | 无码成A毛片免费 | 中文字幕天堂久久精品 | 边摸边吃奶边做带声音 | 亚洲伊人久久大香线蕉综合图片 | 草莓湿漉漉是好事还是恶性 | 久久免费精品国产72精品剧情 | 毛片视频大全 | 国产精品久久久久久久人热 | 在线涩涩免费观看国产精品 | 日本wwwxx爽69护士 | 撕开美女的衣服2 | 老司机亚洲精品影院在线观看 | 国产婷婷午夜精品无码A片 国产婷婷色综合AV蜜臀AV | 亚洲免费在线观看视频 | 亚洲高清视频在线观看 | 国产精品1区在线播放 | bl高h文合集| 国内精品久久久久影院男同志 | 成人久久欧美日韩一区二区三区 | 在线播放毛片 | 成人免费一区二区无码视频 | 啊…嗯啊好深男男小黄文 | qvod电影| 久久久久久久久性潮 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品