<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          直接吹爆,這些網(wǎng)站!

          共 4086字,需瀏覽 9分鐘

           ·

          2022-02-22 12:53

          大家好,我是小林。

          之前分享過一些能幫助我們理解某個知識的網(wǎng)站,比如算法、TCP 滑動窗口、MESI 協(xié)議等。

          這些網(wǎng)站都是針對一個知識點做了動圖模型,我們可以通過輸入?yún)?shù)來模擬學習,但是這類網(wǎng)站就是比較難找,我也是無意間收集到的。

          所以,今天在這里做個集合,大家收藏就完事,需要的時候打開用用。

          算法可視化網(wǎng)站

          Structure Visualization

          我之前那篇文章就是在 Data Structure Visualization 網(wǎng)站做的動圖,這個網(wǎng)站支持很多種數(shù)據(jù)結(jié)構的動圖演示。

          地址:https://www.cs.usfca.edu/~galles/visualization/

          因為網(wǎng)站是國外做的,所以實際上是英文來了,我為了方便大家看,所以翻譯成了中文。

          該網(wǎng)站支持堆、棧、隊列、列表、階乘、反轉(zhuǎn)字符串、N-皇后、排序、二叉樹、AVL樹、紅黑樹、B/B+樹、哈希表、圖、動態(tài)規(guī)劃等等可視化演示,基本都是我們很常見的數(shù)據(jù)結(jié)構與算法。

          接下來,我以平衡二叉樹作為動圖演示例子,如下動圖:

          我們可以自己隨意插入、刪除、查找數(shù)據(jù),也可以自定義動圖的播放速度,甚至可以一步一步的查看增刪查的過程。

          Data Structure Visualization 網(wǎng)站比較可惜的地方是,動圖演示的過程沒有對應的代碼演示。

          VisuAlgo

          VisuAlgo 也是一個優(yōu)秀的數(shù)據(jù)結(jié)構與算法可視化網(wǎng)站,網(wǎng)站可以支持中文顯示。

          地址:https://visualgo.net/

          VisuAlgo ?網(wǎng)站主頁顯示的數(shù)據(jù)結(jié)構不多,但是并不意味它只支持顯示出來的,如果你想學習的數(shù)據(jù)結(jié)構并沒有在主頁中,可以通過搜索框來查找:

          接下來,我演示下快排算法的動圖演示:

          可與看到,在動圖演示的過程,右下角也有對應的代碼執(zhí)行過程,這樣我們可以很清晰的知道代碼每一步的過程,非常便于我們的理解,再也不用通過打 log 來看代碼怎么執(zhí)行的。

          注意,大家在看代碼執(zhí)行過程的時候,建議使用英文,如果使用中文的話,演示的代碼也會被翻譯成中文:

          Algorithm Visualizer

          Algorithm Visualizer 是強大的算法可視化工具,它不一樣的地方在于,它支持 C++、Java、JavaScript 編程語言,是一個不僅能看動圖,也能自己編程的網(wǎng)站。

          地址:https://algorithm-visualizer.org/

          網(wǎng)站的主頁長下面這樣:

          左半部分主要是支持的算法,中間部分是可視化動圖,右半邊就是提供的算法代碼實例,這部分代碼我們是可以修改的。

          我以二叉搜索樹的插入為例子,演示一下它的動圖效果:

          MESI 協(xié)議可視化網(wǎng)站

          我之前寫過 CPU 緩存一致性 MESI 協(xié)議:10 張圖打開 CPU 緩存一致性的大門。

          然后期間挺多人對 MESI 協(xié)議的轉(zhuǎn)換有疑問,其實我在文章中把 MESI 協(xié)議狀態(tài)切換的各個過程都總結(jié)成了一個表格,可能內(nèi)容太多,很多小伙伴沒有仔細看。

          我發(fā)現(xiàn)個可以「在線體驗 MESI 協(xié)議狀態(tài)轉(zhuǎn)換」過程的網(wǎng)站。

          地址:https://www.scss.tcd.ie/Jeremy.Jones/VivioJS/caches/MESIHelp.htm

          下圖即是 MESI 協(xié)議的狀態(tài)圖:

          MESI 協(xié)議的四種狀態(tài)之間的流轉(zhuǎn)過程,我匯總成了下面的表格,你可以更詳細的看到每個狀態(tài)轉(zhuǎn)換的原因:

          接下來說說,怎么玩這個網(wǎng)站。

          看上圖,共分為三個部分:

          • 第一部分,內(nèi)存。顯示內(nèi)存地址和數(shù)據(jù);
          • 第二部分,CPU 緩存。顯示 CPU 緩存的變量數(shù)據(jù)和 MESI 協(xié)議狀態(tài),因為我現(xiàn)在還沒開始操作,所以顯示的是空白。
          • 第三部分,CPU 操作。共有三個 CPU,每個 CPU 都有各自的 Cache,CPU 操作分別「讀」和「寫」,這部分是我們手動操作的部分。

          而且 CPU 和內(nèi)存之間有三條總線,分別是:

          • 數(shù)據(jù)總線(Data Bus):在CPU與內(nèi)存之間來回傳送需要處理或是需要儲存的數(shù)據(jù)。
          • 地址總線(Adress Bus),用來指定在內(nèi)存之中儲存的數(shù)據(jù)的地址。
          • shared,這個我也不知道是什么總線,網(wǎng)上沒搜到資料,網(wǎng)站上最細那條總線就是這個名字,作用是控制 Cache 的數(shù)據(jù)狀態(tài)。

          接下來,來演示下效果。

          我操作 CPU1 讀取 a0 變量,此時頁面會顯示如下(實際上是有動畫的效果的,我這里就不錄制動圖了,建議大家自己去操作一遍,自己感受下過程):

          可以看到,CPU1 核心從內(nèi)存讀取了 a0 變量的數(shù)據(jù),并緩存在了 Cache1 里,而且此時狀態(tài)為 E (獨占)。

          然后我操作 CPU2 讀取 a0 變量,此時頁面會顯示如下:

          可以看到,CPU1 和 CPU1 的 Cache 數(shù)據(jù)的狀態(tài)都是 S(共享),和表格中表述的現(xiàn)象一致。

          別看我的結(jié)果是靜態(tài)的,實際上當我操作完 CPU2 讀取 a0 變量后,實際上是有動畫效果的,這里有個小技巧,在動畫的過程中,我們可以點擊網(wǎng)站任意一個位置,就會暫停,然后再點擊就開始,這樣我們可以很清晰的知道這個狀態(tài)過程是怎么通過這三個總線完成的。

          我大概簡述下過程:

          1. 點擊 CPU2 的 read a0 操作;
          2. CPU2 會向地址總線,發(fā)送讀取 a0 變量的數(shù)據(jù)的請求,此時該請求不僅會被內(nèi)存收到,也會被其他 CPU 核心收到。
          3. CPU1 從地址總線得知,CPU2 發(fā)起的讀取地址存在于 CPU1 Cache 里,于是 CPU1 Cache 里數(shù)據(jù)的狀態(tài)會從 E(獨占)變更為 S(共享);
          4. 內(nèi)存收到 CPU2 發(fā)起的讀取 a0 數(shù)據(jù)的請求后,就會通過數(shù)據(jù)總線將數(shù)據(jù)傳遞給 CPU2;
          5. 最后數(shù)據(jù)會寫到 CPU2 Cache 里,且狀態(tài)是 S(共享)。

          其他狀態(tài)的變更,我在這里就不介紹了,大家自己去網(wǎng)站體驗下,這樣會感觸比較深,光聽我講也記不住。

          可以對照我文章中 MESI 狀態(tài)轉(zhuǎn)換的表格來做實驗,感受下 MESI 狀態(tài)到底是如何在不用加鎖的情況下,是如何實現(xiàn) CPU 緩存一致性的。

          提一句這個網(wǎng)站有個地方和我總結(jié) MESI 表格有點差異,我總結(jié)的 MESI 狀態(tài)轉(zhuǎn)換是基于維基百科的,不知道是不是這個網(wǎng)站原作者實現(xiàn)的時候參看了別的標準。

          TCP 可視化網(wǎng)站

          之前圖解過 TCP 的滑動窗口和流量控制的工作方式:圖解 TCP 重傳、滑動窗口、流量控制、擁塞控制

          當時花費了好幾個星期肝了這篇文章,因為為了方便大家理解他兩的工作方式,以及一些異常場景的分析,畫了很多變化的圖。

          還沒看過的同學,可以去看看,可以說把每一個階段的變化都解釋的很清楚了。

          但是,不管怎么樣圖解,它始終不會動呀,動起來的話,大家學起來就會更加深刻了。

          我最近剛好發(fā)現(xiàn)兩個網(wǎng)站,可以以「動圖」的方式來學習 TCP 的滑動窗口和流量控制工作方式。

          滑動窗口可視化網(wǎng)站

          滑動窗口動圖體驗的網(wǎng)站地址:

          https://www2.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/

          下圖是我從網(wǎng)站錄制的一張動圖:

          每個長方塊代表一個數(shù)據(jù),上面的是發(fā)送方,下面的是接收方,長方塊的不同的顏色代表著不同的意義,而且發(fā)送發(fā)和接收方滑動窗口的也是不同的。

          先來說說,「發(fā)送方」的長方塊顏色:

          • 黃色:代表已發(fā)送并且已被確認的數(shù)據(jù);
          • 藍色:代表已發(fā)送但未被確認或者還未發(fā)送的數(shù)據(jù);
          • 灰色背景:代表滑動窗口的大小,比如這個動圖滑動窗口大小是 5。
          • 紫色圈圈:代表超時重傳時間;

          再來說說,「接收方」的長方塊顏色:

          • 深藍色:代表數(shù)據(jù)已經(jīng)被接收;
          • 白色:代表還未接收到的數(shù)據(jù);
          • 綠色:代表對發(fā)送方數(shù)據(jù)的ack確認包;

          這個網(wǎng)站,可以自行設置一些參數(shù)。

          比如,可以設置滑動窗口的大小、超時重傳時間、發(fā)送速率、確認模式(選擇性確認模式or普通確認模式)等等。

          我這里設置幾個參數(shù),給大家看看效果。

          我把超時重傳時間時間縮短,并且確認模式是普通確認模式,動圖效果如下:

          可以看到,這種確認模式在發(fā)生超時重傳的時候,會把發(fā)送窗口內(nèi)已發(fā)送的數(shù)據(jù)都會重傳一遍。

          接著,我把確認模式改成「選擇性確認」。其動圖效果如下:

          可以看到,改用「選擇性確認」的方式,只會重傳丟失的那一個數(shù)據(jù)。

          流量控制可視化網(wǎng)站

          流量控制動圖體驗的網(wǎng)站地址:

          https://www2.tkn.tu-berlin.de/teaching/rn/animations/flow/

          這個網(wǎng)站的可以設置參數(shù)就比較少,理解起來也很容易。

          我這里簡單介紹下這些參數(shù):

          • file size,發(fā)送的文件總大??;
          • buffer size,發(fā)送方和接收方的內(nèi)核緩沖區(qū)的大??;
          • propagation time,發(fā)送方和接收方之間的傳播時間。

          下圖是我從網(wǎng)站錄制的一張動圖:

          可以看到,發(fā)送方和接收方共有兩個緩沖區(qū),一個是 buffer,指的是內(nèi)核緩沖區(qū),另外一個是 application,指的是應用層的緩沖區(qū)。

          對于發(fā)送發(fā)來說,當要發(fā)送數(shù)據(jù)的時候,需要從 application 拷貝數(shù)據(jù)到 buffer,而對于接收方來說,當接收到數(shù)據(jù)的時候,會先緩存到 buffer,然后再由應用程序從 buffer 讀取數(shù)據(jù)。

          當接收方的 application 來不及從 buffer 讀取數(shù)據(jù),而導致 buffer 堆積滿了,這時接收方就會給發(fā)送方通報一個接收窗口為0的報文,表示我已經(jīng)不能再接收數(shù)據(jù)啦,比如下面這個情況。

          大家可以去體驗這兩個網(wǎng)站,我感覺做的還是挺不錯到,對于學習 TCP 滑動窗口和流量控制會有很大的幫助。

          當然,在使用之前,最好自己要學一點理論知識,看我之前的這篇就夠了:圖解 TCP 重傳、滑動窗口、流量控制、擁塞控制


          如果大家收藏夾里還有這類可視化的網(wǎng)站,歡迎在評論區(qū)分享下!

          圖解系列文章:
          看書的一點小建議!
          圖解系列文章匯總
          計算機基礎學習路線
          小林的圖解系統(tǒng),大曝光!
          不鴿了,小林的「圖解網(wǎng)絡 3.0 」發(fā)布!
          瀏覽 108
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  最新国产精品视频豆花 | 国产黄片一区二区三区 | 人人插人人靠 | 国产夫妻手机在线 | 擼擼夜夜 |