每五秒執行一次 紀念一次離譜的Coursework

2021-10-16 06:19:54 字數 2623 閱讀 4764

大家晚上好!!!又是好久沒更新了~

【前言】

在開學前本以為大三的生活依然是風花雪月,我的生活狀態依舊是瀟灑如鷹,雖然知道這一年學習肯定是要更忙一點,但總認為仍然有足夠的時間去給我享受眼前生活。但大半個學期過去了才發覺,整個人每天都在被各種情緒牽扯,因為我今年明顯感覺到無法把學習和生活平衡得那麼好,雖說得失有數,但為了更高的目標放棄一些東西也的確很難受吧。別的感受也不想多言,我現在只想把它們封存起來,等一年之後再回溯這些寶貴的記憶點,我希望所換來不是刻舟求劍的無奈,而是一種油然而生的想法:這些寶貴的時間碎片是我今年最大的獎。

【吐槽】

沒錯,我想寫的就是can 201的cw1。別的先不說,拿到這個cw的task sheet時我整個人就直接懵了(見下圖)。整整六頁描述要求和評分規則,入門cs到目前為止我還真沒見過要求那麼多的cw,而且這個cw不是一般的難

為什麼難?第一,雖然都嘲諷ics是自學專業,這點我一直否認,但這次無話可說,實現這個需求所用到的技術和操作老師課上幾乎沒教,所給的sample code相對來說也只是一種敷衍(就比如講到socket程式設計時連最基本的recv函式的用法都不說)。第二,要求太多,讀完這個要求就能感覺到這差不多要求我們做乙個工業級的應用,而且還是大三學生在有限的幾周時間內單人開發(而且這個cw直接佔比55%啊)...... 第三就是這個cw技術性太高而且對大家不公平。多執行緒多程序併發加鎖,提高效率甚至考慮一下資料結構的選擇和演算法使用,在linux虛擬機器內測試...... ics專業的學生還好,至少在大二這一年學過相關課程,但這次還有很多其他專業的學生做這個cw,公平嗎?之前也做過一些比較難的coursework,比如大二上學期gui實現視窗的縮放是乙個難點,大二下學期tsp問題怎樣選擇合適的資料結構和演算法來優化路徑也不簡單,但它們都只是難在乙個點上,至少還是在可控的範圍內,而這次幾乎每乙個模組裡面都有難點

【思路】

很多人只是以為本次cw的重點在檔案傳輸,當然沒什麼問題,但我在實現過程中發現更重要的是protocol的設計和如何把所有要求都實現而且不能有衝突(ethan目前還剩下斷點續傳和部分修改兩塊沒有做)。為了能給自己乙個清晰地設計思路,我主要從detection,file transfer,protocol design, other details四個方面考慮,最後在實現的時候不斷修改調整並把它們彙總起來(老敏捷開發了)。

detection

首先一點要明確的是,我設計的是一種主動模式,就是檢測到檔案出現直接傳送,而不是等著對方來跟你要,那麼這個cw與其說是file sharing倒不如說是file synchronization。根據sheet的描述我們可以知道,現在有三颱機器都跑著同乙個程式(也可能還沒啟動),在其中一台機器的share資料夾下放進乙個檔案,另外兩台機器需要自動同步。底層先不說,這裡就已經涉及到兩個很重要的問題:1. 怎樣檢測到有新的檔案加進來了?protocol desgin

file transfer

這是最令我難受的乙個模組,因為我花了前五天甚至第一周都在研究怎樣能使檔案傳輸更快而且不丟包不錯誤,但最後沒有任何收穫(可能是因為我能力不夠)只能按部就班。先說一下多執行緒的問題,老師在課上說用多執行緒分別負責程式的一些block的傳輸可能會使傳輸時間縮短。在理論上這當然是沒有問題的,而且對於tcp而言,在一定頻寬的網路下,建立的tcp連線數越多,那麼搶到的頻寬就越大,傳輸的速度也會更快。但是經過我的測試和大佬們的討論,在一周後我才發現,python裡面的多執行緒是假多執行緒!!!也就是雖說是多執行緒,但每乙個執行緒並沒有被對映到計算機內的每乙個核心上,他還是乙個核跑那麼多執行緒(欲哭無淚、身心俱疲、生無可戀)...... 但是在python裡面多程序可以被對映到每乙個核心上面,但是每啟動乙個程序是非常浪費時間的,可能人家單執行緒傳10m的檔案瞬間就過去了,你還得乙個個執行緒啟動再傳送,不知道慢成什麼樣。更重要的是多執行緒還得考慮race condition和先後順序等一些問題,可能你寫入檔案內容的順序是亂掉的,這還得考慮用陣列下標來表示block啥的,特別煩,執行緒開多了程式甚至也可能崩掉。所以我就不浪了,直接一條執行緒把檔案分block慢慢傳吧,最多再判斷一下檔案大小加個壓縮什麼的。如果說功利的話最多也就丟個三四分吧,能把多執行緒跑順的大佬也應該是少數。

other details

剩下的是一些advanced要求(斷點續傳,部分修改)和一些細節(如何處理資料夾,如何壓縮),因為我還沒有完全做完,雖然有想法,但還不知道能否實現,在這裡就不說了。有想法的朋友們有時間時可以一起討論~

【尾聲】

emmm這次就寫這麼多吧,主要是想記錄一下自己做這個cw時的心境和分享一些想法,希望能幫助到有需要的朋友們,也許過了幾個月自己看也會覺得當時自己好熱忱啊hhhhh。最後在這個十分離譜的cw前,希望大家都能互相幫助,一起度過難走的一關。

crontab設定每五秒執行一次程式的方法

事實上知道crontab設定的最小時間為每分鐘,那麼要實現以秒為單位進行定時執行任務,該怎麼處理,例項說明,以每五秒執行一次任務為說明 方法一 1 homemytest test.sh 1 sleep 5 home mytest test.sh 1 sleep 5 home mytest test....

紀念一次肉眼debugger的過程

題目要求寫多項式的加法和乘法。原理已經想明白了,寫完加法,有兩百多行,嚇得我趕緊用函式代替了一些重複度高的 縮減到了150行左右。初步 是這樣的 include include typedef struct node ptrtonode struct node typedef ptrtonode p...

iOS 計時器(5秒執行一次)

每5秒執行一次,切記離開頁面時取下程序。獲取乙個全域性的執行緒來執行計時器 dispatch queue t queue2 dispatch get global queue dispatch queue priority default,0 建立乙個計時器 timer dispatch sourc...