Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

JustDoEat

[테커톡] 운영체제의 추상화와 커널의 역할 본문

카테고리 없음

[테커톡] 운영체제의 추상화와 커널의 역할

kingmusung 2024. 7. 4. 01:47

운영체제란 무엇인가?

  • 하드웨어를 편리하게 사용하도록 만든 추상화를 제공하는 프로그램.
  • 운영체제가 없다면 메모리 할당, 프로세스 처리 순서등을 사용자가 직접 해야 한다.
  • 컴퓨터 자원(CPU, Memory 등) 사용에 대한 정책(지침)을 제공한다.

❓ 그래서 운영체제가 제공하는 추상화가 뭔데요!! 왜 필요한데요 !!

 

일단. 운영체제가 없다면 사용자 인터페이스가 없으므로 모든 작업(아이콘 클릭, 폴더생성 등)을 명령어로 해야 하고, 하드웨어 자원에 대한 통제 또한 직접 해야 할 것입니다. 벌써부터 머리가 아픈 거 같습니다. 🥲

먼저 ! 하드웨어를 사용하기 편하게 만든 추상화는 아래와 같습니다.


Process(CPU에 대한 추상화)

Process는 실행 중인 프로그램(명령어의 집합)의 인스턴스입니다.

 

Process를 PCB라는 레지스터 안에 넣어서 관리를 합니다.

 

PCB에는 프로세스의 상태, 계정정보, 프로세스 카운터(다음에 실행 할 명령어 주소 위치) 등의 정보를 담고 있습니다.

 

운영체제가 무슨일을 하는지 간략하게 "활성상태보기"에서도 볼 수 있는데요~

 

  • 프로세스의 상태란 ?
    •    생성→ 프로세스가 만들어질때 상태이다.
    •    준비 → 프로세스가 실행될 준비 완료, 언제든의 운영체제의 도움을 받아 CPU를 할당 받을 수 있다.
    •    실행 → 말 그대로 실행상태
    •    대기 → 프로세스가 어떤일을 기다리고 있는 상태, I/O 입력등 ..
    •    종료 → 말그대로 종료 상태
  •  추가 
    •    스레드:
      •       스레드는 프로세스에서 실행되는 작은 작업의 단위이다,
      •       하나의 프로세스는 여러 개의 스레드를 가질 수 있다. 이로 인해 병렬작업이 수행이 가능합니다.
        • EX) 계란 프라이를 만드는 임무(프로세스)가 있고, 이 안에는(계란을 꺼내오는 작업(스레드), 불을 키는 작업(스레드), 요리의 완성은 뒷정리.. 정리를 하는 작업(스레드)) 여러개의 임무를 동시에 실행하는 스레드가 있습니다. 여러개의 스레드가 동시에 일을 한다면 효율적일 것입니다.
    • CPU시간:
      • 각 프로그램이 CPU를 잡고 있는 시간이다, CPU는 한정된 자원이고 모든 프로그램이 CPU자원을 사용하려면 운영체제가 열심히 스케쥴링을 해주어야 합니다.
    • PID:
      • 운영체제가 프로세스를 식별할 수 있도록 하는 이름표 입니다.

멀티태스킹(을 하기 위한 콘텍스트 스위칭)

우리는 컴퓨터를 사용할때 하나의 작업만 하지 않고, 컴퓨터로 노래를 들으면서 코딩을 한다던지, 코딩을 하면서 동시에 ChatGPT를 사용

 

한다던지 여러 작업을 동시에 합니다. 이런 작업을 할 수 있는건 운영체제 덕분인데요.

 

이러한 작업을 “멀티태스킹”이라고 합니다.

 

이러한 멀티태스킹을 지원하기 위해 운영체제는 컨텍스트 스위칭이란 걸 하고 있는데, 콘텍스트 스위칭의 주요 단계는 다음과 같습니다.

  1. 현재 실행 중인 프로세스의 프로그램 카운터, 레지스터, 상태정보를 PCB에 저장한다.
  2. 다음 실행할 프로세스의 정보를 PCB에서 복원한다.
  3. 복원한 새 프로세스가 실행이 된다.

사용자가 눈치채지 못할 정도의 속도로 CPU에서는 여러 프로세스가 번갈아 가면서 실행이 되고 있습니다.

 


Address Space(Memory에 대한 추상화)

흔히 처음 C언어를 공부하고 포인터에 대해 배울 때 들어본 주소공간! 그 주소공간이 맞습니다.

 

process가 실행이 될 때 컴퓨터 자원을 쓸 수밖에 없는데, 각각의 프로세스가 서로의 공간을 침범하면 안 되므로 address space가 할당되어 있습니다.

 

여러분이 방에서 신나게 춤을 추고 있는데(작업) 옆집 사람이 춤을추고 계신 여러분의 방(공간)에 무단으로 침범을 한다면 상당히 부끄럽고 하던 일도 진행할 수 없겠죠?

 

Address Space가 지원하는 역할을 살펴볼까요?

 

가상 메모리:

운영체제는 실제 물리적 메모리를 가상 메모리로 추상화합니다. 가상 메모리는 프로세스마다 독립적으로 할당되며, 프로세스는 자신만의 주소 공간을 가지고 있는 것처럼 동작합니다.

보통 프로그램을 실행시킬 때 Disk(하드디스크, SSD 등)에서 읽어온 후 메모리(RAM)에 적재를 하게 되는데. 이때 각 프로세스는 고유한 주소공간이 존재합니다.

 

페이지와 프레임:

가상 메모리는 페이지라는 작은 단위로 나뉘고, 실제 물리적 메모리는 프레임으로 나뉩니다. 페이지는 프레임에 매핑되어 실제 메모리에 적재됩니다.

 

페이지 테이블

각 프로세스는 페이지 테이블을 통해 가상 주소를 물리적 주소로 변환합니다. 페이지 테이블에는 가상 페이지 번호와 물리적 프레임 번호의 매핑 정보가 저장됩니다.


Port(Network에 대한 추상화)

개발을 하시면서 포트에 대해서 많이들 들어보셨을 겁니다.

포트는 데이터를 주고받기 위한 논리적인 연결점입니다.

운영체제가 Network에 대해 지원하는 추상화중에 대표적으로 포트번호가 있습니다.

0~65535까지의 포트번호가 있으며, 0~1023번 포트는 시스템 포트로 되어 있습니다.

(HTTP는 80번 포트, HTTPS는 443번 포트)

 

http://localhost:5173/ -> vite

http://localhost:8000/ -> 장고

http://localhost:8080/ -> 톰켓

 

이런식으로 흔히 보셨을법한 포트번호도 있습니다. api통신을 할때도 이러한 포트번호를 기반으로 합니다.

 

이러한 추상화가 없다면 생각만해도 끔찍하네요 ..

 


File(Disk에 대한 추상화)

파일은 저장 장치에 기록된 데이터의 집합입니다(하드디스크. SSD 등). 데이터의 영구적인 저장 및 관리를 위해 사용됩니다.

 

흔히 하드디스크에 데이터를 저장하고 읽어오는 기능도 운영체제의 도움을 받고있습니다. 메모리에 있는 데이터를 하드디스크에 저장하고, 하드디스크에있는 데이터를 메모리로 읽어오는 기능,

 

이뿐만이 아니라 하드디스크에 파일이 저장될때 디스크의 몇번 섹터에 어떤 파일이 어떻게 저장되어 있는지에 대한 설정또한 운영체제가 알아서 해주고있습니다.



 

운영체제의 4가지 추상화 기능에 대해 알아보았습니다. 이제 커널이 무엇인지 맛을 볼까요 ?

커널(Kernel)이란?

운영체제의 핵심 부분으로, 하드웨어와 소프트웨어 간의 인터페이스 역할을 하고, 위에서 설명한 운영체제의 추상화 개념들이 커널에 들어가 있습니다.

(프로세스 관리, 주소 공간 관리, 파일시스템, 네트워크 관리)

 

→ 운영체제 덕분에 하드웨어 자원에 대한 직접적인 개입을 할 필요가 없어서 편하게 컴퓨터를 사용 가능합니다. 👋

기본적으로 User 모드, 커널모드가 있는데 User모드는 일반적으로 우리가 작업하는 환경, 커널모드는 운영체제의 기능들이 실행되는 모드입니다.

이러한 운영체제의 기능을 사용자가 임의대로 만든다면 시스템에 심각한 오류를 야기할 수 있으므로 일반적인 접근은 불가능합니다.

<aside> ❓ 그러면 접근을 하기 위해 어떻게 해야 하나요 !

</aside>

시스템콜(System Call)이라는 방식을 이용해서 커널에 접근을 하는 방법이 있다.

시스템콜은 운영체제의 기능을 사용하기 위해 사용하는 함수의 일종입니다.

 

예시로 살펴보시죠 !

 

EX) printf

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

콘솔창에 Hello, World! 를 출력하는 대중적으로 잘 알려진 printf인데요, printf를 시용하면 컴퓨터 내부에서는 무슨일이 일어날까요 ?

#include <unistd.h>int main() {
    const char *message = "Hello, World!\\\\n";
    write(1, message, strlen(message));// 1은 표준 출력 장치의 파일 디스크립터를 나타냄return 0;
}

printf 함수는 표준 출력을 위해 내부적으로 write라는 시스템 콜을 호출할 수 있습니다.

(겉으로는 printf로 보이지만 printf가 실행되기 위해 뒤에서는 위와 같은 작업이 일어나고 있습니다.)

(printf함수는 직접적으로 시스템콜을 사용하지는 않습니다.)


EX) 파일을 열고 닫기 위해 직접 SysyemCall을 호출한 예시

#include <fcntl.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>

int main() {
    int fd;  // 파일 디스크립터

    // 파일 열기 시스템 콜 (open)
    fd = open("example.txt", O_CREAT | O_WRONLY, 0644);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    // 파일 닫기 시스템 콜 (close)
    if (close(fd) == -1) {
        perror("close");
        exit(1);
    }

    printf("파일을 성공적으로 열고 닫았습니다.\\\\n");

    return 0;
}

위 예제는 직접 시스템콜 함수를 사용하는 예시를 보여주고 있습니다.

 

✅ Open(), Write()

 

위의 예시들처럼 코딩을 하면서 시스템콜을 모르는 사람도 시스템콜을 사용하고 있던 것인데요.

대략 시스템콜이 무엇인지 봤으니, 전형적인 OS구조를 예시로 설명을 이어나가 보겠습니다.

 

아래는 전형적인 OS의 구조 입니다.

 

 

Applications

 

User level 사용자들의 함수 호출(기능 사용)로 실행 프로그래머들에 의해 만들어지고 컴파일이 됩니다.

보통 일상적으로 사용하는 영역이 되겠네요 위 그림과는 user interface, GUI, batch, command line 과 대조할 수 있습니다.

 

Libraries (System Call)

 

User level 프로그램에서 자주 사용되는 기능을 미리 정의해 모아둔 형태 헤더에서 포함되고 링커에 입력으로 들어간다. 운영체제를 호출하는 일부 라이브러리 존재(디스크, GPU 처리 등)

   → 시스템콜을 사용할 수 있도록 정의가 되어있는 부분입니다. 라이브러리 익숙하시죠? 그 라이브러리랑 일맥상통한 개념입니다.

 

Portal OS Layers (Service)

 

Kernel level Application에서 제한되는 기능 수행을 위해 OS에서는 system call이라는 메커니즘을 사용. 관련된 정의가 존재하는 곳

 

Machine-dependent layers(Operating System)

 

Kernel level OS 파트 중 특히 하드웨어와 밀접한 부분 ex) Boot loader, device drivers

 


2.예외(Exceptions), 인터럽트(interrupt)

시스템콜 외에도 커널모드로 진입할 수 있는 방법은 있습니다.

 

코딩을 하다 예외.. 많이들 익숙할거라 생각합니다.

 

아래는 대중적으로 많이 볼 수 있는 예외들 입니다.

 

런타임 예외 (Runtime Exceptions):

  • NullPointerException: 객체 참조가 없는 상태에서 메서드를 호출할 때 발생합니다.
  • ArrayIndexOutOfBoundsException: 배열 범위를 벗어난 인덱스로 접근할 때 발생합니다.
  • ArithmeticException: 산술 연산 중에 0으로 나누는 경우 발생합니다.

체크 예외 (Checked Exceptions):

  • FileNotFoundException: 파일을 찾을 수 없을 때 발생합니다.
  • IOException: 입출력 작업 중에 발생하는 예외입니다. </aside>

이러한 예외들이 발생했을 때도 쥐도 새도 모르게 유저모드와 커널모드를 오가면서 처리가 되고 있던것입니다.

 

❗ 아니 예외가 발생했는데 왜 커널로 들어가!

 

예시를 하나 들어보겠습니다.

 

자원 관리에서 발생할 수 있는 예외는 예를 들어 메모리 할당 실패, 입출력 장치 접근 오류 등이 있습니다.

운영체제는 시스템의 자원을 효율적으로 관리하기 위해 커널 모드에서 동작합니다.

이러한 예외는 운영체제가 커널 모드에서 적절히 처리하여 시스템의 안정성을 유지합니다.

 

커널모드로 진입 후 조치를 안 해주었다면 프로그램이 중간에 종료가 될 것 입니다. 이러면 안되겠죠?