본문 바로가기
CS 이론/운영체제

운영체제 2부<구조>

by Suff07 2024. 1. 11.

 

 

목차

    1. 커널과 인터페이스

    운영체제를 이야기하면서 커널이란 개념을 빼놓고 이야기할 수 없습니다.

    커널이란 프로세스 관리,메모리 관리, 저장장치 관리와 같은 운영체제의 핵심 기능을 담당하는 것입니다.

    자동차로 따지면 엔진과 같다고 이해하면 됩니다.

     

    인터페이스는 커널과 사용자 사이에 매개체와 같은 역할을 합니다.

    즉 자동차의 엔진의 움직임을 관측 할 수 있는 계기판이라던가 핸들 브레이크 등으로 제어를 하지요.

    이러한 요소들이 인터페이스라 이해하면 됩니다.

     

     

     

    위의 개념을 옆의 그림으로 도식화하면 다음과 같습니다.

     

    대표적인 인터페이스로는 UNIX에서 셸이 있습니다.

    <Bash라던가 Cshell Tshell등이 존재합니다.>

     

     

     

     

    이것들이 전부 인터페이스입니다! ㅎㅎ

     

     

    당연하지만 인터페이스를 어떻게 변경시키느냐에 따라서 완전히 다른 느낌의 OS를 만들어 낼 수도 있습니다.

     

     


    2. 시스템 호출과 드라이버

    2-1. 시스템 호출<System call>

    시스템 호출이란 커널이 자신을 보호하기 위해 만든 인터페이스입니다.

    즉, 사용자가 자원에 직접 접근하는것을 방지하기 위해 만들어진 API입니다.

     

    ※ API VS SDK

    API란 개념을 이제 한번 제대로 알아봅시다!

    API란 응용프로그램이 자신을 만들기 위해서 시스템 프로그램 상에서 존재하는 인터페이스입니다.

    C언어에서 \(\texttt{printf("Hello world")}\) 나 파이썬에서 \(\texttt{print("Hello python")}\) 과 같은 최초의 프로그래밍을 해본 경험이 다들 있을겁니다.

    \(\texttt{printf()}\) 라는 함수 자체가 시스템 호출의 일종으로써 API입니다.

    즉, Hello World 라는 문자를 표시해 달라고 먼저 printf의 함수에 입력값으로 넣게 되고 printf가 OS에게 이에 해당하는 동작을 하도록 요청한다 이말입니다!

    SDK는 API와 프로그램 개발에 사용되는 툴들을 일괄적으로 제공하는 만능 공구상자와 같은 느낌입니다.


     

     

    다시 시스템 호출로 돌아가서 이야기를 계속 해보겠습니다.

    쉽게 생각해보면 시스템 호출은 카페에서의 점원과 같습니다.

     

     

    먼저 시스템 호출 즉, 점원 없이 내가 직접 커피를 내려먹는다 생각해봅시다.

     

    내가 커피를 내려먹는 숙련도가 높은 고수라면 아무 문제가 없을겁니다.

     

    하지만 내가 초보자라면 커피의 향을 모른채 아무 커피가루나 쓴다던가, 물의 온도를 제대로 정하지 못해서 쓴맛이 너무 난다던가 혹은 도구를 사용하는 도중에 도구에 문제가 발생하면 적절한 조치를 취할 수 없게 될겁니다.

     

    이렇듯 사용자가 숙련된 사용자가 아니라면 컴퓨터 자원을 활용하는데 있어서 애로사항이 꽃피게 될겁니다 ㅠㅠ

     

    출처 :https://univ20.com/73508

     

    그러면 이제는 점원, 즉 시스템 호출이 있다고 생각해봅시다.

     

    우리들은 그냥 점원에게 "더치 커피 한잔만 주세요" 라고 하면 점원은 "네 알겠습니다 조금만 기다려 주세요"하고 알아서 커피를 내옵니다.

     

    그러니까 우리가 미숙한 사용자라 할지라도 점원인 시스템 콜에게 이거 해줘라고 말만 하면 알아서 자원에 접근해서 자원을 사용하게 해주겠다 이겁니다.

     


     

    그러면 시나리오를 통해서 한번 다시 이해를 해보도록 합시다.

     

    아래의 예제는 정말 간단한 프로그래밍이니 따로 설명은 안하겠습니다.

    #include <stdio.h>
    int main() {
        printf("Hello World!\n");
        return 0;
    }

     

     

     

     

     

    위의 코드를 시나리오로 설명하겠습니다.

     

    • User는 프로그래머, 즉 우리들입니다.
    • HCI<Human Computer Interface>는 응용프로그래밍에 접근하기 위한 인터페이스로써 VsCode같은 프로그램이라 이해하면 되겠습니다. VsCode나 IntelliJ,이클립스 같은 것을 생각해보면 이해가 빠릅니다.
    • 응용프로그램은 작성자가 작성한 프로그램을 의미합니다. 즉 위에 작성한 코드가 응용프로그램입니다.
    • API는 \(\texttt{(printf())}\) 와 같은 함수를 의미합니다. 즉 C 언어에서 표준 라이브러리 함수로, 사용자가 작성한 코드에서 출력을 담당합니다.
    • 시스템 프로그램은 표준 입출력 라이브러리에 속하며, 이 라이브러리는 사용자의 입력과 출력을 관리합니다. (위에서 # include stdio.h라는 코드가 보일텐데 이 헤더안에 \(\texttt{(printf())}\)라는 함수가 포함되어있습니다. 그리고 시스템 프로그램은 이 표준 입출력 라이브러리인 헤더를 의미합니다.)
    • OS Interface는 운영체제와 상호 작용하기 위해 시스템 콜을 사용합니다. 가령 ' \(\texttt{(write())}\) '와 같은 명령어를 사용할겁니다.아래의 예시를 통해서 보도록 하겠습니다.
    #include <unistd.h>
    
    int main() {
        const char* message = "Hello world\n";
        write(1, message, 12);  // 1은 표준 출력 파일 디스크립터, 12는 출력할 문자열의 길이
    
        return 0;
    }

    여기서 \(\texttt{(printf())}\) 부분이 시스템 콜입니다. 윈도우나 리눅스 운영체제에서 커널이 제공해주는 함수가 바로 시스템 콜인거죠!

    • 운영체제는 시스템 콜을 처리하고, 하드웨어 자원을 관리하며, 응용 프로그램이 원활하게 동작할 수 있도록 하는 운영체제입니다.

     

    2-2. 드라이버

    여러분들이 새로운 컴퓨터를 구매하게 되거나 포멧을 하게 된다면 드라이버를 새로 설치해야 하는 경우가 발생할겁니다.

    드라이버는 위의 그림에서 OS - HW 인터페이스 부분이 보일건데 그 부분이 바로 드라이버입니다.

     

    왜 이렇게 분리를 해놨냐면 하드웨어의 종류는 매우 다양합니다.

    마우스 컴퓨터만 해도 그 종류가 수천가지가 되지요.

    윈도우를 만든 MS에서 이 수천가지의 인터페이스를 전부 담당하고 개발하기는 매우 힘들겁니다.

    또한 수많은 하드웨어의 구성이라던가 원리를 MS에서 전부 알고 있을리는 만무하죠.

     

    그리하여 커널에서는 하드웨어에게 입출력 부분만을 담당하게 하고 OS-HW 인터페이스는 각각 하드웨어 제조사에게 맡겨서 개발을 하게 합니다.

     

     

    그러니까 시스템 호출하는 부분은 커널 영역 전부를 포함합니다.

    반면에, 드라이버는 커널의 기능을 일부 사용하거나 혹은 하드웨어 제작사가 제작한 드라이버를 통해서 간접적으로 연결이 되지요.


    3. 커널의 종류와 기능

    3-1. 커널의 기능

    앞서 이야기했듯이 커널은 운영체제의 심장과도 같습니다.

    자원을 관리하는것은 지난글에서도 설명했습니다.

    자원 관리는 크게 3가지로 나뉩니다.

     i.프로세스 관리 : CPU의 작업 관리로써 지난 글에서 설명한 멀티 태스킹에서 사용됩니다.

     ii.메모리 관리 : 프로세스 작업 공간을 배치하며 가상 메모리를 제공합니다.

     iii. 파일 시스템 관리 : 데이터를 저장하고 접근할 수 있는 인터페이스를 제공합니다.

     

    그리고 바로 위에서 언급한 입출력 관리를 합니다. 즉 HW와의 통신을 위한 기능도 제공하지요.

    마지막으로 프로세스간의 통신을 관리하는 IPC<Inter-Process Communication> 또한 합니다.

     

    3-2. 커널의 종류

    i. 단일형 커널<=모놀리식 커널>

    단일형 커널은 초창기에 사용되었던 운영체제 구조입니다.

    가장 대표적인 예시로는 리눅스 계열의 OS가 있습니다.

     

    쉽게 말하자면 위의 write(),socket()과 같은 시스템콜과 OS-HW 인터페이스가 main문안에 전부 있다고 생각하면 이해가 편할겁니다.

     

    장점으로는 모듈간의 통신이 없어서 프로그램이 빠릅니다.

    당연하지만 import를 통해서 프로그램간의 통신이 없고 main문안에서 모든걸 처리하니 당연할겁니다.

    단점으로는 상호의존성이 높다는 점이고, 유지 보수 및 디버깅이 어렵다는점이 있습니다.

     

     

    ii.  계층형 커널

    위의 문제점을 해결하기 위해서 비슷한 기능을 가진 시스템콜들을 하나의 모듈로 묶어서 계층을 만들고 이 계층끼리 소통하는 방식을 계층형 커널이라 합니다.

    대표적인 예시로는 윈도우가 있습니다.

     

     

    iii. 마이크로 구조 커널

    계층형 커널 또한 사용자의 요구사항에 맞추어 가다보니 점점 커널의 영역이 커지는 문제가 발생하게 되었습니다.

    그래서 커널의 일부 영역을 사용자 영역으로 넘기는 방식을 채택하게 됐는데 이를 마이크로 구조 커널이라 합니다.

     

    대표적으로는 마하, 애플의 OS X, iOS가 존재합니다.

     

     

     

     

    iv. 가상머신

    https://suff07.tistory.com/4

     

    파이썬의 동작과정

    앞서 설명했다시피 파이썬은 인터프리터 언어라는 점을 주목해야 합니다. (더 정확하게 이야기하자면 하이브리드 언어라고 보는편이 맞습니다. 왜 그런지는 아래에 설명) 인터프리터 언어는 코

    suff07.tistory.com

     

    가상머신에 관한 내용은 위의 링크에서도 어느정도 설명을 했지만 다시 설명을 해보겠습니다.

    C언어는 어셈블리어 같은 저급 언어의 기능을 갖고 있습니다.

    대표적으로 C언어로 작성된 OS는 유닉스<리눅스의 조상격 OS>가 있습니다.

     

    하지만 유닉스 계열과 다른 커널을 가진 운영체제와의 호환성이 떨어지는 문제점이 발생합니다.

    즉 유닉스에서 만든 C계열 프로그램이 윈도우나 Mac OS에서는 호환이 안될 수도 있다는 점이 문제입니다.

    <맥북 쓰시는 분들은 윈도우 프로그램이 작동 안되는점이 짜증났던 점이 한두번이 아닐겁니다.>

     

    이를 보완하기 위해서 프로그램 언어 자체적으로 가상머신이라는 개념이 등장하게 되었고 운영체제 위에 가상머신을 끼얹는 방식으로 제작 되었습니다.

     

    대표적인 언어는 자바,파이썬이 존재합니다.

     

    다음은 프로세스와 쓰레드를 설명하겠습니다.

    반드시 컴퓨터 구조론을 보고 오셔야 이해가 됩니다!

     

     

    'CS 이론 > 운영체제' 카테고리의 다른 글

    운영체제 3부<프로세스와 상태>  (0) 2024.10.09
    운영체제 1부<목적&역사>  (0) 2024.01.11