컴퓨터 구조 & 운영체제/운영체제

[운영체제] 운영체제의 큰 그림

ReBugs 2023. 6. 24.

이 글은 혼자 공부하는 컴퓨터 구조 + 운영체제 (저자 : 강민철)의 책과 유튜브 영상을 참고하여 개인적으로 정리하는 글임을 알립니다.


운영체제의 심장, 커널

운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다. 대표적인 운영체제인 리눅스를 구성하는 소스 코드는 천만 줄이 넘는다.

 

또한 세상에는 다양한 운영체제가 있다. 그래서 운영체제가 응용 프로그램에 제공하는 기능들, 달리 말해 운영체제 서비스 또한 매우 다양하다.

 

스마트폰이 사용자에게 제공하는 서비스 종류는 다양하지만, 그중에서도 전화, 문자, 인터넷 기능처럼 가장 핵심적인 서비스가 있다.

마찬가지로 운영체제가 응용 프로그램에 제공하는 서비스 종류는 다양하지만, 그중에서도 가장 핵심적인 서비스들이 있다. 이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel)이라고 한다.

 

커널은 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능이 포함되어 있다.

운영체제 범주에는 속하지만 커널이 아닌 영역
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스는 대표적으로 사용자 인터페이스(UI:User Interface)가 있다.
운영체제가 제공하는 UI의 종류에는 그래픽 유저 인터페이스(GUI:Graphical User Interface)와 커맨드 라인 인터페이스(CLI:Command Line Interface)등이 있다.

 


 

이중 모드와 시스템 호출

이중 모드

만약 운영체제의 개입 없이, 응용 프로그램이 마음대로 CPU, 메모리, 하드디스크등의 자원을 쓴다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있다.

그래서 운영체제는 응용 프로그램들이 자원에 접근하려고 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.

따라서 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 도움을 요청해야 한다.

'운영체제에 도움을 요청한다'는 말은 '운영체제 코드를 실행하려고 한다'는 말과 같다.

응용 프로그램의 요청을 받은 운영체제는 응용 프로그램 대신 자원에 접근하여 요청한 작업을 수행한다.

 

예를 들어 응용 프로그램이 실행 과정에서 하드 디스크에 접근하여 데이터를 저장하려면 운영체제에 도움을 요청해야 하고 , 운영체제는 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행한다.

이러한 운영체제의 응용 프로그램 대행은 이중 모드로써 구현된다.

이중 모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식이다.

CPU는 명령어를 사용자 모드와 커널 모드로써 실행할 수 있다.

 

사용자 모드

  • 운영체제 서비스를 제공받을 수 없는 실행 모드
  • 커널 영역의 코드를 실행할 수 없는 실행 모드
  • 자원 접근 불가

일반적인 응용 프로그램은 기본적으로 사용자 모드로 실행된다. 사용자 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다.

 

커널 모드

  • 운영체제의 서비스를 제공받을 수 있는 실행 모드
  • 자원 접근을 비롯한 모든 명령어 실행 가능

CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다. 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있다.

슈퍼바이저 플래그

CPU가 사용자 모드로 실행 중인지, 커널 모드로 실행 중인지는 플래그 레지스터 속 슈퍼바이저 플래그를 보면 알 수 있다.

 


 

시스템 호출

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다.

이때 운영체제 서비스를 제공받기 위한 요청을 시스템 호출(system call)이라고 한다.

사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다.

시스템 호출은 일종의 인터럽트이다. 정확히는 소프트웨어적인 인터럽트이다.

소프트웨어 인터럽트는 특정 명령어에 의해 발생되는 인터럽트를 말한다.

 

시스템 호출의 작동 순서는 아래와 같다.

 

일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 이용한다.

그 과정에서 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다.

 


 

운영체제의 핵심 서비스

프로세스 관리

실행 중인 프로그램을 프로세스라고 한다. 우리가 컴퓨터를 사용하는 동안 메모리 안에서는 새로운 프로세스들이 생성되고, 사용되지 않는 프로세스는 메모리에서 삭제된다.

일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기에 CPU는 이 프로세스들을 조금씩 번갈아 가며 실행한다.

즉, CPU는 한 프로세스를 실행하다가 다른 프로세스로 실행을 전환하고, 그 프로세스를 실행하다가 또 다른 프로세스로 실행을 전환하는 것을 매우 빠른 속도로 반복한다.

 

이때 각 프로세스는 상태, 사용하고자 하는 자원 등이 다양하다

이러한 다양한 프로세스를 가장 효율적으로 관리하는 것과 추가적으로 여러 프로세스가 동시에 실행되는 환경에서는 프로세스 동기화가 필수적이고, 프로세스가 아무것도 못하고 더 이상 실행되지 못하는 상황인 교착 상태를 해결해야 한다.

이렇게 다양한 일들을 처리하는 것이 운영체제의 역할이다.

 


 

자원 접근 및 할당

모든 프로세스는 실행을 위해 자원을 필요로 한다.

운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해 준다.

 

CPU

일반적으로 메모리에는 여러 프로세스가 적재되고, 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있다. 

이에 운영체제는 프로세스들에 효율적으로 CPU를 할당하기 위해 어떤 프로세스부터 CPU를 이용하게 할 것인지, 얼마나 오래 CPU를 이용하게 할지를 결정한다. 이를 CPU스케줄링이라고 한다.

CPU 스케줄링을 관리하는 것 또한 운영체제의 역할이다.

 

메모리

메모리에 적재된 프로세스들은 크기도, 적재되는 주소도 가지각색이다. 같은 프로세스라고 할지라도 실행할 때마다 적재되는 주소는 달라진다. 그래서 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할지를 결정한다.

때로는 메모리가 이미 꽉 차 있어 꼭 실행해야 할 프로세스를 적재할 공간이 없는 경우도 있고, 메모리에 공간이 남았는 데도 불구하고 프로세스를 적재하지 못하는 상황도 발생한다.

이런 여러 가지 문제점을 가장 효율적으로 해결하는 것이 운영체제의 역할이다.

 

입출력장치

인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 있다. 입출력장치가 발생시키는 하드웨어 인터럽트도 마찬가지이다. 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤 커널 영역에 있는 인터럽트 서비스 루틴을 실행한다. 이처럼 운영체제는 인터럽트를 처리하는 프로그램, 즉 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.


파일 시스템 관리

우리가 컴퓨터를 사용할 때 여러 파일을 열고, 생성하고, 삭제한다.

파일들을 한 곳에 묶어 디렉터리(폴더)로 관리한다. 당연해 보이는 이런 파일 시스템도 운영체제가 지원하는 핵심 서비스이다.

댓글