Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

일반적인 동시성

여기 두개의 모니터를 가지고 작업을 한다고 생각해보자. 한쪽모니터는 vim(:12)을 띄워놓은 상태에서 코딩을 하고 있고, 다른 한쪽에는 팀원과 채팅을 하고 있다. 이때 우리는 동시에 두개 이상의 작업을 한다고 한다. 즉 코딩을 하면서 또한 채팅도 하는 것인데, 실제로 가능하기도 하다.

그러나 엄밀한 의미에서 이것이 동시적이 아님은 알것이다. 동시적이라 하는 것은 서로다른 두개이상의 공간과 시간을 같은 선상에서 제어할 수 있음을 얘기하는 거지만, 한명의 인간이 가진 지성은 하나의 공간과 하나의 시간안에 놓여있으므로, 동시적을 달성할 수는 없다. 이러한 경우 동시에 두가지 이상의 일을 한다는 의미는 두가지의 사물을 모두 인지하고 있는 상태를 의미한다. 예컨데, 코딩을 하기 위한 모니터와 채팅을 위한 모니터 모두를 지각하고 있는 상태로, 필요에 따라서 적절하게 관심을 바꿀 수 있는 상태를 말한다. 이것은 엄밀한 의미에서의 동시적은 아니며, 동시적인 성향을 띠는 것이므로 우리는 이것을 동시성을 만족시킨다고 한다.

이러한 동시적 성향은 직관적이다. 우리는 어떤일을 동시에 처리하지 못한다. 일을 번걸아 가면서 하는 것으로 동시적 성향을 달성한다.

컴퓨터에서의 동시성

컴퓨터역시 기본적으로 하나의 시간과 공간안에서 어떤 일을 수행한다. 시간이라는 것은 cpu의 연산방향을 의미하며, 공간이라는 것은 메모리를 의미한다. 단지 하나의 cpu와 memory를 가지고 있을 경우, 이 컴퓨터는 단일한 시간과 공간을 가지고 있으므로 인해, 동시에 두개의 일을 처리하지 못한다. 단지 인간이 그러한 것처럼, 두가지 이상의 일을 번갈아 가면서 수행함으로써, 동시적 성향 즉, 동시성을 달성하게 된다.

우리는 이것을 동시성 혹은 concurrency이라고 한다. 컴퓨터의 cpu와 memory를 제어하는 것은 운영체제(:12) 이므로, 컴퓨터를 통해서 동시성의 업무를 처리하기 위해서는 운영체제가 동시성을 구현해야 한다. 현대의 거의 모든 운영체제들은 동시성을 지원하고 있는데, 이러한 운영체제를 우리는 다중 프로세스를 지원하는 혹은 멀티 태스킹을 지원하는 운영체제라고 한다. 윈도우즈와 거의 대부분의 unix(:12)들이 멀티태스킹을 지원한다.

멀티태스킹은 인간의 지성과 마찬가지로, 시간을 쪼개는 방식으로 이루어지는데, 이것을 시분할 방식이라고 한다. 달리 말해서 컴퓨터에서의 동시성은 시분할 방식(time sharing)에 의해서 달성된다고 설명할 수 있을 것이다.

프로그램에서의 동시성

동시성의 달성을 위한 방법들

컴퓨팅에서의 동시적의 달성

동시적을 달성하기 위해서 일반적으로 생각할 수 있는 방식은 여러개의 cpu를 꽂는 것이 될것이다. 공간인 메모리는 논리적으로 쪼개는데 문제가 없을 것이므로, 메모리의 의한 제약은 그리 심하지 않다고 볼 수 있다. 그렇지만 현재 동시적을 달성하기 위해서 사용되는 가장 좋은 방법은 여러대의 서로다른 컴퓨터를 연결해서 네트워크화 하는 것으로 생각되어지고 있다. 이 방식은 여러개의 cpu를 가진 강력한 하나의 컴퓨터를 사용해서 동시적을 이루는 것에 비해서 다음과 같은 몇가지 이익을 준다.
  1. 훨씬 저렴한 가격으로 동시적을 달성할 수 있게 한다.
  2. 좀더 안전한 시스템을 만들 수 있다.
인터넷이 원래 군사적인 용도로 만들어졌다는 점을 상기하기 바란다. 네트워크는 시스템을 튼튼하게 만들어준다.

동시적으로 할 수 있는 일은 두 가지의 종류가 있을 것이다. 하나는 여러개의 작은 일을 동시에 처리하는 것이고, 다른 하나는 커다란 하나의 일을 나누어서 처리하는 것이다. 예컨데, 수억건의 웹문서를 분석해서 검색가능한 색인테이블을 만든다거나 하는 일은 하나의 큰 일을 여러개의 컴퓨터가 나누어서 처리하는 것으로, 이경우 동시적은 병렬적과 동일하게 취급할 수 있을 것이다. 병렬컴퓨팅 이라하면, 여러대의 컴퓨터가 하나의 일을 나누어서 처리해서 처리속도를 높이는 것을 말한다.

여러개의 작은일을 동시에 처리하는 경우는 우리의 PC에서 찾아볼 수 있다. 여러개의 (multi) 일 (task)를 처리하는 방식이므로, 병렬이라고 부르지 않고 multitasking 이라고 한다. 멀티태스킹은 코딩하면서, 컴파일하고, 음악도 들으면서 웹서핑도 해야하는 그런 경우에 적합하다.