나도 개발 고민이 많아쩌
돌고 돌아와서 다시 서버 프로그래밍 얘기이어요.
백엔드 이어도 코어 개발이어서 이거는 일반적인 벡엔드 비즈니스로직 얘기랑 달라서 어렵쩌.
전에 nightmare서버에는 단일 프로세스로 하였는데 php가 터지면 다같이 터지는 문제가 있어요.
php가 가득이나 불안정한 프로젝트 이어서 변론에 여지는 없겠쩌.
이러면 멀티 프로세스 구조로 바꺼야 하는데 IPC(내 프로세스 소통) 기법을 사용해요. 이거는 프로그램 2개를 띄워서 서로 소통을 하는 여지가 있쩌. 사실 host-child처럼 fork 구조이면 표준 스트림으로도 소통이 되어요. 표준 스트림은 콘솔 버퍼에 기록하는 거이기에 느려요.
윈도우가 아니면 posix 시그널 SIGUSR1, SIGUSR2 같은 거로 단편적인 신호를 보내는 여지가 있쩌. 윈도우라 하더라도 CTRL+C 내지는 CTRL+BREAK는 공통이어서 불법하게 사용하면 양쪽 모두 대응하는 여지가 있어요.
Console.CancelKeyPress 이벤트 (System) | Microsoft Learn
물론 이런 기능을 건드리면 일부 개발자들은 눈이 돌을 거여서 일반적으로 이렇게 하면 안될 거여요.
프로세스 간 통신 - Win32 apps | Microsoft Learn
여기서 윈도우 10 빌드넘버 17063부터 유닉스 소켓을 사용하는 여지가 있어요. 유닉스 소켓은 일반적으로 스트리밍으로 사용하지만 데이터그램 소켓으로도 되어요. 어쩌면 네임드 파이프보다 가벼운 소통을 이루겠쩌. 그러나 데이터그램 소켓은 가벼워도 만능이 아니어요. 내부 통신이라 하더라도 타이밍이 틀어지면 신호를 수신하지 못하는 여지가 생겨요.
순서랑 손실을 보존해주는 스트리밍이 편하지만 이런 기능에 소비되는 컴퓨터 파워도 설계에 고려하여야 좋아요. 사실 데이터그램이라 하더라도 공유 메모리에 상대가 새로운 값을 기록하는 부분을 검사하고 안그럼 재전송을 하는 기법으로 하여도 좋아요.
c#에 공유메모리는 일반적으로 스트리밍으로 제공하는데 c언어로 소통을 치려면 메모리 블록으로 하여야 해요. c++에 c# dll을 넣을까 고민을 하였어도 이거는 프로그램이 지나치게 커져서 버려야 해요.
SafeMemoryMappedViewHandle Class (Microsoft.Win32.SafeHandles) | Microsoft Learn
c#에 SafeBuffer 객체는 AcqurePointer로 관리되지 않은 메모리 포인터를 가져오는 기능을 가지고 있어요. 이럼 스트리밍을 하지 않아도 되어요. c# 코드에 의존하기 싫음 리눅스는 system v 공유메모리를 치고 윈도우는 맵 뷰 파일 매핑을 사용하는 코드를 직접 작성하면 될거여요.
언제나 지금 실천하지 않는 거는 먼저 맡은 프로젝트를 마치고 하여야 정신력 상한을 넘지 않아서 이렇쩌.
진도가 느림 슬퍼져요.
