《程序員的自我修養(yǎng) — 鏈接片任,裝載與庫》這本書被很多人推薦,翻了一下蔬胯,好像確實是一本很有意思的書对供,值的推薦。我會陸陸續(xù)續(xù)把讀書筆記寫在這里氛濒。
這是第二部分产场,目錄如下:
- 入口函數和程序的初始化
1. 入口函數_start 函數和程序的初始化
- 從bash上面fork出一個進程,然后去執(zhí)行入口函數(_start 函數)舞竿。
- 進行初始化和運行環(huán)境的初始化京景,包括堆,I/O骗奖,線程确徙,全局變量。
- 入口函數初始化之后执桌,調用main函數米愿,并把argc,argv等參數傳遞給main函數鼻吮,然后去執(zhí)行育苟。
- main函數執(zhí)行完畢之后,返回到入口函數椎木。包括全局變量的析構违柏,堆銷毀,關閉I/O香椎。然后進行系統(tǒng)調用結束進程漱竖。
2. 內核級線程和用戶級線程
簡單的來說,用戶級的多線程在內核看來是一個進程(盡管它里面有多個線程)畜伐,如果一個線程在io(或者被阻塞)那么這個進程將被掛起來馍惹。也就說其他的線程也無法獲得cpu。
內核級的線程玛界,如果一個線程阻塞万矾,那么其他的線程依然可能獲得cpu。
在linux下面通過pthread_create 創(chuàng)建的線程是內核級的線程慎框。在調用pthread_create函數的時候良狈,調用了clone的系統(tǒng)調用。
( PS : 查了一下 NPTL(Native POSIX Thread Library)實現中笨枯,用戶創(chuàng)建的線程和內核中調度實體的關系是1:1薪丁。其他線程庫的實現遇西,可以支持M:N。)
cat /proc/[pid]/status #這是查看進程狀態(tài)很好的一個命令
#里面有一個tpid的選項和一個Threads的參數
#表示的了當前進程創(chuàng)建的線程組id和線程數目严嗜。
#如果你創(chuàng)建的線程粱檀,os感知不到,那就是用戶線程
- 又想到一個問題 fork / vfork /clone 的區(qū)別
關于fork和vfork的區(qū)別 :http://www.reibang.com/p/bc0ef5a911a7- vfork 子進程先執(zhí)行
- vfork 完全和父進程共享內存漫玄,包括堆梧税、BSS、初始化非0數據區(qū)等區(qū)域称近。
- clone 系統(tǒng)調用是fork()的推廣形式,它允許新進程指定具體需要與父進程共享哪些元素哮塞,如存儲空間刨秆、文件描述符、信號處理程序等忆畅。是否需要阻塞父進程等衡未,所以,比fork更加靈活家凯。