2 minute read

가상화

  • 운영체제는 하나의 프로세스를 실행한 후, 얼마 후 중단시키고 다른 프로세스를 실행하는 작업을 반복하면서 여러 개의 가상 CPU가 존재하는 것처럼 보이게 한다. 이를 시분할 기법(time sharing)이라고도 부른다.
  • CPU를 공유할수록 각 프로세스의 성능은 낮아진다.

가상화 구현

  • 가상화를 잘 구현하기 위해서 운영체제는 저수준 도구와 고차원의 지능이 필요하다.
  • 저수준 도구를 메커니즘(mechanism)이라 한다.
    • 메커니즘은 필요한 기능을 구현하는 방법이나 규칙을 의미한다.
      • ex) 문맥 교환(context switch)
  • 운영체제의 지능은 정책(policy)형태로 표현된다.
    • 정책이란 어떤 결정을 내리기 위한 알고리즘이다.
      • ex) 스케줄링 정책(scheduling policy)

프로세스

프로세스 개념

  • 프로세스(process)란 실행 중인 프로그램을 말한다.
  • 프로그램이 실행되는 동안 하드웨어 상태를 읽거나 갱신할 수 있다.
  • 프로세스의 구성 요소를 이해하기 위해서는 하드웨어 상태(machine state)를 이해해야 한다.
    • 메모리(memory): 명령어는 메모리에 저장된다.
    • 레지스터(register): 많은 명령어들이 레지스터를 직접 읽거나 갱신한다.
      • 프로그램 카운터(program counter, PC): 프로그램의 어느 명렁어가 실행 중인지를 알려준다.
      • 스택 포인터(stack pointer), 프레임 포인터(frame pointer): 함수의 변수와 리턴 주소를 저장하는 스택을 관리할 때 사용하는 레지스터이다.
    • 영구저장장치(disk)

프로세스 API

  1. 생성(Create): 운영체제는 새로운 프로세스를 생성할 수 있는 방법을 제공한다.
    • ex) fork(), …
  2. 제거(Destroy): 프로세스를 강제로 제거할 수 있는 인터페이스를 제공해야 한다.
    • ex) kill(), …
  3. 대기(Wait): 때론 어떤 프로세스의 실행 중지를 기다릴 필요가 있기에 여러 종류의 대기 인터페이스가 제공된다.
    • ex) wait(), …
  4. 각종 제어(Miscellaneous Control): 프로세스를 일시 정지하거나 재개하는 기능을 제공한다.
    • ex) pause(), sleep(), kill(), …
  5. 상태(Status): 프로세스 상태 정보를 얻어내는 인터페이스도 제공된다.
    • ex) getpid(), …

프로그램이 어떻게 프로세스로 변형되는가?

  1. 운영체제는 프로그램 코드(code)정적 데이터(static data)를 메모리, 프로세스의 주소 공간에 탑재(load)하는 것이다.
    • 초기 운영체제는 프로그램 실행 전 모두 메모리에 탑재하였지만, 최근 운영체제는 이 작업을 늦추고, 필요한 부분만 메모리에 탑재한다.
    • 페이징(paging)과 스와핑(swapping)동작의 이해가 필요하다.
  2. 운영체제는 일정량의 메모리를 프로그램의 실행시간 스택(run-time stack, 스택)용도로 할당시킨다. 운영체제는 스택을 주어진 인자로 초기화한다. argc, argv 벡터를 사용하여 초기화한다.
  3. 운영체제는 힙(heap)을 위한 메모리 영역을 할당한다.
  4. 운영체제는 입출력과 관계된 초기화 작업을 수행한다. Unix 시스템에서 각 프로세스는 표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러(STDERR) 장치에 해당하는 세 개의 파일 디스크립터(file descriptor)를 갖는다.
  5. 운영체제는 프로그램의 시작 지점(entry point), main()에서부터 실행을 시작한다.

프로세스 상태

Screen Shot 2022-12-10 at 5 24 45 PM

  1. 실행(Running): 프로세스는 프로세서에서 실행 중이다. 명령어를 실행하고 있다.
  2. 준비(Ready): 프로세스는 실행할 준비가 되어 있지만 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기 중이다.
  3. 대기(Blocked): 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산이다. ex) 프로세스는 입출력 요청을 하였을 때 입출력이 완료될 때까지 대기 상태가 되고, 다른 프로세스가 실행 상태로 될 수 있다.

자료구조(Process Control Block, PCB)

Screen Shot 2022-12-10 at 5 53 35 PM

  • process control block은 어디에 있는 걸까?
    • OS 메모리 영역data부분에 있다.
  • xv6 kernel
    1. 프로세스 상태(process state)
    2. 프로세스 식별자(process id)
    3. 레지스터 컨텍스트(register context)
      • 프로세스가 중단되었을 때 해당 프로세스의 레지스터값들을 저장한다. 이후 이를 복원하여 재개할 수 있다.
    4. 레지스터(program counter, stack pointer …)
    5. 프로세스의 시작 주소
    6. 프로세스 커널 스택의 바닥 주소
    7. 프로세스 컨텍스트 정보
    8. 부모 프로세스에 대한 포인터
      struct context {
        int eip;
        int esp;
        int ebx;
        int ecx;
        int edx;
        int esi
        int edi;
        int ebp;
      }
      
      enum proc_state { UNUSED, EMBRYO, SLEEPING,
                 RUNNABLE, RUNNING, ZOMBIE };
      
      struct proc {
        char *mem;                  // 프로세스 메모리 시작 주소
        uint sz;                    // 프로세스 메모리의 크기
        char *kstack;               // 프로세스의 커널 스택의 바닥 주소
        enum proc_state state;      // 프로세스의 상태
        int pid;                    // 프로세스 ID
        struct proc *parent;        // 부모 프로세스
        void *chan;                 // 0이 아니면 chan에서 수면
        int killed;                 // 0이 아니면 종료됨
        struct file *ofile[NOFILE]; // 열린 파일
        struct inode *cwd;          // 현재 디렉터리
        struct context context;     // 프로세스를 실행시키려면 여기로 교환
        struct trapframe *tf;       // 현재 인터럽트에 해당하는 트랩 프레임
      }
      

참고 자료

  • 운영체제(공룡책)
  • kocw 반효경, 운영체제와 정보기술의 원리
  • 운영체제: 아주 쉬운 세 가지 이야기