目錄
#系統呼叫" >#系統呼叫
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

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

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

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

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

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

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

sublime寫好代碼後如何運行 sublime寫好代碼後如何運行 Apr 16, 2025 am 08:51 AM

在 Sublime 中運行代碼的方法有六種:通過熱鍵、菜單、構建系統、命令行、設置默認構建系統和自定義構建命令,並可通過右鍵單擊項目/文件運行單個文件/項目,構建系統可用性取決於 Sublime Text 的安裝情況。

laravel安裝代碼 laravel安裝代碼 Apr 18, 2025 pm 12:30 PM

要安裝 Laravel,需依序進行以下步驟:安裝 Composer(適用於 macOS/Linux 和 Windows)安裝 Laravel 安裝器創建新項目啟動服務訪問應用程序(網址:http://127.0.0.1:8000)設置數據庫連接(如果需要)

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

git軟件安裝 git軟件安裝 Apr 17, 2025 am 11:57 AM

安裝 Git 軟件包括以下步驟:下載安裝包運行安裝包驗證安裝配置 Git安裝 Git Bash(僅限 Windows)

VSCode怎麼用 VSCode怎麼用 Apr 15, 2025 pm 11:21 PM

Visual Studio Code (VSCode) 是一款跨平台、開源且免費的代碼編輯器,由微軟開發。它以輕量、可擴展性和對眾多編程語言的支持而著稱。要安裝 VSCode,請訪問官方網站下載並運行安裝程序。使用 VSCode 時,可以創建新項目、編輯代碼、調試代碼、導航項目、擴展 VSCode 和管理設置。 VSCode 適用於 Windows、macOS 和 Linux,支持多種編程語言,並通過 Marketplace 提供各種擴展。它的優勢包括輕量、可擴展性、廣泛的語言支持、豐富的功能和版

See all articles