[운영체제] 프로그램 실행 원리
입출력(I/O)
모든 입출력은 운영체제을 통해서 실행할 수 있습니다. 그래서 다른 프로세스들이 입출력을 하기위해서는 운영체제에게 요청을 해야합니다. 이 요청을 '시스템콜'이라고 합니다. 프로세스가 CPU에 인터럽트를 걸게되고, CPU 제어권이 운영체제에 넘어가고 mode bit이 0으로 바뀝니다. OS는 device controller에게 IO 요청을합니다.
동기 vs 비동기
입출력을 진행하는 방식은 '동기'와 '비동기'로 나눌 수 있습니다. '동기'란 어떤 일을 요청하고 그것의 결과를 확인해야 이어서 작업을 수행하는 것을 말하고, 반대로 '비동기'란 어떤 일을 요청해놓고 언젠가는 결과가 나올 것이라는 것만 기대하며 작업을 이어나가는 것입니다.
입출력에도 이 두가지 방법으로 입출력 방식을 구현할 수 있는데요. 다만, 조금 특별한 점은 CPU를 시분할 방식으로 여러 프로세스가 짧은 시간 동안 돌아가면서 사용하기 때문에, 프로세스의 입장에서는 동기여도 CPU입장에서는 비동기처럼 느껴지는 방법도 있습니다. 프로세스가 IO 요청을 하면, 우선 해당 프로세는 그 작업의 결과를 얻을 때까지 멈춥니다. 이 시간 동안 CPU는 기다리지 않고, 다른 프로세스로 넘어가서 작업을 하다가, IO가 끝나면 다시 해당 프로세스 작업을 이어나갑니다.
주소공간
CPU는 오직 메모리만 바라보며 주소값을 통해 메모리에 접근하여 인스트럭션을 읽고 실행합니다. 따라서 프로그램을 실행시키기 위해서는 보조 기억장치에 있는 프로그램을 메모리에 올려야합니다. 이때 메모리에 올라와서 실행되는 프로그램을 프로세스라고 합니다.
이 프로세스들은 각각 자신만의 가상의 '주소공간'을 할당 받습니다. 각각의 프로세스가 물리적 메모리 안에 겹치지 않도록 배치가 되겠지만, 각 프로세스들은 모두 0번지부터 N번지까지 공간을 할당받았다고 느끼도록 합니다. 이렇게 하는 이유는 '보안' 때문입니다. 만약 가상의 주소공간을 할당받지 않고, 각 프로세스들이 물리적 공간의 실제 주소를 사용한다면, 쉽게 다른 프로세스의 공간을 침범할 수 있을 것입니다. 이것을 예방하는 방법이 가상 주소 공간입니다. 이렇게 부여 받은 가상 주소는 MMU ( Memory Management Unit )이 실제 주소로 변환해줍니다.
이 주소공간은 크게 'code', 'date', 'stack'으로 이뤄져있습니다. code는 말그대로 실행할 코드들이 기계어로 담겨져있고, data는 자료구조를, stack은 실행한 함수들의 체인을 담고 있습니다.
Swap Area
메모리는 작고, 실행할 프로세는 많기 떄문에, 당장 필요한 부분만 골라서 물리적 메모리에 올려놓고, 그렇지 않는 부분은 Swap Area에 내려놓습니다.
커널 주소 공간
커널도 마찬가지로 code, data, stack으로 나뉩니다. code에는 시스템콜, 인터럽트 처리 코드 등이 담겨있습니다. 흥미로운 부분은 실행되는 프로세스마다 하나씩 PCB(Process Controll Block을 만들어서, 프로세스 운영에 대한 정보를 저장합니다. CPU가 시분할 방식으로 운영되고, CPU는 한순간에 하나의 작업만 할 수 있다보니, 이 프로세스 조금 저 프로세스 조금씩 실행하게됩니다. 때문에, 어떤 프로세스를 다시 실행할 때, 이전에 어디까지 실행했었고 어떤 상태였는지 기억을 하고 있어야하는데요. 이 정보들을 저장해 놓는 곳이 PCB입니다. 이곳에는 프로세스 고유번호(PID), 상태, PC(Program Pointer: 어디까지 실행했는지 기록) 등이 저장됩니다. 또한 커널의 stack에도 프로세스마다 스택이 나뉘어 있습니다.