pc 레지스터 : 실행 위치를 가지고 있다.

OS/이론 2020. 1. 13. 14:26

 이 포스트를 어디에 쓸지 고민을 굉장히 많이 하였습니다. OS에 쓸지, 어셈블리 카데고리를 따로 만들어서 써야 할 지, 아니면 C언어에 쓸지. 그런데, 모 사이트에서 가장 많이 질문받은 것 중 하나가 OS의 thread (혹은 Linux의 fork)를 공부하고 있는데 왜 실행 흐름이 이렇게 되나요? 에 대한 질문이 많았습니다. 그렇기 때문에, 일단 OS 카데고리에 작성하도록 하겠습니다.

 

 먼저, pc는 프로그램 카운터입니다. 그러면 이 값을 저장하는 것은, pc register일 거에요. 그러면 뭘 저장할까요? 실행할 기계어 코드의 주소를 저장할 거에요. 아. 벌써 모르는 용어가 3개 나온 거 같아요. 쉽게 설명해 드리겠습니다.

 

 


 일단, 우리는 기계어를 명령이라고 합시다. 밥 먹어라. 혹은 설거지 해라와 같은. 그리고 주소는 명령이 있는 줄이라고 생각해 봅시다. 1줄에는 하나의 명령만 올 수 있습니다. 아래와 같은 프로그램을 생각해 봅시다.

 

 

 되게 복잡해 보이지만, 사실 1시이면 밥을 먹는 프로그램입니다. 그러면, 이렇게 간단하게 (스크래치 등으로) 작성하실 수 있습니다. 이제, 1시일 때와 아닐 때, 프로그램을 실행시켜 보겠습니다.

 

 

 1번 명령. 시작한다를 수행합니다. 그 다음에 어디로 가야 할까요?

 

 

 1시인가? 로 가야 할 겁니다. 1시인가요? 그러면 3번으로 갑니다.

 

 

 밥을 먹습니다. 다 먹고 나면 어떻게 해야 하나요? 종료하면 되지 않을까요? 4번으로 가겠습니다.

 

 

 4번으로 가야 할 겁니다. 실행 흐름은 1, 2, 3, 4번 순이였습니다. 그러면, pc 레지스터도 1, 2, 3, 4 순으로 변화했을 거에요. 여기서 우리는 주소를 1번, 2번, 3번, 4번으로 볼 수 있어요. 그리고 이 값에 따라서, 몇 번 명령을 실행할 것인지를 결정했어요. 시작한다. 1시인가? 등등을 말입니다.

 

 만약에 1시가 아니라고 해 봅시다.

 

 

 그러면 바로 종료를 해야 할 거에요. 그러면, 3번으로 가면 안 되고, 4번으로 곧장 가야겠죠. 따라서, 1시가 아닌 경우, 실행 흐름은 1, 2, 4번 순이 됩니다.

 

 


 프로세스가 fork로 새로 생성이 되었을 때, 자식 프로세스의 pc 레지스터와, 부모 프로세스의 pc 레지스터는 독립적인 공간에 있다는 이야기를 많이 합니다. 즉, 별개의 실행 흐름을 가진다고 이야기를 하는데요. 그것의 의미도 같이 보도록 하겠습니다.

 

 

 프로세스 생성을 다 끝냈다면, 밥을 먹고, 국을 먹고, 밥을 먹고, 국을 먹고, ... 그런 식으로 하기 때문에, 프로세스 생성 함수가 끝나면, 2번으로 가는 게 아니라, 3번으로 가는 게 더 자연스러워 보입니다. 그러면, process를 생성하는 함수가 끝났다면, 3번 명령을 수행할 차례가 될 겁니다.

 

 

 자식과 부모가 몇 번째 명령을 수행하여야 하는지에 대한 정보를 공유한다고 생각해 봅시다. 그러면 어떻게 될까요? 생각보다 답은 복잡하지 않습니다. 먼저 부모가 3번 명령을 수행했습니다. 그러면 parent는 밥을 먹습니다.

 

 

 그러면, 4번 명령을 수행할 차례가 되었는데요. 이 때 자식 턴이라고 해 봅시다. 그러면, child는 국을 먹을 거에요.

 

 

 다음 턴은 자식이 될 수도 있고, 부모가 될 수 있는데요. 부모 턴이라고 해 봅시다. 그러면 부모는 또 밥을 먹을 거에요. 이런 식으로 1개 명령마다, 자식과 부모 턴이 되고, 실행할 줄에 대한 정보를 parent와 child가 공유한다면, 부모는 계속 밥만 먹고, 자식은 국만 먹는 상황이 생길 거에요. 이것은 부모의 흐름과 자식의 흐름이 서로 종속적이기 때문입니다.

 

 그런데, 실제로는, 부모 흐름과 자식의 흐름이 별개라고 이야기를 합니다. 이는, 어떤 의미일까요?

 

 

 p는 부모가 실행할 코드의 위치, c는 자식이 실행할 코드의 위치를 나타냅니다. 자식이 먼저, 3번 코드를 실행했다고 해 봅시다. 그러면, 3번을 실행했으니, 4번을 실행할 차례일 겁니다. 그러면, c의 값이 3에서 4가 됩니다.

 

 

 그러면 이 때 부모는 몇 번 코드를 실행할 차례인가요? 자식이 3을 실행했으니, 부모는 4를 실행해야 하나요? 서로 별개의 공간에 있다면, c값만 증가했다면, p값이 증가할 이유는 없습니다. 부모가 3을 실행했다면, 그제서야 p값이 4로 증가할 거에요.

 

 

 그러면, 부모랑 자식 둘 다 밥도 먹고 국도 먹을 수 있을 거에요.