[운영체제] Chapter 4. Process Management 1,2

조희연·2022년 1월 5일
0

Study

목록 보기
5/15
post-thumbnail

강의 주소 : 이화여대 반효경 교수님 운영체제 강의 (2014년)

Chapter 4. Process Management 1,2

4.1 프로세스 생성


  • 부모 프로세스가 자식 프로세스를 복제 생성(예 : fork()) : 프로그램 카운터와 문맥 모두 복제
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스는 자원을 필요로 함 : OS로부터 받음 & 부모와 공유
  • 자원의 공유
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델
  • 수행
    • 부모와 자식이 공존하며 수행되는 모델
    • 자식이 종료될 때까지 부모가 기다리는 모델
  • 주소 공간
    • 자식은 부모의 공간을 복사함
    • 자식은 그 공간에 새로운 프로그램을 올림(덮어씌움)(예 : exec())

Copy-on-write(COW)
부모와 자원(code, data, stack)을 공유하다가 write가 발생할 때, 부모의 자원을 copy해 독립적으로 가지는 것(이전까지는 부모의 것을 공유)

4.2 프로세스 종료


  • 프로세스가 마지막 명령을 수행한 후 OS에게 이를 알려줌(exit)
    • 자식이 부모에게 output data를 보냄(wait)
    • 프로세스의 각종 자원들이 OS에게 반납됨
  • 부모 프로세스가 자식의 수행을 강제로 종료시킴(abort)
    • 자식이 할당 자원의 한계치를 넘어섬
    • 자식에게 할당된 태스크가 더 이상 필요하지 않음
    • 부모가 종료하는 경우 : OS는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않음

4.3 fork() 시스템 콜 : create a child(copy)


  • 부모 프로세스가 자식 프로세스를 만들어 달라고 OS에 요청
  • 부모와 자식 구분 방법 : fork()의 return value가 다름(부모는 양수, 자식은 0)
int main() {
	int pid;
    printf("Hello, everyone\n");
    pid = fork();
    if(pid == 0) {
    	printf("Hello, I am child\n");
    } else if(pid > 0) {
    	printf("Hello, I am parent\n");
    }
}
  • 위의 코드를 가진 부모 프로세스가 fork()를 할 경우, 프로그램 카운터도 복제되었기 때문에 자식 프로세스는 pid = fork()의 이후 코드부터 실행한다.

-> 부모 프로세스는 Hello, everyone -> Hello, I am parent 출력
-> 자식 프로세스는 Hello, I am parent 출력

4.4 exec() 시스템 콜 : overlay new image


  • 프로세스가 새로운 프로그램으로 태어나게 하는 역할
  • 한 번 exec() 되면 되돌아 올 수 없음
int main() {
	printf("1");
    execlp("echo", "echo", "3", (char *) 0);
    printf("2");
}

-> 1 출력
-> echo라는 프로그램으로 덮어씌어짐 : 3 출력
-> 종료

4.5 wait() 시스템 콜 : sleep until child is done


  • 프로세스가 wait() 시스템 콜을 호출하면, 커널은 child가 종료될 때까지 프로세스를 sleep 시킴(block 상태)
  • child process가 종료되면 커널은 프로세스를 깨움(ready 상태)

4.6 exit() 시스템 콜 : frees all the resources, notify parent


1. 자발적 종료

  • 마지막 statement 수행 후 exit() 시스템 콜을 통해 프로그램에 명시적으로 적어주지 않아도 main 함수가 리턴되는 위치에 컴파일러가 넣어줌

2. 비자발적 종료

  • 부모 프로세스가 자식 프로세스를 강제 종료시킴
  • 키보드로 kill, break 등을 친 경우
  • 부모가 종료하는 경우 : 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

4.7 프로세스 간 협력


1. 독립적 프로세스
프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함

2. 협력 프로세스
프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음

프로세스 간 협력 메커니즘(IPC : Interprocess Communication)

  • 메시지를 전달하는 방법(message passing) : 커널을 통해 메시지 전달

    • Direct Communication : 통신하려는 프로세스의 이름을 명시적으로 표시
    • Indirect Communication : mailbox(또는 port)를 통해 메시지를 간접 전달
  • 주소 공간을 공유하는 방법(shared memory) : 서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음

-> thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 process를 구성하는 thread 간에는 주소 공간을 공유하므로 협력이 가능하다.

4.8 CPU & I/O Bursts in Program Execution


프로그램은 CPU와 I/O Bursts의 연속이지만 종류에 따라 빈도와 길이가 다르다.

-> 여러 종류의 job(프로세스)이 섞여 있기 때문에 CPU 스케줄링이 필요하다.

  • Interactive job에게 적절한 response 제공 요망
  • CPU와 I/O 장치 등 시스템 자원을 골고루 효율적으로 사용

4.9 프로세스 특성 분류


I/O bound process

  • CPU를 잡고 계산하는 시간보다 I/O에 많은 시간이 필요한 job
  • many short CPU bursts

CPU bound process

  • 계산 위주의 job
  • few very long CPU bursts

4.10 CPU Scheduler & Dispatcher


운영체제에서 수행하는 기능(코드)

CPU Scheduler

  • Ready 상태의 프로세스 중에서 CPU를 줄 프로세스를 고름
  • OS 안에 CPU scheduling을 하는 코드가 있음

Dispatcher

  • CPU의 제어권을 CPU scheduler에 의해 선택된 프로세스에게 넘김
  • 이 과정을 context switch(문맥 교환)라고 함

CPU 스케줄링이 필요한 경우는 프로세스에게 다음과 같은 상태 변화가 있는 경우이다.
1. Running -> Blocked(예 : I/O 요청하는 시스템 콜)
2. Running -> Ready(예 : 할당시간 만료로 timer interrupt)
3. Blocked -> Ready(예 : I/O 완료 후 interrupt)
4. Terminate

-> 1, 4 : nonpreemptive(강제로 빼앗지 않고 자진 반납)
-> All other scheduling : preemptive(강제로 빼앗음)

profile
Software Engineer

0개의 댓글