운영체제 만들어보기 (1)

문지원·2025년 3월 15일
0

본 게시물은 박주항 개발자님께서 집필하신 "C++로 나만의 운영체제 만들기"라는 책을 기반으로 작성된 게시물입니다.
시작에 앞서 본 책을 집필하신 박주항 개발자님의 명복을 빕니다.

초등학교때 본 책을 구매하여 이해하지 못한 채 지금에서야 보면서 따라하게 되었습니다.

운영체제 이론

  • 프로세스
  • 스레드
  • 스택
  • 호출 규약

프로세스

먼저 프로그램이 실행되면 보조기억장치 -> 주기억장치 적재(로더) -> 실행되는 것을 프로세스라 함.

주기억장치(RAM)

프로세스의 메모리 할당에 대해 이해하기 위해 메모리의 구조를 이해하여야 한다.

메모리는 위와 같은 구조를 가지고 있다.
Code(Text) 영역 -> Data 영역 -> Heap 영역 -> Stack 영역 순으로 낮은 메모리 주소에서 높은 메모리 주소로 내려가는 것을 알 수 있다.

Code 영역

  • 실행 할 프로그램의 코드의 저장 공간 할당

Data 영역

  • 프로그램 동작을 위한 변수 저장 공간 할당

Heap 영역

  • 변수, 함수 등 동적 저장 공간 할당

Stack 영역

  • 지역 변수 / 매개 변수 저장 공간 할당

멀티태스킹 운영체제(한번에 다중 처리가 가능)

프로그램을 다중 처리 해야하기 때문에 시스템 자원(CPU, 램 등)을 독점적으로 사용하는 것을 방지 하기 위해 각 프로세스에 자원 사용 시간을 적절히 배분한다.

커널

커널은 소프트웨어가 동작 시 하드웨어의 자원을 필요로 할 때 각 프로세스에 분배하고 프로세스 제어, 메모리 제어 등을 수행하는 운영체제의 가장 아래 계증체 속한다.
-> OS 핵심 부분으로 소프트웨어 <-> 하드웨어간 징검다리 역할을 수행한다.

프로세스 컨텍스트

컨텍스트(Context) 문맥이라고도 불리는 컨텍스트는 운영체제가 관리하는 프로세스 정보라고 볼 수 있다.
컨텍스트는 간략하게 CPU 상태, PCB, 가장주소공간 데이터를 의미한다. 이러한 정보를 바탕으로 커널이 프로세스를 실행하고 있따는 것을 의미한다.

  • CPU 상태
    CPU 레지스터, Instruction Pointer 등이 존재한다.
  • PCB(Process Control Block)
    자료구조를 의미하며 커널이 프로세스를 표현하기 위해 사용된다.
    PCB는 체인으로, 다른 PCB에 연결되어 있다.
    OS가 관리상 사용하는 정보 : Process Status, Process ID, 스케쥴링 정보, 우선순위
    CPU 수행 관련 하드웨어 정보 : Program Counter, Register
    메모리 정보 : Code, Data, Stack 영역의 위치 정보
  • 가장주소공간 데이터
    위에서 살펴보았던 코드 영역, 데이터 영역, 스택 영역, 힙 영역을 의미한다.

프로세스 상태

컨텍스트 스위칭에 의해 프로세스는 실행 상태에 놓일 수도, 정지 상태에 놓일 수도 있다.

위 프로세스 상태 다이어그램을 통해 이해할 수 있다.

  • 실행 : 프로세스가 CPU 점유
  • 대기 : 프로세스가 CPU를 점유하기 위해 기다리고 있는 상태
  • 블록 : 당장 작업 수행이 불가능한 상태(Sleep 함수 등 동기화로 대기 시 프로세스 블록)
  • 정지 상태 : 스케쥴러나 인터럽트로 비활성화된 상태(외부에서 재개 필요)

Context Switching

CPU가 한 프로세스에 다른 프로세스의 PCB 정보로 스위칭 되는 과정을 의미한다.

위 과정처럼 두 프로세스가 실행과 중지를 반복하면서 컨텍스트 스위칭이 발생하는 것을 알 수 있다.
컨텍스트 스위칭은 시스템 콜이나 외부 인터럽트에 의해 발생할 수 있다.

스레드

하나의 프로세스에는 여러개의 스레드를 포함하고 있다. 커널은 프로세스의 스레드를 관리해 프로세스의 동작을 조정한다.
스레드1과 스레드2가 있다고 생각해보자. 스레드 1과 2의 가상주소 공간에는 Stack, Heap, Data, Code의 공간들이 존재할 것이다. 이러한 가상주소 공간은 프로세스의 Heap, Data, Code의 영역을 공유한다.
영역을 공유하는 만큼 데이터의 무결성이 중요하다. 각 스레드에서 읽기 전용 데이터를 접근할 때에는 문제가 발생하지 않지만 쓰기 데이터를 접근할 때에는 데이터 무결성 문제가 발생할 수 있다(단, 스택 영역은 스레드의 공유 자원이기 때문에 일반적인 경우에 어떠한 스레드로부터 간섭을 받지 않기 때문에 동기화 문제가 발생하지 않는다)
프로세스에 PCB가 존재하듯이 스레드 정보를 관리하기 위해 TCB(Thread Control Block)가 존재한다.
TCB는 다음과 같은 정보를 담고 있다.

  • 스레드 식별자
  • 스택 포인터
  • 프로그램 카운터
  • 스레드 상태
  • 레지스터 값
  • 스레드를 담고 있는 프로세스의 PCB 포인터

스레드 경합
자료구조 혹은 데이터에 복수의 스레드가 접근하면 문제가 발생할 수 있다. 이러한 상태를 경쟁 상태 또는 경합 상태(Race Condition)라고 한다.

스레드 동기화

스레드 경합의 문제를 해결하기 위해서는 동기화를 적용하여야 한다. 동기화를 적용하기 위해서는 동기화 객체를 사용하면 되는데 동기화 기법의 큰 범주로는 유저 모드 동기화, 커널 모드 동기화가 존재한다.

  • 유저 모드 동기화
    크리티컬 섹션(Critical Section)
    인터락 함수(Interlocked Family Of Function)

  • 커널 모드 동기화
    뮤텍스(Mutex)
    세마포어(Semaphore)
    이름있는 뮤텍스(Named Mutex)
    이벤트(Event)

profile
인문계 고등학교에서 코딩하는 학생입니다 👋

0개의 댓글