chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

深度解讀Linux內(nèi)核printf冰山的秘密

Linux閱碼場(chǎng) ? 來源:csdn ? 作者:dog250 ? 2020-08-31 15:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近日在一次測(cè)試Linux內(nèi)核路由查找算法的過程中,發(fā)現(xiàn)一個(gè)printf語(yǔ)句竟然能將性能降低2/3。當(dāng)然,使用“竟然”一詞并不意味著這個(gè)問題是第一次發(fā)現(xiàn),我的想法是,把它記錄下來,讓沒有經(jīng)驗(yàn)的同學(xué)對(duì)printf知其所以然,同時(shí)導(dǎo)出我對(duì)“性能攸關(guān)”的這類算法中記錄日志的一個(gè)觀點(diǎn)。

聲明

我不會(huì)把大段的源代碼貼在文章中,而只是希望能通過闡述原理把我的意思表達(dá)清楚。誠(chéng)然,作為程序員沒有代碼好像一切都會(huì)很虛,不過同樣的,也是因?yàn)榇a,總是會(huì)把人逼進(jìn)死胡同,代碼只是一種實(shí)現(xiàn),理解了原理,作為一個(gè)懂編程的程序員,任何人都可以寫出一個(gè)自己的實(shí)現(xiàn)。
我會(huì)給出原理圖,但是這圖決不是我憑空想象的,來源在哪?當(dāng)然是UNIX的相關(guān)標(biāo)準(zhǔn)以及Linux的具體實(shí)現(xiàn)代碼。既然原理來自于Linux的代碼,為何不貼出來分析一下呢?要知道,代碼隨著Linux的內(nèi)核版本,C庫(kù)的版本以及應(yīng)用程序的版本變化而變化,不變的是思想!UNIX歷經(jīng)幾十年,其思想不還在指導(dǎo)著千千萬萬的程序員嗎?另外,有誰會(huì)去通讀Linux內(nèi)核代碼呢?對(duì)于大多數(shù)的人而言,如果想知道printf或者任何其它的接口的原理,肯定不會(huì)去擺開架勢(shì)做出一副要先了解Linux內(nèi)核架構(gòu),C庫(kù)架構(gòu)作為前置知識(shí),然后去跟蹤調(diào)試其實(shí)現(xiàn)。在以上這個(gè)過程中,你會(huì)把大量的精力消耗在理解不相關(guān)的內(nèi)容上,比如函數(shù)調(diào)用關(guān)系,層層嵌套的條件語(yǔ)句,或者調(diào)試器怎么使用,諸如此類。

關(guān)于printf

printf是一個(gè)接口,跟UNIX標(biāo)準(zhǔn)IO的write系統(tǒng)調(diào)用類似,但是更像C庫(kù)的fwrite,因?yàn)橥盗械暮瘮?shù)中還有一個(gè)fprintf(至于同系列其它的函數(shù),請(qǐng)自行man)。printf和fwrite的區(qū)別在于兩點(diǎn):

1.它可以格式化輸出,如果用fwrite,它接受的是一個(gè)固定的buffer,你不得不在調(diào)fwrite之前先使用sprintf之類的函數(shù)格式化buffer;

2.它免除了你的fopen-fwrite-fclose這個(gè)序列的調(diào)用,因?yàn)樗苯訉⒏袷交膬?nèi)容寫入U(xiǎn)NIX進(jìn)程自然打開的1號(hào)文件描述符,即標(biāo)準(zhǔn)輸出。

既然printf寫入了標(biāo)準(zhǔn)輸出,那么接下來就要定義什么是標(biāo)準(zhǔn)輸出。在早期UNIX年代,人們?cè)诮K端或者偽終端操作機(jī)器,那時(shí)的輸入基本都是鍵盤,磁帶更古老的東西,而輸出就是一個(gè)計(jì)算結(jié)果,需要展示出來給人看的那種,一般為終端屏幕,也可以是一條紙帶,那么程序怎么知道輸入和輸出到底是什么呢?這就需要程序明確指定。UNIX的“一切皆文件”思想以及“分離抽象”思想徹底改變了這一切。

UNIX定義了抽象文件描述符0,1,2分別為標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出。至于它們到底對(duì)應(yīng)什么設(shè)備,你可以在程序初始化的時(shí)候顯式重定向到任意設(shè)備,也可以在外部shell做類似的重定向,這樣就把指明設(shè)備這件事從程序分離了出來。

我為什么不統(tǒng)一說一下fwrite調(diào)用對(duì)程序性能的影響呢?因?yàn)樵撜{(diào)用之前你必須執(zhí)行fopen,而fopen的一個(gè)參數(shù)明確表示了你希望寫入的對(duì)象是什么,這就不會(huì)帶來異議,畢竟如果你非要在性能測(cè)試的時(shí)候?qū)慍F卡,那也是你愿意。printf就不同了,它對(duì)效率的影響取決于標(biāo)準(zhǔn)輸出是什么以及你是如何重定向標(biāo)準(zhǔn)輸出的,所謂的標(biāo)準(zhǔn)輸出并不是真實(shí)的設(shè)備,它只是一個(gè)抽象層,具體如何解釋標(biāo)準(zhǔn)輸出,還要依靠外部。

數(shù)據(jù)都去哪兒了

我以下面這個(gè)超級(jí)小的程序來說明printf的時(shí)候,數(shù)據(jù)都去哪了:

#include #include 
int main(int argc, char **argv){        int i = 0;        int c = atoi(argv[1]);        for(; i < c; i++) {                printf("############  %d
", i);        }        return 0;}

我先給出結(jié)果:
1.在/dev/tty1上直接執(zhí)行time ./test 1000
...
######### 995
######### 996
######### 997
######### 998
######### 999

real 0m0.414s
user 0m0.003s
sys 0m0.411s


2.在/dev/tty1上執(zhí)行time ./test 1000 >/dev/tty2
real 0m0.007s
user 0m0.003s
sys 0m0.007s

3.在SecureCRT上執(zhí)行time ./test 1000
...
######### 997
######### 998
######### 999

real 0m0.010s
user 0m0.002s
sys 0m0.003s


4.在SecureCRT上執(zhí)行time ./test 100000 >/dev/tty1,此時(shí)不切換tty
...
等了幾秒,無結(jié)果,于是在鍵盤按下Alt-F2,切換到第二個(gè)tty,馬上顯示出了結(jié)果:
real 0m4.276s
user 0m0.066s
sys 0m4.204s


5.在tty1上執(zhí)行time ./test 100000 >/dev/tty2:
real 0m0.499s
user 0m0.081s
sys 0m0.410s


6.在tty1上執(zhí)行time ./test 100000 >/dev/null
real 0m0.030s
user 0m0.028s
sys 0m0.001s

通過以上的結(jié)果數(shù)據(jù),我們可以得到以下的結(jié)論:

a.對(duì)于tty終端而言,如果當(dāng)前終端不是寫入的終端,那么開銷主要在內(nèi)核態(tài),且開銷不是很大;

b.對(duì)于tty終端而言,如果當(dāng)前終端是寫入的終端,那么開銷主要在內(nèi)核態(tài),且開銷很大;

c.對(duì)于不管是tty還是遠(yuǎn)程的pty終端,寫入/dev/null的開銷主要在用戶態(tài),開銷不大;

d.對(duì)于pty遠(yuǎn)程終端(/dev/pts/X),不管寫入的是不是當(dāng)前的pty終端,開銷主要在內(nèi)核態(tài),且開銷不是很大

e.對(duì)應(yīng)上面的結(jié)果和結(jié)論,下面給出一幅圖解,詳細(xì)解釋一下printf冰山下面的秘密:

我想上圖已經(jīng)很清楚了,如果不懂什么叫行規(guī)程(也叫線路規(guī)程)的話,請(qǐng)閱讀《UNIX環(huán)境高級(jí)編程》的終端和偽終端章節(jié),簡(jiǎn)單來說,它就是一個(gè)中間層,用來適配VFS接口和底層的具體驅(qū)動(dòng),比如解釋和處理控制字符等。從上面的圖中,我們可以看出,主要的開銷幾乎都集中在底層,而底層卻偏偏是我們不能控制或者很難控制的。之所以上面的測(cè)試?yán)又衧sh登錄的終端對(duì)test性能的測(cè)試效果良好,但是那是因?yàn)榫W(wǎng)絡(luò)環(huán)境好,你在一個(gè)64kbps相隔5k公里的線路上試一下。

小小的printf下面竟然藏著如此多的內(nèi)容,并且很可能就是它成了你的程序的性能瓶頸,因?yàn)樽畹讓拥挠绊懸蛩赝遣豢煽氐?。那么是不是就是意味著我要建議大家從來不用printf打印呢?或者說干脆就不要用標(biāo)準(zhǔn)輸出呢?并不是這樣。但是為何不把打印這種事交給本機(jī)的另一個(gè)進(jìn)程呢?事實(shí)上,幾乎所有的需要記錄日志的系統(tǒng)都是這么做的,而syslog則迎合了這個(gè)思想。這種思想的背后就是“用可控制的一次IPC替換不可控制冰山之下的茫茫深?!?/p>

關(guān)于日志記錄

日志記錄一直都是“薛定諤貓”式的東西,因?yàn)槿罩居涗涀鳛橐欢未a,它已經(jīng)是程序的一部分,不可能獨(dú)立地觀察程序的行為,如果說用鏡像系統(tǒng)的話,那么這種行為就是被動(dòng)的,你不得不鏡像每一條指令,以發(fā)現(xiàn)一些關(guān)鍵的信息,要想主動(dòng)記錄關(guān)鍵事件,必須用日志系統(tǒng)。打印日志可以方便信息獲取和審計(jì),但是代價(jià)有時(shí)也是高昂的:

1.你要設(shè)計(jì)一套日志回滾系統(tǒng),防止存儲(chǔ)空間被撐爆;

2.你要讓日志記錄盡快完成,不能降低關(guān)鍵路徑的性能;

3.你要反復(fù)調(diào)試代碼,確保日志記錄的緩沖區(qū)不會(huì)溢出;

4.為了讓日志更短,語(yǔ)言能力不好的人組織的日志就像電報(bào)一樣難以理解。

我認(rèn)為,日志記錄應(yīng)該遵循以下的原則:

1.除非必須要把事件發(fā)生的時(shí)間記錄下來,否則就用計(jì)數(shù)器代替日志記錄,一系列的事件映射成一系列的計(jì)數(shù)器,由用戶決定什么時(shí)候查看事件發(fā)生了。事實(shí)上,Linux的網(wǎng)絡(luò)子系統(tǒng)就是用的這種方式,所有的/proc/net/netstat就是這個(gè)查看接口。

2.一定要有一個(gè)日志級(jí)別控制選項(xiàng),用戶可以決定是否記錄日志,以及記錄的日志詳細(xì)到什么程度。

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

    關(guān)注

    88

    文章

    11760

    瀏覽量

    219047
  • Printf
    +關(guān)注

    關(guān)注

    0

    文章

    84

    瀏覽量

    14738

原文標(biāo)題:printf的歸宿-數(shù)據(jù)打印到哪兒了

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程調(diào)度到設(shè)備驅(qū)動(dòng)的定時(shí)檢查,都離不開它的身影。
    的頭像 發(fā)表于 02-04 16:27 ?826次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

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

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

    深度解析ES8389/ES8390/音頻芯片Linux驅(qū)動(dòng)(Linux6.1內(nèi)核

    基于 Linux6.1 內(nèi)核,從驅(qū)動(dòng)架構(gòu)、寄存器配置、核心函數(shù)、數(shù)據(jù)流走向四個(gè)維度,完整拆解 ES8389 的 Linux 驅(qū)動(dòng)實(shí)現(xiàn),幫你吃透這款芯片的驅(qū)動(dòng)邏輯。 ? ? 注意:在講解 rk3576 系列課程的視頻中有
    的頭像 發(fā)表于 02-02 11:37 ?1355次閱讀
    <b class='flag-5'>深度</b>解析ES8389/ES8390/音頻芯片<b class='flag-5'>Linux</b>驅(qū)動(dòng)(<b class='flag-5'>Linux</b>6.1<b class='flag-5'>內(nèi)核</b>)

    Linux系統(tǒng)內(nèi)核參數(shù)調(diào)優(yōu)實(shí)戰(zhàn)指南

    Linux 內(nèi)核參數(shù)調(diào)優(yōu)是系統(tǒng)性能優(yōu)化的核心環(huán)節(jié)。隨著云原生架構(gòu)的普及和硬件性能的飛速提升,默認(rèn)的內(nèi)核參數(shù)配置往往無法充分發(fā)揮系統(tǒng)潛力。在高并發(fā) Web 服務(wù)、大數(shù)據(jù)處理、容器化部署等場(chǎng)景下,合理的
    的頭像 發(fā)表于 01-28 14:27 ?452次閱讀

    深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    ,背后都離不開內(nèi)核調(diào)度算法的精準(zhǔn)操控。今天,我們就從優(yōu)先級(jí)、調(diào)度算法、時(shí)間片分配到底層實(shí)現(xiàn),全方位拆解Linux內(nèi)核進(jìn)程調(diào)度的核心邏輯。 一、進(jìn)程調(diào)度的“身份標(biāo)識(shí)”:優(yōu)先級(jí)與分類 要理解調(diào)度邏輯,首先得搞懂:進(jìn)程憑什么“插隊(duì)”?
    的頭像 發(fā)表于 12-24 07:05 ?4314次閱讀
    深入<b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

    Linux內(nèi)核日志玩明白了嗎?printk調(diào)試神器全解析

    前言:做Linux驅(qū)動(dòng)開發(fā)或內(nèi)核調(diào)試的朋友,一定對(duì)printk不陌生,但你真的會(huì)用它嗎?為什么同樣是調(diào)試RK3588內(nèi)核,別人能精準(zhǔn)捕捉關(guān)鍵錯(cuò)誤,你卻被海量日志淹沒?今天就帶大家吃透printk
    的頭像 發(fā)表于 12-19 08:32 ?864次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>日志玩明白了嗎?printk調(diào)試神器全解析

    基于 DR1M90 的 Linux-RT 內(nèi)核開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    本手冊(cè)由創(chuàng)龍科技研發(fā),針對(duì) DR1M90,詳述 Linux-RT 實(shí)時(shí)內(nèi)核開發(fā):含實(shí)時(shí)性測(cè)試(LinuxLinux-RT 對(duì)比、CPU 空載 / 滿負(fù)荷 / 隔離狀態(tài)測(cè)試)、
    的頭像 發(fā)表于 12-02 10:38 ?1186次閱讀
    基于 DR1M90 的 <b class='flag-5'>Linux</b>-RT <b class='flag-5'>內(nèi)核</b>開發(fā):從編譯配置到 GPIO / 按鍵應(yīng)用實(shí)現(xiàn)(1)

    Linux內(nèi)核printk日志級(jí)別全解析:從參數(shù)解讀到實(shí)操配置

    一、開篇:一個(gè)命令引出的核心問題 在?Linux?終端執(zhí)行?cat /proc/sys/kernel/printk,你可能會(huì)看到這樣的輸出: 這串?dāng)?shù)字不是隨機(jī)的,而是內(nèi)核日志系統(tǒng)的“核心配置開關(guān)
    的頭像 發(fā)表于 11-20 15:54 ?1707次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>printk日志級(jí)別全解析:從參數(shù)<b class='flag-5'>解讀</b>到實(shí)操配置

    deepin亮相2025中國(guó)Linux內(nèi)核開發(fā)者大會(huì)

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

    Linux系統(tǒng)性能優(yōu)化技巧

    經(jīng)過10年一線運(yùn)維經(jīng)驗(yàn),我發(fā)現(xiàn)大多數(shù)工程師只掌握了Linux優(yōu)化的冰山一角。今天分享的這些秘技,能讓你的系統(tǒng)性能提升200%以上!
    的頭像 發(fā)表于 08-27 14:34 ?970次閱讀

    Linux內(nèi)核參數(shù)調(diào)優(yōu)方案

    在高并發(fā)微服務(wù)環(huán)境中,網(wǎng)絡(luò)性能往往成為K8s集群的瓶頸。本文將深入探討如何通過精細(xì)化的Linux內(nèi)核參數(shù)調(diào)優(yōu),讓你的K8s節(jié)點(diǎn)網(wǎng)絡(luò)性能提升30%以上。
    的頭像 發(fā)表于 08-06 17:50 ?959次閱讀

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

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

    手把手教你如何調(diào)優(yōu)Linux網(wǎng)絡(luò)參數(shù)

    在高并發(fā)網(wǎng)絡(luò)服務(wù)場(chǎng)景中,Linux內(nèi)核的默認(rèn)網(wǎng)絡(luò)參數(shù)往往無法滿足需求,導(dǎo)致性能瓶頸、連接超時(shí)甚至服務(wù)崩潰。本文基于真實(shí)案例分析,從參數(shù)解讀、問題診斷到優(yōu)化實(shí)踐,手把手教你如何調(diào)優(yōu)Linux
    的頭像 發(fā)表于 05-29 09:21 ?978次閱讀

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

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

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

    引言本文是對(duì)我之前關(guān)于RaspberryPi3同一主題的帖子的更新。與之前的帖子一樣,我使用的是隨Raspbian鏡像提供的標(biāo)準(zhǔn)內(nèi)核,以及應(yīng)用了RT補(bǔ)丁的相似內(nèi)核版本。對(duì)于實(shí)時(shí)版,我
    的頭像 發(fā)表于 03-25 09:39 ?818次閱讀
    樹莓派4 性能大比拼:標(biāo)準(zhǔn)<b class='flag-5'>Linux</b>與實(shí)時(shí)<b class='flag-5'>Linux</b> 4.19<b class='flag-5'>內(nèi)核</b>的延遲測(cè)試