看板 LinuxDev 關於我們 聯絡資訊
第一次在板上詢問...小的是linux系統程式的生手 最近在寫proxy server碰到timer的問題: 我的需求是有一台proxy server (以下簡稱ps) ps 會開 n 個 thread 去處理 "每個不同的client 對固定server 的連線(send跟recv)" 圖解: client --> proxy --> server <-- <-- 每個thread的特性就是,需要計時器去計時 每個client透過ps連到server有一段時間限制 (並不是處理完就關閉) 我目前有找到一些方法: 1. 針對單一thread: time.h裡面有內建,使用的是定期傳送signal(alarm)看是否過期 2. 狂耗CPU資源的方法: 就是隨時都檢查有沒有過期 3. pthread_cond_init(): 這方法也是會面臨main thread很吃資源的問題 4. glib提供的g_timeout_source_new(): 支援multithread,但程式碼要砍掉重練 如果要盡量省CPU資源,多久檢查檢查的時間內都不會吃CPU 請問有更好的方法嗎? 不然應該只能採用glib了 先謝謝板友 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.2.247 ※ 編輯: note35 來自: 140.115.2.247 (08/14 14:10)
yvb:不知使用 epoll 或 libevent 如何? 08/14 22:01
我原先是使用epoll下去實作,但發現一些問題才改變做法 後來另外一組人馬有用poll把他實做出來,我才發現原來poll有辦法做到
tseng1129:timer_create - create a POSIX per-process timer 08/15 00:17
這個我沒嘗試過@@,會再去搜尋看看
dou0228:推 libevent 08/15 21:38
yvb:忽然想到, 3 為何很吃資源? 是因為套用 2 在 main thread 嗎? 08/16 20:34
yvb:然後, 2 是在 thread 用 non-blocking 嗎? 08/16 20:40
我是打算讓non-blocking跟blocking的方式都能運作 3的部分,誠如你所說,會在main thread上吃到CPU 100% 後來我的解決方法是用「共用變數」的方式去解決的 我拿成品交出去的時候,被對方認為這是種很奇妙的思維... poll已經足夠支援我的需求,這點也算長了一些知識 另外補充 libev其實就是涵蓋了epoll(for linux)跟BSD自己的另一套poll函式庫 使用libev也就能同時支援兩個系統。 ※ 編輯: note35 來自: 140.115.2.247 (08/22 19:02)
yvb:libev 和 libevent 是兩套不同的 library... 08/30 21:27
yvb:使用 select/poll/epoll 基本原理都是 asynchronous 的方式, 08/30 21:28
yvb:但在很多 FDs 和 Threads 的情況下, epoll 較佳... 08/30 21:29
yvb:另外, 即使用 busy waiting 的方式, 還是可以適當加入一些 08/30 21:33
yvb:條件做 usleep() 來避免狂吃資源... 08/30 21:34
yvb:比方non-blocking read沒東西就慢慢加大usleep直到某上限之類. 08/30 21:36
yvb:read 的到東西就不需做 usleep() ... 08/30 21:37
yvb:另外, 不知您 "用「共用變數」的方式" 是怎樣的方式?? 08/30 21:38