{"id":21974979,"url":"https://github.com/earlgrey02/multiplexing","last_synced_at":"2026-05-03T09:31:39.920Z","repository":{"id":260690952,"uuid":"882061231","full_name":"earlgrey02/multiplexing","owner":"earlgrey02","description":"I/O Multiplexing with Kqueue","archived":false,"fork":false,"pushed_at":"2024-12-27T07:45:08.000Z","size":7,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-01-28T03:23:35.687Z","etag":null,"topics":["cpp"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/earlgrey02.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-01T19:49:28.000Z","updated_at":"2024-12-28T05:31:26.000Z","dependencies_parsed_at":"2024-12-27T08:25:10.424Z","dependency_job_id":"da058e5d-06da-4650-a82c-a6f5d4e4ddc5","html_url":"https://github.com/earlgrey02/multiplexing","commit_stats":null,"previous_names":["earlgrey02/multiplexing"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earlgrey02%2Fmultiplexing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earlgrey02%2Fmultiplexing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earlgrey02%2Fmultiplexing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/earlgrey02%2Fmultiplexing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/earlgrey02","download_url":"https://codeload.github.com/earlgrey02/multiplexing/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245036122,"owners_count":20550661,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp"],"created_at":"2024-11-29T15:49:00.593Z","updated_at":"2026-05-03T09:31:39.914Z","avatar_url":"https://github.com/earlgrey02.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"## I/O Multiplexing with Kqueue\n\n\u003e **Kqueue를 통해 구현해보는 I/O 멀티플렉싱(I/O Multiplexing)**\n\n본 저장소는 BSD(Berkeley Software Distribution) 계열 운영체제의 `epoll()`인 `kqueue()`를 통해 I/O 멀티플렉싱을 구현한 예제에 대한 저장소이다.\u003cbr/\u003e\n\n## Description\n\n### I/O Multiplexing\n\nI/O 멀티플렉싱이란 하나의 채널로 여러 파일 디스크립터(File Descriptor)를 관리하는 기법이다.\u003cbr/\u003e\n해당 기법을 소켓 프로그래밍에 활용하면 하나의 스레드로 여러 요청을 처리하는 고성능 네트워크 애플리케이션을 구현할 수 있다.\n\nI/O 멀티플렉싱을 구현하는 방법으로는 `select()`, `poll()`, `epoll()` 등의 시스템 콜(System call)이 있다.\u003cbr/\u003e\n이 방법들 중에서 `select()`와 `poll()`은 파일 디스크립터들을 매번 유저 스페이스(User Space)에서 커널로 복사해야 하므로 성능적인 부분에서 단점을 가진다.\n이에 비해 `epoll()`은 커널에서 직접 파일 디스크립터들을 관리해 오버헤드(Overhead)가 적으므로 일반적으로 `epoll()`을 사용해 I/O 멀티플렉싱을 구현한다.\n\n### Event Loop\n\n이벤트 루프(Event Loop)는 I/O 멀티플렉싱을 리액터 패턴(Reactor Pattern)으로 구현한 동시성 처리 모델 중 하나로, 반복문을 돌면서 발생한 이벤트들을 확인하고 그에 맞는 처리를 하는 역할을 한다.\u003cbr/\u003e\n일반적으로 이벤트 루프는 비동기 및 논블로킹(Non-blocking) I/O를 구현하는데 사용되는데, 이는 이벤트 루프가 입출력을 기다리지 않고 입출력이 준비된 채널에 대해서만 입출력을 수행하기에 가능한 것이다.\n이러한 입출력의 준비 상태 등은 발생한 이벤트들을 통해 판단하게 되는데, 이 이벤트들을 관리하는 방법이 앞서 설명한 `epoll()` 등의 이벤트 관리 시스템 콜이다.\n\n이벤트 루프를 활용한 대표적인 예시로 Node.js의 구성 요소 중 하나인 [libuv](https://github.com/libuv/libuv)나 Spring WebFlux에서 WAS(Web Application Server)로 사용하는 [Netty](https://github.com/netty/netty)가 있는데, 이들은 모두 `epoll()`이나 `kqueue()` 등의 시스템 콜을 사용해 이벤트 루프를 구현한다.\u003cbr/\u003e\n이 중 Netty는 `epoll()` 등의 시스템 콜을 사용하는 것은 아니고 이를 추상화한 Java NIO(New I/O)의 `Selector`를 사용한다.\n물론 네이티브 트랜스포트(Native Transport)를 사용하는 Netty는 시스템 콜을 직접 사용한다.\n\n## How to use\n\nI/O 멀티플렉싱을 구현한 코드는 `multiplexing.cpp`의 `EventLoop`이다.\u003cbr/\u003e\n이에 대한 테스트로 `EventLoop`를 사용해 하나의 스레드로 여러 클라이언트와 소켓 통신을 수행하는 `server.cpp`와 여러 스레드로 서버에 반복적으로 요청을 보내는 `client.cpp`를 사용할 수 있다.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fearlgrey02%2Fmultiplexing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fearlgrey02%2Fmultiplexing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fearlgrey02%2Fmultiplexing/lists"}