어떻게 시스템 콜: 프로그램이 운영체제에 부탁하는 공식 창구
지난 레슨 끝에서 묘한 빈틈을 하나 보았다. 운영체제가 파일마다 권한을 정해 두는데도 내 프로그램은 읽기가 허락된 파일조차 디스크에서 직접 꺼내 오지 못한다는 것이다. 사실 프로그램은 디스크도 화면도 네트워크도 마음대로 건드리지 못하고 단단한 울타리 안에 갇혀 있어요. 그렇다면 프로그램은 어떻게 파일을 열고 화면에 글자를 띄울까?
프로그램은 울타리 안에 갇혀 있다 (사용자 모드)
앞에서 운영체제는 프로그램끼리 서로의 메모리를 침범하지 못하게 벽을 세웠다. 같은 벽이 하드웨어 앞에도 서 있다. 보통 프로그램은 디스크에 직접 손을 뻗지도, 화면에 직접 점을 찍지도, 네트워크 장치를 직접 만지지도 못한다.
이렇게 울타리 안에 갇힌 상태를 사용자 모드라고 불러요.
답답해 보이지만 까닭이 있다. 아무 프로그램이나 하드웨어를 직접 주무를 수 있다면 실수투성이 프로그램이나 나쁜 마음을 먹은 프로그램 하나가 컴퓨터 전체를 망가뜨릴 수 있기 때문이다.
버튼을 누르면 프로그램이 디스크에 직접 손을 뻗는다. 가운데 벽이 빨갛게 변하며 막히는데, 사용자 모드의 프로그램은 하드웨어를 직접 만질 수 없어요.
직접 손을 뻗으면 번번이 막힌다. 안전을 생각하면 당연한 일이다.
그런데 이상하다. 우리가 매일 쓰는 프로그램은 멀쩡히 파일을 열고 사진을 보여 주고 인터넷에 접속한다. 울타리에 갇혀 있다면서 그 일들은 어떻게 해내는 걸까?
비밀은 직접 하지 않고 부탁하는 데 있어요.
해결: 공식 창구에 부탁하기 (시스템 콜)
은행에 가면 우리는 금고에 직접 들어가지 않는다. 창구에 요청서를 내밀면 열쇠를 가진 직원이 대신 처리해 준다.
프로그램도 똑같다. 디스크를 직접 열 수 없으니 운영체제의 창구에 가서 '이 파일을 열어 줘', '이 글자를 화면에 띄워 줘', '이걸 인터넷으로 보내 줘' 하고 부탁한다. 운영체제에 내미는 이런 요청 하나하나를 시스템 콜이라고 불러요.
핵심은 프로그램이 일을 직접 하지 않고 운영체제에게 시킨다는 점이다. 하드웨어를 만질 권한은 운영체제에게만 있기 때문이다.
버튼을 누르면 프로그램(금색)이 운영체제 창구(파랑)에 '파일 열기'를 부탁하고, 운영체제가 디스크에서 대신 일을 처리해 결과를 돌려준다(초록). 프로그램은 디스크에 한 번도 직접 닿지 않아요.
창구에 부탁하니 안 되던 일이 되었다. 프로그램은 여전히 울타리 안에 있지만 운영체제라는 대리인을 통해 바깥일을 해낸 것이다.
그런데 한 가지가 묘하다. 같은 디스크인데 프로그램이 만지면 막히고 운영체제가 만지면 되는 까닭은 무엇일까?
창구를 넘는 그 짧은 순간에 무언가가 바뀌는 게 분명해요.
창구를 넘으면 권한이 바뀐다 (사용자 모드 ↔ 커널 모드)
비밀은 CPU에 모드가 두 가지 있다는 데 있다. 하나는 우리 프로그램이 사는, 힘이 제한된 사용자 모드다. 다른 하나는 하드웨어든 무엇이든 다 만질 수 있는 운영체제의 커널 모드예요.
프로그램은 평소 사용자 모드로 달린다. 그러다 시스템 콜로 창구를 넘는 순간 CPU가 잠깐 커널 모드로 바뀐다. 운영체제는 그 강한 권한으로 부탁받은 일을 처리하고, 끝나면 곧바로 사용자 모드로 돌아와 프로그램에 결과를 건넨다.
강한 힘은 요청을 처리하는 그 순간에만, 그것도 이 창구를 통해서만 주어졌다가 곧 거둬들여져요.
버튼을 한 번 누르면 시스템 콜이 창구를 넘어 커널 모드(파랑)에서 운영체제가 일을 처리한다. 한 번 더 누르면 사용자 모드(금색)로 돌아와 결과를 받아요.
모드가 잠깐 바뀌었다가 다시 돌아오는 이 짧은 왕복이 운영체제 안전의 핵심이다. 강한 힘은 늘 켜져 있지 않고 부탁이 들어온 순간에만 잠깐 켜졌다 꺼진다.
그런데 의문이 하나 남는다. 창구를 넘기만 하면 운영체제가 시키는 대로 다 해 준다면, 프로그램이 하드웨어를 직접 만지는 것과 결국 무엇이 다를까?
그래서 창구에는 할 일이 하나 더 있어요. 바로 검사다.
창구가 하나라서 검사할 수 있다 (권한 확인)
운영체제가 부탁을 받자마자 묻지도 따지지도 않고 다 해 준다면 창구는 그냥 지나가는 길목일 뿐이다. 하지만 운영체제는 그렇게 하지 않는다.
모든 요청이 반드시 이 창구 하나를 지나니, 운영체제는 일을 처리하기 전에 먼저 검사할 수 있다. '이 파일을 읽을 권한이 있는가?' 지난 레슨에서 본 권한 확인이 바로 여기서 일어나요.
권한이 있으면 처리하고, 없으면 거절하고 오류를 돌려준다. 좁은 창구 하나가 위험한 행동이 모두 거쳐 가야 하는 검문소가 되는 셈이다.
요청 세 개 가운데 하나를 골라 창구에 낸다. 운영체제가 권한을 검사해 내 파일 읽기와 화면 출력은 처리하고(초록), 친구 파일 쓰기는 거절하고 오류를 돌려줘요(빨강).
허락된 요청은 통과했고 금지된 요청은 문 앞에서 막혔다. 창구가 좁다는 것은 불편이 아니라 오히려 안전장치였다.
위험한 행동이 모두 한곳을 지나니 그 한곳에서만 규칙을 지키면 되기 때문이에요.
이제 사용자 모드의 울타리, 부탁인 시스템 콜, 잠깐 바뀌는 커널 모드, 창구의 검사를 한 줄로 꿸 차례다.
정리: 한 줄로 꿴 왕복, 그리고 창구 뒤의 커널
전체를 한 줄로 보면 이렇다. 프로그램은 하드웨어를 직접 만지지 못하는 사용자 모드 울타리 안에서 달린다. 무언가 필요하면 시스템 콜로 공식 창구에 부탁한다.
창구를 넘는 순간 CPU가 잠깐 커널 모드로 바뀌고, 운영체제는 먼저 권한을 검사한 뒤 일을 처리한다. 끝나면 사용자 모드로 돌아와 결과를 건네요.
그러니 시스템 콜은 프로그램과 운영체제의 힘을 잇는, 잘 지켜지는 단 하나의 문이다. 파일을 열 때도, 화면에 점 하나를 찍을 때도, 인터넷으로 무언가를 보낼 때도 모든 일이 조용히 이 문을 지나간다.
다섯 단계를 차례로 누르면 프로그램, 시스템 콜, 커널 모드와 권한 검사, 일 처리, 결과 반환으로 이어지는 왕복 한 바퀴에 불이 켜진다. 다섯 칸이 모두 켜지면 한 바퀴가 끝나요.
그렇다면 창구 뒤에서 커널 모드의 강한 힘으로 실제 일을 처리하는 것은 누구일까? 운영체제의 가장 깊은 중심에서 모든 권한을 쥐고 하드웨어와 직접 이야기하는 부분에는 이름이 있다. 바로 커널이다. 시스템 콜은 결국 이 커널에게 보내는 부탁이었어요.
다음 레슨에서는 드디어 커널을 정면으로 만난다. 지금까지 본 일정 관리, 메모리, 파일, 권한, 창구가 모두 누구 손에서 돌아가고 있었는지 한자리에서 보게 될 거예요.