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

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

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

Linux環(huán)境編程必須搞懂的幾個(gè)概念

dyquk4xk2p3d ? 來源:良許Linux ? 2023-02-12 16:57 ? 次閱讀

Linux環(huán)境編程對(duì)于初學(xué)者來說,必須深刻理解重點(diǎn)概念才能更好地編寫代碼,實(shí)現(xiàn)業(yè)務(wù)功能,下面就幾個(gè)重要的及常用的知識(shí)點(diǎn)進(jìn)行說明。搞懂這幾個(gè)概念后以免在將來的編碼出現(xiàn)混淆。

系統(tǒng)調(diào)用

所有的操作系統(tǒng)在其內(nèi)核里都有一些內(nèi)建的函數(shù),這些函數(shù)可以用來完成一些系統(tǒng)級(jí)別的功能。在Linux系統(tǒng)使用的這樣的函數(shù)叫做“系統(tǒng)調(diào)用”,英文是systemcall。這些函數(shù)代表了從用戶空間到內(nèi)核空間的一種轉(zhuǎn)換。

系統(tǒng)調(diào)用是Linux操作系統(tǒng)提供的服務(wù),是編寫應(yīng)用程序與內(nèi)核之間通信接口,也就是我們所說的函數(shù)。相對(duì)于普通的函數(shù)調(diào)用來說,系統(tǒng)調(diào)用的性能消耗相對(duì)來說是大的。所以在程序追求性能的同時(shí),盡量避免系統(tǒng)調(diào)用。

用戶態(tài)的程序默認(rèn)是通過棧來傳遞參數(shù)的。而對(duì)于系統(tǒng)調(diào)用來說,內(nèi)核態(tài)和用戶態(tài)使用的是不同的棧,這使得系統(tǒng)調(diào)用的參數(shù)只能通過寄存器的方式進(jìn)行傳遞。

IO操作

什么是IO,通俗來講就是輸入輸出

IO分為標(biāo)準(zhǔn)IO和文件IO,我們常用的scanf、printf、getchar、putchar、gets、puts這些都是標(biāo)準(zhǔn)輸入輸出。Linux系統(tǒng)下一切皆文件的概念,所以在linux下的編程中對(duì)文件的IO操作有標(biāo)準(zhǔn)IO和文件IO兩種操作類型。標(biāo)準(zhǔn)IO是帶緩沖的IO屬于庫(kù)函數(shù),文件IO是不帶緩沖的屬于系統(tǒng)調(diào)用。

標(biāo)準(zhǔn)IO:

1.標(biāo)準(zhǔn)IO是由ANSIC標(biāo)準(zhǔn)定義

2.跨平臺(tái),可以在windows下運(yùn)行,也可以在Linux下運(yùn)行

3.通過緩沖機(jī)制來減少系統(tǒng)調(diào)用,實(shí)現(xiàn)更高的效率

4.文件流 標(biāo)準(zhǔn)IO用結(jié)構(gòu)體類型來存放文件的相關(guān)信息,標(biāo)準(zhǔn)IO所有操作圍繞著FILE來操作。

文件IO:

1.文件IO是POSIX提供的一組函數(shù)

2.只能運(yùn)行在可移植操作系統(tǒng)中,不能跨平臺(tái)

3.沒有緩沖機(jī)制

4.文件描述符是一個(gè)非負(fù)整數(shù),每打開一個(gè)文件,系統(tǒng)會(huì)自動(dòng)分配一個(gè)文件描述符(即從系統(tǒng)最小的且沒有被用的描述符來分配)

原子操作

原子在化學(xué)課程中是不可再分的顆粒。而對(duì)于Linux系統(tǒng)來說所謂原子操作是為了確保對(duì)一個(gè)整型數(shù)據(jù)的更改具有排他性。原子操作就是要么不執(zhí)行,一旦執(zhí)行就會(huì)執(zhí)行完成,是不可被打斷的一個(gè),或一系列的動(dòng)作,即在完成任務(wù)前不會(huì)被其他事件所打斷,就像原子不可被分割成顆粒一樣。單處理中,可以用單條指令完成的指令可以被看成是一個(gè)原子操作。軟件中的原子操作依賴于硬件原子操作的支持。當(dāng)然原子操作,也可以當(dāng)引用計(jì)數(shù)使用。

原子操作其實(shí)本質(zhì)上和鎖實(shí)現(xiàn)同樣的功能,都是為了保護(hù)共享對(duì)象,它具有原子性,和順序性。原子性確保指令執(zhí)行期間不被打斷,要么全部執(zhí)行,要么根本不執(zhí)行。而順序性確保即使兩條或多條指令出現(xiàn)在獨(dú)立的執(zhí)行線程中,甚至獨(dú)立的處理器上,它們本該執(zhí)行的順序依然要保持。

線程安全

所謂線程安全,就是指代碼可以在多線程環(huán)境下安全地執(zhí)行,輸出我們想要的結(jié)果。即符合正確的邏輯,是程序員期望的正常執(zhí)行結(jié)果。為了實(shí)現(xiàn)線程安全,Linux系統(tǒng)提供一些列的方法,或者只能使用局部變量或資源,或者就是利用鎖等同步機(jī)制,來實(shí)現(xiàn)全局變量或資源的訪問。

線程安全在Linux環(huán)境編程中極其重要,我們不僅要了解概念,更重要的是要在實(shí)際的編程中學(xué)會(huì)實(shí)現(xiàn)線程安全方式。下面來看一個(gè)簡(jiǎn)單的例子:

#include
#include
#include

staticintnCnt=0;

void*Thread(void*arg)
{
for(inti=0;i

大家看出上面例子的問題了嗎?

對(duì),沒錯(cuò),在此例子中我們創(chuàng)建了兩個(gè)線程,線程函數(shù)是同一個(gè)函數(shù),在線程函數(shù)中是對(duì)全局變量nCnt的自增操作。這個(gè)例子中輸出結(jié)果和我們想要的是不一樣,就是因?yàn)閚Cnt執(zhí)行指令并不是原子的,兩個(gè)個(gè)線程對(duì)nCnt的并發(fā)訪問出現(xiàn)了問題。我們利用鎖就可以解決此問題。

阻塞與非阻塞

Linux環(huán)境編程中的阻塞與非阻塞,都是指I/O操作。而所有的I/O系統(tǒng)調(diào)用默認(rèn)都是阻塞的。那什么是阻塞?阻塞的系統(tǒng)調(diào)用是指當(dāng)進(jìn)行系統(tǒng)調(diào)用時(shí)除非出錯(cuò)或被信號(hào)打斷,那么系統(tǒng)調(diào)用將會(huì)一直陷入內(nèi)核態(tài)直到調(diào)用完成。非阻塞的系統(tǒng)調(diào)用是指無論I/O操作成功與否,調(diào)用都會(huì)立刻返回。阻塞和非阻塞IO是訪問設(shè)備的兩種模式,驅(qū)動(dòng)程序可以靈活的支持這兩種用戶空間對(duì)設(shè)備的訪問方式。

阻塞操作是指在執(zhí)行操作時(shí),若不能獲得資源,則阻塞進(jìn)程直到滿足條件再進(jìn)行操作。被阻塞的進(jìn)程進(jìn)入睡眠狀態(tài),被調(diào)度器的運(yùn)行隊(duì)列移走,直到等待的條件滿足

非阻塞是指在進(jìn)行操作時(shí),若不能獲得資源,他要么放棄,要么返回后重新查詢,直到可以進(jìn)行操作為止。

當(dāng)數(shù)據(jù)準(zhǔn)備好時(shí)二者的模式相同,即IO操作都是將進(jìn)程阻塞,直到IO操作完成

阻塞、非阻塞是設(shè)備文件、網(wǎng)絡(luò)文件的屬性

同步與異步

同步與異步,也是指I/O操作。POSIX定義如下:A synchronous I/O operation causes the requesting process to beblocked until that I/O operation completes An asynchronous I/O operation does not cause the requesting processto be blocked

兩者的區(qū)別就在于同步IO做IO操作時(shí)會(huì)將進(jìn)程阻塞,而異步IO做IO操作時(shí)不會(huì)阻塞進(jìn)程

當(dāng)把阻塞、非阻塞、同步和異步放在一起時(shí),難免會(huì)出現(xiàn)混淆。同步是否就是阻塞,異步是否就是非阻塞?實(shí)際上在I/O操作中,它們是不同的概念。同步既可以是阻塞的,也可以是非阻塞的,而常用的Linux的I/O調(diào)用實(shí)際上都是同步的。這里的同步和異步,是指I/O數(shù)據(jù)的復(fù)制工作是否同步執(zhí)行。

以系統(tǒng)調(diào)用read為例。阻塞的read會(huì)一直陷入內(nèi)核態(tài)直到read返回;而非阻塞的read在數(shù)據(jù)未準(zhǔn)備就緒時(shí),會(huì)直接返回,而當(dāng)有數(shù)據(jù)時(shí),非阻塞的read同樣會(huì)一直陷入內(nèi)核態(tài),直到read完成。這個(gè)read就是同步的操作, 即I/O的完成是在當(dāng)前執(zhí)行流程下同步完成的。如果是異步,則I/O操作不是隨系統(tǒng)調(diào)用同步完成的。調(diào)用返回后,I/O操作并沒有完成,而是由操作系統(tǒng)或者某個(gè)線程負(fù)責(zé)真正的I/O操作,等完成后通知原來的線程

審核編輯:湯梓紅

聲明:本文內(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)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8254

    瀏覽量

    149943
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207894
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122731
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3521

    瀏覽量

    93263
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965

原文標(biāo)題:Linux環(huán)境編程必須搞懂的幾個(gè)概念

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    分析EMC問題必須掌握的幾個(gè)基本概念

    產(chǎn)品的電源線或信號(hào)線上。其實(shí)質(zhì)也是共模干擾。與EMC相關(guān)的幾個(gè)基本概念先舉幾個(gè)個(gè)例子:1、一個(gè)產(chǎn)品帶LED顯示,在考慮EMC設(shè)計(jì)(主要是ESD)時(shí),我們常常會(huì)在LED上并連一個(gè)102貼片陶瓷電容。為什么?2
    發(fā)表于 12-01 20:41

    C語言編程入門(linux環(huán)境)

    消息管理 …………………………………………………………………………39第七章 線程操作 …………………………………………………………………………49第八章 網(wǎng)絡(luò)編程 …………………………………………………………………………54第九章 Linux 下 C 開發(fā)工具介紹 …
    發(fā)表于 12-19 13:57

    Linux平臺(tái)搭建與環(huán)境熟悉

    環(huán)境、系統(tǒng)編程以及網(wǎng)絡(luò)編程,熟悉C++、QT編程并且深刻體會(huì)整個(gè)嵌入式Linux項(xiàng)目開發(fā)流程,強(qiáng)化學(xué)員對(duì)
    發(fā)表于 05-19 08:30

    從哪幾個(gè)方面入手去學(xué)習(xí)linux嵌入式編程開發(fā)呢

    的疑問,學(xué)習(xí)時(shí)有很多的困難,在這里小編就來讓你們迅速學(xué)會(huì)linux嵌入式編程開發(fā)。linux嵌入式編程開發(fā)學(xué)習(xí)時(shí),你要從這幾個(gè)方面來下手,首
    發(fā)表于 12-22 08:11

    LINUX環(huán)境編程指南資料合集

    資料簡(jiǎn)介:第 1 章著重介紹整個(gè) Linux編程環(huán)境,包括如何安裝 Linux 系統(tǒng),以及如何使用 Shell 來操作你的系統(tǒng),在這一章中還給大家詳細(xì)介紹了
    發(fā)表于 07-11 15:30

    Linux編程白皮書(pdf下載)

    Linux編程白皮書》是由一群Linux高手所寫的,它由五個(gè)部分組成——是Linux文檔工程的一個(gè)印刷版本。該書描述了關(guān)鍵的設(shè)計(jì)概念,以及
    發(fā)表于 09-10 11:32 ?653次下載
    <b class='flag-5'>Linux</b><b class='flag-5'>編程</b>白皮書(pdf下載)

    linux下c語言編程pdf

    linux下c語言編程內(nèi)容為::基礎(chǔ)知識(shí),進(jìn)程介紹,文件操作,時(shí)間概念,信號(hào)處理,消息管理,線程操作,網(wǎng)絡(luò)編程,Linux 下C 開發(fā)工具介
    發(fā)表于 12-08 10:00 ?0次下載

    幾個(gè)RT-Linux 源碼

    幾個(gè)RT-Linux 源碼
    發(fā)表于 01-08 14:27 ?11次下載

    開關(guān)電源EMC必須掌握的幾個(gè)概念

    開關(guān)電源EMC必須掌握的幾個(gè)概念
    發(fā)表于 01-14 12:13 ?34次下載

    串口編程參考資料 linux環(huán)境下的

    串口編程參考資料 linux環(huán)境下的
    發(fā)表于 10-24 14:39 ?8次下載
    串口<b class='flag-5'>編程</b>參考資料 <b class='flag-5'>linux</b><b class='flag-5'>環(huán)境</b>下的

    精通嵌入式Linux編程—構(gòu)造自己的GUI環(huán)境

    精通嵌入式Linux編程—構(gòu)造自己的GUI環(huán)境
    發(fā)表于 10-30 09:04 ?16次下載
    精通嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>編程</b>—構(gòu)造自己的GUI<b class='flag-5'>環(huán)境</b>

    LINUX系統(tǒng)教程之如何在Linux系統(tǒng)下進(jìn)行編程

    本文檔的主要內(nèi)容詳細(xì)介紹的是LINUX系統(tǒng)教程之如何在Linux系統(tǒng)下進(jìn)行編程主要內(nèi)容包括了:程序開發(fā)過程 ,Linux編程
    發(fā)表于 12-18 19:09 ?9次下載

    LINUX環(huán)境編程圖文指南的PDF電子書免費(fèi)下載

    本書從零開始,循序漸進(jìn)地攻破Linux環(huán)境編程所遇到的各級(jí)關(guān)卡,以圖文并茂的形式幫助讀者理解各個(gè)概念。本書內(nèi)容翔實(shí),囊括了Linux系統(tǒng)操作
    發(fā)表于 06-08 08:00 ?0次下載
    <b class='flag-5'>LINUX</b><b class='flag-5'>環(huán)境</b><b class='flag-5'>編程</b>圖文指南的PDF電子書免費(fèi)下載

    關(guān)于電磁兼容必須搞懂的幾件事,你了解嗎

    你了解電磁兼容必須搞懂的幾件事嗎?其實(shí),往往在學(xué)習(xí)電磁兼容的過程中,不能忘記我們的初衷。所以,在學(xué)習(xí)之前,有些基本要點(diǎn)必須搞懂。下面給大家分享一下實(shí)用常識(shí),能對(duì)各位工程師有所幫助! 1
    的頭像 發(fā)表于 10-30 18:16 ?433次閱讀

    Linux環(huán)境編程:從應(yīng)用到內(nèi)核

    Linux環(huán)境編程:從應(yīng)用到內(nèi)核資料下載。
    發(fā)表于 06-01 14:51 ?16次下載