OS - Strcture

윤형·2025년 4월 27일

Operation System

목록 보기
2/9
post-thumbnail

서론

이번 시간에는 운영체제의 구조가 어떻게 이루어져 있는지 좀 더 자세하게 알아보고자 한다.

OS 구조

아래 그림을 통해 운영체제의 구조에 대해 천천히 살펴보도록 하겠다.

User Interface

  • GUI : 그래픽을 이용해 사용자가 컴퓨터와 상호작용 하는 방법. 사용자는 "눈에 보이는" 것들을 클릭하면 상호작용 한다.
  • Batch : 배치는 여러 작업을 한번에 묶어서 자동으로 처리하는 방법이다. (백업 스크립트 , 빌드 자동화 등등)
  • command line : 텍스트 기반으로 컴퓨터에게 명령을 입력해서 조작하는 방식이다. (터미널, CMD등등)

API

응용 프로그램이 OS기능을 사용하기 위한 표준 인터페이스.

조금 쉽게 설명하자면, 개발자에게 제공되는 고수준의 인터페이스다.
예를 들어 카카오 지도를 사용하기 위해서 "카카오 지도를 보여줘"라는 명령(API)를 호출하면 카카오가 내부에서 복잡한 지도 데이터를 처리하고 결과만 보여주는 것이다.

  • 이식성 : 다른 하드웨어/OS에서도 동일한 코드 실행 가능.
  • 편의성 : 복잡한 시스템 호출을 추상화해서 간단한 함수로 제공한다.
printf("Hello")
//라고 되어있는 것도 C표준 라이브러리 API를 사용한 것이다. 
//내부적으로는 'write()'라는 system call을 사용한 것.

system calls

사용자 프로그램이 운영체제의 기능을 사용하고 싶을 때 요청하는 특별한 함수 호출.
사용자 모드 프로그램이 커널 모드의 OS 기능을 요청하는 것.

  • 파일을 열거나 저장할 때
  • 데이터를 읽고 쓸때
  • 프로세스를 생성하거나 종료할 때

  • 직접 하드웨어를 건드릴 수 없기 때문에 프로그램이 OS에게 요청하는 것이다. 시스템콜이 없으면 하드웨어를 직접 건드려야 하기 때문에 복잡하고 위험해진다.


    <CPU의 두가지 모드>
  • UserMode : 일반 사용자 모드, 위험한 작업 불가(하드웨어 조작, 메모리 덮어쓰기 등등)
  • Kernel Mode : 관리자 권한 모드, 모든 작업 가능(주의 해야함)

<두 모드로 나누는 이유>

  • 보안 : 악성 프로그램이 하드웨어를 건드리는 것을 방지.
  • 안정성 : 프로그램의 버그가 전체 시스템에 영향을 주지 않는다.
  • 효율성 : 자주 쓰는 기능은 커널이 최적화 해 관리한다.

매개변수 전달 방식

운영체제에서 system call을 통해 커널에 명령을 내릴 때, 사용자 프로그램이 커널에 전달해야 하는 정보 즉, 매개변수가 있다. 이 매개변수들은 여러가지 전달 방식으로 전달 될 수 있다. - 데이터의 크기, 특성에 따라 달라짐

  1. 레지스터 전달
    : CPU의 레지스터에 매개변수를 직접 저장하여 전달하는 방식.
  • 속도가 매우 빠르다.
  • 전달할 수 있는 데이터의 개수, 크기가 제한됨(레지스터 수 때문에)
  • 작은 파라메터일때 적합하다.
  1. 메모리 전달
    : 매개변수의 실제 데이터를 메모리에 저장하고, 그 주소값을 커널에 전달하는 방식
  • 대용량 데이터에 적합하다.
  • 주소값만 레지스터에 저장하고, 실제 데이터는 커널이 해당 메모리 주소를 참조하여 접근한다.
  • 데이터가 커서 레지스터에 담을 수 없을 때 사용함.
  1. 스택 전달
    : 매개변수의 데이터 자체를 스택 영역에 저장하고, 커널이 스택에서 해당 값을 읽어가는 방식.
  • 함수 호출 시와 동일하게 스택 프레임을 사용한다.
  • 매개변수 수가 많거나 함수 호출의 형태를 사용하려고 할때.
  • 호출이 끝나면 자동으로 정리된다. - 스택이니까

MS-DOS

  • Single-tasking 시스템: 한 번에 하나의 프로그램만 실행
  • Shell이 부팅할때 먼저 올라온다.
  • 프로그램을 실행하려면 새로운 프로세스를 만들지 않고 메모리에 덮어씌운다(load).
  • 커널은 메모리의 가장 아래쪽에 위치하고, 덮어씌워지지 않는다.
  • 프로그램이 종료되면 다시 shell이 메모리 위로 올라와서 사용자가 명령을 입력할 수 있게 된다.

왼쪽은 맨 처음 부팅할때고, 오른쪽은 프로그램을 실행 상태이다. 프로그램 실행시 free memory의 부분을 차지하는 것을 볼 수 있다.

멀티태스킹이 불가능하다.

UNIX

  • UNIX는 멀티태스킹과 프로세스 관리를 지원한다.
  • 시스템 프로그램과 커널 두 부분으로 나눠져있다.

  • 사용자 영역 - 위층
    : 사용자들이 이용하는 프로그램(shell, compiler, interpreter)이 있다.

  • System Call Interface
    : 사용자 프로그램이 커널 기능을 요청할 때 통하는 '창구'역할.
    : 파일을 읽고싶으면 system call을 통해 요청한다.

  • Kernel
    : 하드웨어와 연결되는 직접적인 부분.
    : 파일 시스템 관리, CPU 스케쥴링, 메모리 관리, 입출력 처리 같은 복잡한 기능들을 담당한다.

  • Hardware Interface
    : 터미널, 디스크, 메모리 등 실제 하드웨어와 연결되는 부분.
    : 커널이 이걸 통해 물리적 장치들과 소통하게 된다.

Microkernel System 구조

  • 커널에 최소한의 기능만 유지
  • 파일 시스템, 장치 드라이버, 네트워크 스택등은 사용자 공간에서 서비스로 실행한다.

<특징>

  • Message Passing : 사용자 공간 서비스 간 통신은 메시지 전달 방식으로 처리한다.
  • Mach 커널(현대 mac OS)가 대표적인 사례

<장점>

  • 안정성 : 커널 모드 코드가 감소한다. -> 드라이버 결함이 전체 시스템에 영향을 미치지 않는다.
  • 확장성 : 새로운 서비스를 사용자 공간에서 추가 가능.
  • 이식성 : 하드웨어 의존성이 낮아 다른 아키텍처에 추가하기 수월하다.

<단점>

  • 성능 오버헤드 : 사용자/커널 공간 전환과 메시지 전달로 인해 오버헤드가 발생한다.

Monolithic System 구조

  • 모든 OS 기능이 단일 커널 공간에 통합된다.(파일 시스템, 드라이버 등)

<특징>

  • 직접 호출 : 시스템 서비스 간 상호작용이 함수 호출로 빠르게 처리 된다.
  • Linux가 대표적인 사례.

<장점>

  • 고성능 : 커널 내 직접 통신으로 오버헤드가 발생하지 않는다.
  • 단순한 설계 : 계층화 없이 통합된 구조이다.

<단점>

  • 복잡성 : 코드 규모가 커지면 디버깅과 유지보수가 어려워진다.
  • 안정성 리스크 : 커널 모드의 결함이 전체 시스템 장애로 이어질 수 있다.

Modules System

운영체제의 핵심 기능을 동적으로 로드 가능한 모듈로 분리하여 설계하는 방식이다. Monolithic의 문제점(복잡성, 유연성 부족)을 해결하기 위해 등장했다.

<특징>

  • 객체지향 설계 : 각 모듈은 독립적인 객체처럼 작동하며, 명확한 인터페이스를 통해 다른 묘듈과 상호작용한다.

  • 분리된 코어 컴포넌트 : 커널의 핵심 기능(프로세스, 메모리 관리)와 추가 기능(드라이버, 파일 시스템)을 분리한다.

  • 명확한 인터페이스 : 모듈간 통신은 사전 정의된 API를 통해 이루어진다.

  • 동적 로딩 : 모듈을 실행중에 필요에 따라 메모리에서 올리거나 제거할 수 있다.

<장점>

  • 유지보수 좋음

  • 메모리 효율 올라감 : 사용하지 않는 모듈은 로드하지 않는다.

  • 안정성 : 결함이 발생한 모듈만 재시작 하면 됨.

  • 하드웨어 지원 : 새로운 장치 드라이버를 재부팅 없이 추가할 수 있다.

<동작 원리>

  • 커널 초기화: 기본 기능만으로 최소한의 커널을 부팅.

  • 모듈 탐지: 하드웨어 또는 시스템 요구사항을 분석하여 필요한 모듈을 식별.

  • 모듈 로드: 해당 모듈을 메모리에 적재하고 커널 기능에 통합.

  • 모듈 관리: 사용 중인 모듈은 lsmod(Linux) 명령어로 확인.

profile
제가 관심있고 공부하고 싶은걸 정리하는 저만의 노트입니다.

0개의 댓글