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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

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

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

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

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

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

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

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