2 분 소요

1. 운영체제의 실행

💡 중요 개념: 운영체제도 하나의 프로그램으로서 프로세서에 의해 실행된다는 점은 OS의 기본 개념을 이해하는데 매우 중요합니다.

1.1 운영체제 실행의 특징

  • OS는 일반 소프트웨어처럼 프로세서가 실행하는 프로그램
  • OS는 자주 제어권을 포기하고 프로세서가 OS로 제어를 반환하는 것에 의존

1.2 실행 설계 접근법

  1. 사용자 프로세스 내 실행
    • OS 코드가 사용자 프로세스 문맥 내에서 실행
    • 커널이 사용자 프로세스의 일부처럼 보임
    • 모드 전환만 발생, 프로세스 전환은 필요할 때만 수행
  2. 프로세스 기반 운영체제
    • 주요 커널 기능을 별도의 시스템 프로세스로 구현
    • 깔끔한 설계 가능
    • 다중 프로세서/컴퓨터 환경에 유용

2. 프로세스 생성

💡 프로세스 생성 과정과 시스템 콜(fork, exec)의 동작 방식은 OS 면접에서 매우 중요한 주제입니다.

2.1 OS 관점의 프로세스 생성

  1. 기본 단계
    • 고유한 프로세스 ID (pid) 할당
    • 프로세스를 위한 메모리 할당
    • PCB 초기화
    • 적절한 큐에 연결
    • 기타 자료구조 생성
  2. PCB 초기화 내용
    • 프로세스 ID, 부모 ID
    • 프로그램 카운터와 스택 포인터 설정
    • 상태를 보통 ready로 설정

2.2 응용 프로그램 관점의 프로세스 생성

  1. 프로세스 계층 구조
    • 부모 프로세스가 자식 프로세스 생성
    • 트리 형태의 프로세스 구조 형성
  2. 주소 공간 옵션
    • 자식이 부모를 복제
    • 자식이 새로운 프로그램을 로드
  3. 실행 옵션
    • 부모와 자식이 동시 실행
    • 부모가 자식 종료까지 대기
  4. 자원 공유 옵션
    • 모든 자원 공유
    • 일부 자원만 공유
    • 자원 공유 안 함

3. UNIX 시스템 콜

💡 fork(), exec(), wait() 시스템 콜의 동작 방식과 차이점은 필수 면접 준비 항목입니다.

3.1 fork() 시스템 콜

  • 특징: UNIX 시스템에서 새로운 프로세스를 생성하는 유일한 방법
  • 동작: 호출한 프로세스의 동일한 복사본 생성
  • 반환값
    • 부모: 성공 시 자식의 pid, 실패 시 -1
    • 자식: 0

fork

3.2 exec() 시스템 콜

  • 목적: 새로운 프로그램 실행 시작
  • 동작: 호출한 프로세스를 새 프로그램으로 완전히 대체
  • 특징: 프로세스 속성은 유지됨

exec

3.3 fork()와 exec()의 조합

#include <unistd.h>
docommand(char *command) {
    pid_t pid;
    if ((pid = fork()) < 0) return(-1);
    if (pid == 0) { /* child */
        execl("/bin/sh", "sh", "-c", command, (char *) 0);
        perror("execl");
        exit(1);
    }
    /* parent code, wait until child exits */
    wait((int *) 0);
    return(0);
}

3.4 exit()와 wait() 시스템 콜

  1. exit()
    • 정상적인 프로세스 종료
    • 정리 작업 수행 후 커널로 반환
  2. wait()
    • 자식 프로세스 종료까지 부모 프로세스 중단
    • SIGCHLD 시그널 처리

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

💡 IPC의 다양한 메커니즘과 각각의 특징을 이해하는 것은 매우 중요합니다.

4.1 기본 IPC

  1. 파이프 (Pipe)
    • 부모-자식 프로세스 간 통신
    • 프로세스 종료 시 제거
  2. FIFO (Named Pipe)
    • 관련 없는 프로세스 간 통신 가능
    • 영구적 통신 채널

4.2 System V IPC

  1. 메시지 패싱
    • 프로세스 간 메시지 송수신
    • 주요 함수: msgget(), msgsnd(), msgrcv(), msgctl()
  2. 공유 메모리
    • 여러 프로세스가 메모리 세그먼트 공유
    • 주요 함수: shmget(), shmat(), shmdt(), shmctl()
  3. 세마포어
    • 프로세스 동기화
    • 주요 함수: semget(), semop(), semctl()

4.3 소켓 통신

  1. 소켓의 특징
    • 양방향 통신
    • 포트 번호와 IP 주소에 바인딩
    • TCP 또는 UDP 프로토콜 사용
  2. 소켓 유형
    • UDP 소켓 (SOCK_DGRAM)
      • 비연결형
      • 신뢰성 없음
      • 순서 보장 없음
    • TCP 소켓 (SOCK_STREAM)
      • 연결 지향적
      • 신뢰성 있는 전송
      • 순서 보장

참고 자료

  • UNIX System Programming
  • Advanced Programming in the UNIX Environment
  • TCP/IP Illustrated

댓글남기기