* 架構淺析
先來看一下asio的0層的組件圖。
(圖1.0)
io_object是I/O對象的集合,其中包含大家所熟悉的socket、deadline_timer等對象,主要功能是提供接口給用戶使用。
services服務是邏輯功能的實現者,其中包含提供定時功能的deadline_timer_service、提供socket相關功能的win_iocp_socket_service(windows平台)/reactive_socket_service(其他平台)、作為io_service功能的真正實現者win_iocp_io_service(windows平台)/task_io_service(其他平台)等等服務。
"Asio核心組件"在這一層中可以理解為就是io_service,它通過關聯的類service_registry將實現具體功能所需的服務組合起來,再由io_object提供接口給用戶使用。
這三大組件構成了asio的核心架構,asio的一切都是以此為根基衍生擴展出來的。
讓我們將圖1.0進一步細化:
(圖1.1)
“Asio核心組件”細化為4個類:io_service,service_registry,service,service_base。其中,service_registry負責管理所有服務,使用延遲創建技術,在真正使用服務對象的時候才創建服務對象,並以單鏈表的方式管理,但只能增不能刪,直到service_registry析構時才會釋放其管理的服務對象。service是io_service的類中類,是一個虛基類,所有由service_registry管理的服務都必須從service派生。service_base是service的直接派生類,是services繼承體系的第二級,組合了service_id<Type>,目前asio中所有服務均繼承與service_base。
“I/O對象”細化為basic_io_object及其派生類。basic_io_object是所有I/O對象的基類,提供I/O對象與其對應服務的聯系。
再將圖1.1進一步細化(關注網絡I/O方面的一些類,其他方面的類未畫出):
(圖1.2)
io_service的真正邏輯實現封裝在內部橋接的類io_service_impl中,io_service_impl是一個typedef(在windows平台下是win_iocp_io_service,其他平台下是task_io_service)。io_service_impl就是一個繼承於service_base的服務,在io_service初始化也就是其關聯類service_registry初始化時被創建,再由io_service持有其引用。
從圖中可以看到,繼承於service_base的服務有:
strand_service:提供串行化多線程調用的功能
deadline_timer_service:提供定時器功能
stream_socket_service:提供流式socket相關功能
datagram_socket_service:提供報文式socket相關功能
seq_packet_socket_service:提供seq_packet socket相關功能
raw_socket_service:提供原始套接字相關功能
socket_acceptor_service:提供端口監聽和接受客戶端連接相關功能
這些服務都是幕后英雄,對於用戶而言是感知不到的,用戶使用的都是其對應的I/O對象。
這些服務對應的I/O對象是:
io_service::strand
basic_deadline_timer
basic_stream_socket
basic_datagram_socket
basic_seq_packet_socket
basic_raw_socket
basic_socket_acceptor
除此之外,asio中還有串口通信、信號處理等功能,在此不再一一贅述。
由於本文會實時根據讀者反饋的寶貴意見更新,為防其他讀者看到過時的文章,因此本系列專題謝絕轉載!