책정리 114

6장 복제를 통한 객체 생성문제(Prototype패턴)

이미 생성된 객체를 복제해서 새로운 객체를 생성 할 수 있다. 문제 사례 설명 그래픽 편집기를 객체지향 개념에 바탕을 두고 설계를 한다면, 문서에 추가되는 각각의 그래픽 요소는 객체로 표현될 수 있을 것이다. 즉, 문서에 새로 끌어다 놓여지는 그래픽 요소 각각이 객체로 생성될 것이고, 문서는 이들을 포함하는 형태가 될 것이다. 여기서 우리가 고민해볼 문제는 각각의 그래픽 요소들이 문서에 추가될 때 어떤 방식으로 객체를 생성해주는 것이 가장 쉬우면서도 추후의 변경 등에 유연하게 대처할 수 있는 형태가 될 것인가라는 점이다. 다양한 접근 방법 및 PROTOTYPE 패턴 주어진 문제를 요약하면, 팔레트에 정의된 그래픽 요소들을 객체로 생성하는 데 있어 가장 바람직한 방법은 무엇인가라는 것이다. 여기서 감안해야..

5장 대행 함수를 통한 객체 생성 문제(Factory Method 패턴)

객체를 생성하는 작업을 할 때 복잡하고 어렵거나 특정한 절차를 따라야 할 경우 이를 대행하는 함수를 둘 수 있다. 문제 사례 설명 윈도우 운영체제에서 문서 파일을 더블클릭한 경우를 생각해보자. 문서 파일 이름의 확장자에 따라 적절한 응용 프로그램이 실행될 것이며, 응용 프로그램은 문서 파일을 열어 그 내용을 화면 상에 보여줄 것이다. 예를 들어 파일 이름 확장자가 hwp면 한글 소프트웨어가 실행되고, doc이면 마이크로소프트 워드가, zip이면 알집과 같은 압축 관련 소프트웨어가 실행될 것이다. 이런 동작 과정을 객체지향 관점에서 살펴보면 두 가지 종류의 객체가 생성되어야 함을 알 수 있다. 그 하나는 응용프로그램 객체이고, 다른 하나는 더블클릭된 문서파일에 대한 객체이다. 먼저 응용 프로그램 객체는 운..

4장 부분 부분 생성을 통한 전체 객체 생성 문제 : BUILDER 패턴(Builder 패턴)

때때로 클래스의 생성자를 불러서 객체를 생성하는 것이 아니라 객체를 구성하는 부분부분을 따로 생성하고 이를 조합해서 전체 객체를 생성해주는 것이 보다 효과적일 때가 있다. 한꺼번에 객체를 생성하는 것이 불가능하거나, 가능하더라도 부분 부분 생성한 후 전체 객체로 조합하는 것이 훨씬 비용이 적게 들 경우가 이에 해당한다. 문제 사례 설명 자동 번역 소프트웨어를 개발해서 매뉴얼을 제작하기로 결정함. 이 때 개발해야 할 소프트웨어는 한국어로 된 매뉴얼을 입력하면 영어, 일본어, 프랑스어로 된 매뉴얼을 만들어내는 것을 목적으로 한다. 여기서 매뉴얼에 사용되는 문장은 평서문, 의문문, 명령문으로만 구성되어 있으며, 자동 번역 소프트웨어는 매뉴얼을 문장 단위로 번역하게 된다. 다양한 접근 방법 및 BUILDER 패..

23장 IOCP(Input Output Completion Port)

Overlapped IO를 기반으로 IOCP 이해하기 논의가 한참인 epoll과 IOCP의 성능비교 select와 같은 전통적인 IO 모델의 한계극복을 목적으로 운영체제 레벨(커널 레벨)에서 성능을 향상시킨 IO 모델이 운영체제 별로 등장하였다. 그 중 대표적인 것이 리눅스의 epoll, BSD의 kqueue 그리고 윈도우의 IOCP이다. 이들의 공통적인 특성은 운영체제에 의해서 기능이 지원 및 완성된다는 것이다. 넌블로킹 모드의 소켓 구성하기 윈도우에서는 다음의 함수호출을 통해서 넌블로킹 모드로 소켓의 속성을 변경한다. SOCKET hListenSock; int mode = 11; .... hListenSock = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_F..

22장 Overlapped IO 모델

Overlapped IO 모델의 이해 IO(입출력)의 중첩이란? 위 그림에서 보이듯이, 하나의 쓰레드 내에서 동시에 둘 이상의 데이털르 전송(또는 수신)함으로 인해 입출력이 중첩되는 상황을 가리켜 'IO의 중첩'이라 한다. 그리고 이러한 일이 가능하려면 호출된 입출력 함수가 바로 반환을 해야 한다. 그래야 두 번째, 세 번째 데이터 전송을 시도할 수 있기 때문이다. 결과적으로 위의 모델로 데이터를 송수신하는데 있어서 핵심이 되는 사항은 '비동기 IO'이다. 그리고 비동기 IO가 가능하려면 호출되는 입출력 함수는 넌블로킹 모드로 동작해야 한다. 이번 Chapter에서 말하는 Overlapped IO의 포커스는 IO에 있지 않습니다 윈도우에서 말하는 Overlapped IO의 포커스는 IO가 아닌 IO가 완..

21장 Asynchronous Notification IO모델

비동기(Asynchronous) Notification IO 모델의 이해 동기(Synchronous)와 비동기(Asynchronous)에 대한 이해 비동기란 '일치하지 않음'을 뜻하는데, 이러한 비동기의 상황은 데이터의 입출력 과정에서도 매우 유용하게 활용된다. 지금까지는 send, recv 함수를 통해 동기화된 입출력을 진행하였다. send 함수가 호출되면 데이터의 전송이 완료된 후에야 반환이 이뤄지고 recv 함수가 호출되면 원하는 만큼 데이터를 읽어 들인 후에야 반환이 이뤄지기 때문에 동기화된 입출력을 진행한 셈이다. "send 함수가 호출되는 순간부터 데이터의 전송이 시작되고, send 함수의 호출이 완료(반환)되는 순간 데이터의 전송이 완료된다" "recv 함수가 호출되는 순간부터 데이터의 수신..

20장 Windows에서의 쓰레드 동기화

동기화 기법의 분류와 CRITICAL_SECTION 동기화 유저모드(User mode)와 커널모드(Kernel mode) 윈도우 운영체제의 연산방식(프로그램 실행방식)을 가리켜 '이중모드 연산(Dual-mode Operation)'방식이라 한다. 이는 연산을 하는데 있어서 윈도우에 두 가지 모드가 존재함을 뜻한다. 유저모드응용프로그램이 실행되는 기본모드로, 물리적인 영역으로의 접근이 허용되지 않으며, 접근할 수 있는 메모리의 영역에도 제한이 따른다커널모드운영체제가 실행될 때의 모드로 메모리뿐만 아니라 하드웨어의 접근에도 제한이 따르지 않는다.커널은 운영체제의 핵심모듈을 의미하므로, 이를 다음과 같이 단순히 정의할 수도 있다. 유저모드응용프로그램의 실행모드커널모드운영체제의 실행모드응용프로그램의 실행과정에서..

19장 Windows에서의 쓰레드 사용

커널 오브젝트(Kernel Objects) 윈도우 기반에서 쓰레드를 이해하기 위해서는 '커널 오브젝트'를 먼저 이해해야 한다. 커널 오브젝트란 무엇인가? 프로세스, 쓰레드, 파일, 그리고 앞으로 이야기할 세마포어, 뮤텍스 등 운영체제가 만드는 리소스(Resource)의 종류는 다양하다. 그리고 이들 대부분은 프로그래머의 요청에 의해서 생성되며, 요청의 방식도 제 각각이다. 그런데 이러한 차이점에도 불구하고 이들은 다음의 공통점을 지닌다 "윈도우 운영체제가 생성해서 관리하는 리소스들이다." '관리'의 방식 역시 리소스의 종류에 따라서 차이가 있다. 예를 들어 파일이라면 파일과 관련된 데이터의 입출력 위치, 파일의 오픈 모드(read or write) 등이 등록 및 갱신 되어야 하며, 쓰레드라면 쓰레드의 I..

18장 멀티쓰레드 기반의 서버구현

쓰레드의 이론적 이해 쓰레드의 등장배경 멀티 프로세스 기반의 단점은 다음과 같다 프로세스 생성이라는 부담스러운 작업과정을 거친다 두 프로세스 사이에서의 데이터 교환을 위해서는 별도의 IPC 기법을 적용해야 한다. 컨텍스트 스위칭(Context Switching)에 따른 부담은 프로세스 생성방식의 가장 큰 부담이다 CPU가 하나인(CPU의 연산장치인 CORE) 시스템에서 둘 이상의 프로세스가 동시에 실행되려면 CPU의 할당시간을 매우 작은 크기로 쪼개서 서로 나누어 사용해야 한다. 그런데 CPU의 할당시간을 나누기 위해서는 '컨텍스트 스위칭'이라는 과정을 거쳐야 한다. 프로그램의 실행을 위해서는 해당 프로세스의 정보가 메인 메모리에 올라와야 한다. 때문에 현재 실행중인 A프로세스의 뒤를 이어서 B프로세스를..

12장 IO 멀티플렉싱(Multiplexing)

멀티플렉싱 기반의 서버 멀티프로세스 서버의 단점과 대안 이전 Chapter에서는 다중접속 서버의 구현을 위해 클라이언트의 연결요청이 있을 때마다 새로운 프로세스를 생성하였다. 이는 실제 사용되는 방법이지만 문제가 전혀 없는 방법은 아니다. 프로세스의 생성에는 상당히 많은 대가를 지불해야 하기 때문이다. 많은 양의 연산이 요구되며, 필요한 메모리 공간도 비교적 큰 편이다. 또한 프로세스마다 별도의 메모리 공간을 유지하기 때문에 상호간에 데이터를 주고받으려면 다소 복잡한 방법을 택할 수밖에 없다. 프로세스의 생성을 동반하지 않으면서 다수의 클라이언트에게 서비스를 제공할 수 있는 방법으로 IO멀티플렉싱 서버가 있다. 하지만 이 모델은 구현하고자 하는 서버의 특성에 따라서 구현방법이 달리 결정되어야 한다. 즉 ..