1. 程式人生 > >《Linux核心設計與實現》與《Linux核心原始碼情景分析》讀書筆記

《Linux核心設計與實現》與《Linux核心原始碼情景分析》讀書筆記

第一章:核心簡介

處理器在任何指定時間點上的活動範圍:

a,運行於核心空間,處於程序上下文,代表某個特定的程序執行;

b,運行於核心空間,處於中斷上下文,於任何程序無關,處理某個特定的中斷;

c,運行於使用者空間,執行使用者程序。

當一個程序在執行時,CPU的所有暫存器中的值、程序的狀態以及堆疊中的內容被稱 為該程序的上下文。當核心需要切換到另一個程序時,它需要儲存當前程序的 所有狀態,即儲存當前程序的上下文,以便在再次執行該程序時,能夠必得到切換時的狀態執行下去。在LINUX中,當前程序上下文均儲存在程序的任務資料結 構中。在發生中斷時,核心就在被中斷程序的上下文中,在核心態下執行中斷服務例程。但同時會保留所有需要用到的資源,以便中繼服務結束時能恢復被中斷程序 的執行。


第三章:程序管理

1,核心把程序存放在叫做任務佇列(task list)的雙向連結串列中,連結串列中每一項都是型別為task_struct,稱為程序描述符(process descriptor)的結構,此結構包含一個具體程序的所有資訊。

2,核心通過一個惟一的程序標識值或PID來標誌每個程序,核心把每個程序的PID存放在它們各自的程序描述符中。

3,x86系統暫存器較少只能通過在該程序核心棧的棧頂或棧底建立thread_info結構,通過計算偏移間接的查詢task_struct結構。

4,程序狀態:

a,TASK_RUNNING程序正在執行或在執行佇列中等待執行;

b,TASK_INTERRUPTIBLE程序正在睡眠,等到某些條件達成,核心就會把程序狀態設定為執行,或因為接收到訊號而提前被喚醒並投入執行。

c,TASK_UNINTERRUPTIBLE程序正在睡眠,且不響應訊號。

d,TASK_ZOMBIE該程序已經結束,為使父程序獲知它的訊息,子程序的程序描述符仍被保留;

e,TASK_STOPPED程序停止執行,接收到SIGSTOP、SIGTTIN、SIGTTOU、SIGTSTP等訊號時發生。

5,系統呼叫和異常處理程式是對核心明確定義的介面,程序只有通過這些接口才能陷入核心執行,對核心的所有訪問都必須通過這些介面。

6,程序間的關係存放在程序描述符中,每個task_struct都包含一個指向其父程序task_struct叫做parent的指標,和一個稱為children的子程序連結串列。

7,寫時拷貝:fork()後核心讓父程序和子程序共享同一個拷貝,只有在父子程序需要寫入的時候,資料才會被複制。

8,fork()和vfork()呼叫clone(),clone()呼叫do_fork(),do_fork()呼叫copy_process(),具體見p27,p28。

9,執行緒在核心中是一個普通的程序,致使該程序和其他程序共享一些資源,每個執行緒擁有屬於自己的task_struct,執行緒的建立也是呼叫clone()。

10,核心執行緒和普通程序的區別是沒有獨立的地址空間,只在核心空間執行,會將它在建立時得到的函式永遠執行下去,該函式通常有一個迴圈,再需要的時候,該核心執行緒會被喚醒和執行,完成任務會自行休眠。

11,程序終結,do_exit()系統呼叫p31,wait()函式通過系統呼叫wait4()實現的,最終釋放程序描述符時,release_task()會被呼叫,p32;

12,核心對孤兒程序的處理:給子程序在當前執行緒組內找一個執行緒作為父親,如果不行,就讓init做其父程序,遍歷子程序連結串列和prace子程序連結串列;

13,當一個程式執行了系統呼叫或者觸發了某個異常,它就會陷入核心空間,此時核心代表程序執行,處於程序上下文中。此時,程序可以睡眠和呼叫排程程式。可以通過current巨集關聯當前程序。

第四章:程序排程

1,在搶佔式多工模式下,由排程程式來決定什麼時候停止一個程序的執行,以便其他程序能夠得到執行機會。這個強制的掛起動作叫做搶佔。程序在被搶佔之前能夠執行的時間的預先設定好的,叫程序的時間片。

2,策略決定排程程式在何時讓什麼程序執行。I/O消耗型程序大部分時間用來提交I/O請求或是等待I/O請求,經常處於可執行狀態,但通常都是執行短短一會兒,這裡說的I/O是指任何型別的可阻塞資源;處理器消耗型程序把時間大部分用在執行程式碼上,除非被搶佔否則就一直在執行。

3,排程策略在兩個目標中找平衡:程序響應迅速和最大系統利用率。

4,程序優先順序:根據程序的價值和其對處理器時間需求來對程序分級。Linux兩種優先順序:nice值和實時優先順序,nice值作為權重將調整程序所使用的處理器時間比,nice值越高的程序被賦予低權重,喪失一部分處理器使用比;CFS排程器的搶佔時機取決於新的可執行程式消耗的多少處理器使用比,若比當前程序小,則新程序立刻投入執行,搶佔當前程序。舉例來說,一個文字編輯程式和一個視訊編碼程式是某一時刻僅有的兩個可執行程式,有相同的nice值,因為文字編輯器將更多時間用於等待使用者輸入,所以它的處理器使用比肯定低於50%,低於視訊編碼程式的使用比,所以CFS會在使用者輸入即文字編輯器被喚醒時,將其立即投入執行,搶佔視訊編碼程式,處理完程後,又一次進入睡眠等待使用者的下一次輸入。

5,linux的排程器是以模組方式提供的,允許不同型別的程序選擇不同的排程演算法,這種模組化結構成為排程器類,完全公平排程(CFS)是針對普通程序的排程類,它的做法是允許每個程序執行一段時間、迴圈輪轉、選擇執行最少的程序作為下一個執行程序。

6,排程器實體結構struct sched_entity作為一個名為se的成員嵌入在程序描述符struct task_struct內,se裡面的vruntime變數是程序花在執行上的時間和,CFS排程演算法的核心:選擇具有最小vruntime的任務。

CFS使用紅黑樹組織可執行佇列,CFS的程序選擇演算法總結為執行rbtree樹中最左邊葉子節點所代表的那個程序。向樹中加入程序發生在程序變為可執行狀態或者通過fork()呼叫第一次建立程序時;從樹中刪除動作發生在程序阻塞(變為不可執行狀態)或者終止時。

排程器的入口時schedule()函式,它以優先順序為序,從最高的排程類開始,每個排程類要有自己的可執行佇列,從佇列中獲取下一個可執行的程序。

睡眠:程序把自己標記成睡眠狀態,從可執行紅黑數中移出,放入等待佇列,然後呼叫schedule()選擇和執行一個其他程序;

喚醒:程序被設定為可執行狀態,再從等待佇列中移到可執行紅黑樹中;

等待佇列是由等待某些事件發生的程序組成的簡單鏈表。P50程序加入等待佇列的詳細步驟;

上下文切換:context_switch()函式處理,呼叫switch_mm()將虛擬記憶體從上一個程序對映切換到新程序中;呼叫switch_to()將上一個程序的處理器狀態切換到新程序的處理器狀態,包括儲存、恢復棧資訊和暫存器資訊。

7,核心提供一個need_resched標誌來表明是否需要重新執行一次排程。

8,使用者搶佔發生在:從系統呼叫返回使用者空間時和從中斷處理程式返回使用者空間時;核心搶佔發生在:中斷處理程式正在執行,且返回核心空間之前;核心程式碼再一次具有可搶佔性的時候;如果核心中的任務顯示的呼叫schedule();如果核心中的任務阻塞(這同樣也會呼叫schedule());

第五章:系統呼叫

1,在Linux中,系統呼叫是使用者空間訪問核心的唯一手段,除異常和陷入外,它們是核心唯一的合法入口。Unix的系統呼叫抽象出了用於完成某種確定的目的的函式,至於這些函式怎麼用完全不需要核心去關心。提供機制而不是策略。

2,在Linux中,每個系統呼叫被賦予一個系統呼叫號,核心記錄了系統呼叫表中的所有已註冊過的系統呼叫的列表,儲存在sys_call_table中。

3,使用者空間的程式無法直接執行核心程式碼,因為核心駐守在受保護的地址空間上,應用程式通過軟中斷的機制通知核心,通過引發一個異常促使系統切換到核心態去執行異常處理程式即系統呼叫處理程式system_call(),系統呼叫陷入核心要將系統呼叫號通過eax暫存器傳遞給核心,引數和返回值都是通過暫存器傳遞。系統呼叫返回的時候,system_call負責切換到使用者空間,並讓使用者程序繼續執行下去。

第六章:核心資料結構

1,核心連結串列和普通連結串列的區別:普通連結串列的連結串列節點包含業務內容,而核心連結串列將業務內容和連結串列分離,單獨成為一個節點,並且將連結串列節點包含在其中;

i = (int) (&(((struct AdvAdvTeacher *)0)->age ));獲取業務內容的偏移量。

2,核心紅黑樹:詳見http://blog.csdn.net/yang_yulei/article/details/26066409

第七章:中斷和中斷處理

1,中斷是一種由硬體產生的電訊號,並直接送入中斷控制器,中斷控制器會給處理器傳送一個電訊號,處理器通知作業系統已經產生中斷,作業系統再對中斷進行處理。

2,核心隨時可能因為新到的中斷而被打斷。硬體發生中斷是為了引起核心的關注。

3,每個中斷對應一箇中斷值稱為IRQ中斷請求線,每個IRQ都關聯一個數值量。

4,異常與中斷的區別:異常要與處理器時鐘同步。異常是由軟體引起的,中斷是由硬體產生的。

5,核心響應中斷的特定函式叫中斷處理函式或中斷服務例程ISR,一個裝置的ISR是它的裝置驅動程式的一部分,裝置驅動程式是用於管理裝置的核心程式碼。

6,當執行一個ISR時,核心處於中斷上下文中,中斷上下文與程序無關,無current巨集無關,不可以睡眠,因為沒有後備程序所以無法呼叫排程程式。

7,中斷處理程式是上半部,中斷處理程式打斷了其他的程式碼(甚至可能打斷了在其他中斷線上的另一中斷處理程式),正是因為這種非同步執行的特性,所以所有的中斷處理程式必須儘可能的迅速簡潔,儘量把工作從中斷處理程式中分離出來,放在下半部來執行,因為下半部可以在更合適的時間執行。

8,中斷處理程式擁有自己的棧,每個處理器一個,大小為一頁。即中斷棧。

第八章:下半部和推後執行的工作

1,要儘量減少中斷處理程式中需要完成的工作量,因為它在執行的時候,當前的中斷線在所有的處理器上都會被遮蔽。縮短中斷被遮蔽的時間對系統的響應能力和效能都至關重要。下半部執行的關鍵在於它們執行的時候,允許響應所有的中斷。

2,軟中斷:一個軟中斷不會搶佔另一個軟中斷,唯一可以搶佔軟中斷的是中斷處理程式,相同型別的其他軟中斷可以在其他處理器上同時執行。

3,tasklet

4,工作佇列把工作交由一個核心執行緒去執行,它總是會在程序上下文中執行,即允許重新排程和睡眠。

第九章:核心同步介紹

1,Linux核心是搶佔式核心,在沒有保護的的情況下,排程程式可以在任何時刻搶佔正在執行的核心程式碼,重新排程其他的程序執行。

2,各種鎖機制之間的區別主要在於:當鎖已經被其他執行緒持有,因而不可用時的行為表現——一些鎖被爭用時會簡單地執行忙等待,而另外一些鎖會使當前任務睡眠直到鎖可用為止。

3實際上同步就是呼叫模組等待一個被呼叫體返回後,再繼續下一步;而非同步是呼叫模組發起呼叫之後,不用等待呼叫返回就繼續下一步了。

4,核心中造成併發執行的原因:a,中斷;b,軟中斷和tasklet;c,核心搶佔;d,睡眠及與使用者空間的同步;e,對稱多處理。

5,大多數核心資料結構都需要加鎖,要給資料而不是程式碼加鎖。

6,自死鎖,如果一個執行執行緒試圖去獲得一個自己已經擁有的鎖,它將不得不等待鎖被釋放。abba死鎖每個執行緒都在等待其他執行緒持有的鎖,但是沒有一個執行緒會釋放他們一開始就持有的鎖。避免死鎖的規則:a按順序加鎖,b防止發生飢餓,c不要重複請求同一個鎖,d設計力求簡單。以獲得所的相反順序釋放鎖。

第十章:核心同步方法

1,自旋鎖最多隻能被一個可執行執行緒持有,如果一個執行緒試圖獲得一個被其他執行緒持有的自旋鎖,那麼該執行緒就會一直進行忙迴圈——旋轉——等待鎖重新可用。這樣特別浪費處理器時間,所以自旋鎖不應給長時間被持有。

2,自旋鎖可以用在中斷處理程式中,而訊號量不可以,因為訊號量會導致睡眠,在中斷處理程式中使用自旋鎖時,一定要在獲取鎖之前,禁止本地中斷(當前處理器上的中斷請求),否則,中斷處理程式就會打斷正持有鎖的核心程式碼,有可能會試圖去爭用這個已經被持有的自旋鎖,這樣,中斷處理程式就會自旋,等待該鎖重新可用,但是鎖的持有者在這個中斷處理程式執行完畢前不可能執行。這就是雙重請求死鎖。

3,下半部和程序上下文共享資料時,因為下半部可以搶佔程序上下文,所以要對程序上下文中的共享資料進行保護,加鎖的同時還要禁止下半部執行;中斷處理程式和下半部共享資料時,由於中斷處理程式可以搶佔下半部,必須在獲取恰當的鎖的同時還要禁止中斷。同類的tasklet不能同時執行,所以對於同類tasklet中的共享資料不需要保護。當資料被兩個不同種類的taskLet共享時,就需要在訪問下半部中的資料前先獲得自旋鎖,不需要禁止下半部,因為同一個處理器上tasklet不會相互搶佔。資料被軟中斷共享和tasklet一樣。

4,讀寫自旋鎖:一個或多個讀任務可以併發的持有讀者鎖,用於寫的鎖最多隻能被一個寫任務持有,而且此時不能有併發的讀操作。

5,訊號量:如果一個任務試圖獲得一個不可用的訊號量時,訊號量會將其推進一個等待佇列,然後讓其睡眠,這是處理器能重獲自由,去執行其他程式碼,當持有的訊號量可用後,處於等待佇列中的那個任務將被喚醒,並獲得該訊號量。

6,訊號量適用於鎖被長期持有的情況。只能在程序上下文中獲取訊號量鎖。

7,讀寫訊號量,只要沒有寫者,併發持有讀鎖的讀者數不限,相反,只有唯一的寫者可以在沒有讀者時獲得寫鎖。

8,互斥鎖,使用計數始終為1的互斥訊號量。

9,完成變數、順序鎖、屏障;

第九章:記憶體管理

1,程式程式碼產生出的是邏輯地址,CPU要將一個邏輯地址轉換為實體地址,需要兩步:首先CPU利用段式記憶體管理單元,將邏輯地址轉換成線性地址,再利用頁式記憶體管理單元,把線性地址最終轉換為實體地址。

2,Linux採用頁式儲存管理機制,由於i386CPU的向下相容,所以Linux核心只不過是在對付本來就毫無必要卻又非得如此的例行公事而已,即每個段都是從0地址開始的整個4GB虛存空間,虛擬地址到線性地址的對映保持原值不變。

3,每個程序都擁有4G位元組的虛存空間,較低的3G位元組為自己的使用者空間,最高的1G位元組則為與所有程序以及核心共享的系統空間。雖然系統空間佔據了每個虛存空間中最高的1G位元組,在物理的記憶體中卻是從最低的地址(0)開始。

對於系統空間來說,其地址對映就是簡單的線性對映,給定一個虛地址x,其實體地址是從x中減去PAGE_OFFSET=0xC0000000,相應的,給定一個實體地址x,其虛擬地址是x+PAGE_OFFSET;不管什麼程序,一旦進入系統空間,都有相同的頁面對映。

對於使用者空間,其地址對映就是頁式管理的精髓了。Linux頁式對映機制分為三層:頁面目錄PGD,中間目錄PMD,頁面表PT,PT中的表項成為PTE。每個程序都有自己的PGD,PMD,PT,這三者均為陣列。

一個地址為0000 1000 0000 0100 1000 0101 0110 1000,最高十位是十進位制32,所以i386CPU就以32為下標去頁面目錄中找到其目錄項,這個目錄項的高20位指向一個頁面表,CPU在這20位後面添上12個0就得到該頁面表的指標,(每個頁面表佔一個頁面,所以自然就是4K位元組邊界對齊的,其起始地址的低12位一定是0,),找到頁面表以後,CPU再來看線性地址中的中間10位,即72,CPU就以此為下標在已經找到的頁表中找到相應的表項,與目錄項類似,32位的頁面表項中的高20位指向一個實體記憶體頁面,在後面添上12個0就得到這實體記憶體頁面的起始地址,在其起始地址上加上線性地址的最低12位就得到了最終的實體記憶體地址。

4,越界訪問:1,相應的頁面目錄項或頁面表項為空;2,相應的物理頁面不在記憶體中;3,指令中規定的訪問方式與頁面的許可權不符;此時CPU會產生一個page fault exception頁面出錯異常,進而執行預定的頁面異常處理程式,並向該程序傳送SIGSEGV訊號,程序每次從中斷/異常返回之前,都要檢查當前程序是否有懸而未決的訊號需要處理,即輸出Segment Fault,程序結束。

5,使用者堆疊的擴充套件:

假設程序執行過程中,已經用盡了為本程序分配的堆疊空間,即堆疊指標已經指向了堆疊空間的起始地址esp,假設現在需要呼叫某個子程式,CPU需將其返回地址壓入堆疊,即要將返回地址寫入esp-4的地方,而那個地方是空洞;因堆疊操作引起的越界是作為特殊情況對待的,需要檢查發生異常的地址是否緊挨著堆疊指標所指的地方標準是esp-32,如果不是,那就是非法越界訪問,如果是那就在空洞的頂端開始分配若干頁面建立對映,並將之併入堆疊空間,使其得到擴充套件。

6,中斷和異常的區別:當中斷以及自陷發生時,CPU都會將下一條指令,也就是本來應該執行的指令的地址壓入堆疊作為中斷服務程式的返回地址,異常發生時,CPU將因無法完成而夭折的指令本身的地址(不是下一條指令的地址)壓入堆疊,這就可以在從異常處理返回時完成未竟的事業。

7,記憶體分配演算法:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28820980&id=3848787

相關推薦

windows核心情景分析讀書筆記-----HYPERSPACE

主要介紹HYPERSPACE的建立對映函式 賞光看我這一系列文章的朋友最好結合毛德操老師的書來看,具體的細節我這裡就不闡述了 簡單說下這個函式功能 Windows核心有時候需要把某些物理頁面臨時對映到核心的虛存空間,用做臨時的用途 #define HYPERSPACE (

Linux核心設計實現Linux核心原始碼情景分析讀書筆記

第一章:核心簡介 處理器在任何指定時間點上的活動範圍: a,運行於核心空間,處於程序上下文,代表某個特定的程序執行; b,運行於核心空間,處於中斷上下文,於任何程序無關,處理某個特定的中斷; c,運行於使用者空間,執行使用者程序。 當一個程序在執行時,CPU的所有暫存器中的

Linux下通過GRUB2實現Windows的雙啟動

前一篇文章介紹瞭如何在只有Windows系統可以啟動的情況下,通過BCDEdit和Grub4Dos來啟動Linux系統。可是這樣啟動Linux實際上運行了兩次Boot程式。既然通過上述方法已經可以進入Linux系統了,那麼不如重新設定和安裝Linux下原有的Grub。當前GR

SQL Server橫向擴展:設計實現維護(2)- 分布式分區視圖

做的 img attach one 遠程 cnblogs ole out 不同的 為了使得朋友們對分布式分區視圖有個概念,也為了方便後面的內容展開,我們先看看下面一個圖: 講述分布式分區視圖之前,很有必要將之與我們常常熟悉的分區表和索引

分布式爬蟲系統設計實現實戰:爬取京東、蘇寧易購全網手機商品數據+MySQL、HBase存儲

大數據 分布式 爬蟲 Java Redis [TOC] 1 概述 在不用爬蟲框架的情況,經過多方學習,嘗試實現了一個分布式爬蟲系統,並且可以將數據保存到不同地方,類似MySQL、HBase等。 基於面向接口的編碼思想來開發,因此這個系統具有一定的擴展性,有興趣的朋友直接看一下代碼,就能理

基於Android簡單備忘錄的設計實現(附git原始碼連結)

前言 課程作業需要,於是忙活兩天寫了一個簡單的備忘錄,使用了ListView,SQLite。 開發環境:Android Studio 原始碼連結:https://gitee.com/zg0212/Memoire 功能截圖 主頁面 新建頁面

linux核心建立flash上的各分割槽原始碼進行分析

1.注意:核心原始碼版本為4.9 2.首先注意關鍵字串"partitions found on MTD device 這句話在drivers/mtd/mtdpart.c的parse_mtd_partitions()中出現 3.mtd_device_parse_register()呼叫了parse_mtd

Linux核心原始碼情景分析-特殊檔案系統/proc

    由於proc檔案系統並不物理地存在於任何裝置上,它的安裝過程是特殊的。對proc檔案系統不能直接通過mount()來安裝,而要先由系統核心在核心初始化時自動地通過一個函式kern_mount()安裝一次,然後再由處理系統初始化的程序通過mount()安裝,實際上是"重

協議棧之一:《linux核心網路棧原始碼情景分析》.(曹桂平)

在工作中或多或少需要和協議棧打交道,因為公司的策略,公司自有的協議棧基本都是基於開源協議棧的理解重寫的協議棧,在可維護性和效能方面均比開源軟體強勢很多,可惜在公司時更多是呼叫API,並未從頭到尾研究過一個完整的協議棧。從事網路工作沒有研究過完整的協議棧,不得不說是個嚴重的缺

Linux核心原始碼情景分析筆記---對照4.2.5核心

/* * These routines also need to handle stuff like marking pages dirty * and/or accessed for architectures that don't do it in hardware

儲存管理(二)--學習《Linux核心原始碼情景分析》第二章(方便理解,內容在註釋中)

        2.7 物理頁面的分配         分配若干頁面時,分配頁面用於DMA(direct memory assess)當然應該是連續的,其實出於物理儲存空間質地一致性考慮,記憶

儲存管理(一)--學習《Linux核心原始碼情景分析》第二章(方便理解,內容在註釋中)

2.1 Linux記憶體管理基本框架         32位cpu上的頁式記憶體管理是採用兩層對映方式,但在64位cpu上採用兩層對映方式就不太合理了,所以在Linux中頁式管理採用的是三層對映方式:頁面目錄(PGD)、中間目錄(P

段式、頁式記憶體管理--學習《Linux核心原始碼情景分析》第一章

    不得不說《Linux核心原始碼情景分析》這本書被那麼多人當作經典是有原因的,這裡只是該書的筆記遠不及毛老師描述的清楚。     對第一章做一個總結。這一章主要講解段式和頁式記憶體管理,當然還有一些其他東西。 Linux核心版本號的格式

Linux核心原始碼情景分析-系統呼叫mknod

    普通檔案可以用open或者create建立,FIFO檔案可以用pipe建立,mknod主要用於裝置檔案的建立。    在核心中,mknod是由sys_mknod實現的,程式碼如下:asmlinkage long sys_mknod(const char * filen

Linux驅動設計硬體基礎(六)硬體時序分析

2.6 硬體時序分析2.6.1 時序分析的概念    驅動工程師一般不需要分析硬體的時序,但許多企業內驅動工程師還需要承擔電路板除錯的任務,因此,掌握時序分析的方法也就比較必要了。    對驅動工程師或硬體工程師而言,時序分析是讓晶片之間的訪問滿足晶片資料手冊中時序圖訊號有效

Linux驅動設計硬體基礎(五)原理圖分析

    原理圖分析的含義是指通過閱讀電路板的原理圖獲得各種儲存器、外設所使用的硬體資源、介面和引腳連線關係。若要整體理解整個電路板的硬體組成,原理圖的分析方法是以主CPU為中心向儲存器和外設輻射,步驟如下。1)閱讀CPU部分,獲知CPU的哪些片選、中斷和整合的外設控制器在使用

數據結構算法(刺猬書)讀書筆記----目錄

更新 rip javascrip tar 結構 順序 耗時 梳理 讀書筆記 最近在抓底層的語言基礎,以前對數據結構和算法並沒有太大感覺,但越往深處學就越覺得這些基礎真的是要牢牢掌握住。一個簡簡單單的數組,深究起來都有很多學問。所以打算寫個一系列的讀書筆記,好好梳理一下這一塊

數據結構算法(刺猬書)讀書筆記(1)----數組

split() ring 此外 結果 shift 即使 cnblogs 操作符 main 在JavaScript中,數組其實是一種特殊的對象,用來表示偏移量的索引是該對象的屬性,所以JavaScript的數組本質上是對象。同時這些數字索引在內部會被轉換成為字符串類型,因為J

軟件需求分析讀書筆記3

可能 生產力 gpo 目的 浪費 需求工程 clas 讀書筆記 讀書 這本厚厚的書終於被我讀完了,現在開始最後一篇讀書筆記。 最後幾章主要講的是需求的文檔和需求過程的管理。即需求分析必須標準化。我們在需求的過程中必須學會用建模的方法來規範需求工程。需求分析的

Java核心技術卷一基礎技術-第13章-集合-讀書筆記

第13章 集合 本章內容: * 集合介面 * 具體的集合 * 集合框架 * 演算法 * 遺留的集合 13.1 集合介面 Enumeration介面提供了一種用於訪問任意容器中各個元素的抽象機制。 13.1.1 將集合的介面與實現分離 Java集合類