멀티태스킹

내위키

동시에 여러 가지의 작업(태스크)을 동시에 실행하는 것. 여성들의 주특기.

컴퓨터 운영체제의 멀티태스킹

여러 가지 프로세스를 동시에 실행시키는 것을 말한다. 예를 들어, MS-DOS 시절에는 한 번에 한 가지 프로그램만 실행시킬 수 있었지만 윈도우는 여러 가지 프로그램을 띄워놓고 동시에 돌릴 수 있다. 예를 들어 음악을 재생시키면서 워드프로세서 작업을 한다든지, 인터넷에서 파일보나마나 야동을 다운로드 받으면서 다른 웹사이트를 간다든지 할 수 있다.

요즘은 멀티코어도 있고 하지만 예전에는 컴퓨터에 CPU는 한 개 뿐이었다. 물론 화면도 키보드도, 기본적으로는 한 개다. 결국 한정된 시스템의 자원을 여러 프로그램이 나눠서, 교대로 써야 하는데, 운영체제는 이를 관리하고 자원을 줬다 뺐는 되게 치사한 기능을 한다.

프로그램은 실행되는 동안 상당 기간을 놀고 있는 상태가 된다. 예를 들어서 워드프로세서가 실행되었다면 사용자가 뭔가 입력할 때까지는 하염없이 기다리고 있다. 문서를 다 만들어서 인쇄를 할 때에는 프린터로 데이터를 보내고 상당한 시간을 놀게 된다. 이렇게 놀면서 CPU 자원을 차지하고 있느니 차라리 그 시간에 다른 프로그램이 CPU를 쓸 수 있도록 해 주자... 이게 멀티태스킹의 기본 개념이다. 프로세스를 한 개만 돌릴 때(싱글태스킹)와 여러 개 돌릴 때를 비교한다면, 개별 프로세스의 속도만 놓고 보면 당연히 싱글태스킹 쪽이 빠르다. 일단 시스템 자원을 줬다 뺏었다 하는 데다가, 운영체제 역시 그러한 작업을 수행하려면 하는 일이 많아지고 그 역시 시스템 자원을 어느 정도 소모한다. 하지만 한 프로세스가 노는 시간에 다른 프로세스들을 수행할 수도 있고 하니 전체로 보면 효율은 멀티태스킹 쪽이 훨씬 낫다. 옛날에야 컴퓨터가 할 수 있는 일이 한정되어 있었고, 연결되는 장치도 많지 않았으니 싱글태스킹으로도 충분했지만 이제는 컴퓨터가 할 수 있는 일도 대폭 늘어났고, 연결되는 장치도 많아졌으니 멀티태스킹이 필수가 되었다.

물론 CPU 코어가 여러 개라면 당연히 멀티태스킹이 훨씬 효율이 높다. 코어가 2개라고 해도 운영체제가 싱글태스킹만 지원하면 프로그램을 하나만 돌릴 수 있으니까 두 개 코어 중 하나만 쓰이게 되지만 멀티태스킹이 되면 두 개의 프로그램이 동시에 실행되면서 코어를 하나씩 차지하게 되므로 훨씬 빠르다. 물론 코어 하나를 두 개 프로그램이 나눠 쓰는 것보다도 훨씬 빨라진다. 다만 운영체제가 멀티코어를 제대로 지원하는지, 즉 멀티프로세싱을 지원하는지, 지원한다면 멀티코어를 몇 개까지 지원하는지가 관건이다.

협력형 멀티태스킹

프로세스들끼리 서로 협력해서 멀티태스킹을 수행한다. 윈도우 3.1까지가 이랬다. 각각의 프로세스는 원하는 만큼 시스템 자원을 사용하고 안 쓸 때에는 반납해야 한다. 만약 어떤 프로세스가 말을 안 듣고 시스템 자원을 쥐고 안 내놓으면 멀티태스킹이 망가진다. 그러니까 프로세스를 프로그래밍할 때 멀티태스킹을 지원하도록 프로그래밍이 되어 있어야 한다. 윈도우 3.1의 경우에는 이벤트 기반 방식으로 이를 구현했다. 즉, 프로그램이 실행되면 초기 작업을 거진 후에는 루프를 빙빙 돌면서 시스템에게 제어권을 넘겨줬다가 어떤 이벤트(마우스 클릭, 키보드 입력)가 발생했을 때 시스템이 그 이벤트를 처리하는 코드(이벤트 핸들러)를 호출하면 그 프로그램으로 제어권이 넘어간다. 프로그램이 처리를 끝내면 다시 루프로 돌아가서 시스템에게 제어권을 넘기는 과정이 되풀이된다. 이벤트 핸들러가 루프로 돌아가서 제어권을 넘겨주지 않고 오랫동안 처리 작업을 질질 끌면 다른 프로그램은 하염없이 기다려야 하기 때문에 멀티태스킹에 문제가 발생하는 게 가장 큰 단점이다.

선점형 멀티태스킹

멀티태스킹을 지원하는 대다수 운영체제는 이 방식이다. 운영체제가 최고 권한을 쥐고 있으며 프로세스들이 실행되는 과정에서 일정 간격으로 계속 시스템 자원을 감시한다. 곧 어떤 프로세스가 말을 안 듣고 시스템을 자원을 쥐고 있으려고 해도 운영체제는 언제든지 원한다면 시스템 자원의 사용권을 빼앗을 수 있다. 유닉스 계열은 처음부터 이 방식이었고, 윈도우 계열은 [윈도우 95]], 혹은 윈도우 NT부터 이 방식을 지원한다. 여전히 프로그래밍은 이벤트 기반 방식을 사용하지만 이벤트 핸들러가 루프로 안 돌아가도 윈도우 3.1과는 달리 한 프로그램이 시스템 자원을 독점하도록 운영체제가 그냥 놔두지 않는다. 물론 특정 프로그램이 시스템 자원을 과도하게 많이 사용하면서 다른 프로그램이나 시스템 전반의 속도가 느려지는 경우는 종종 있지만 어쨌거나 전체가 아예 먹통이 되는 경우는 아주 드물다.

멀티프로세싱

멀티프로세싱(multiprocessing)는 여러 프로세스를 병렬로 실행시킬 수 있는 것을 뜻한다. 쉽게 말해서 여러 프로그램을 동시에 실행시킬 수 있다는 뜻이다. 위에서 이야기한 협력형이나 선점형 멀티태스킹은 CPU 한 개를 가지고 여러 프로세스 또는 스레드가 돌려서 쓰는 것이라면 멀티프로세싱은 아예 여러 개의 CPU가 있어서 진짜로 '동시'에 여러 프로세스가 돌아가는 것이다. 요즈음은 CPU 칩 하나에 여러 개의 코어가 있는 멀티코어가 기본이므로 코어 하나 하나가 CPU의 구실을 해서 여러 프로세스를 동시에 실행시킬 수 있다. 예를 들어 어떤 CPU 칩에 코어가 네 개 있다면 네 개의 프로세스를 동시에 병렬로 돌릴 수 있다는 뜻이다.

멀티스레드

멀티스레드(multithread)는 멀티태스킹에서 좀 더 발전한 개념. 한 개의 프로세스가 여러 개의 스레드로 구성되어 있고, 동시에 여러 스레드가 돌아갈 수 있는 식이다. 예를 들어, 영상처리 프로그램에서 어떤 비디오에 시간이 걸리는 효과 처리를 걸어 놓고 다른 비디오 클립을 편집할 수 있는 식이다. 프로그래머의 관점에서 본다면 이 경우 프로그램 안에 있는 같은 변수에 여러 스레드가 접근할 수 있으며 그에 따라서 예상하지 못한 문제가 일어날 수 있다. 예를 들어 어떤 변수에 한 스레드가 1초 후에 꺼내 쓰려고 값을 저장해 놨는데 1초 사이에 다른 스레드가 다른 값을 저장했다면? 처음에 값을 저장했던 스레드가 1초 후에 돌아왔을 때에는 엉뚱한 값이 저장되어 있어서 오류를 일으킬 수 있다. 이를 피하기 위해서는 스레드 동기화를 감안해 가면서 프로그램을 짜야 한다.

아예 하드웨어 수준에서 멀티스레드를 지원하는 경우도 있는데 이는 위에서 말한 소프트웨어의 멀티스레드와는 달리, 아예 CPU가 실제 코어 수보다 많게 인식되는 것이다. 인텔의 하이퍼스레딩 기술이 대표적으로 예를 들어 코어가 2개 있는 CPU가 하이퍼스레딩이 적용되면 4대로 인식된다. 물론 실제로 코어가 4개 있는 CPU보다는 느리지만 동시에 많은 작업들이 돌아가는 요즈음의 운영체제에서는 CPU의 효율성을 크게 향상시킬 수 있다는 장점이 있다. 다만 '하이퍼스레딩'은 멀티스레드가 아닌 멀티프로세싱의 개념이다.

사람의 멀티태스킹

사람을 비롯한 모든 생물은 멀티태스킹을 한다. 일단 수많은 장기들은 각자 끊임없이 자기 일을 하고 있다. 또한 TV를 보면서 밥을 먹는다든가, 운전을 하면서 전화 통화를 한다든가, 그러다가 사고를 치든가 실생황에서 우리는 많은 멀티태스킹을 많이 한다.

남자보다 여자가 멀티태스킹 능력이 뛰어난 것으로 알려져 있다. TV를 보면서 한 어깨에 전화기를 끼고 수다를 떨고, 한 손으로는 마늘을 까면서 다른 한 손으로는 아이를 달랜다. 그리고 나서도 아까 본 드라마 내용을 다 기억한다! 과학적으로도 뇌 구조가 다르다는 것이 입증되었다. 남자는 싱글코어, 여자는 멀티코어.