Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
Ria9993 committed Apr 25, 2024
1 parent 425619c commit aaeb048
Showing 1 changed file with 28 additions and 31 deletions.
59 changes: 28 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ IRC server written by C++98 with Unix kqueue

***
# Requirements
- **Unix** or **Linux** or **MacOS** system
- **clang++(Recommand)** or **g++**
- **MacOS(Recommanded)** or **Unix** or **Linux** system
- **clang++(Recommanded)** or **g++**
- **make**

# Build and Run
Expand Down Expand Up @@ -58,32 +58,32 @@ Based on RFC 1459 : https://datatracker.ietf.org/doc/html/rfc1459
- [**./CodingStandard.md**](/CodingStandard.md)

***
# Core Concepts
# Core Concepts / Architecture
![image](/dot_inline_dotgraph_2_org.svg)
이 단락은 해당 IRC 서버의 목표와 주요 기술사항을 설명한다.
이 단락은 해당 프로젝트의 목표와 주요 개념, 설계 사항을 설명한다.

## Table of contents
- [Summary](#summary)
- [Detailed Description](#detailed-description)
- [Shared Pointer](#shared-pointer)
- [Message Block](#message-block)
- [Memory Pool](#memory-pool)
- [Preprocessor Tuple](#preprocessor-tuple)
- [Page Locking Efficiency](#page-locking-efficiency)
- [Deferred Message Processing](#deferred-message-processing)
- [Deferred Registration](#deferred-registration)
- [Deferred Client Release](#deferred-client-release)
- [**Summary**](#summary)
- [**General**](#general)
- [**Performance**](#performance)
- [**Maintenance**](#maintenance)
- [**Detailed Description**](#detailed-description)
- [**Shared Pointer**](#shared-pointer)
- [**Message Block**](#message-block)
- [**Memory Pool**](#memory-pool)
- [**Preprocessor Tuple**](#preprocessor-tuple)
- [**Page Locking Efficiency**](#page-locking-efficiency)
- [**Deferred Message Processing**](#deferred-message-processing)
- [**Deferred Registration**](#deferred-registration)
- [**Deferred Client Release**](#deferred-client-release)

# Summary
해당 프로젝트는 서버로서의 **성능**과 타 프로그래머의 참여를 위한 **유지보수**를 주요 목표로 한다.

두 요소는 상충관계에 있으므로,
설계와 구현에 있어 사이즈, 수정빈도, 사용빈도, 이를 사용/수정하는 프로그래머의 실력 등을 고려하여 절충점을 찾는 것이 중요하다.
설계와 구현에 있어 사이즈, 수정빈도, 사용빈도, 이를 사용/수정하는 프로그래머의 실력 등을 고려하여 절충점을 찾는 것이 중요시되었다.

아래에서 프로젝트 설계에서 일어난 각 결정 사항들을 설명한다.
<br>

먼저 프로젝트 전반에 영향을 끼치는 사항들이다.
## General
- [**Shared Pointer**](#shared-pointer)
약간의 오버헤드가 있지만 채팅서버의 특성 상 상호관계가 많아 메모리 해제 시점이 복잡하므로
모든 메시지, 클라이언트, 채널 등의 리소스는 자체 구현한 스마트 포인터로 관리한다.
Expand All @@ -94,32 +94,29 @@ Based on RFC 1459 : https://datatracker.ietf.org/doc/html/rfc1459
- [**Page Locking Efficiency**](#page-locking-efficiency)
메모리 풀로 메시지 블록의 지역성을 높이고 내부 청크가 페이지 단위로 할당되도록 구현하여 page lock을 최소화함.

<br>
다음은 성능을 우선시한 경우들이다.

예를 들어, 실제 kqueue와 recv/send를 처리하는 코어 네트워크 코드의 경우
## Performance
예를 들어, kqueue와 recv/send를 직접 처리하는 코어 네트워크 코드의 경우
수정빈도가 낮고, 사용빈도가 높으며, 메인 프로그래머를 제외한 다른 프로그래머가 수정할 가능성이 낮다.

이에 따라 이러한 부분들은 성능을 최우선으로 하여 구현되었으며,
오히려 이 부분의 복잡도를 올림으로써 다른 부분의 복잡도를 낮추는 등의 기술적인 선택이 이루어졌다.

- **<https://ria9993.github.io/IRC_server/irc_server_kqueue_udata.html>**
kevent의 udata필드 값으로 SharedPtr의 ControlBlock을 담는다는 복잡한 구현을 결정.
kevent의 udata필드 값으로 SharedPtr의 ControlBlock을 담는다는 복잡한 구현을 결정한 이유
- [**Deferred Message Processing**](#deferred-message-processing)
TCP 속도 저하를 방지하기 위해 클라이언트로부터 받은 메시지를 곧바로 처리하지 않고 대기열에 추가하도록 함.
TCP 속도 저하를 방지하기 위해 클라이언트로부터 받은 메시지를 곧바로 처리하지 않고 대기열에 추가됨.
- [**Deferred Registration**](#deferred-registration)
kqueue에 이벤트를 등록하거나 수정하는 것을 최소화하기 위해 대기열에 추가하고 한 번에 처리함.
- [**Deferred Client Release**](#deferred-client-release)
클라이언트의 연결이 끊어진 후 곧바로 소켓을 닫지 않고 대기열에 추가하여 해제된 클라이언트를 접근하는 예외를 방지함.
성능을 더 희생한다면 이 방법을 사용하지 않아도 되었지만,
이 방법은 플로우의 분기를 만들지 않고도 예외를 방지할 수 있어 선택함.
이 방법은 플로우의 분기를 만들지 않고도 예외를 방지할 수 있어 선택됨.

<br>
다음은 유지보수를 우선시한 경우이다.
## Maintenance
클라이언트 메시지 처리나 채널 관리 등은 수정빈도가 높고, 사용빈도가 중간이며, 아무 프로그래머가 수정할 가능성이 높다.

클라이언트의 메시지 처리나 채널 관리 등은 수정빈도가 높고, 사용빈도가 중간이며, 아무 프로그래머가 수정할 가능성이 높다.
이에 따라 이러한 코드는 유지보수를 우선하는 것으로 방향이 잡혔다.

이에 따라 해당 코드는 유지보수를 우선하는 것으로 방향을 잡았으며,
다음과 같은 결정들이 이루어졌다.
- [**Preprocessor Tuple**](#preprocessor-tuple)
명령어나 응답 코드를 한 번에 리스트로 관리하고, 수정/추가할 때의 실수를 방지한다.
- 메시지 파싱, 메시지 실행 등의 경우 기능의 Input/Output, 책임 범위를 명확하게 정한다.
Expand Down

0 comments on commit aaeb048

Please sign in to comment.