程序 執行緒 協程(一 程序環境)

2021-10-09 09:58:42 字數 4084 閱讀 1037

本來這個程序/執行緒/協程是在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執行時所需要的一串指令。每個獨立...