原创 合併k個排序數組(優先級隊列(小頂堆)或歸併)

和合併K個排序鏈表思路完全相同。 法1:歸併 法2:優先級隊列(小頂堆) class Solution { //歸併 public: int kthSmallest(vector<vector<int>>& matrix,

原创 最長重複子數組(後綴序列+dp)

這題的dp不是很好想到, dp[i][j]表示長度爲i,以A[i-1]爲末尾的序列 和 長度爲j,以B[j-1]爲末尾的序列,二者的最大公共後綴序列長度 我覺得關鍵是要想到:比較的是後綴序列! class Solution

原创 linux 多線程下使用條件變量模擬“生產者-消費者”模型

條件變量: 條件變量本身不是鎖!但它也可以造成線程阻塞。通常與互斥鎖配合使用。給多線程提供一個會合的場所。 pthread_cond_init函數 初始化一個條件變量 int pthread_cond_init(pthread_c

原创 linux 系統編程-進程

CPU和MMU 進程控制塊PCB 我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。 /usr/src/linux-headers-3.16.

原创 linux SIGCHLD信號

SIGCHLD的產生條件 子進程終止時 子進程接收到SIGSTOP信號停止時 子進程處在停止態,接受到SIGCONT後喚醒時 藉助SIGCHLD信號回收子進程 子進程結束運行,其父進程會收到SIGCHLD信號。該信號的默認處理動作

原创 linux wait、waitpid函數回收子進程

wait函數 一個進程在終止時會關閉所有文件描述符,釋放在用戶空間分配的內存,但它的PCB還保留着,內核在其中保存了一些信息:如果是正常終止則保存着退出狀態,如果是異常終止則保存着導致該進程終止的信號是哪個。這個進程的父進程可以調

原创 linux 進程間通信-pipe

IPC方法 Linux環境下,進程地址空間相互獨立,每個進程各自有不同的用戶地址空間。任何一個進程的全局變量在另一個進程中都看不到,所以進程和進程之間不能相互訪問,要交換數據必須通過內核,在內核中開闢一塊緩衝區,進程1把數據從用戶

原创 linux C庫IO和系統IO

一、C庫IO函數工作流程示意圖: FILE 類型的指針,是特殊結構體類型,包含文件描述符、讀寫指針位置、內存地址等信息,用於文件讀寫操作。 I/O緩衝區用於利用內存減少硬盤操作。在右側三種情況下刷新緩衝區,存到硬盤上。 二、進程

原创 linux 多路IO轉接服務器之epoll(重點)

epoll是Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程序在大量併發連接中只有少量活躍的情況下的系統CPU利用率,因爲它會複用文件描述符集合來傳遞結果而不用迫使開發者每次等待事件之前都必須重新準備要

原创 linux exec函數簇

fork創建子進程後執行的是和父進程相同的程序(但有可能執行不同的代碼分支),子進程往往要調用一種exec函數以執行另一個程序。當進程調用一種exec函數時,該進程的用戶空間代碼和數據完全被新程序替換,從新程序的啓動例程開始執行。

原创 linux gcc的編譯過程

以head.h和.c文件不在同一個目錄爲例: gcc ./c_test.c -I ./head -o ./c_test

原创 linux 信號1

信號的機制 A給B發送信號,B收到信號之前執行自己的代碼,收到信號後,不管執行到程序的什麼位置,都要暫停運行,去處理信號,處理完畢再繼續執行。與硬件中斷類似——異步模式。但信號是軟件層面上實現的中斷,早期常被稱爲“軟中斷”。 信號

原创 linux 進程間通信-FIFO(有名管道)

FIFO FIFO常被稱爲命名管道,以區分管道(pipe)。管道(pipe)只能用於“有血緣關係”的進程間。但通過FIFO,不相關的進程也能交換數據。 FIFO是Linux基礎文件類型中的一種。但,FIFO文件在磁盤上沒有數據塊,

原创 linux 多路IO轉接服務器之poll

#include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); struct pollfd { int fd; /* 文件描述符 */

原创 linux 線程同步之互斥鎖、讀寫鎖

線程同步 舉例: 內存中100字節,線程T1欲填入全1, 線程T2欲填入全0。但如果T1執行了50個字節失去cpu,T2執行,會將T1寫過的內容覆蓋。當T1再次獲得cpu繼續 從失去cpu的位置向後寫入1,當執行結束,內存中的10