當前位置:首頁 » 操作系統 » 消息機制linux

消息機制linux

發布時間: 2023-01-06 17:40:25

A. linux和windows編程機制是消息機制嗎 QT為什麼作為一個開發工具也有自己的編程機制,是信號與槽機制

linux 和windows都是消息驅動機制
說白了 就是 回調函數.表層用 事件,信號和槽等等,都無所謂,最終調用的都是系統提供的API函數.

B. 在window里是消息機制,在linux里是什麼呢QT里的信號和槽和他們是怎麼聯系的呢

個人觀點:
GUI程序基本都是事件觸發的,只是時間傳遞的實現方法各不相同。
Windows裡面用的是消息,回調函數,Qt用的是信號和槽,GTK+用的是回調函數。

C. linux圖形用戶界面的核心是

事件驅動消息機制。linux圖形用戶界面的核心是事件驅動消息機制,相對於傳統的類Windows消息機制,該系統具有系統資源需求少,便於移植,模塊靈活,界面美觀等特點。

D. Handler消息機制(一):Linux的epoll機制

在linux 沒有實現epoll事件驅動機制之前,我們一般選擇用select或者poll等IO多路復用的方法來實現並發服務程序。在linux新的內核中,有了一種替換它的機制,就是epoll。

相比select模型, poll使用鏈表保存文件描述符,因此沒有了監視文件數量的限制 ,但其他三個缺點依然存在。

假設我們的伺服器需要支持100萬的並發連接,則在__FD_SETSIZE 為1024的情況下,則我們至少需要開辟1k個進程才能實現100萬的並發連接。除了進程間上下文切換的時間消耗外,從內核/用戶空間大量的無腦內存拷貝、數組輪詢等,是系統難以承受的。因此,基於select模型的伺服器程序,要達到10萬級別的並發訪問,是一個很難完成的任務。

由於epoll的實現機制與select/poll機制完全不同,上面所說的 select的缺點在epoll上不復存在。

設想一下如下場景:有100萬個客戶端同時與一個伺服器進程保持著TCP連接。而每一時刻,通常只有幾百上千個TCP連接是活躍的(事實上大部分場景都是這種情況)。如何實現這樣的高並發?

在select/poll時代,伺服器進程每次都把這100萬個連接告訴操作系統(從用戶態復制句柄數據結構到內核態),讓操作系統內核去查詢這些套接字上是否有事件發生,輪詢完後,再將句柄數據復制到用戶態,讓伺服器應用程序輪詢處理已發生的網路事件,這一過程資源消耗較大,因此,select/poll一般只能處理幾千的並發連接。

epoll的設計和實現與select完全不同。epoll通過在Linux內核中申請一個簡易的文件系統(文件系統一般用什麼數據結構實現?B+樹)。把原先的select/poll調用分成了3個部分:

1)調用epoll_create()建立一個epoll對象(在epoll文件系統中為這個句柄對象分配資源)

2)調用epoll_ctl向epoll對象中添加這100萬個連接的套接字

3)調用epoll_wait收集發生的事件的連接

如此一來,要實現上面說是的場景,只需要在進程啟動時建立一個epoll對象,然後在需要的時候向這個epoll對象中添加或者刪除連接。同時,epoll_wait的效率也非常高,因為調用epoll_wait時,並沒有一股腦的向操作系統復制這100萬個連接的句柄數據,內核也不需要去遍歷全部的連接。

當某一進程調用epoll_create方法時,Linux內核會創建一個eventpoll結構體,這個結構體中有兩個成員與epoll的使用方式密切相關。eventpoll結構體如下所示:

每一個epoll對象都有一個獨立的eventpoll結構體,用於存放通過epoll_ctl方法向epoll對象中添加進來的事件。這些事件都會掛載在紅黑樹中,如此,重復添加的事件就可以通過紅黑樹而高效的識別出來(紅黑樹的插入時間效率是lgn,其中n為樹的高度)。

而所有 添加到epoll中的事件都會與設備(網卡)驅動程序建立回調關系,也就是說,當相應的事件發生時會調用這個回調方法 。這個回調方法在內核中叫ep_poll_callback,它會將發生的事件添加到rdlist雙鏈表中。

在epoll中,對於每一個事件,都會建立一個epitem結構體,如下所示:

當調用epoll_wait檢查是否有事件發生時,只需要檢查eventpoll對象中的rdlist雙鏈表中是否有epitem元素即可。如果rdlist不為空,則把發生的事件復制到用戶態,同時將事件數量返回給用戶。

epoll結構示意圖

通過紅黑樹和雙鏈表數據結構,並結合回調機制,造就了epoll的高效。

events可以是以下幾個宏的集合:
EPOLLIN:觸發該事件,表示對應的文件描述符上有可讀數據。(包括對端SOCKET正常關閉);
EPOLLOUT:觸發該事件,表示對應的文件描述符上可以寫數據;
EPOLLPRI:表示對應的文件描述符有緊急的數據可讀(這里應該表示有帶外數據到來);
EPOLLERR:表示對應的文件描述符發生錯誤;
EPOLLHUP: 表示對應的文件描述符被掛斷;
EPOLLET:將EPOLL設為邊緣觸發(EdgeTriggered)模式,這是相對於水平觸發(Level Triggered)來說的。
EPOLLONESHOT: 只監聽一次事件,當監聽完這次事件之後,如果還需要繼續監聽這個socket的話,需要再次把這個socket加入到EPOLL隊列里。
示例:

ET(EdgeTriggered) :高速工作模式,只支持no_block(非阻塞模式)。在此模式下,當描述符從未就緒變為就緒時,內核通過epoll告知。然後它會假設用戶知道文件描述符已經就緒,並且不會再為那個文件描述符發送更多的就緒通知,直到某些操作導致那個文件描述符不再為就緒狀態了。(觸發模式只在數據就緒時通知一次,若數據沒有讀完,下一次不會通知,直到有新的就緒數據)

LT(LevelTriggered) :預設工作方式,支持blocksocket和no_blocksocket。在LT模式下內核會告知一個文件描述符是否就緒了,然後可以對這個就緒的fd進行IO操作。如果不作任何操作,內核還是會繼續通知!若數據沒有讀完,內核也會繼續通知,直至設備數據為空為止!

1.我們已經把一個用來從管道中讀取數據的文件句柄(RFD)添加到epoll描述符
2. 這個時候從管道的另一端被寫入了2KB的數據
3. 調用epoll_wait(2),並且它會返回RFD,說明它已經准備好讀取操作
4. 然後我們讀取了1KB的數據
5. 調用epoll_wait(2)……

ET工作模式:
如果我們在第1步將RFD添加到epoll描述符的時候使用了EPOLLET標志,在第2步執行了一個寫操作,第三步epoll_wait會返回同時通知的事件會銷毀。因為第4步的讀取操作沒有讀空文件輸入緩沖區內的數據,因此我們在第5步調用epoll_wait(2)完成後,是否掛起是不確定的。epoll工作在ET模式的時候,必須使用非阻塞套介面,以避免由於一個文件句柄的阻塞讀/阻塞寫操作把處理多個文件描述符的任務餓死。

只有當read(2)或者write(2)返回EAGAIN時(認為讀完)才需要掛起,等待。但這並不是說每次read()時都需要循環讀,直到讀到產生一個EAGAIN才認為此次事件處理完成,當read()返回的讀到的數據長度小於請求的數據長度時(即小於sizeof(buf)),就可以確定此時緩沖中已沒有數據了,也就可以認為此事讀事件已處理完成。

LT工作模式:
LT方式調用epoll介面的時候,它就相當於一個速度比較快的poll(2),並且無論後面的數據是否被使用,因此他們具有同樣的職能。

當調用 epoll_wait檢查是否有發生事件的連接時,只是檢查 eventpoll對象中的 rdllist雙向鏈表是否有 epitem元素而已,如果 rdllist鏈表不為空,則把這里的事件復制到用戶態內存中,同時將事件數量返回給用戶。因此,epoll_wait的效率非常高。epoll_ctl在向 epoll對象中添加、修改、刪除事件時,從 rbr紅黑樹中查找事件也非常快,也就是說,epoll是非常高效的,它可以輕易地處理百萬級別的並發連接。

1.減少用戶態和內核態之間的文件句柄拷貝;

2.減少對可讀可寫文件句柄的遍歷。

https://cloud.tencent.com/developer/information/linux%20epoll%E6%9C%BA%E5%88%B6
https://blog.csdn.net/u010657219/article/details/44061629
https://jiahao..com/s?id=1609322251459722004&wfr=spider&for=pc

E. windows下有消息處理機制,linux下游對應的機制嗎

Linux使用IPC的消息隊列

F. kotlin實現android 消息機制

大部分人應該都明白,簡單過一下。

這個稍微復雜一點

此demo有一點與android的不同,在沒有消息時,android使用linux內核epoll機制 實現線程睡眠,而本demo使用的是線程鎖

demo傳送門 https://github.com/pokercc/message-demo
請注意工程結構基於idea,不是android studio

G. Handler 中的 epoll

在 Linux 中,epoll 機制是一個重要的機制。在 Android 中的 Handler,簡單的利用了 epoll 機制,做到了消息隊列的阻塞和喚醒。

epoll 機制相關的函數有

因為對於Handler 對於 epoll 沒有過於深入的使用,只是利用了 epoll 進行了阻塞和喚醒,還是比較好理解的。

於是,便利用 epoll 機制在mEpollFd上添加(EPOLL_CTL_ADD)了監聽的 fd(mWakeEventFd);

java 層,next( )@Message 會阻塞到nativePollOnce(long ptr, int timeoutMillis),特別的是,當沒有消息時,timeoutMillis = -1表示一直阻塞。如果有 delay 的消息,則 timeoutMillis 表示 delay的時間。

此時利用epoll 機制在 epoll_wait()上設置超時時間。當 timeoutMillis = -1時會一直等待知道有新消息來。否則當超時時間到達時,會返回到 next()@Message就可以處理那條 delay 的消息了。

當有新消息來臨時並且是立刻執行的,enqueueMessage()@Message 會調用nativeWake(),否則會根據新來的消息的 delay 時間和隊列中的 delay 時間進行對比,消息隊列是按照msg 的到達時間和 delay 時間進行排序,如果新來的消息在前並且需要 delay 也會進行 wake()

當往 mWakeEventFd 寫入一個 1,便會從 epoll_wait() 馬上返回。進行新一輪的消息處理。

另外,native 層的 Looper 的 epoll 機制沒有這么簡單,只是在 Handler 中只是簡單地使用了。

Linux中的epoll

H. 淺談linux和windows的線程機制的區別

-
轉載自fychit創意空間 早前想寫寫linux線程編程windows線程編程每寫知道哪寫起自知道東西都寫面我談談linux線程及線程同步並windows線程進行比較看看間相同點同

其實始我搞windows編程包括windows編程windows 驅包括usb驅ndis驅,pci驅1394驅等等同條龍服務做windows應用程序發面慢慢我linux發產比較深興趣轉搞linux發接我寫些博客主要寫linux編程windows編程區別吧現想寫linuxusb驅windowsusb驅發區別些都等我linux線程windows線程講解完我再寫篇usb驅談談windows linux usb驅東東言歸傳始線程

首先我講講要採用線程編程其實並所程序都必須採用線程些候採用線程性能沒單線程所我要搞清楚候採用線程採用線程處:

(1)線程彼間採用相同址空間共享部數據進程相比代價比較節儉進程啟新進程必須配給獨立址空間需要數據表維護代碼段數據段堆棧段等等

(2)線程進程相比明顯優點線程間通信同進程說具獨立數據空間要進行數據傳遞能通通信式進行種式僅費且便於線程間直接共享數據比簡單式共享全局變數共享全部變數要注意哦呵呵必須注意同步知道呵呵

(3)cpu情況同線程運行同cpu完全並行

反我覺種情況採用線程比較理想比說要做任務2步驟提高工作效率線程技術辟2線程第線程做第步工作第2線程做第2步工作候要注意同步第步做完才能做第2步工作我採用同步技術進行線程間通信

針種情況我首先講講線程間通信windows平台線程間通信採用主要:

(1)共享全局變數,種容易想呵呵首先講講吧比說吧面問題第步要向第2步傳遞收據我間共享全局變數讓兩線程間傳遞數據主要考慮同步面線程數據進行操作候第線程改變數據內容同步保護嚴重知道種情況讀臟數據種情況我容易想同步設置bool flag比說第2線程沒用完數據前第線程能寫入2線程所需間相同候達效率同步比較麻煩咱幾緩沖區進行操作像產者消費者2線程直跑由於間致緩沖區遲早溢種情況要考慮讓數據寫入讓數據覆蓋掉數據候要具體問題具體析打住呵呵用bool變數控制同步linux windows

既講道再講講其同步同 針面問題共享全局變數同步問題除採用bool變數外容易想互斥量呵呵傳說加鎖windows加鎖linux加鎖類似採用互斥量進行同步要想進入段代碼先必須獲互斥量

linux互斥量函數:

windows互斥量函數:createmutex 創建互斥量獲互斥量waitforsingleobject函數用完釋放互斥量ReleaseMutex(hMutex)減0候 內核才釋放其象面windows與互斥幾函數原型

HANDLE WINAPI CreateMutex(
__in LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in LPCTSTR lpName
);
用創建名或名互斥量象
第參數 指向結構體SECURITY_ATTRIBUTES般設null;
第二參數 指函數應應狀態 FALSE前擁者創建互斥
第三參數 指明否名互斥象 名 用null

DWORD WINAPI WaitForSingleObject(

__in HANDLE hHandle,

__in DWORD dwMilliseconds

);

第 創建互斥象句柄第二 表示少間返 設宏INFINITE 則返 直用戶自定義返

於linux操作系統互斥類似函數同罷linux互斥相關幾函數要閃亮登場

pthread_mutex_init函數:初始化互斥鎖;

pthread_mutex_destroy函數:注銷互斥鎖;

pthread_mutex_lock函數:加鎖功阻塞等待;

pthread_mutex_unlock函數:解鎖;

pthread_mutex_trylock函數:測試加鎖功立即返錯誤碼EBUSY;

至於些函數用google搜呵呵講windows用保護數據線程同步式

臨界區臨界區互斥類似間區別臨界區速度快能用同步同進程內線程臨界區獲取釋放函數:

EnterCriticalSection() 進入臨界區; LeaveCriticalSection()離臨界區 於線程共享內存東東講

(2)採用消息機制進行線程通信同步windows面消息機制函數用postmessageLinux消息機制我用較少說誰熟悉告訴我呵呵

(3)windows另外種線程通信事件信號量同針我始舉例2線程同步間傳遞信息採用事件(Event)或信號量(Semaphore),比第線程完產數據必須告訴第2線程已經數據准備取走第2線程數據取走呵呵採用消息機制第線程准備數據直接postmessage給第2線程按理說採用postmessage線程搞定問題呵呵重點省略講

於linux類似條件變數呵呵windowslinux同要特別講講才行

於windows採用事件信號量同步候都使用waitforsingleobject進行等待函數第參數句柄Event句柄或Semaphore句柄第2參數等待延遲終等久單位ms參數INFINITE限等待釋放信號量函數ReleaseSemaphore();釋放事件函數SetEvent使用些東西都要初始化講Msdn搜神馬都呵呵神馬都浮雲

於linux操作系統採用條件變數實現類似功能Linux條件變數般都互斥鎖起使用主要函數:

pthread_mutex_lock ,

pthread_mutex_unlock,

pthread_cond_init

pthread_cond_signal

pthread_cond_wait

pthread_cond_timewait

I. linux 進程間通信的幾種方式

1管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關系進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關系進程間的通信;
2信號(Signal):信號是比較復雜的通信方式,用於通知接受進程有某種事件發生,除了用於進程間通信外,進程還可以發送信號給進程本身;linux除了支持Unix早期信號語義函數sigal外,還支持語義符合Posix.1標準的信號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠信號機制,又能夠統一對外介面,用sigaction函數重新實現了signal函數);
3報文(Message)隊列(消息隊列):消息隊列是消息的鏈接表,包括Posix消息隊列system V消息隊列。有足夠許可權的進程可以向隊列中添加消息,被賦予讀許可權的進程則可以讀走隊列中的消息。消息隊列克服了信號承載信息量少,管道只能承載無格式位元組流以及緩沖區大小受限等缺點。
4共享內存:使得多個進程可以訪問同一塊內存空間,是最快的可用IPC形式。是針對其他通信機制運行效率較低而設計的。往往與其它通信機制,如信號量結合使用,來達到進程間的同步及互斥。
5信號量(semaphore):主要作為進程間以及同一進程不同線程之間的同步手段。
6套介面(Socket):更為一般的進程間通信機制,可用於不同機器之間的進程間通信。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支持套接字。

熱點內容
歪歪腳本 發布:2025-05-12 06:07:37 瀏覽:671
linux多ip 發布:2025-05-12 05:58:31 瀏覽:90
手機無線路由器怎麼設置密碼 發布:2025-05-12 05:18:28 瀏覽:816
渝人解壓密碼 發布:2025-05-12 05:18:12 瀏覽:769
備份網站資料庫備份 發布:2025-05-12 05:04:35 瀏覽:53
轉移的存儲卡 發布:2025-05-12 04:51:18 瀏覽:467
c語言大數相加 發布:2025-05-12 04:51:13 瀏覽:589
安卓內存大小有什麼影響 發布:2025-05-12 04:41:36 瀏覽:51
以下c語言常量錯誤的是 發布:2025-05-12 04:40:39 瀏覽:808
怎麼降低qq版本安卓80 發布:2025-05-12 04:40:39 瀏覽:191