PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2015/04/26 17:56:08
Name 랜덤여신
Subject [일반] 컴퓨터의 멀티태스킹은 어떻게 이루어지나
"컴퓨터는 한 번에 하나의 일만 처리할 수 있다." 꽤 중요함에도 자주 간과되는 사실입니다. 컴퓨터가 여러 프로그램을 동시에 돌리는 것처럼 느껴지는 것은 사실, 컴퓨터가 빠른 속도로 이 프로그램 돌렸다가 저 프로그램 돌렸다가 하기 때문에 그렇게 보이는 '환상'이죠. 이런 현상을 가리키는 용어가 '멀티태스킹'으로써, 이제는 실생활에서도 꽤 쓰이는 말이 되었습니다.

----

컴퓨터의 멀티태스킹에는 크게 두 가지 방법이 있습니다. '선점형'(preemptive)과 '협력형'(cooperative)이 그것인데요.

'협력형'은 먼 옛날 호랑이가 롤 하던 시절에 쓰이던 멀티태스킹 방식입니다. 이게 협력형이라고 불리는 이유는...

컴퓨터로 동영상을 재생하면서 동시에 음악을 듣는다고 생각해 봅시다. (주의: 절대 따라하지 마세요.) 협력형 멀티태스킹에서는 각 프로그램이 CPU를 독점적으로 사용하게 됩니다. 그러다가 적당한 시간이 되면, CPU 점유를 스스로 포기하고 다른 프로그램에 CPU를 사용할 수 있는 권리를 넘기게 됩니다. 음악 플레이어가 CPU를 활용하여 음악을 0.001초 재생하고, 동영상 플레이어에 CPU를 양보하면, 이번에는 동영상 플레이어가 CPU를 써서 동영상을 0.001초 재생하고, 다시 음악 플레이어에 CPU를 넘깁니다. 이 과정이 무지 빠르게 이루어지기 때문에 위에서 말씀드린 '환상'이 생깁니다.

이 과정은 그럴듯하지만 문제가 있습니다. 오동작하는 프로그램을 막을 수 없다는 것입니다. 음악 플레이어가 갑자기 미쳐서 [CPU를 양보하지 않기로 결정했다]면 어떻게 될까요. CPU 100% 차지하면서 듣기 싫은 노래를 영원히 듣게 될 것입니다. Alt+Tab도 안 되고(왜냐하면 Alt+Tab도 프로그램이니까), 심지어 작업 관리자 켜서 강제 종료할 수도 없습니다. 작업 관리자로 CPU가 가지 않으니까요.

CPU를 순순히 양보한다고 해도 여전히 문제는 있습니다. 욕심 많은 프로그램은 남들보다 CPU를 더 많은 시간 쓴 다음에 양보할 수도 있죠. 이러면 규칙을 지키는 프로그램은 CPU를 덜 쓰게 되니까 공정하지 못합니다.

윈도 3.1이나 윈도 95/98/Me가 불안정했던 이유가 이것입니다. 윈도 3.1은 완전히 협력형이었고, 윈도 95/98/Me는 일부 16비트 프로그램에 협력형을 사용했습니다. 그래서 오동작하는 프로그램 하나가 시스템 전체를 먹통으로 만들 수 있었습니다. 윈도 XP에 와서야 협력형을 완전히 버리게 되죠.

협력형의 대안으로서 등장한 것이 선점형입니다. 선점형 구조에서는 프로그램이 CPU를 양보하지 않고 있어도, [일정 시간이 흐르면] (보통 몇 마이크로세컨드 단위입니다만...) 강제로 운영 체제가 CPU를 빼앗아서 다른 프로그램에 넘겨 줍니다. 따라서 어떤 프로그램이 미쳐도 다른 프로그램에는 영향이 없죠.

문제 해결!

----

...인 줄 알았는데, 몇 년 전부터 폐기된 줄로만 알았던 협력형 멀티태스킹이 주류 프로그래밍 기법으로 슬금슬금 다시 올라오고 있습니다.

선점형의 문제점은 여러 가지가 있습니다. 그 중 가장 큰 것이 프로그램의 동작을 예측하기 어렵다는 것입니다.

이 문제는 프로그램 여럿이 협력하여 하나의 목표를 달성할 때 발생합니다. 오늘날의 수많은 프로그램들은 자기 내부에 작은 프로그램들을 여럿 거느리고 있습니다. 스타크래프트를 예로 들면, 화면을 그리는 프로그램, 현재 남은 자원량을 측정하는 프로그램, 사용자로부터 입력을 받아들이고 유닛에 적절한 명령을 내리는 프로그램, 유닛의 다음 위치를 계산하는 프로그램들로 구성되어 있을 수 있다는 것입니다. 이것을 전문 용어로 '스레드'라고 합니다.

'화면을 그리는 프로그램'과 '남은 자원량을 계산하는 프로그램'을 예로 들어 보죠. 건설 로봇이 군수 공장을 짓기 시작합니다. 그러자 '자원량 프로그램'은 이를 감지하고 광물 150, 베스핀 가스 100을 각각 현재 자원량에서 감소시키고자 합니다. 일단 광물 150을 감소시켰는데, 아뿔싸... 운영 체제가 너는 CPU를 너무 많이 썼다며 CPU를 빼앗아 다른 프로그램에 줘버립니다. 이제 '화면 그리는 프로그램'이 CPU를 받고, [광물만 150 감소한 상태로 화면을 그립니다.] 플레이어가 잘못된 화면을 보게 되는 것이죠.

협력형에서는 이런 일이 생기지 않았을 것입니다. 왜냐하면 '자원량 프로그램'은 누가 뭐래도 하늘이 두 쪽이 나도 광물과 베스핀 가스를 둘 다 감소시킨 다음에야 CPU를 양보했을 테니까요.

이를 방지하기 위해 오늘날의 프로그램은, A 프로그램은 B 프로그램의 수행이 끝날 기다려야 한다느니, C 프로그램은 A, B 모두 끝나야 비로소 처리를 시작한다느니 하는 온갖 규칙들을 프로그램 내에 적어 둡니다. 이를 전문 용어로 '상호 배제'(mutex)라고 합니다.

하지만 이것은 완벽하지 않은데, 프로그래머가 깜빡할 때가 많기 때문입니다. CPU의 양보는 순전히 임의로 일어나므로, 위와 같은 버그가 있더라도 운 좋게 잘 동작할 수도 있습니다. 광물만 감소시키고 베스핀 가스는 감소시키지 않은 그 타이밍에 CPU를 빼앗길 때만 위에서 말한 버그가 발생할 테니까요. 따라서 테스트할 때는 분명 올바르게 동작하던 놈이 사용자 수천 명이 쓰다 보니 그 중 한 명은 저 증세를 겪고, 게시판에 글 올리고, 하늘이 무너지고 땅이 꺼지고... 이럴 수가 있습니다.

또한 프로그램에게 기다림의 미학을 가르치는 것은 비용이 듭니다. 성능이 떨어진다는 것이지요.

----

선점형으로 프로그래밍하기는 어렵고 성능이 떨어지고, 그렇다고 단 하나의 프로그램이 모든 것을 망쳐버릴 수 있는 협력형을 쓸 수도 없고... 그래서 오늘날 재발견되고 있는 것이 '프로그램 내부에 있는 소규모 프로그램들(스레드)끼리만 협력형을 쓰자'는 것입니다. 이 분야에서는 Node.js가 대표적으로 인지도가 있는데, 웹 사이트를 만드는 데 협력형 멀티태스킹을 쓸 생각을 한 최초의 시도 중 하나이기 때문입니다.

일단 내 프로그램 안의 소규모 프로그램들은 내가 짠 것이므로 어느 정도는 믿을 수 있습니다. 최소한 누군가 악의적으로 CPU를 부당하게 많이 사용하는 프로그램을 끼워 넣었을 우려는 없습니다. 또한 영 망하더라도 그 프로그램 안의 소규모 프로그램들이 영향 받지, 다른 프로그램에 영향이 가는 것은 아니므로, 작업 관리자로 강제 종료를 시킬 수도 있습니다.

다만 잘 짰다고 생각했는데 버그 때문에 특정 소규모 프로그램만 CPU를 더 많이 쓰고... 이런 경우는 충분히 있을 수 있습니다. 이 경우에 책임은 스스로가 져야 하죠. 협력형 멀티태스킹을 사용한 대가니까요. 성능을 높이는 대가로 CPU가 불공평하게 배분될 위험성을 지불하는 것입니다. 그리고 위에서 언급한 Node.js의 사례를 보면, 아직까지는 제법 괜찮은 성과를 보이고 있는 것 같습니다. 그래서인지 점점 더 많은 언어가 협력형 멀티태스킹에 관심을 보이고 있습니다.

이렇듯 완전히 묻힌 줄로만 알았던 기술이 20년 30년 후에 새로운 브랜드를 달고 다시 부활하기도 합니다. 이럴 때면 '엔지니어링은 트레이드-오프가 전부다'라는 말이 생각납니다. 모든 기술은 장단점이 있으므로, 지금 기준에서는 단점이 장점보다 크지만, 나중에 다른 기준에서는 장점이 더 커질 수도 있는 거죠. 지나간 기술이라고 괄시해서는 안 되는 이유입니다.

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
azurespace
15/04/26 18:12
수정 아이콘
멀티코어 멀티CPU를 넘어서 그리드 컴퓨팅으로 가는 지금까지도 사실 논문 같은거 보면 형태만 조금 바뀌었지 60년대 70년대에 했던 고민과 거의 다르지 않고 솔루션도 비슷한 아이디어를 적용해서 하는 경우가 많습니다. 아마 이는 아예 아키텍쳐의 구조 자체를 바꿔버릴 혁신이 없다면 계속 반복되겠지요.
커피소년
15/04/26 18:12
수정 아이콘
요즘 임백준님의 여러가지 프로그래밍의 미학? 같은 책을 읽는 중인데
이런 책을 읽듯이 랜덤여신님 글을 읽게 되네요. 뭔가 이해 안될것 같은데 읽으면 이해가 가네요. 크크
잘 읽었습니다!
Holy shit !
15/04/26 18:22
수정 아이콘
프로그래밍도 잘 모르고 컴퓨터에 대해서도 잘 모르는데 군대로 비유하면

협력형은 이등병들끼리 작업을 하는데 선임이 와서 이거해라 시키고 또 다른 선임이 이거해라 시키고 행보관이 와서 저거해라 시켜서 열심히 하다가 갑자기 한쪽 작업에 차질이 생겨서 다른 작업까지 덩달아 차질이 생기는경우고
선점형은 이등병들 작업하는데 말년병장와서 작업할걸 각자 할당해주고 다른 한쪽에 문제가 생겨도 차질이 없게 교통정리 해준다는 개념인가요?
15/04/26 18:37
수정 아이콘
협력형은 피쟐러가 똥 다싸면 변기 비켜줘서 다음 피쟐러 똥싸게 해주는 거고(변비러 있으면 망함)

선점형은 다 싸지 못했어도 시간되면 운영진이 강제로 내보내고(밑 못 닦았을 때 망함) 다음 피잘러를 앉히는 거 같습니다
GregoryHouse
15/04/26 19:40
수정 아이콘
이게 정답이죠 명쾌한 비유네요
Rainbowchaser
15/04/26 19:53
수정 아이콘
훌륭하네요...
15/04/26 20:30
수정 아이콘
오싹할 정도의 정교함이네요.
15/04/26 20:46
수정 아이콘
촌철살인
15/04/27 06:56
수정 아이콘
저를 살인죄로 다스려 주십쇼!
15/04/26 20:52
수정 아이콘
대단한 정답이네요..
랜덤여신
15/04/27 08:59
수정 아이콘
사실 개인적으로 PGR21에서 유행하는 똥 유머를 좋아하진 않습니다만, 이것은 인정할 수밖에 없군요. 여러 모로 이해가 잘 가는 비유입니다. 본문이 무색해질 정도군요.
15/04/27 09:10
수정 아이콘
앗 랜덤여신님의 애독자로서 영광입니다^^!
15/04/27 12:08
수정 아이콘
멀티태스킹에 대해서는 나름 오랫동안 공부해왔지만...
이 댓글보다 더 잘 설명할 자신이 없다?!!
하루빨리
15/04/26 19:39
수정 아이콘
토론을 하는데
협력형은 발언 시간을 사회자가 제재 안하는 방식이고, (그래서 트롤러가 마이크를 부여잡고 1시간 이상 떠들어도 사회자는 터치 안하는 방식)
선점형은 발언 시간을 사회자가 정하는 방식 (트롤러가 정해진 시간 10분을 초과해 썼다 하면 지체없이 사회자가 마이크 끄고 다른 참여자에게 발언기회를 넘겨주는 방식)이라 할 수 있겠네요.
싸이유니
15/04/26 18:29
수정 아이콘
학교다닐때 공룡책에서 많이보던 내용이군요
삼성그룹
15/04/26 19:53
수정 아이콘
O..operating system concept 인가요?크크 저도 저걸이번학기 교재로 쓰고 있습니다.흐흐
깡디드
15/04/26 20:30
수정 아이콘
크크 저도 공룡책 봤는데 그 때는 node.js도 없었을 때네요
damianhwang
15/04/26 20:00
수정 아이콘
mac os 클래식에서 이걸 해결을 못해서 헤매다가 결과적으로 잡스가 넥스트스텝 가지고 애플로 돌아오는 빌미가 되었다죠 흐흫
15/04/26 20:29
수정 아이콘
재밌게 잘 익었습니다. :)
송지민
15/04/26 22:46
수정 아이콘
재미있게 잘 읽었습니다.
혹시 퍼가도 괜챃을까요?
랜덤여신
15/04/27 08:59
수정 아이콘
네, 괜찮습니다.
발음기호
15/04/27 08:43
수정 아이콘
그렇다면 싱글 코어 cpu로 음악 감상을 하면서 다른 작업을 할 때,
실제로는 매우 짧은 간격(아마도 사람이 인지할 수 없을 정도로 짧은 간격?)으로 음악이 나왔다 안나왔다 하고 있는 것인가요?
랜덤여신
15/04/27 09:05
수정 아이콘
본문에서는 설명의 편의를 위해 그렇게 설명했지만, 사실 더 정확히 말하면 음악 재생이 중단되는 것은 아닙니다. 왜냐하면 스피커에서 실제로 나오는 소리는 CPU가 아니라 사운드 카드에서 만들어 내는 것이기 때문입니다. 중단되는 것은 'CPU에서 사운드 카드로 소리를 전달하는 과정'이죠. CPU와 사운드 카드는 독립적으로 동작하기 때문에 이게 가능합니다.

그래서 음악 플레이어는 자기가 CPU를 잃을 것에 대비해 미리 사운드 카드로 넉넉하게 소리를 보내 놓습니다. 그러면 사운드 카드는 제공된 소리를 알아서 재생하게 되죠. 가끔 컴퓨터나 게임기가 멈췄을 때 특정 소리가 무한 반복해서 들리는 경우를 겪으신 적이 있나요? 그게 바로 CPU에서 새로운 소리를 제공 받지 못한 사운드 카드가 이미 가지고 있는 소리만 반복 재생하는 현상입니다.
발음기호
15/04/27 09:30
수정 아이콘
아, 그렇군요... 나름 전공자인데 부끄럽네요.. 크크크...
잘 배웠습니다!!

랜덤여신님께서 IT 관련 내용들을 이해하기 쉽게 풀어써주시는 글들 재밌게 읽고 있습니다.
개발자신걸로 얼핏 본 것 같은데 실례가 안된다면 무슨 개발하시는지 여쭤봐도 되나요???
랜덤여신
15/04/27 13:00
수정 아이콘
평범한 백수입니다. 갓수라고 불러주셔도 됩니다.

그나마 경험이 있는 분야를 말하라면 웹 사이트 제작이나 서버 개발 정도일 것 같군요. 하하
15/04/27 09:41
수정 아이콘
아 그래서 음악이 계속 나오는 거군요!
뜻하지 않게 호기심 해결하고 가네요 감사합니다
15/04/27 12:22
수정 아이콘
뜬금없지만 이것도 멀티태스킹의 적절한 예인가요? 아니 멀티코어 프로세서...

http://i.imgur.com/24WJqHU.jpg
랜덤여신
15/04/27 13:03
수정 아이콘
두 번째 그림이 바로 선점형 멀티태스킹에서 프로그램들끼리 경쟁할 때 (CPU를 서로 빼앗아댈 때) 실행 결과를 예측할 수 없는 현상을 나타낸 것입니다. 이걸 막기 위해 '밥 그릇은 한 번에 하나의 개만 접근할 수 있다'는 제한을 가하면 그게 본문에서 말한 '기다려야 하는 규칙'이 되는 것이고, 전문 용어로 '상호 배제'라고 하는 것이죠.
15/04/27 13:44
수정 아이콘
첫 번째 그림에서, 저 강아지들 뒤로 다른 강아지들이 예쁘게 한마리씩 자기 순서를 기다리고 있는게 제일 해피한 상황...
이지만, 현실은 시궁창!!
포켓토이
15/04/27 17:03
수정 아이콘
선점형 멀티태스킹의 장점은 이뿐만이 아니죠. 배터리 절약에도 획기적인 효과가 있습니다.
요즘은 CPU로드에 따라 클럭을 가변하는데.. 이게 좀 문제가 많은게 한박자 느리다는거죠.
interactive 같은 방식으론 실질적으로 절약 효과가 적고 그렇다고 다른 방식을 쓰면 사용자 반응이 둔감해지고...
옛날에 셀빅 써보신 분들은 아시겠지만 셀빅은 AA배터리 2개로 몇주를 버텼습니다. 실사용시간 기준으로 해도
요즘 스마트폰하곤 비교도 안될 정도로 오래 버텼죠. 물론 그때는 흑백이고 해상도도 낮지만, 그대신 반도체
기술이 열악해서 사실 AP가 전기 먹는건 그때나 지금이나 큰 차이가 없을겁니다...
그때 극단적으로 오래버틸 수 있던건 다름이 아니라 셀빅OS가 선점형 멀티태스킹을 썼기 때문이죠..
즉 백그라운드에서 돌아가는 태스크가 매우 적고 그것들을 완벽하게 통제하고 있기 때문에 CPU가 슬립에 들어가야
하는 순간과 아닌 순간을 확실하게 구별할 수 있다는겁니다. 셀빅은 클럭 가변이 아니라 아예 CPU를 슬립에
넣어버렸습니다. 사용자 입력이 들어오는 순간 인터럽트로 깨서 사용자 입력만 처리하고 곧바로 다시 슬립..
즉 화면이 멈춰있으면 아예 CPU가 멈춰서 안돌고 있는거지요. 뭐 팜OS도 마찬가지였겠습니다만..
그렇기 때문에 요즘 스마트폰하곤 비교도 안될만큼 배터리 효율이 높았던거지요.
애플 iOS가 안드로이드에 비해서 배터리 효율이 높은 것도 비슷한 원리입니다. iOS 역시 얼마 전까지만 해도
백그라운드 태스크를 허용을 안했죠. 즉 백그라운드로 돌아가는 것들은 모두 OS에서 돌린 것들뿐이고
그것들은 확실하게 통제할 수 있기 때문에 클럭을 낮은 상태로 유지할 수 있는 시간을 극대화할 수 있는겁니다.
뭐 그렇다고 해도 아예 CPU를 슬립에 넣어버릴 수 있는 옛날 셀빅이나 팜에 비하면야 한수 아래겠지만요..
옛날이 그립군요.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
57799 [일반] ’소비의 핵‘ 40대가 옴짝달싹 못하는 이유는?…한국사회 허리가 병들었다 [97] 동네형10253 15/04/27 10253 1
57798 [일반] [KBO] NC 김진성, 종아리 부상으로 5~6주 재활 [10] SKY923233 15/04/27 3233 0
57797 [일반] 무한도전을 보면서 사람 마음의 간사함이 느껴지네요. [72] 발롱도르10026 15/04/27 10026 2
57795 [일반] 처리 지연 및 회원간 차이 발생에 대하여 사과 드립니다. [458] 더스번 칼파랑21629 15/04/27 21629 15
57794 [일반] 장동민 삼풍백화점 생존자로부터 고소 + 2시 라디오 하차 [285] 포스트잇18082 15/04/27 18082 8
57793 [일반] 세계 오페라의 수도는???(탑텐) [21] 표절작곡가4221 15/04/27 4221 3
57792 [일반] 지민XJ.DON/빅뱅의 티저가 공개되었습니다. [3] 효연광팬세우실4065 15/04/27 4065 0
57791 [일반] [야구] 넥센 히어로즈의 반등 이야기 [60] GLASSLIP7148 15/04/27 7148 0
57790 [일반] 생애 첫 자동차 사고를 당했습니다. [28] 삭제됨5635 15/04/27 5635 0
57789 [일반] [스포주의] WWE PPV 익스트림 룰즈 2015 최종확정 대진표 [4] SHIELD5598 15/04/26 5598 0
57788 [일반] 내가 좋아하는 폴 매카트니 노래 Best 20 - 2 [폴맥경 내한공연 기념] [31] 김연아4771 15/04/26 4771 7
57787 [일반] 가치 간의 우열 관계가 아니라, 가치체계의 내적 완결성을 검토하자. [9] 캇카4111 15/04/26 4111 4
57786 [일반] 남녀관계에서의 고질적인 문제 [156] 삭제됨14969 15/04/26 14969 34
57785 [일반] 매니 파퀴아오 인생 경기... [48] Neandertal12819 15/04/26 12819 1
57784 [일반] 기아의 흔한 마무리- 윤석민 마무리에 대한 생각 [65] swordfish-72만세6920 15/04/26 6920 4
57783 [일반] 컴퓨터의 멀티태스킹은 어떻게 이루어지나 [30] 랜덤여신8672 15/04/26 8672 7
57782 [일반] 내가 좋아하는 폴 매카트니 노래 Best 20 - 1 [폴맥경 내한공연 기념] [22] 김연아4390 15/04/26 4390 2
57781 [일반] 롯데 치어리더 홍유정의 치어리딩 [7] style7592 15/04/26 7592 0
57780 [일반] 인간에 대하여 뇌과학이 말해준 것들. [18] 탐이푸르다6140 15/04/26 6140 5
57779 [일반] SNS의 선동질, 혹은 마녀사냥 [86] 삭제됨9385 15/04/26 9385 6
57778 [일반] 이동걸 첫 승, 김성근 감독님이 따뜻하게 안아주셨다 [568] 발롱도르21507 15/04/26 21507 44
57777 [일반] 이글스 팬의 평범한 하루 [22] 영혼의공원6628 15/04/26 6628 6
57776 [일반] 자식을 낳고 키워야 하는 이유는 무엇일까? [67] 피들스틱15057 15/04/26 15057 6
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로