운영체제: 유저모드, 커널모드, 시스템콜
운영체제를 통해 안정적이고, 효율적인 동작을 하기 위해서는 사용자 또는 응용프로그램이 직접 하드웨어에 접근하는 것을 막아야한다. 운영체제 내부에서는 컴퓨터가 CPU를 어떻게 사용하느냐에 따라 2가지 방식으로 컴퓨터를 제어한다. 하나는 CPU의 명령어를 마음대로 설정할 수 없게끔 만들어 놓은 모드가 있다. 이걸 유저 모드라고 한다. CPU를 직접 컨트롤 할 수 있는 커널 모드이다.
- 유저모드(User Mode): 사용자와 데이터를 왔다갔다할 수 있는 등의 작업을 한다. 은행원이 데스크에서 고객과 상담하는 것과 비슷하다.
- 커널모드(Kernel Mode): 운영체제 내부에서 실제로 하드웨어를 제어할 수 있다. 은행원이 뒤에서 작업을 하는 것과 비슷하다.
이렇게 두가지 모드가 있는데, 요청에 따라서 모드가 왔다갔다 한다. 이 요청은 시스템 콜(System Call)을 통해서 전환이 된다. 예를 들어 평소에 운영체제가 유저모드라면, 사용자가 입력을 하면 유저모드에서 시스템 콜이 호출이 되면서 커널모드로 바뀌어서 내부에서 들어온 요청을 가지고 거기에 맞는 작업을 하고 다시 유저모드로 돌아오는 컨셉이다. 평소에는 유저모드로 대기하고 있다. (아래 그림 참조.)
카카오톡 같은 프로그램을 사용할 때, 여러가지 명령을 수행을 하게 된다. 위 그림을 예로들면, Job1(카카오톡) 프로그램이 실행되면서 명령을 요청했다(2번상태). 2번상태로 내려가면, 시스템 콜을 부른다. 그러면 밑에 커널모드에서 컴퓨터가 exception handler를 통해 수행을 한다. 그리고 4번 모드로 돌아온다.
그러면서 Job1(카카오톡)이 waiting 상태가 되고, Job2(다른 프로그램)가 running 상태가 된다. 예를들어, Job1인 카카오톡이 실행중이었는데, Job2라는 크롬 프로그램이 뭔가를 하려고 기다리고 있었다고 가정해보자.(1번상태) 카카오톡이 작업을 수행하고 있는데, 크롬이 본인도 작업을 해야한다고 하면서 시스템콜 요청을 보낸다. 그게 getc라고 하는 시스템 콜이다. 시스템 콜이 운영체제로 가면, Job2가 뭔갈 하고 싶데 카카오톡 너 잠깐만 있어봐 크롬이랑 뭐좀 하고 올게 하고, 3번으로 내려가서 그 작업을 수행한다음 크롬을 킨다. 정확하게는 크롬이 일할 수 있는 환경을 만들어준다.
일을 할 수 있는 환경을 만들어 준다는 것은 무슨 뜻일까?
컴퓨터의 메인 메모리 안에 코드와 데이터가 올라와있다. 그걸 접근할 수 있는건 CPU밖에 없다. 그러다보니 CPU가 일을 하려면, 어떤 코드, 어떤 데이터를 메인 메모리에서 가져다 쓰느냐를 매번 결정해야하는데, 그걸 운영체제가 커널모드에서 관리를 한다. 유저모드에서 어플리케이션들이 작업을 하고 싶다고 요청을 보내면, 운영체제가 커널모드에서 CPU한테 작업을 수행하라고 명령을 한다. 그러면 CPU가 하던 일을 멈추고, Job2가 요청한걸 수행하게 된다. 즉, Job1을 멈추고, Job2가 수행된다.
그런데, 갑자기 키보드가 입력이 되면 어떻게 될까?
사용자가 키보드를 누른다는 건 가장 먼저 처리해야하는 굉장히 중요한 작업이다. 어떤 프로그램이 켜져있든 사용자 입력을 먼저 처리해야해서 키보드가 작동되면, 키보드 인터럽트라는 시스템 콜이 호출 된다. 키보드를 누르는 순간 유저모드에서 키보드를 담당하는 프로그램이 운영체제한테 키보드 인터럽트를 날려서 그때까지 하던일을 다 멈추고, 키보드에 대한 처리를 하게 된다.
이러한 작업들이 컴퓨터 내부에서 계속해서 일어나고 있는 것이다. 컴퓨터가 돌아가는 걸 보면, 동시에 굉장히 여러가지를 처리하고 있다. 카카오톡을 키고, 크롬도 켜져있고, 줌도 켜져있고 등등. 많은 프로그램들이 동시에 올라와있고, 컴퓨터가 동시에 이걸 다 처리해야하는데, 이와중에 키보드까지 처리하려고 하면 어떻게 처리를 하는 걸까? 궁금할 것이다. 이 부분을 이해하는게 운영체제에서 중요하게 다뤄야할 부분이다.
많은 프로그램을 동시에 실행할 수 있는 이유
프로그램이 실행되려면, CPU와 메모리 사이에서 작업을 처리하는 소통이 필요하다고 했다. 이러한 처리를 하는 프로그램이 운영체제에 올라와있다. 멀티코어 환경에서는 다른 코어에게 다른 시스템 콜을 서로 처리할 수 있다. 즉, 동시에 병렬적으로 처리할 수 있다. 운영체제가 멀티코어 환경일 때는 코어마다 시스템 콜이 다르게 호출 가능하다. (프로세스 스케줄링과 멀티스레팅 프로세싱을 배우면 어떤 느낌인지 알 수 있음.)
이러한 여러 작업들이 동시에 이루어지게 보이는 핵심적인 이유는 굉장히 빠르게 처리되기 때문이다. 멀티코어여서 동시에 처리가 가능한 것도 가능하지만, 그래봤자 코어가 4개 8개 밖에 없다. 우리 컴퓨터는 켜지는 프로그램이 정말 많다. 윈도우면, Ctrl + Alt + delete 눌러보면 Process Tab이 있는데 거기에 프로그램이 몇백개가 켜져있다. 아무리 코어가 많아도 동시에 굉장히 많은 프로그램이 돌고 있기 때문에 결국 컴퓨터가 굉장히 빠른 속도로 내부적으로 처리해야하는 것이다. 그래서 동시에 처리하는 것처럼 보인다. 컴퓨터의 CPU는 1초에 32억번 클럭이 가능해서(이론상) 그만큼 빠르기 때문이다. 실제로 무거운 프로그램을 동시에 돌리면, 굉장히 느려진다.
시스템콜(System calls)
위에서 유저모드, 커널모드, 시스템 콜에 대해서 알아보았다. 이제 시스템 콜이 어떤식으로 동작하는 건지 동작원리를 알아보자.
시스템 콜은 운영체제가 컴퓨터 하드웨어를 다루기 위해 입출력, 메모리할당, 프로세스의 생성 등을 수행하는 코드의 집합이다. 사용되는 컴퓨터(CPU architecture)와 OS에 따라서 다양하게 구현되어 있다. 똑같은 맥이라도 인텔이냐, M1 이냐에 따라 시스템 콜이 다르다. 또한, 조립형 컴퓨터를 맞춰서 하드웨어가 같더라도, 윈도우11을 설치하는거랑 우분트를 설치하는거랑은 다르다. 똑같은 하드웨어를 다르게 제어하게 된다. 그런 OS에 따라서도 시스템 콜이 다르게 구현되어있다. 똑같은 카카오톡 프로그램을 버전별로 다시 깔아야하는 이유이다.
시스템 콜의 유형
시스템 콜의 유형에는 총 5가지가 있다.
- Process Control: 작업, 일이라고 생각하면 된다. 프로세스라는게 컴퓨터가 일을 하는 단위. 어떤 걸 시작하고, 어떤 걸 멈추고 할지를 정해주는 것.
- File Management: 한컴을 통해 문서작업을 하면, 다운로드 받는거, 저장하는거, 삭제하는 것 등.
- Device Management: 컴퓨터에 달려있는 디바이스들.(연결되어있는 모든 I/O 디바이스)이걸 운영체제에서 시스템 콜 형태로 관리함.
- Information Maintenance: 지금 컴퓨터가 사용하고 있는 여러가지 정보들. 지금 현재 컴퓨터에서 작동하고 있는 모든 정보. 컴퓨터 시간 등. 컴퓨터가 나타내는 상태들을 관리할 수 있음.
- Communications (between computer and computer): 주로, 네트워크 생각하면됨. 컴퓨터가 다른 컴퓨터랑 소통하는 것.(네트워크란 결국 다른 컴퓨터랑 소통하는 것) 컴퓨터끼리 소통할때 커뮤니케이션을 함. 시스템콜이 역시 이것을 관리함. 블루투스, 와이파이 등도 커뮤니케이션. 공유기도 다른 개념의 컴퓨터임. 맥OS로 아이폰에 에어드랍을 하면 이것도 커뮤니케이션.
여기까지 운영체제의 유저모드, 커널모드, 그리고 시스템 콜에 대해서 알아보았다. 다음 파트에서는 운영체제의 종류에 대해 알아보겠다.
'Computer Science > 컴퓨터공학(김용담 강사님)' 카테고리의 다른 글
프로세스 상태 전이도(feat. 프로세스 vs 프로그램 용어 차이) (0) | 2023.04.24 |
---|---|
운영체제 종류: 유닉스, 윈도우, 맥OS, 리눅스 (0) | 2023.04.22 |
운영체제(OS)란? 개념과 구조(커널, 시스템콜 등) (0) | 2023.04.18 |
CPU란? 구조와 역할, 구성요소, 성능향상 방법 (0) | 2023.04.14 |
정수(signed, unsigned)와 부동 소수점 표현 in 컴퓨터 (0) | 2023.04.12 |
댓글