CMU 深入理解計算機操作系統 proxy lab

文章定位:寫坑+敘述

lab分爲三步:

 第一步:深度參考tiny.c,再自己改改就行,驗證的非常粗略,我還寫了很多RFC 1945裏面關於細節的check,並用於火狐的代理,看到自己寫的東西起碼能用起來,還是很開心的。

 第二步:沒實際內容,只要第一步寫好,改成多線程還是挺簡單的。(沒在這一步遇到困難)

第三部:自己寫cache,LRU,我用的是帶頭結點的雙向鏈表,尾插。還要加鎖pthread_rwlock。


pthread_rwlock用法:

 函數定義:https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html

 鎖定義:pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

 初始化鎖:pthread_rwlock_init(&rwlock, NULL);

 申請獲得讀鎖:pthread_rwlock_rdlock(&rwlock);

 申請獲得寫鎖:pthread_rwlock_wrlock(&rwlock);

 無論是讀鎖還是寫鎖,用完以後要釋放:pthread_rwlock_unlock(&rwlock);


坑1(write-up):一直說要看RFC 1945,看完以後,發現並沒啥用。還仔細看了兩天。


坑2(火狐代理):習慣性的用www.baidu.com測試,但是百度用的是http/1.1 connect方法。我只實現了GET方法,後來用學校主頁測試,效果很好。


坑3(從連接中讀內容):兩種函數帶緩存的和不帶緩存的。先用了帶緩存的(rio_readlineb),後用了一個不帶緩存的(rio_readn),結果,後面那個函數就讀不到數據,因爲數據已經被讀到緩存裏了。(好吧,這個錯誤的確有點腦殘。後面用不帶緩存的,覺得沒啥必要用緩存)


坑4(pthread_rwlock):一個線程,不能同時擁有讀鎖和寫鎖,一定要先釋放一種鎖,再申請另一種鎖。


坑5(有些迴應沒有content-length頭部):讀完頭部以後,就一直讀到EOF標識。這樣的讀法,同時解決二進制數據接收問題。


個人錯誤:

 1. m = (rio_writen(fd, buf, n)) == n -->  (m = rio_writen(fd, buf, n)) == n

 2. 給char 指針賦值,傳入了char * --> 傳入char ** (已經不是第一次了,屢教不改)

3. 更多其他....


自動測試其實很粗略,感覺很多點都沒有測試到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章