프로세스와 프로세스 관리

junto·2024년 3월 11일
0

operating system

목록 보기
2/13
post-thumbnail

프로세스

  • 프로그램이란 단순히 디스크에 존재하는 명령어 모음에 불과하다. 운영체제는 단순한 명령어 모음을 메모리 위에서 실행할 수 있는 상태로 만든다. 이러한 실행 중인 프로그램을 프로세스라고 한다.

프로그램이 실행되기까지

  1. 운영체제는 프로그램 실행을 위해 가장 먼저 프로그램 코드와 정적 데이터를 메모리, 프로세스의 주소 공간에 탑재(load)한다.
  2. 그 후 일정량의 메모리를 프로그램의 실행시간 스택 용도로 할당한다. 또한 프로그램의 힙(heap)을 위한 메모리 공간을 확보한다.
  3. 입출력과 관계된 초기화 작업을 통해 unix에서는 표준 입력(STDIN), 표준 출력 (STDOUT), 표준 에러(STDERR) 세 개의 파일 디스크립터를 갖는다. 이를 이용하여 입력을 받고 화면에 출력하는 작업이 가능하다.
  4. 마지막으로 main 함수를 실행한다.

프로세스는 무엇으로 구성될까?

  • 프로세스 구성 요소를 이해하기 위해서는 하드웨어 상태를 이해해야 한다. 프로그램이 실행되면서 여러 하드웨어 값을 읽고 변경하기 때문이다. 그 중 메모리는 프로그램의 지시 사항과 데이터를 저장하는 공간으로, 프로세스의 실행에 필수적이며, 레지스터는 CPU 내부에 위치하여 명령어의 실행 상태, 프로세스의 현재 위치, 연산 데이터 등을 임시로 저장하는 역할을 한다.
  • 특별한 레지스터
    • 프로그램 카운터(Program Counter, PC): 프로그램의 어느 명령어가 실행 중인지 알려준다.
    • 스택 포인터(Stack Pointer)와 프레임 포인터(Frame Pointer): 함수의 변수와 리턴 주소를 저장하는 스택을 관리할 때 사용한다.

PCB(Process Control Block)

  • 운영체제는 각 프로세스를 관리하기 위해 PCB라는 자료구조를 사용한다. 위에서 언급한 메모리와 CPU 레지스터 정보가 필요하고 운영체제가 관리상 필요한 정보와 파일 관련 정보가 필요하다.
    - 메모리: code, data, stack 위치 정보
    • CPU: program counter, 각종 register
    • 운영체제: process state, process id, scheduling information, priority
    • 파일: open file descriptors, list of open file ...
  • PCB는 구조체로 저장되며 xv6에서 간단한 구현을 볼 수 있다.
sturct 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;       // 현재 인터럽트에 해당하는 트랙 프레임
}

프로세스 상태

  • 실행(Runnig): 실행 상태에서 프로세스는 프로세서에서 실행 중이다. 명령어를 실행하는 중이다.
  • 준비(Ready): 준비 상태에서 프로세스는 실행할 준비가 되어 있지만 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기 중이다.
  • 대기(Blocked): 프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산이다. (입출력 I/O였을 때 동기식 입출력의 경우 프로세스는 입출력이 완료될 때까지 대기 상태가 될 수 있다)
  • 중지(Suspended): 외부적인 이유로 프로세스 수행이 정지된 상태이다. 프로세스는 통째로 디스크에 swap out된다. 자신이 요청한 event가 완료되면 Ready 상태로 바뀌는 Blocked 상태와 달리 외부에서 Resume 해주어야 Active 상태가 된다.

프로세스 전환(Context Switch)

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정을 말한다. CPU를 내어주는 프로세스 상태를 그 프로세스 PCB에 저장하고, CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어온다.

    System call이나 Interrupt 발생은 반드시 Context Switch를 유발하는가?

  • 그렇지 않다. System call이나 Interrupt로 인해 단순히 User Mode -> Kernel Mode -> User Mode로 변경되는 경우에는 문맥 교환없이 User Mode로 복귀한다. (Kernel Mode로 들어가기 전에 context의 일부를 저장하는 것을 미미하다고 본다.)

  • 하지만 I/O 요청 System call이나 timer interrupt 처럼 다른 프로세스로 전환해야 하는 경우에는 프로세스 전환(Context Switch)이 일어난다. (Cache Memory Flush)

프로세스 간 협력(Inter Process Communication)

1. 메시지 전달(Message Passing)

  • 커널을 통해 메시지를 전달한다. 프로세스 사이에 공유 변수(Shared Variable)를 두지 않고 통신하는 구조를 말한다.
  • 직접 통신(Direct Communication)과 간접 통신(Indirect Communication)으로 나눌 수 있으며, 전자는 통신하려는 프로세스를 명시적으로 표시한다. 후자는 Mailbox 또는 port를 통해 간접적으로 통신한다.

2. 메모리 공유(Shared Memory)

  • 프로세스끼리 메모리 영역을 공유하여 상호 간 통신하는 방법이다. 커널은 초기 공유 메모리 영역을 설정할 때만 개입하며, 두 프로세스는 공유 영역에서 자유롭게 통신한다.

쓰레드(Thread)

  • CPU를 점유할 수 있는 최소 실행 단위를 말한다. 한 개의 프로세스에서 하나 이상의 쓰레드가 존재한다.
  • 프로세스와 달리 쓰레드는 하나의 작업 공간 안에서 code, data, heap 공간을 공유하며, 별도의 stack 영역(program counter, register set, stack space)을 가진다.
  • 쓰레드는 다음과 같은 장점을 가진다.
    - 높은 응답성: 하나의 스레드가 block 되어도 나머지 스레드가 실행되어 빠른 처리가 가능하다.
    - 성능 향상: 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율과 성능 향상을 얻을 수 있다.
    - 자원 공유: 스레드는 code, data, heap 공간을 공유하기 때문에 프로세스 생성보다 효율적이다.
  • 커널 스레드와 유저 스레드로 구분할 수 있다. 커널 스레드는 스레드가 여러 개 있다는 사실을 커널이 알고 있으며, 스케줄링의 대상이 된다. 유저 스레드는 커널은 모른 채로 유저레벨에서 라이브러리로 구현되어 관리된다.

참고자료

  • 2014 이화여대 반효경 운영체제 강의
  • 운영체제, 아주 쉬운 세 가지 이야기
profile
꾸준하게

0개의 댓글