CSci 4061多執行緒影像匹配伺服器

j22h7x發表於2024-04-01

CSci 4061:作業系統簡介,2024年春季專案#3:多執行緒影像匹配伺服器中間提交截止時間:2023年4月4日下午11:59(CDT)
最終提交截止時間:下午11:59(CDT),4。12, 2023
1.背景
這個實驗室的目的是使用
C語言中的POSIX執行緒(pthreads)來學習執行緒程式設計和同步方法。在這個專案中,我們將使用多執行緒來提高伺服器的效能程式設計為接受來自使用者的影像,將其與已知影像的資料庫進行匹配,然後返回最接近的匹配影像。在這個程式設計任務中,我們將使用排程員工作人員執行緒的模型。同時存在併發性和並行性(如果伺服器執行在多核系統)。注意:即使執行緒被分派到不同的核心,它們仍然可以直接訪問所有的程序記憶體。
此程式設計任務的目的是讓您開始使用執行緒程式設計和同步。您需要熟悉POSIX執行緒、互斥鎖和條件變數。
2.工程概況
您的專案將由兩種型別的執行緒組成:排程器執行緒和工作執行緒。這個排程器執行緒的目的是重複接受傳入的連線,讀取客戶端請求並將請求放入佇列中。我們將假設只有一個請求每個傳入連線。工作執行緒的目的是監視請求佇列,檢索請求(以輸入影像的形式)並將影像讀取到儲存器中(即獲取影像的位元組),將影像與影像資料庫進行匹配,並將最佳或最接近的匹配影像提供給
使用者佇列是一個有界緩衝區,需要正確同步。所有客戶端伺服器通訊是為您實現的。
3.伺服器概述
當程式啟動時,伺服器應該建立一個固定的工作執行緒和排程執行緒池。代 寫CSci 4061工作執行緒池的大小應該是num_worker(您可以假設工作執行緒的數量將小於請求的數量)並且排程器執行緒的大小應該是num_dispatcher。你的當伺服器啟動時,伺服器應該將影像資料庫放入記憶體。
3.1伺服器資料庫:
● 資料庫是一個充滿影像的目錄。這些影像用於比較從客戶端接收的輸入影像,最接近的匹配隨後返回到各自的客戶。必須在伺服器的啟動以確保在匹配過程中有效訪問。
3.2請求佇列結構:
● 請求佇列結構:佇列中的每個請求都將包含一個影像(即位元組),以及傳送到哪裡的檔案描述符最佳匹配影像返回。在將該資料新增到佇列之前,可以使用結構來儲存該資料。佇列結構由您決定。您可以將其實現為結構佇列或的連結串列結構或任何其他您認為合適的資料結構。
3.3 Dispatcher執行緒
排程器執行緒的目的是重複接受傳入連線,讀取來自連線的客戶端請求(即影像內容),並將該請求放入佇列中。我們將假設每個傳入連線只有一個請求。您將使用鎖和條件
變數(週四討論)來同步此佇列(也稱為有界緩衝區)。佇列是固定尺寸。
● 佇列管理:已識別的位元組影像流將沿著新增到請求佇列帶有將影像傳送回何處的檔案描述符。此佇列與工作人員共享。
● 發出新請求訊號:一旦請求被新增到請求佇列中,排程器執行緒將向所有工作執行緒發出佇列中有請求的訊號。
● 完整佇列:一旦佇列已滿,排程程式執行緒將等待來自任何工作執行緒的訊號執行緒通知佇列中有空間。
● 排程員將呼叫的網路功能:
○ int socketfd=accept_connection():返回一個檔案描述符應儲存在佇列中
○ Char*緩衝區=get_request(int socketfd,size_t*大小):將檔案描述符作為第一個引數,將size_t指標作為第二個引數將由該函式設定的引數。返回帶有原始影像位元組的char*。
3.6工作執行緒
工作執行緒負責監視請求佇列、檢索請求,將來自資料庫的影像與請求影像進行比較,並將最佳影像提供給使用者。以下是其功能的細分:
● 引數:工作執行緒將使用threadID作為引數(0,1,2,…),稍後將使用用於日誌記錄。您可以按照建立執行緒的順序為執行緒分配一個ID。筆記該執行緒ID與pthread_create()分配給該執行緒的pthread_ID不同作用
● 佇列監視:工作執行緒持續監視共享請求佇列。當一個新的請求從排程程式執行緒到達,其中一個工作執行緒將檢索該請求以進行進一步處理處理。
● 請求處理:一旦獲得請求,工作執行緒將與用於最佳匹配影像的資料庫的記憶體副本。
● 對請求的響應:在找到影像後,工作執行緒準備要服務的影像透過傳送影像位元組返回給使用者。然後,客戶端將返回的影像寫入檔案。:輸入檔案是foobar.png輸出檔案可以是foobar_smilar.png。
● 空佇列:一旦佇列為空,工作執行緒將等待來自排程器執行緒,佇列中現在有請求。
● 同步:適當的同步機制,如互斥鎖和條件變數用於確保多個工作執行緒可以安全地訪問和修改共享資料結構(佇列)和其他全域性變數,而沒有競爭條件或死鎖。
● 工作人員將執行的網路功能:
○ database_entry_t image_match(char*input_image,int size):
○ send_file_to_client(int socketFd,char*緩衝區,int大小):獲取客戶端檔案描述符、匹配的影像記憶體塊及其大小。
3.8請求日誌記錄
工作執行緒必須小心地將每個請求記錄到名為“server_log”的檔案中,也記錄到終端(stdout),格式如下。日誌檔案應建立在最終檔案所在的同一目錄中
可執行檔案“伺服器”存在。您還必須保護日誌檔案不受競爭條件的影響。格式為:
threadId][reqNum][fd][Request string][bytes/error]
● threadId是從0到num_workers-1的整數,表示請求的執行緒索引搬運工人。(注意:這不是pthread_create返回的pthread_t)。
● reqNum是特定工作執行緒迄今為止處理的請求總數,包括當前請求(即,這是對每個請求進行唯一標記的一種方式)。
● fd是accept_connection()為此請求提供的檔案描述符
● 資料庫字串是伺服器傳送的影像檔名
● 位元組/錯誤是成功請求返回的位元組數。日誌(在“server_log”檔案和終端中)應該類似於下面的示例。我們為此提供程式碼。
[8] [1][5][/DB/30.jpg][17772]
[9] [1][5][/DB/30.jpg][17772]確保開啟serer_log檔案進行寫入,並將其截斷為0。
3.8伺服器終止我們將保持這個非常簡單:^C。如果你希望你能抓住^C,並做一些清理或再見,但不需要。如果客戶端正在執行,那麼這可能會掛起客戶端或使其崩潰。別擔心。
4.客戶概述
您的客戶端將使用目錄名作為命令列引數,並負責遍歷其內容。對於目錄中遇到的每個檔案,客戶端將啟動一個執行緒來請求
伺服器來處理它。這個執行緒將處理檔案傳輸到伺服器進行處理。隨後,執行緒將保持活動狀態,等待接收到相應的匹配影像從伺服器,將內容寫入檔案,然後終止。客戶端是多執行緒的原因是模擬對伺服器的多個併發請求。
4.1客戶端主執行緒
● 目錄遍歷:主執行緒將遍歷每個映像的目錄內容在目錄中遇到,它將生成一個執行緒來處理它伺服器的併發性,希望如此。
4.2客戶端執行緒
● 檔案準備:一旦執行緒啟動,它將把影像載入到記憶體中併傳送到使用send_file_to_server()函式的伺服器。
● 使用者響應:線上程成功地向伺服器傳送影像之後。執行緒將
保持活動,等待從伺服器接收到相應的匹配影像。
● 匹配影像處理:一旦客戶端收到匹配影像,執行緒將影像儲存到一個新檔案中並記錄請求。
● 客戶端需要呼叫的網路函式:
○ int socketFd=setup_connection():返回一個檔案描述符將資料傳送到伺服器
○ send_file_to_server(int socketFd file*fd,size_t size):獲取伺服器檔案描述符、影像檔案描述符和影像大小。
○ receive_file(int socketFd,char*路徑):伺服器檔案描述符和
輸出新影像的路徑。
5.編制說明您可以使用建立所有必要的可執行檔案命令列製作使用可以完成使用各種目錄執行程式
命令列
$ ./伺服器<埠><資料庫路徑><num_dispatcher><num_workers><queue_lenght>
$ ./客戶端<目錄路徑><伺服器埠><輸出目錄路徑變數。將.zip檔案上傳到Gradescope的組成員應將其他成員新增到
他們的小組提交後。一個組中只有一個成員應上傳。9.2最終提交每組中的一名學生應向Gradescope上傳一個.zip檔案,其中包含所有專案檔案。自述檔案應包括以下詳細資訊:
● 專案組編號
● 組成員名稱和x500
● 您在其上測試程式碼的CSELabs計算機的名稱○ 例如csel-kh1250-01.cselabs.umn.edu
● 成員個人貢獻
● 對Makefile或現有檔案所做的任何會影響放坡的更改
● 您所做的任何未在第7節中概述的假設
● 如何使您的程式使每個單獨的請求並行化?(高層虛擬碼是可接受的/首選的)將.zip檔案上傳到Gradescope的組成員應將其他成員新增到
他們的小組提交後。一個組中只有一個成員應上傳。您的專案資料夾應包括原始模板中的所有資料夾。您可以新增
將其他檔案新增到這些資料夾並編輯Makefile,但要確保一切正常。之前提交您的最終專案,執行“make clean”以刪除任何現有的輸出/資料,然後手動刪除任何錯誤的檔案。
10.其他
1.我們將提供一組初始程式碼,但大部分程式碼將由您完成。
2.不要使用系統呼叫“系統”。
3.之前說過:根據需要,在除錯過程中殺死所有雜散程序。
4.提供的任何二進位制檔案都適用於CSELAB Linux環境。不會有其他二進位制檔案分散式。
5.禁止ChatGPT或其他重要的“其他”程式碼重用。本課程的目的是邊做邊學,不要錯過最後期限。如果您不確定任何定位的線上程式碼,聯絡我們6.另一方面,定位顯示如何使用系統呼叫的程式碼片段也很好

11.準則(暫定)
● [10%]自述
● [15%]中間提交
● [15%]編碼風格:縮排、可讀性、適當的註釋
● [20%]測試用例
● [30%]正確使用pthread_create()、pthread_join()和pthread_mutex_t,pthread_cond_t,
pthread_mutex_lock()、pthread_mutex_unlock(),pthread_cond_wait(),pt hread_cond-signal()
● [10%]錯誤處理--應處理系統呼叫錯誤並正常終止附加說明:
● 我們將使用安裝在CSELabs機器上的GCC版本來編譯您的程式碼。製作
確保您的程式碼在CSELabs上編譯和執行。
● CSELabs機器列表可在https://cse.umn.edu/cseit/classrooms-labs
○ 儘量使用Keller Hall電腦,因為這些電腦是我們用來測試您的密碼
● 有用的GDB手冊。黃:GDB教程考夫曼:GDB快速指南

相關文章