본문 바로가기

쉽게 풀어본 IT 기술

프로그램은 어떻게 여러개가 동작될까?

CPU는 하나인데, 어떻게 여러개의 명령어를 실행할까? 멀티쓰레드 멀티프로세스라는 조금은 어려운 말이 나온다. 멀티 쓰레드를 설명하면 쓰레드라는 조그만 일단위가 여러개가 동시에 진행이 된다. 동시에 라는 말을 다시 한번 쪼개보면 시분할이다. 엄밀히 말하면 여러개의 프로그램이 순차적으로 조금씩 실행되는 것이다. 너무 빠르게 돌아가기때문에 동시에 실행되는 것처럼 보이다. 굉장히 빠른 시간들을 통해서 프로그램은 순서에 따라서 자신이 수행될 기회를 얻어 수행을 한다.

물론 최근 컴퓨터는 실제로 하나의 프로그램만 실행되는 것은 아니다. CPU도 그렇고, 메모리도 그렇고, 여러개의 프로그램이 실행되게끔 설계되었다.

컴퓨터 내에서의 여러가지 처리해야할 일들이 많이 있을 때에 무엇부터 처리할지에 대한 고민은 사실 고전적인 문제이며 이를 해결하기 위해서 많은 시도가 있었다. 윈도우의 탄생과 더불어 이미 승자 방식은 선점형 멀티태스킹이다. 조금 어렵게 표현하면 Preemptive Multitasking이다. 선점형, 먼저 차지하는 일에게 기회를 주는 방식이다.

운영체제에서 주로 행해지는 일로 오랜 시간 동안 고민을 해왔으면 그 방식도 여러가지가 있다. 선점형 멀티태스킹, 라운드 로빈 방식이다. 일를 할 수 있는 기회를 주되 의지가 강한 놈에게 주는 것이다. 그렇지 않다면 전체적으로 성능이 늦어지기때문이였을 것이다.

메모리가 컴퓨터 전체 성능에 영향을 미치는 이유는 CPU가 다음 일할 것들에 대해서 임시 창고가 되어 CPU의 일을 바로 바로 할 수 있게 해주기 때문이다. 버스를 타고 일을 싣어 날른다면 더 느려지기 때문이다. 좀더 빠른 속도를 위한 고민은 계속된다. 그래서 나온 개념이 캐쉬 메모리이다. 메모리가 상당히 빠른 속도의 접근이 가능한대 CPU내에 메모리 공간이 있다면 더 빠르게 처리할 수 있다는 것에서 착안하여 CPU내 메모리를 캐쉬 메모리라고 한다. 더 빠르게 일처리를 할 수 있는 것이다.

그러면 CPU가 할일에 대해서 메모리에서 캐쉬메모리로 일을 쌓아둔다. 계속 메모리에서 캐쉬메모리로 일을 옮기고 CPU는 바로 옆에 책상처럼 가까이 있는 캐쉬메모리에서 쌓인 일들 처리하면 된다. 이에 그치지 않는다. 인접한 메모리 위치를 서로 다른 뱅크에 둠으로써 CPU가 동시에 접근한게 하는 것을 메모리인터리빙이라고 한다. 인접한 메모리 위치를 서로 다른 뱅크에 뒀다는 것은 인접한 메모리에 CPU는 엑세스 할 확률이 높다. 그것을 각각 다른 뱅크에 둠으로써 동시에 일을 가져오게 될 확률이 높아진다. 메모리에 어떤 일을 둘 것인가의 문제는 이야기할 부분이 많으니 다음 기회로 한다.

메모리에서 캐쉬 메모리로 어떤 일들을 옮겨놔야 CPU가 바로 바로 처리할까라는 예측을 하기 시작한다.
메모리에 어떤 일을 놓았을 때 그 일을 CPU가 가져가서 하게 된다. CPU가 일을 찾으려고 했는데, 그 일이 메모리에 없다면 그것은 헛걸음이 되고, 해당하는 일의 해당하는 내용을 파일로부터 메모리에 올려야 한다. 이렇게 되면 BUS라는 것을 통해서 데이터가 일부 메모리가 탑재되어야 하니 시간이 좀더 소모가 될 것이다. 그래서 메모리에 CPU가 찾고자 하는 일이 있는 것을 Hit율이라고 한다.
메모리에 딱 찾던 일이 그곳에 있는 상황이다. Hit , 반대로 말해서 Hit율이 떨어지면 컴퓨터 성능은 전체적으로 떨어질 수 있다. 그럼 어떤 일들을 메모리 근거리 창고에 둘 것인가 그것은 연속된 일들 다음에 행해질 일들 그럼 어떤 일들을 메모리에서 내릴 것인가? 안하게 될 일들 참조하지 않는 데이터들이다. 이것이 관리가 잘되어야 효율적으로 운영이 될 것이다.

CPU는 시분할 즉 시간을 쪼개어 일들을 처리한다. 다시 말해 일들을 돌아가면서 조금씩 처리한다. 물론 어느 시점 CPU들은 한번에 한가지 일만 하지 않고, 여러개의 Core가 있어서 실제 물리적으로도 동시에 일들을 처리한다. 멀티 코어 프로세서가 대부분이다. 지금 기본적인 동작 원리를 이야기 하는 것이니 그냥 시분할을 해서 일처리 한다고 이해하자. 이때 CPU에서 각종 레지스터도 있고, 작업을 위해서 셋팅된 값들이 있을 것이다. 해당 작업이 끝나고 엄밀히 말하면 끝난게 아니지만, 다음 작업을 하기 위해서는 그러한 환경 값들이 변하고, 해당 작업에 해당하는 일들이 다시 올라온다. 그래서 A작업에서 B작업으로 바뀌는 것을 켄택스트 스위칭이라고 한다. 이는 일이 바뀌는 것을 의미하고, 작업 시간보다 이 스위칭 시간이 오래걸리게 되면 전체적인 성능이 갑자기 급격하게 떨어지게 된다. 이러한 현상은 컴퓨터에서 여러개의 프로그램을 켜다 보니 갑자기 멈추는 느낌이 드는 것이 그런 현상이다.

이 현상을 스래싱 현상이라고 한다. 컨텍스트 스위칭 작업이 빈번하여 전체 시스템 성능이 저하되는 현상
그래서 적당하게 프로그램도 띄워야 한다. 그리고 무조건 Round-robin이 빨리 돈다고 해서 좋은 것도 아니다.