C 語言

@learnc

Public team

Community (0)
No community contribution yet

Joined on Feb 10, 2021

  • 考前必讀 1. I/O 處理 2. STL Container 3. STL Algorithm sort lower_bound upper_bound 4. String 處理
     Like  Bookmark
  • 主要參考文獻 Microsoft Docs AIdrifter CS 浮生筆錄 Google C++ Style Guide 繁體中文版 chenlen.com cplusplus.com 山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑系列文 比較安全的 C++ 虛擬函式寫法:C++11 override 與 final 使用 VSCode 開發 C++
     Like 1 Bookmark
  •  Like  Bookmark
  • 查閱 Linux manual page 時會發現: 在 stdio.h 中有密密麻麻的函式/變數定義。有趣的是,筆者發現許多 C 語言的入門教材都沒有將標準輸入輸出交代仔細。讓大多數的人讀完文章還是對 stdio.h 內函式的設計感到一頭霧水,因此,筆者希望透過撰寫文章為大家解惑,也順便複習一下生疏的 C 語言技能。 先備知識 在學習 stdio library 之前,需要先了解 Unix 作業系統的檔案觀念,在掌握檔案觀念後,可以幫助我們更快的理解 stdio 的設計巧思。 File descriptor stdio.h 中的函式幾乎都跟 File 的操作脫不了關係。 在 Unix 或是 Unix-like 中,作業系統抽象了一層資料結構用來存取 File, input / output 資源,該資料結構稱為 File descriptor 。並且, File descriptor 是屬於 POSIX API 的一部份,在符合 POSIX 的作業系統上,每一個 Process (除了守護程序)都應該具備至少三個 File descriptor ,分別是:
     Like  Bookmark
  • :::info 🚀 更多文章都已經整合到 AwesomeCS Wiki 了,歡迎送上 Star ! 🚀 AwesomeCS 臉書專業 ::: 在介紹 Mutex lock 與 spinlock 後,本篇文章同樣針對並行程式的 Synchronization 作探討,學習如何保證並行程式的執行順序並介紹什麼是 Deadlock 與 Livelock 。 Semaphore Semaphore 中文稱為號誌,是一個同步物件,用於保持在 0 至指定最大值之間的一個計數值。當執行緒完成一次對該 semaphore 物件的等待(wait)時,該計數值減一;當執行緒完成一次對 semaphore 物件的釋放(release)時,計數值加一。當計數值為 0 ,則執行緒等待該 semaphore 物件不再能成功直至該 semaphore 物件變成 signaled 狀態。 semaphore 物件的計數值大於 0 ,為 signaled 狀態;計數值等於 0 ,為 nonsignaled 狀態.
     Like 4 Bookmark
  • 先前已經向各位介紹如何利用鎖保證多執行緒程式的同步,像是 Spinlock 、 Mutex lock 與 Semaphore 等。這樣的作法雖然可以有效避免 Condition race ,卻因為執行緒被阻塞而增加程式的延遲。 非阻塞演算法 為了有效避免上述狀況,電腦科學家又提出了非阻塞演算法,為了實現該演算法,計算機通常需要支援 Atomic operations ,常見的操作像是 CAS (Compare And Swap)。 Lock-free 在 Lock-free 系統中,有些特定的計算仍有可能被 Block 一段時間,不過,其他執行緒不會因為該計算被阻塞,而是繼續做其他無須該資原的任務進而增加整體的吞吐量。 Lock-free 這邊的無鎖指的是沒有執行緒會被鎖住,而不是程式中沒有鎖。
     Like  Bookmark
  • 開發者們經常戲稱: 學習 C 語言,從入門到放棄。 我想,這只是因為大家不知道 C 語的歷史演變與使用目的。 本系列文會一步一步帶大家學習這個入門殺手。 目錄 基礎 C 語言
     Like  Bookmark
  • 並行/多執行緒程式往往會碰上同步問題 (Synchronization),在前一篇文章中介紹了什麼是 Race condition 以及 Critical sections ,並且利用互斥鎖將 CS 鎖住。不過,同步問題的解法可不止一個,本篇將探討廣泛應用在 Linux kernel 的 Spinlock 。 Spinlock 介紹 Spinlock 中文稱做自旋鎖,透過名稱我們就能大概大概猜到 Spinlock 的功用。與 Mutex 相同, Spinlock 可以用來保護 Critical section ,如果執行緒沒有獲取鎖,則會進入迴圈直到獲得上鎖的資格,因此叫做自旋鎖。 原子操作 原子操作可以確保一個操作在完成前不會被其他操作打斷,以 RISC-V 為例,它提供了 RV32A Instruction set ,該指令集都是原子操作 (Atomic)。 為了避免在同時間有多個 Spinlock 對相同的記憶體做存取,在 Spinlock 實現上會使用到原子操作以確保正確上鎖。
     Like 2 Bookmark
  • 建立 Thread 的成本遠低於 Process 的成本,執行 Context switch 時的效能也有顯著的差異。既然並行程式這麼好,為什麼大學資工系的教授不一開始就教、甚至是到畢業都沒學到呢?很顯然的,當執行緒一多時,如果開發者的頭腦不夠清楚便會產出各式各樣的問題以及臭蟲,本篇文章整理了一些並行程式的眉眉角角,歡迎大家閱讀。 Race condition Race condition 用來描述一個系統或者 Process 的輸出依賴於不受控制的事件出現順序或者出現時機。 像是: 有多個 Process 嘗試存取同一個記憶體位置,如果沒有處理好,就有可能發生無法預期的執行結果,這種情況容易發生在錯誤的後端程式、資料庫、檔案系統設計或是其他採用多執行緒設計的程式。 範例 考慮以下程式碼: #include <pthread.h>
     Like 5 Bookmark
  • Critical Section Race condition Data race Database Filesystem 共筆 Mutex and Condition Variabal Mutex
     Like  Bookmark
  • POSIX Threads 是一套符合 POSIX 標準的 API ,方便開發者設計出 User-level 的多執行緒程式。 開始之前 先了解執行緒的記憶體分配有助於多執行緒程式的開發。 thread 空間分配 在同一個 Program 中,多個 Thread 會共用同一個位址空間,每個 Thread 都會分配到一塊空間作為自己的 Stack ,而指向這些空間起始點的指標就被稱為 Stack pointer 。 呼叫函式和一般的跳躍不同,在呼叫結束後必須回到原本呼叫的地方,原本執行中的位址被叫做「回傳位址」(return address)。如果說呼叫只會發生一次的話,隨便找一個暫存器存回傳位址就好了;但是函式呼叫可以一層一層呼叫下去,所以必須把回傳位址存在記憶體裡。實務上,回傳位址被存在記憶體中的堆疊(stack)裡。 堆疊,被實作成只能使用堆疊空間最上方位址所存的一個變數。而這個紀錄堆疊最上方的紀錄空間被稱為「堆疊指標」(stack pointer)。x86-64 中,為了方便寫呼叫函式的程式,提供了堆疊指標專用的暫存器,和使用這個暫存器的指令。往堆疊上堆資料的操作是「push」,而取出堆疊資料的操作是「pop」。
     Like 2 Bookmark
  • 進入正題 void (*foo)(); int (*ftpr1)(int); int n = 5; int square(int num){ return num*num; }
     Like 1 Bookmark
  • 指標 C 語言規格書中有針對指標語法做出明確定義。然而,仍有部分是規格書中沒有交代清楚的,像是: 以實作定義 未指定 未定義 Jserv 說過: 閱讀規格書可以大幅省去臆測。 更詳細的資訊可以參考你所不知道的 C 語言: 開發工具和規格標準。
     Like  Bookmark
  • 在學習並行程式設計之前,我們需要先了解 Program 、 Process 、 Thread 的定義,這邊筆者舉一個簡單的例子: 當我們開啟 APP 時, APP 會被載入到 Memory 中,而執行中的 APP 在一般情況下僅有一個執行緒 (Thread) 。 在上面的例子中,尚未執行的 APP 就是 Program ,執行中的 APP 則是 Process 。 Program Program 在 Operating System 這門學科中並沒有太多的介紹,讀者可以把 Program 當成是可執行檔 (*.out, *.elf, *.exe...) 即可。 Process
     Like 1 Bookmark
  • C Preprocessor Link C的內存結構 主要分為四大類: Stack 主要用來儲存 Function calls 和 Local variables 。 Stack 的最底層為 main() ,調用函數時執行 push() ,函數 return 時執行 pop() 。 Heap
     Like  Bookmark