Post

12 OS - 유닉스

12 OS - 유닉스

1. 유닉스의 탄생과 구성

1. 유닉스의 설계원칙

  • 유닉스는 시분할 시스템과 다중 프로세스를 지원하도록 설계
  • 소형 컴퓨터용 운영체제의 모범 사례로, 설계자(프로그래머)의 편의성을 중시하여 운영체제 크기가 작고 구조가 단순함.
  • 대부분의 알고리즘은 속도나 복잡성보다는 단순성에 초점을 맞춤

    2. 유닉스의특징

  • 대화형 시스템: 사용자가 입력한 명령에 실시간으로 응답함.
  • 다중 사용자 시스템: 여러 사용자가 동시에 시스템을 사용할 수 있음.
  • 다중 작업용 시스템: 여러 프로세스를 동시에 실행할 수 있음
  • 높은 이식성과 확장성: 다양한 하드웨어에 쉽게 적용하고 기능을 확장할 수 있음
  • 계층적 트리 파일 시스템: 모든 파일이 트리 구조로 구성
  • 다양한 부가 기능 제공: 풍부한 명령어와 도구로 자동화와 조합이 가능

3. 커널

  • 커널은 유닉스 운영체제의 핵심
  • 프로세스 관리, 메모리 관리, 파일 시스템, 장치 제어 등 시스템 자원을 초기화하고 제어
  • 응용 프로그램은 시스템 호출(System Call)을 통해 커널에 기능을 요청함
  • 커널의 구성
    • 파일서브시스템 : 메모리 일부를 버퍼로 활용해 디스크 캐시 방식으로 파일을 관리함
    • 프로세서 제어 서브시스템 : 프로세스 동기화, 프로세스 간 통신, 메모리 보호, 스케줄링 및 디스패칭 등을 담당

4. 셀

  • 사용자의 명령을 해석하고 커널에 전달하는 중간자 역할
  • 사용자가 입력한 명령을 문자열로 해석하여 커널의 시스템 호출로 변환함

2. 유닉스의 프로세스의 관리

1. 유닉스 프로세스의 종류

  • 사용자 프로세스: 일반 사용자가 실행하는 애플리케이션 프로세스.
  • 커널 프로세스: 커널 내부에서 동작하며 시스템 자원을 관리하는 프로세스.
  • 데몬 프로세스: 백그라운드에서 실행되며 시스템 서비스를 제공하는 프로세스

2. 유닉스 프로세스의 상태

  • 생성(new): 프로세스가 막 생성된 상태.
  • 준비(ready): 실행 가능하지만 CPU를 아직 할당받지 못한 상태.
  • 실행(running): CPU를 할당받아 명령을 수행 중인 상태.
  • 대기(waiting): 입출력 등 외부 이벤트를 기다리는 상태.
  • 종료(terminated): 실행이 끝나거나 종료 명령으로 소멸된 상태.
  • 좀비(zombie): 종료되었지만 부모 프로세스가 아직 수거하지 않은 상태.

3. 유닉스 프로세스의 구조

  • 상주 테이블
    • 프로세스 테이블: 각 프로세스의 상태, PID, 우선순위 등 정보를 저장.
    • 텍스트 테이블: 실행 코드(텍스트 영역)의 공유 여부, 위치 등을 관리.
  • 사용자 영역
    • 사용자 프로그램의 코드, 데이터, 스택 등이 위치하며 프로세스마다 독립적.
  • 시스템 데이터 구조
    • 파일 디스크립터, 커널 스택, 페이지 테이블 등 시스템이 관리하는 구조로 커널 영역에 위치.

4. 유닉스 프로세스의 스케줄링

  • 시분할 방식을 기반으로 하며 각 프로세스에 일정 시간씩 CPU를 할당.
  • 선점형(Preemptive) 방식으로 높은 우선순위가 낮은 우선순위 프로세스를 중단 가능.
  • 프로세스마다 우선순위(priority)가 존재하며, 커널이 이를 기준으로 스케줄링.
  • 실행 준비 큐(run queue)를 사용해 준비 상태인 프로세스를 관리.
  • CPU 사용 시간을 공정하게 분배하고 시스템 반응 속도를 유지하도록 설계됨.

3. 시스템 호출 인터페이스

1. 파일조작

  • 파일 입출력은 시스템 호출을 통해 커널이 직접 처리함.
  • 시스템 호출을 통해 파일 디스크립터를 받고, 이를 기반으로 모든 조작이 이뤄짐
  • 주요 호출
    • open(): 파일 열기
    • read(): 파일에서 데이터 읽기
    • write(): 파일에 데이터 쓰기
    • close(): 파일 닫기
    • lseek(): 파일 포인터 위치 변경
    • stat(): 파일 정보 조회

2. 프로세스 제어

  • 프로세스 생성, 실행, 종료 등도 커널의 제어하에 이루어짐
  • 유닉스는 fork()와 exec() 조합을 통해 새로운 프로그램 실행을 분리함.
  • 주요 호출
    • fork(): 현재 프로세스를 복제하여 자식 프로세스 생성
    • exec(): 새로운 프로그램을 현재 프로세스에 적재하여 실행
    • wait(): 자식 프로세스의 종료를 대기
    • exit(): 프로세스 종료
    • getpid(), getppid(): 현재/부모 프로세스 ID 조회

3. 시그널

  • 시그널은 프로세스 간 또는 커널과 프로세스 간의 비동기 이벤트 전달 수단
  • 시그널은 예외 처리, 타이머, IPC(프로세스 간 통신) 등에 다양하게 사용됨
  • 주요 호출
    • kill(pid, sig): 특정 프로세스에 시그널 전송
    • signal(sig, handler): 시그널 처리 함수 등록
    • alarm(seconds): 특정 시간 후 시그널 발생 예약
    • pause(): 시그널 수신 대기
  • 대표 시그널
    • SIGINT: 인터럽트(Ctrl+C)
    • SIGKILL: 강제 종료
    • SIGCHLD: 자식 종료 알림

4. 유닉스의 메모리관리

1. 유닉스의 메모리 관리 개요

  • 유닉스는 가상 메모리(Virtual Memory) 기반으로 동작하며, 각 프로세스에 고립된 주소 공간을 제공함.
  • 메모리는 크게 커널 공간과 사용자 공간으로 나눔
  • 사용자 공간에는 코드 영역(텍스트), 데이터 영역, 힙, 스택이 포함
  • 커널은 메모리 보호, 할당, 회수, 스와핑 등을 담당하며, malloc()과 같은 호출은 내부적으로 커널 메모리 관리 루틴을 이용함.

2. 대치

  • 시스템 메모리가 부족할 때 일시적으로 프로세스를 디스크로 내보내는 기법이다.
  • 오래 사용하지 않은 프로세스의 메모리 내용을 보조 저장장치(스왑 공간)에 저장하고, 필요한 시점에 다시 메모리로 불러옴.
  • 대치 대상 선택은 페이지 교체 알고리즘(예: LRU, FIFO 등)을 통해 결정함.
  • 대치는 시스템 반응성을 유지하면서 동시에 많은 프로세스를 실행하기 위한 핵심 기술.

3. 페이징

  • 가상 메모리를 동일한 크기의 페이지로 분할하고, 실제 물리 메모리도 프레임 단위로 관리하는 기법
  • 페이지와 프레임은 보통 4KB 같은 고정 크기로 일치
  • 페이지 테이블이 가상 주소와 물리 주소 간의 매핑 정보를 저장
  • 필요한 페이지가 메모리에 없을 경우 페이지 폴트(page fault)가 발생하고, 디스크에서 해당 페이지를 불러옴
  • 페이징을 통해 프로세스는 연속된 주소 공간처럼 동작하지만 실제 물리 메모리는 단편화 없이 효율적으로 사용함.

5. 유닉스의 파일시스템

1. 디스크 블록의 구조

  • 유닉스 파일 시스템은 디스크를 고정 크기의 블록 단위로 나눠 사용한다.
  • 블록의 종류
    • 부트 블록: 부팅에 필요한 코드 저장
    • 슈퍼블록: 파일 시스템의 전체 정보(크기, 사용량 등) 저장
    • 아이노드 블록: 파일 메타데이터(i-node) 저장
    • 데이터 블록: 실제 파일 데이터 저장

2. 유닉스에서 연속 파일 할당

  • 유닉스는 연속 할당 방식보다 블록 연결 방식(비연속)을 주로 사용
  • 파일은 디스크 내 여러 위치에 분산된 블록으로 저장됨
  • 아이노드는 각 블록의 주소 포인터를 통해 파일을 구성함

3. i 노드의 할당과 반납

  • i-node는 파일의 메타데이터(파일 크기, 소유자, 권한, 블록 주소 등)를 저장하는 구조체
  • 파일 생성 시 새로운 i-node가 할당되고, 삭제 시 반납됨
  • 각 i-node는 고유 번호를 가지며, 파일명은 디렉터리에서 i-node 번호와 연결된다
  • 데이터 블록의 위치는 i-node에 포함된 포인터들이 관리함

4. 유닉스의 디렉터리

  • 디렉터리는 파일 이름과 i-node 번호를 매핑하는 특수한 파일
  • 파일 시스템은 디렉터리를 통해 파일명을 해석하고 해당 i-node를 찾아간다
  • 계층적 구조로 트리 형태를 가지며, 경로 탐색에 사용됨

5. 유닉스의 시스템 파일 테이블

  • 프로세스가 파일을 열면, 커널은 해당 정보를 시스템 전체 파일 테이블에 저장
  • 각 프로세스는 자신의 파일 디스크립터 테이블을 통해 시스템 테이블을 참조
  • 테이블 항목에는 파일 위치, 접근 모드, 참조 횟수 등의 정보가 있음
  • 여러 프로세스가 하나의 파일을 열면 같은 시스템 테이블 항목을 공유

6. 유닉스의 디스크 구조

  • 디스크는 일반적으로 다음과 같은 구조를 가짐
    • 부트 블록
    • 슈퍼블록
    • i-node 영역
    • 데이터 블록 영역
  • 이러한 구조는 파일 시스템의 빠른 탐색과 관리 효율성을 높임
  • 유닉스는 이러한 영역을 고정된 순서와 규칙에 따라 나누어 저장
This post is licensed under CC BY 4.0 by the author.