本來這個程序/執行緒/協程是在9月份看完了,可惜9月份墮落了很就,就推到了11月份,為什麼不10月份呢?因為國慶要回家,總不能拿這麼厚的書回家把,所以就選了一本nginx,比較薄的書,接下來一段時間內,我們專供程序/執行緒/協程、
我們從開始學c語言開始就一直寫main函式,我們也知道c程式總是從main函式開始執行,main函式的原型是:
int
main
(int argc,
char
*ar**[
])
其中argc是命令列引數的數目,ar**是指向引數的各個指標所構成的陣列。
說實話,我大學那時候寫微控制器的時候,一直都以為main函式的引數是void的,哎,直到後來學習了linux應用程式設計之後,才發現main函式原來還有這麼多不知道的東西。
當核心執行c程式時,在呼叫main前先呼叫乙個特殊的啟動歷程。可執行程式檔案將此啟動歷程的起始位址–這是由鏈結器設定的,而鏈結器則由c編譯器呼叫,啟動歷程從核心取到命令列引數和環境變數值,然後那上述的main函式傳參。
有8種方式使程序終止,其中5種為正常終止,他們是:
從main返回(return)
呼叫exit(先執行一些清理,然後返回核心)
呼叫_exit或_exit
最後乙個執行緒從其啟動歷程返回
從最後乙個執行緒呼叫pthread_exit
異常終止有3種方式,他們是:
呼叫abort
接收到乙個訊號
最後乙個執行緒對取消請求作出響應
退出函式都是可以帶上引數的,這個引數就是這個程序退出的狀態
比如exit(0)或者return 0;程序返回的狀態都是0;
乙個程序在退出的時候,是可以登記多至32個函式,這些函式將又exit自動呼叫。我們稱這些函式為終止處理程式。並呼叫atexit函式來登記這些函式。
int
atexit
(void
(*func)
(void
))
注意:只要呼叫了exit這個退出,才會執行終止處理程式,並清理。
extern
char
**environ;
可以用一張圖來描述環境表,乙個environ指向了指標陣列,陣列中儲存了字串指標
說實話,上面的那些內容我都懂了,其實就是想看看這個空間布局,不過前面的就當過一遍。
c程式一直由下列幾部分組成:
下面 看看圖
a.out中還有若干其他型別的段,如包含符號表的段、包含除錯資訊的段以及包含動態共享庫連線表的段等。這些部分並不裝載到程序執行的程式影像中。
可以用size命令讀取程式中的各段資訊:
des和hex分別以十進位制和十六進製制表示的3段總長度。
我們經常用的3個用於儲存空間動態分配的函式。
void
*maloc
(size_t size)
;//分配指定位元組數的儲存區
void
*calloc
(size_t nobj, size_t size)
;//為指定數量指定長度的物件分配儲存空間
void
*realloc
(void
*pt, size_t newsize)
;//增加或減少以前分配區的長度
void
free
(void
*ptr)
;//釋放ptr指向的儲存空間
libmalloc
vmalloc
quick-fit
jemalloc
tcmalloc
函式alloca
環境變數的操作函式:
char
*getenv
(const cahr *name)
;//獲取環境變數的值
intputenv
(char
*str)
;//將其放到環境表中
intsetenv
(const
char
*name,
const
char
^value,
int rewrite)
;//設定環境變數,rewrite先刪除在寫
intunsetenv
(const
char
*name)
;//刪除name定義
刪除乙個環境變數挺簡單的,只要先在環境表中找到該指標,然後將所有後續指標都向環境表首部順次移動乙個位置,這樣就可以把要刪除的變數,刪除掉。
如果新value的長度少於或等於現有value的長度,則只需要將新字串複製到原字串所在的空間
如果新value的長度大於原長度,則必須malloc申請空間,然後將新字串複製到新空間中,然後環境表中的指標這個環境的指標指向新分配區。
如果是第一次增加乙個新name,需要為新的指標表分配空間,(因為原來的空間已經固定好了),接著將原來環境表的值全部複製到新的指標表中,並將直線新的字串的指標存放在該指標表的最後,並在表尾有增加乙個null指標。最後使environ指向新指標表。
如果不是第一次增加name,則可以知道已經呼叫了malloc分配好了環境表,所以只需要呼叫realloc,以分配比源空間多存放乙個指標的空間。然後把將這個新指標賦值到最後,最後再新增乙個null。
每乙個程序都有一組資源限制,其中一些可以用下面兩個函式修改或者查詢
int
getrlimit
(int resource,
struct rlimit *rlptr)
;int
setrlimit
(int resource,
const
struct rlimit *rlptr)
;
函式以後用到在看,有支援shell命令的:
root@ubuntu:~/net# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3741
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
posix message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time
(seconds, -t) unlimited
max user processes (-u) 3741
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
這一節,比較簡單,就是熟悉一些程序環境。 程序 執行緒 協程
多程序多執行緒的最終目地都是為了加快任務處理的時間,但是受限於cpu核數 只有多核才能實現並行,任務耗時 單核任務耗時 cpu核數 那麼在單核上執行多程序多執行緒是不是沒有用了,加快不了處理的速度了?答案肯定是不是的,不然這個東西設計出來太雞肋了,那它們加快處理的原理是什麼呢?乙個程序耗時 b程序耗...
程序 執行緒 協程
程序是系統資源分配的最小單位,系統由乙個個程序 程式 組成。一般情況下,包括文字區域 text region 資料區域 data region 和堆疊 stack region 檔案描述符表 程序每次開啟乙個檔案,系統就會在該程序的使用者檔案描述符表中分配乙個相應的表項,表項的索引返回給該程序,用於...
執行緒 程序 協程
執行緒是作業系統中進行運算排程的最小單位。執行緒被包含在程序之中,是程序中的實際運作單位。一條執行緒指的是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒並行執行不同的任務。乙個執行緒是乙個execution context 執行上下文 即乙個cpu執行時所需要的一串指令。每個獨立...