目錄
#系統呼叫" >#系統呼叫
IO操作" >IO操作
原子操作" >原子操作
线程安全" >线程安全
阻塞与非阻塞" >阻塞与非阻塞
同步与异步" >同步与异步
首頁 系統教程 Linux Linux環境程式設計必須搞懂的幾個概念

Linux環境程式設計必須搞懂的幾個概念

Feb 15, 2024 am 08:03 AM
linux linux教程 linux系統 linux作業系統 並發訪問 linux指令 shell腳本 同步機制 overflow 嵌入式linux linux入門 linux學習

對於初學者來說,要想在 Linux 環境下編程,必須深入理解一些重要概念才能更好地編寫程式碼,實現業務功能。以下我們將介紹幾個重要且常用的知識點。掌握這些概念可以避免在未來的編碼中出現混淆。

Linux環境程式設計必須搞懂的幾個概念

#系統呼叫

#「

#❝

所有作業系統的核心中都有一些內建函數,這些函數可以用來完成一些系統層級的功能。在 Linux 系統中,這些函數被稱為「系統呼叫」(system call)。它們代表了從用戶空間到核心空間的一種轉換。

#已收到訊息. 對於初學者來說,要想在 Linux 環境下編程,必須深入理解一些重要概念才能更好地編寫程式碼,實現業務功能。以下我們將介紹幾個重要且常用的知識點。掌握這些概念可以避免在未來的編碼中出現混淆。 ## 系統呼叫> ❝ > > 所有作業系統的核心中都有一些內建函數,這些函數可以用來完成一些系統層級的功能。在Linux 系統中,這些函數稱為「系統呼叫」(system call) 。它們代表了從使用者空間到核心空間的一種轉換。 > > ❞

4共5

按讚不喜歡更多

  • 系統呼叫是Linux作業系統提供的服務,是編寫應用程式與核心之間通訊的接口,也就是我們所說的函數。相對於普通的函數呼叫來說,系統呼叫的效能消耗相對來說是大的。所以在程式追求效能的同時,盡量避免系統呼叫。
  • 使用者態的程式預設是透過堆疊來傳遞參數的。而對於系統呼叫來說,核心態和使用者態使用的是不同的棧,這使得系統呼叫的參數只能透過暫存器的方式傳遞。

IO操作

#「

#❝

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

  • # IO分為標準IO和檔案IO,我們常用的scanf、printf、getchar、putchar、gets、puts這些都是標準輸入輸出。 Linux系統下一切皆檔案的概念,所以在linux下的程式設計中對檔案的IO操作有標準IO和檔案IO兩種操作類型。標準IO是帶緩衝的IO屬於函式庫函數,檔案IO是不帶緩衝的屬於系統呼叫。

標準IO:

1.标准IO是由ANSIC标准定义

2.跨平台,可以在windows下运行,也可以在Linux下运行

3.通过缓冲机制来减少系统调用,实现更高的效率

4.文件流 标准IO用结构体类型来存放文件的相关信息,标准IO所有操作围绕着FILE来操作。
登入後複製

檔案IO:

1.文件IO是POSIX提供的一组函数

2.只能运行在可移植操作系统中,不能跨平台

3.没有缓冲机制

4.文件描述符是一个非负整数,每打开一个文件,系统会自动分配一个文件描述符(即从系统最小的且没有被用的描述符来分配)
登入後複製

原子操作

原子在化学课程中是不可再分的颗粒。而对于Linux系统来说所谓原子操作是为了确保对一个整型数据的更改具有排他性。原子操作就是要么不执行,一旦执行就会执行完成,是不可被打断的一个,或一系列的动作,即在完成任务前不会被其他事件所打断,就像原子不可被分割成颗粒一样。单处理中,可以用单条指令完成的指令可以被看成是一个原子操作。软件中的原子操作依赖于硬件原子操作的支持。当然原子操作,也可以当引用计数使用。

  • 原子操作其实本质上和锁实现同样的功能,都是为了保护共享对象,它具有原子性,和顺序性。原子性确保指令执行期间不被打断,要么全部执行,要么根本不执行。而顺序性确保即使两条或多条指令出现在独立的执行线程中,甚至独立的处理器上,它们本该执行的顺序依然要保持。

线程安全

所谓线程安全,就是指代码可以在多线程环境下安全地执行,输出我们想要的结果。即符合正确的逻辑,是程序员期望的正常执行结果。为了实现线程安全,Linux系统提供一些列的方法,或者只能使用局部变量或资源,或者就是利用锁等同步机制,来实现全局变量或资源的访问。

  • 线程安全在Linux环境编程中极其重要,我们不仅要了解概念,更重要的是要在实际的编程中学会实现线程安全方式。下面来看一个简单的例子:
#include 
#include 
#include 

static int nCnt = 0;

void * Thread(void * arg)
{
    for (int i = 0; i return NULL;
}
int main()
{
    pthread_t t1;
    pthread_t t2;

    /* 创建两个线程 */
    pthread_create(&t1, NULL, thread, NULL);
    pthread_create(&t2, NULL, thread, NULL);

    pthread_join(t1, NULL);
    pthread_join(t2, NULL);

    printf("nCnt is %d by threads\n", nCnt);

    return 0;
}
登入後複製
  • 大家看出上面例子的问题了吗?
  • 对,没错,在此例子中我们创建了两个线程,线程函数是同一个函数,在线程函数中是对全局变量nCnt的自增操作。这个例子中输出结果和我们想要的是不一样,就是因为nCnt执行指令并不是原子的,两个个线程对nCnt的并发访问出现了问题。我们利用锁就可以解决此问题。

阻塞与非阻塞

Linux环境编程中的阻塞与非阻塞,都是指I/O操作。而所有的I/O系统调用默认都是阻塞的。那什么是阻塞? 阻塞的系统调用是指当进行系统调用时除非出错或被信号打断,那么系统调用将会一直陷入内核态直到调用完成。非阻塞的系统调用是指无论I/O操作成功与否,调用都会立刻返回。阻塞和非阻塞IO是访问设备的两种模式,驱动程序可以灵活的支持这两种用户空间对设备的访问方式。

  • 阻塞操作是指在执行操作时,若不能获得资源,则阻塞进程直到满足条件再进行操作。被阻塞的进程进入睡眠状态,被调度器的运行队列移走,直到等待的条件满足
  • 非阻塞是指在进行操作时,若不能获得资源,他要么放弃,要么返回后重新查询,直到可以进行操作为止。
  • 当数据准备好时二者的模式相同,即IO操作都是将进程阻塞,直到IO操作完成
  • 阻塞、非阻塞是设备文件、网络文件的属性

同步与异步

同步与异步,也是指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

  • # 兩者的差別就在於同步IO做IO操作時會將進程阻塞,而異步IO做IO操作時不會阻塞進程
  • 當把阻塞、非阻塞、同步和非同步放在一起時,難免會出現混淆。同步是否就是阻塞,非同步是否為非阻塞?實際上在I/O操作中,它們是不同的概念。同步既可以是阻塞的,也可以是非阻塞的,而常用的Linux的I/O呼叫其實都是同步的。這裡的同步與異步,是指I/O資料的複製工作是否同步執行。
  • 以系統調用read為例。阻塞的read會一直陷入內核態直到read返回;而非阻塞的read在資料未準備就緒時,會直接返回,而當有資料時,非阻塞的read同樣會一直陷入內核態,直到read完成。這個read就是同步的操作, 即I/O的完成是在目前執行流程下同步完成的。如果是異步,則I/O操作不是隨系統呼叫同步完成的。呼叫返回後,I/O操作並沒有完成,而是由作業系統或某個執行緒負責真正的I/O操作,等完成後通知原來的執行緒
#

以上是Linux環境程式設計必須搞懂的幾個概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

vscode 可以用於 mac 嗎 vscode 可以用於 mac 嗎 Apr 15, 2025 pm 07:36 PM

VS Code 可以在 Mac 上使用。它具有強大的擴展功能、Git 集成、終端和調試器,同時還提供了豐富的設置選項。但是,對於特別大型項目或專業性較強的開發,VS Code 可能會有性能或功能限制。

See all articles