티스토리 뷰
컴퓨터는 하드웨어로 이루어져있지만 전기 공급만으로 알아서 작동하는 마법의 상자가 아니다.
우리가 프로그램을 작동하기위해서는 하드웨어를 통해 소프트웨어를 작동시켜야하는데
이 연결지점이 되는 것이 운영체제다.
그렇다면 운영체제는 무엇을 하는가?
운영체제는 프로그램의 실행에 필요한 요소들을 가리키는 자원(CPU, 메모리, 보조기억장치, 입출력장치 etc..)들을
할당하고 프로그램이 올바르게 실행되도록 제어하는 특별한 프로그램이다.
운영체제가 프로그램?
운영체제는 인터넷 브라우저와 같은 프로그램으로써 다른 여타 프로그램들과 같이 메모리에 적재되어야한다.
그러나 운영체제는 특.별.한 프로그램이기때문에 메모리상에서 커널 영역이라는 공간에 컴퓨터 부팅 시 따로 적재되어 실행된다.
메모리 안에 커널 영역은 무슨소리야?
메모리는 커널 영역과 사용자 영역으로 나누어져 있는데, 운영체제가 사용하고있는 커널 영역 이외의 메모리 영역을 사용자영역이라고 한다. 해당 사용자 영역은 사용자가 이용하는 응용 프로그램이 적재되는 영역이다.
이러한 메모리에 여러 프로그램이 적재되어 실행되게 되며 운영체제는 어디 메모리 주소에 응용프로그램을 적재할 지, 어떤 프로그램에 CPU를 할당할 지, 사용중인 프로그램이있다면 사용하는 동안 다른 프로그램에서 자원을 빼앗아 가지 못하도록 하는 등 커맨드센터와 같은 역할을 한다.
이러한 역할은 응용프로그램이 필요한 자원을 잘 할당받고 올바르게 실행되도록 하게 도와준다.
이러한 운영체제를 굳이 우리가 알아야하는 이유는 뭘까?
매우 중요한 질문이다.
CS를 공부하며 굳이? 라는 생각이 들면서 학습하게되면 단지 읽을 뿐 이해와 암기에 효율이 줄어든다. 그렇기에 짚고 가자.
개발자 입장에서 운영체제가 없다면 하드웨어를 조작하는 코드를 모두 개발자가 직접 작성을 해야한다.
그러나 운영체제가 이러한 조작을 대체해주며 우리는 추상화된 상위 영역에서 프로그래밍을 할 수 있게 해준다.
추상화되어 우리를 잘 도와주고 있다면 우리는 단지 위에서 잘 다루면 되는것이 아닌가?
결론부터 말하자면 아니다. 운영체제는 하드웨어가 아닌 프로그램이기 때문에 우리와 대화가 가능하며, 현재 하드웨어의 상태, 코드 실행의 결과, 어떤 문제가 발생했는지 등 문제해결의 실마리를 찾는데 큰 역할을 하기에 우리는 알아야한다.
코딩을 하는데 있어서 자주 만나는 오류 메시지 또한 대다수의 오류 메시지의 근원은 운영체제며 해당 문제를 해결하기 위해서 메시지를 이해하고 파악할 수 있는 능력을 갖기위해서는 운영체제의 앎이 불가결이다.
이제 알겠다면 운영체제에 대해 살펴보도록 하자.
험난한 길이 될거다.
그러나!!
우리는 이겨낼 것이다. 개블즈늬끄...!
운영체제의 심장, 커널에 대해 알아보자
커널이란?
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나로, 실제 리눅스(다양한 운영체제 중 하나)의 경우 천만 줄이 넘은 코드를 갖고있다. 이렇게 큰 프로그램에서도 중요한 기능을 제공하는 영역이 있는데 예시로 우리의 휴대폰을 보면 인터넷과 카카오톡이 가장 주를 이루는 기능이 아닌가? 마찬가지로 운영체제의 중요 기능을 담당하는 부분을 커널이라고 칭한다.
+ 대부분의 전공책에서 말해주는 운영체제 설명은 해당 커널을 설명한다.
커널에 포함되지 않는 서비스로는
사용자 인터페이스 / 윈도우 바탕화면처럼 사용자가 상호작용할 수 있는 인터페이스(그래픽 유저 인터페이스 , 커맨드 라인 인터페이스 등)가 있다.
만약 응용프로그램이 자체적으로 자원에 접근하게 될 수 있다면,,, 각자 자기가 먼저쓰고 자원을 뺏아쓰고 난리가 날 것이다.
그렇기에 운영체제는 질서된 관리를 위해 오직 자신을 통해서만 자원에 접근할 수 있도록 자원을 보호한다.
응요프로그램은 자원을 사용할 필요가 있을시, 운영체제에게 도움을 요청함으로써 작업을 수행하게되는 과정을 거치게 되는 것이다.
이중모드( 사용자 모드, 커널 모드)란?
운영체제가 문지기 마냥,
자원을 사용하기위해 관리하게될 때 이중 모드(dual mode)로 CPU가 명령어를 실행하는 모드를 나누게 된다.
해당 이중 모드는 사용자 모드와 커널 모드로 나눠지는데
사용자 모드의 경우, 커널 영역의 코드를 실행할 수 없는 모드로 일반적인 응용프로그램은 기본적으로 사용자모드로 실행된다. 그렇지 않으면 위에 설명한 바와 같이 무질서해질 수 있기 때문에 위험하다.
사용자 모드로 실행 중인 CPU는 하드웨어 자원에 접근하는 명령어를 실행할 수 없음으로 자원에 접근할 수 없게 된다.
커널 모드의 경우, 커널 영역의 코드를 실행할 수 있는 모드로 CPU가 하드웨어 자원에 접근하는 명령어를 실행할 수 있다.
이러한 두가지 모드를 통해 사용자모드로 실행되는 프로그램이 자원에 접근하기 위해서는, 운영체제에게 요청을 보내 커널 모드로 전환되어야한다. 해당 요청을 시스템 호출(System call)이라고 하며 해당 요청을 받은 운영체제는 커널 모드로 전환시켜준다.
시스템 콜( System Call)이란?
일종의 인터럽트(끼어듦)로 시스템콜이 발생하면 CPU는 지금까지의 작업을 백업(일단 저장)하고 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)을 실행한 뒤에 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해나간다.
하드디스크에 데이터를 저장하는 시스템 콜을 발생시켜 커널 모드로 전환하고
운영체제 내의 저장 코드를 실행함으로써 하드디스크에 접근한 뒤
하드 디스크 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속해 나간다.
일반적인 응용프로그램은 실행과정에서 이러한 동작을 매우 빈번하게 사용한다.
위에서 운영체제의 주요 서비스를 담은 영역을 커널이라고 하였다.
이제는 운영체제가 제공하는 중요 서비스들에 대해 간략하게 알아보자 (큰 그림을 그려보자)
운영체제의 핵심 서비스 ?
운영체제의 핵심 서비스는 프로세스 관리, 자원 접근 및 할당, 파일 시스템관리 세가지로 나눠질 수 있다.
1. 프로세스 관리
- 실행 중인 프로그램을 프로세스 라고하며, 일반적으로 우리가 응답없음을 표시하고 있는 인터넷 브라우저를 끌 때 사용하는 작업관리자를 열면 다양한 프로그램들이 실행중임을 확인할 수 있다. 해당 프로세스들은 메모리안에서 실행중이다.
CPU는 한 번에 하나의 프로세스만을 실행 할 수 있기 때문에 CPU는 해당 프로세스들을 번갈아 가며 실행한다.
마치 손을 빨리 움직여 잔상으로 손이 두개로 보이듯이 움직이는 것과 비슷하게 실제 사용자에게는 다양한 프로세스들이 동시에 실행되어 있는 것 처럼 보이게 한다.
2. 자원 접근 및 할당
-모든 프로세스는 실행을 위해 자원을 필요로 하는데 운영체제에서 이전에 말한 바와 같이 문지기 역할로 자원을 할당해주며 CPU, 메모리, 입출력장치에 대해 다양하게 관리한다.
CPU의 경우
하나의 CPU는 하나의 프로세스만을 실행할 수 밖에 없기에 다양한 프로세스들을 조금씩 실행시키지만 빠르게 움직임으로 사용자에게는 동시성을 제공한다. 그러나 어떤 프로세스부터 CPU를 이용하게 할 것인지 , 얼마나 오래동안사용하게 할 것인지 에 대한 결정이 필요한데 이러한 결정을 CPU 스케쥴링이라고 한다.
메모리의 경우
메모리에 적재된 프로세스들은 적재 주소도 다양하며 같은 프로세스더라도 실행 할 때마다 주소가 달라질 수 도 있다.
그렇기에 운영체제는 주소를 잘 할당해야하며, 메모리가 효율적으로 적재되도록 공간을 마련해야하고 부족하면 어떻게 극복해야하는지도 관리해야한다.
입출력장치의 경우
인터럽트 서비스 루틴의 실행을 통해 운영체제는 입출력작업을 수행한다.
3. 파일 시스템 관리
- 프로세스를 실행하면서 여러 파일을 읽고 생성하며 삭제하는 작업은 파일들을 디렉터리(폴더)로 관리하며
운영체재의 파일시스템에 따라 파일과 디렉터리를 관리하게 된다.
그림참고)
https://data-flair.training/blogs/system-call-in-os/
'Operating System' 카테고리의 다른 글
6. Deadlock (0) | 2023.01.19 |
---|---|
5. Process Synchronization (0) | 2023.01.19 |
4. CPU Scheduling (0) | 2023.01.19 |
3. Thread (0) | 2023.01.16 |
2. Process (0) | 2023.01.15 |