운영체제(1) – OS 핵심 구조와 기능

1. 운영체제 및 커널 개요

  • 운영체제(Operating System)
    • 데스크탑(Windows, macOS, Linux)과 모바일(iOS, Android) 등 다양한 종류가 존재함
    • 응용 프로그램에 필요한 자원(데이터, 하드웨어 부품)을 할당 및 관리함
  • 커널(Kernel)
    • 운영체제의 핵심 기능 담당
    • 두 가지 핵심 기능
    • 자원 할당 및 관리
    • 프로세스 및 스레드 관리

2. 시스템 콜과 이중 모드

운영체제의 메모리 적재

  • 운영체제도 하나의 프로그램이며, 메모리에 적재되어야 실행 가능
  • 응용 프로그램과 다르게 커널 영역이라는 전용 공간에 적재
  • 응용 프로그램이 적재되는 공간은 사용자 영역
  • 사용자 영역에서는 CPU, 메모리 등 주요 자원에 직접 접근 불가
  • 응용 프로그램이 운영체제의 기능을 사용하려면 시스템 콜을 호출해야 함

시스템 콜 (System Call)

  • 응용 프로그램이 운영체제의 서비스를 요청하는 함수 형태의 인터페이스
  • 실행 방식:

1. 응용 프로그램이 시스템 콜 호출
2. 소프트웨어 인터럽트 발생 → CPU가 현재 작업 백업
3. 커널 모드로 전환 → 운영체제 코드 실행
4. 실행 완료 후 다시 사용자 모드로 복귀

  • 시스템 콜을 통해 파일 시스템 접근, 프로세스 생성, 네트워크 통신 등 수행 가능

이중 모드 (Dual Mode)

  • CPU가 사용자 모드커널 모드로 구분되어 실행
  • 사용자 모드
    • 응용 프로그램 실행
    • 제한된 명령어만 실행 가능
    • 직접적인 자원 접근 불가 (시스템 콜을 통해 접근)
  • 커널 모드
    • 운영체제 실행
    • 모든 명령어 실행 가능
    • 하드웨어 및 시스템 자원 직접 관리
  • 시스템 콜 호출 시 사용자 모드 ↔ 커널 모드 전환이 빈번하게 발생

3. 자원 할당 및 관리

  • 시스템 자원(System Resource)
    • 프로그램 실행에 필요한 요소(데이터와 하드웨어 부품)를 의미함
    • CPU, 메모리, 보조기억장치 등 컴퓨터의 핵심 부품 포함
  • 운영체제의 역할
    • 응용 프로그램 대신 자원에 접근하여 효율적으로 관리함
    • 응용 프로그램이 자원을 문제 없이 할당받아 실행되도록 지원함
  • 주요 관리 대상
    • CPU 관리: CPU 스케줄링
    • 한정된 CPU 자원을 여러 프로그램이 공정하고 합리적으로 사용하도록 순서 및 사용 시간을 결정함
    • 우선순위, 스케줄링 큐, 선점형/비선점형 알고리즘 적용
    • 메모리 관리: 가상 메모리
    • 다수의 실행 프로그램을 메모리에 적재하고 불필요한 메모리 낭비 없이 관리함
    • 물리적 메모리보다 큰 메모리 사용을 가능하게 하는 가상 메모리 기법 적용
    • 물리 주소와 논리 주소, 페이징, 페이지 교체 알고리즘 등으로 구성됨
    • 파일/디렉터리 관리: 파일 시스템
    • 보조기억장치의 정보를 파일 및 폴더(디렉터리) 단위로 체계적으로 관리함
    • 정리되지 않은 상태에서는 원하는 데이터를 찾기 어려움
    • 입출력 장치 및 캐시 메모리 관리
    • 입출력 장치 드라이버, 인터럽트 서비스 루틴, 캐시 일관성 유지 등으로 지원함

4. 프로세스와 스레드

프로세스(Process)

  • 실행 단위: 프로그램이 메모리에 적재되어 실행되는 단위
  • 유형:
    • 포그라운드: 사용자와 직접 상호작용
    • 백그라운드: 사용자 눈에 보이지 않는 작업 수행 (데몬/서비스)
  • 메모리 배치:
    • 커널 영역: PCB(프로세스 제어 블록) 등 운영체제 관리 정보 저장
    • 사용자 영역:
    • 코드 영역: 실행 가능한 명령어(읽기 전용)
    • 데이터 영역: 초기값이 있는 정적 변수, 전역 변수 저장
    • BSS 영역: 초기값이 없는 정적 변수 저장
    • 힙 영역: 동적 메모리 할당 영역 (개발자가 직접 관리)
    • 스택 영역: 함수 호출 시 생성되는 매개변수, 지역 변수, 복귀 주소 등 저장

PCB와 문맥 교환

  • 프로세스 제어 블록(PCB)
    • 저장 정보: PID, 프로세스 상태, 레지스터 값, 메모리 배치, 입출력 관련 정보
    • 관리 방식: 여러 PCB는 프로세스 테이블로 관리되며, 프로세스 생성/종료 시 추가/삭제됨
  • 문맥 교환 (Context Switching)
    • 동작 과정:

1. 현재 프로세스의 문맥(레지스터, 프로그램 카운터 등)을 PCB에 저장
2. 다음 프로세스의 PCB에서 문맥을 복구하여 실행
특징: 타이머 인터럽트 등으로 일정 시간 후 발생하며, 너무 잦으면 캐시 미스 등 오버헤드가 발생

프로세스 상태

  • 프로세스 상태(Process States)
    • 생성 상태 (new): 프로세스를 생성 중인 상태로, 메모리에 적재되어 PCB를 할당받은 상태
    • 준비 상태 (ready): CPU 할당 대기 중인 상태. 준비 상태인 프로세스는 디스패치(dispatch)를 통해 실행 상태로 전환됨
    • 실행 상태 (running): CPU를 할당받아 실행 중인 상태. 일정 시간 동안만 실행되고 타이머 인터럽트 발생 시 다시 준비 상태로 전환됨
    • 대기 상태 (blocked): 입출력 요청 등으로 인해 곧장 실행할 수 없는 상태. 입출력 작업 등이 완료되면 다시 준비 상태로 전환됨
    • 종료 상태 (terminated): 프로세스가 종료된 상태로, 종료 후 PCB와 사용한 메모리를 운영체제가 정리함

  • 블로킹 입출력 (Blocking I/O)과 논블로킹 입출력 (Non-blocking I/O)
    • 블로킹 입출력 (Blocking I/O)
    • 대기 상태로 접어들고, 입출력 작업이 완료되면 준비 상태가 되어 실행을 재개
    • 논블로킹 입출력 (Non-blocking I/O)
    • 출력 장치에게 입출력 작업을 맡긴 뒤, 곧바로 이어질 명령어를 실행

멀티프로세스 vs. 멀티스레드

  • 멀티프로세스
    • 각 프로세스는 독립적으로 실행되어 자원을 별도로 할당받음
    • 한 프로세스에 문제가 생겨도 다른 프로세스에 영향을 미치지 않음
    • 예시: 웹 브라우저의 각 탭이 별도 프로세스로 실행
  • 멀티스레드
    • 하나의 프로세스 내 여러 스레드가 동시에 실행됨
    • 스레드들은 프로세스의 자원(코드, 데이터, 힙 등)을 공유
    • 장점: 자원 공유를 통한 빠른 협력과 통신
    • 단점: 한 스레드의 오류가 전체 프로세스에 영향을 줄 수 있음

스레드 생성과 조인

  • 스레드 생성
    • 각 스레드는 동일 프로세스의 PID를 공유하지만 고유의 스레드 ID, 프로그램 카운터, 스택 등 개별 실행 정보 보유
    • 프로그래밍 언어(C/C++, 자바, 파이썬, Go 등)에서 스레드 생성 및 관리 지원
  • 스레드 조인 (Thread Join)
    • 생성한 스레드가 종료될 때까지 호출한 스레드(예: main 스레드)가 대기
    • 모든 스레드가 종료된 후에야 이후 작업이 진행되도록 함

5. 프로세스 간 통신 (IPC)

  • 공유 메모리 (Shared Memory)
    • 여러 프로세스가 공통 메모리 영역을 할당받아 데이터를 직접 읽고 쓰며 통신하는 방식
    • 프로세스 A가 공유 메모리 영역에 데이터를 쓰면, 프로세스 B는 해당 영역에서 데이터를 읽음
    • 시스템 콜을 통해 공유 메모리 영역을 확보하거나, 파일과 같이 공유 가능한 자원을 활용 가능
    • 커널 개입 없이 직접 메모리 접근이 이루어져 통신 속도가 빠름
    • 다만, 여러 프로세스가 동시에 접근할 경우 데이터 일관성이 훼손될 위험(레이스 컨디션) 존재
  • 메시지 전달 (Message Passing)
    • 데이터를 커널을 거쳐 송수신하는 통신 방식
    • 송신 측과 수신 측이 명확히 구분되어 있으며, 대표적으로 send()와 recv() 시스템 콜을 사용
    • 주요 수단:
    • 파이프 (Pipe): 단방향 통신 도구
    • 익명 파이프: 부모-자식 간 통신에 주로 사용
    • 지명 파이프: 임의의 프로세스 간 양방향 통신 지원
    • 시그널 (Signal): 비동기 이벤트 알림을 통해 통신 수행
    • 다양한 시그널(SIGCHLD, SIGILL, SIGINT, SIGKILL, SIGSEGV, SIGTERM, SIGUSR1, SIGUSR2)을 활용하여 프로세스 간 이벤트를 전달
    • 프로세스는 시그널이 발생하면 기존 작업을 중단하고, 미리 정의된 시그널 핸들러를 실행한 후 다시 작업을 재개함
    • 소켓 (Socket)
    • 원격 프로시저 호출 (RPC): 원격 프로세스의 코드를 실행하는 방식으로, 플랫폼에 관계없이 메시지 송수신 가능
    • 메시지 전달은 커널의 개입으로 인해 동기화나 레이스 컨디션 문제를 상대적으로 덜 고려하지만, 통신 속도는 공유 메모리 방식에 비해 느림


6. 동기화 및 스레드 안전

  • 동기화 (Synchronization)
    • 여러 프로세스 또는 스레드가 공유 자원에 동시에 접근할 때, 임계 구역(critical section)에서 발생하는 문제를 방지하기 위한 기법
    • 주요 목적:
    • 실행 순서 제어: 프로세스 및 스레드의 올바른 순서 실행
    • 상호 배제(Mutual Exclusion): 동시에 접근 불가 자원에 대해 단일 접근 보장
  • 동기화 기법
    • 뮤텍스 락(Mutex Lock)
    • 임계 구역에 들어가기 전 반드시 락(acquire) 획득, 작업 종료 후 락(release) 해제
    • 단일 자원에 대한 상호 배제를 보장
    • 세마포 (Semaphore)
    • 공유 자원의 사용 가능 개수를 나타내는 변수(S)를 기반으로 동기화를 수행
    • wait() 함수: 임계 구역 진입 전 S 값을 감소시키며, S가 음수면 대기 상태 진입
    • signal() 함수: 임계 구역 종료 후 S 값을 증가시키고, 대기 중인 프로세스 깨움
    • 조건 변수와 모니터 (Condition Variable & Monitor)
    • 조건 변수는 특정 조건 만족 시까지 대기(wait)하고, 조건 만족 시 signal을 통해 실행 재개
    • 모니터

공유 자원과 이를 다루는 인터페이스(공유 자원 연산)를 하나로 묶어, 상호 배제실행 순서 제어를 자동화하는 동기화 도구

진입 방식
모니터에 진입하려는 프로세스 또는 스레드는 반드시 모니터가 제공하는 인터페이스를 통해 진입
모니터 내부에 이미 다른 프로세스나 스레드가 실행 중이라면, 대기 큐에서 진입 대기
상호 배제
모니터 내부에는 동시에 오직 하나의 프로세스(또는 스레드)만 실행 가능
한 프로세스(또는 스레드)가 모니터를 사용하는 동안, 다른 프로세스(또는 스레드)는 대기 상태로 전환
조건 변수(Condition Variable)를 통한 실행 순서 제어
특정 조건이 만족되지 않는 동안 모니터 내부의 스레드를 대기 상태로 전환
조건이 충족되면 대기 중인 스레드를 깨워 다시 실행

예) 자바의 synchronized 키워드를 통한 모니터 구현

  • 스레드 안전 (Thread Safety)
    • 멀티스레드 환경에서 동시에 여러 스레드가 변수나 함수, 객체에 접근해도 문제 없이 동작하는 상태
    • Vector 클래스는 스레드 안전성이 보장되는 반면, ArrayList는 그렇지 않음

7. 교착 상태 (Deadlock)

  • 교착 상태 (Deadlock)
    • 여러 프로세스가 서로가 보유한 자원을 기다리며 실행이 정지되는 현상
    • 시스템 자원 회수와 프로세스 진행에 심각한 영향을 미침
  • 교착 상태 발생 조건

1. 상호 배제 (Mutual Exclusion)
한 번에 하나의 프로세스만 특정 자원을 사용할 수 있음
동시에 여러 프로세스가 동일 자원에 접근 불가
2. 점유와 대기 (Hold and Wait)
프로세스가 이미 자원을 점유한 상태에서 추가 자원을 요청하며 대기함
3. 비선점 (No Preemption)
한 번 할당된 자원은 프로세스가 작업을 완료하기 전까지 강제로 회수할 수 없음
4. 원형 대기 (Circular Wait)
각 프로세스가 서로가 보유한 자원을 요청하는 원형 구조 형성

  • 교착 상태 해결 방법
    • 예방(Prevention): 4가지 조건 중 하나라도 성립하지 않도록 자원 할당 방식을 설계
    • 회피(Avoidance): 교착 상태가 발생하지 않을 정도로 자원을 제한적으로 할당
    • 검출 후 회복(Detection and Recovery): 주기적으로 교착 상태 여부를 검사하고, 발생 시 자원 선점이나 프로세스 강제 종료 등으로 회복

참고

_이것이 취업을 위한 컴퓨터 과학이다 with CS 기술 면접 – 한빛미디어_

위로 스크롤