프로세서는 프로그램이라는 미리 배치된 일련의 명령어를 하나의 제어권 내에서 수행하는 수행 단위라고 할 수 있는데, 이런 일련의 제어권 내에서 다른 프로세서로부터 보낸 메시지를 받을 준비가 되어 있는 경우를 "동기(synchronous)"라는 말을 사용합니다.
반면에 비동기(asynchronous)는 일련의 제어권 내에서는 존재하지 않지만, 다른 프로세서로부터 보낸 메세지를 받아서 처리할 수 있는 핸들러를 커널에게 미리 알려주고, 원하는 메시지가 도착하였을 때, 지정된 함수를 실행시킬 수 있게 할 수 있습니다. 이때 수행할 핸들러의 주소는 프로세서 내에 있지만, 실제 실행되는 제어권은 현재 실행되는 프로세서의 제어권과는 다른 제어권으로 수행하게 됩니다. 즉, 프로그램을 수행하다가 예측할 수 없는 위치에서 인트럽트를 받게 되면서 프로세서의 제어권이 멈추고, 곧바로 핸들러를 수행하게 되는거죠...
따라서, 프로세서간 통신(IPC)에서 동기방식은 메시지큐,소켓 등 일반적인 IPC 리소스들에 해당하고, 비동기방식은 signal, 인터럽트(디바이스 드라이버) 등이 있죠...
동기와 비동기에 대한 내용은 사실상 처음 접하는 분들은 이해하기가 어려울 수도 있습니다. 이런 부분은 커널에서 이런 IPC를 어떻게 처리하는지 원리를 이해하면 명확하게 이해가 되지만, 그런 경험이 없으신 분들은 난해할 거에요...
참고로 커널에서 본다면 다음과 같은 부분이 다르죠...
동기와 비동기는 send에 대한 부분 보다는 recv에 대한 부분에 대한 의미가 더 강합니다.
동기방식에서는 recv함수가 다 존재합니다. 즉, 프로그램 내에 recv함수의 위치가 있고, 대부분은 이 코드가 수행되면서 프로세서는 suspend될 수 있습니다.
하지만, 비동기 방식은 recv함수가 없고, 대신에 핸들러를 커널에 등록을 해야 하죠... 즉, 어느시점에 메시지를 받는다는 것을 지정할 수 없죠(unexpected).
커널의 스케줄러는 동기방식에서는 메시지가 들어오면 해당 메시지를 기다리면서 suspend되어 있는 해당 프로세서를 깨우는 역할을 하지만, 비동기 방식에서는 곧바로 등록된 핸들러 리스트들을 뒤져서 해당 프로세서를 suspend시킨후, 해당 핸들러를 수행하게 되는거죠.
따라서, 비동기 방식은 자주 발생하는 메시지라기 보다는 긴급상황 혹은 비정상 신호등을 유발할때 사용합니다.
[quote="APIUE"]Signals provide a way of
"Advanced Programming in the UNIX Environment"란 책을 보고 계신가요.. 그 책 번역판 엉망이라고 알려져 있습니다.
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
비동기와 동기의 개념을 이해하시면 됩니다....프로세서는 프로그램
비동기와 동기의 개념을 이해하시면 됩니다....
프로세서는 프로그램이라는 미리 배치된 일련의 명령어를 하나의 제어권 내에서 수행하는 수행 단위라고 할 수 있는데, 이런 일련의 제어권 내에서 다른 프로세서로부터 보낸 메시지를 받을 준비가 되어 있는 경우를 "동기(synchronous)"라는 말을 사용합니다.
반면에 비동기(asynchronous)는 일련의 제어권 내에서는 존재하지 않지만, 다른 프로세서로부터 보낸 메세지를 받아서 처리할 수 있는 핸들러를 커널에게 미리 알려주고, 원하는 메시지가 도착하였을 때, 지정된 함수를 실행시킬 수 있게 할 수 있습니다. 이때 수행할 핸들러의 주소는 프로세서 내에 있지만, 실제 실행되는 제어권은 현재 실행되는 프로세서의 제어권과는 다른 제어권으로 수행하게 됩니다. 즉, 프로그램을 수행하다가 예측할 수 없는 위치에서 인트럽트를 받게 되면서 프로세서의 제어권이 멈추고, 곧바로 핸들러를 수행하게 되는거죠...
따라서, 프로세서간 통신(IPC)에서 동기방식은 메시지큐,소켓 등 일반적인 IPC 리소스들에 해당하고, 비동기방식은 signal, 인터럽트(디바이스 드라이버) 등이 있죠...
동기와 비동기에 대한 내용은 사실상 처음 접하는 분들은 이해하기가 어려울 수도 있습니다. 이런 부분은 커널에서 이런 IPC를 어떻게 처리하는지 원리를 이해하면 명확하게 이해가 되지만, 그런 경험이 없으신 분들은 난해할 거에요...
참고로 커널에서 본다면 다음과 같은 부분이 다르죠...
동기와 비동기는 send에 대한 부분 보다는 recv에 대한 부분에 대한 의미가 더 강합니다.
동기방식에서는 recv함수가 다 존재합니다. 즉, 프로그램 내에 recv함수의 위치가 있고, 대부분은 이 코드가 수행되면서 프로세서는 suspend될 수 있습니다.
하지만, 비동기 방식은 recv함수가 없고, 대신에 핸들러를 커널에 등록을 해야 하죠... 즉, 어느시점에 메시지를 받는다는 것을 지정할 수 없죠(unexpected).
커널의 스케줄러는 동기방식에서는 메시지가 들어오면 해당 메시지를 기다리면서 suspend되어 있는 해당 프로세서를 깨우는 역할을 하지만, 비동기 방식에서는 곧바로 등록된 핸들러 리스트들을 뒤져서 해당 프로세서를 suspend시킨후, 해당 핸들러를 수행하게 되는거죠.
따라서, 비동기 방식은 자주 발생하는 메시지라기 보다는 긴급상황 혹은 비정상 신호등을 유발할때 사용합니다.
두서없이 설명을 드린거 같네요... 이해하시는데 도움이 되시길...
댓글 달기