[ 운영 체제 ] Process Management

2025. 4. 12. 01:37개발/💻 CS 지식

 

 

 

프로세스 생성 ( Process Creation )

 

프로세스 생성 개요

-  부모 프로세스가 자식 프로세스 생성
    :  시스템콜을 통해 프로세스가 수행하지 못하는 작업들(PCB 복사, Memory 지정 등)을 수행
-  프로세스의 트리(계층 구조) 형성
-  프로세스는 자원을 필요로 함
    :  ( 1 ) 운영체제로부터 받는다 ( 2 ) 부모와 공유한다
-  자원의 공유
    :  ( 1 ) 부모와 자식이 모든 자원 공유 ( 2 ) 일부를 공유 ( 3 )전혀 공유하지 않음
-  수행
    :  ( 1 ) 부모와 자식이 공존하며 수행되는 모델 ( 2 ) 자식이 종료가 될 때까지 부모가 기다리는(wait, blocked) 모델

 

 

주소 공간(Address Space)

-  자식은 부모의 공간을 그대로 복사함 (binary, OS data) : fork()

-  자식은 필요 시 그 공간에 새로운 프로그램을 덮어씌움 : exec()

 

 

프로세스 종료 ( Process Termination )

-  프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 : exit()

   :  자식이 부모에게 output data를 보냄

   :  프로세스의 각종 자원들이 운영체제에게 반납됨

-  부모 프로세스가 자식의 수행을 종료시킴 : abort()

    :  자식이 할당 자원의 한계치를 넘어섬

    :  자식에게 할당된 태스크가 더 이상 필요하지 않음

    :  부모가 종료하는 경우 -> 단계적 종료 (자식을 먼저 종료시킨 뒤 부모 종료)

 

 

시스템콜 (System Call)

 

fork() 시스템콜

:  새로운 프로세스(자식 프로세스) 생성

 

이때 자식 프로세스는 OS data(code, stack, data)를 그대로 복제하기 때문에

부모 프로세스가 코드를 어디까지 수행했는지에 대한 정보를 가지고 있으며

부모가 실행한 코드의 뒷부분부터 실행한다

 

부모 / 자식 프로세스 구분

:  부모의 process id 는 0보다 크고, 자식의 process id는 0이다

:  이때 process id는 fork()의 반환값을 통해 얻을 수 있다

int main()
{
	int pid;
    pid = fork(); // 자식 프로세스 생성
    
    ///// 자식 프로세스는 여기서부터 코드 실행 //////
    
    if (pid == 0) // 자식 프로세스일 경우
    	print("\nHello I'm child\n");
        
    else if (pid > 0 ) // 부모 프로세스일 경우
    	print("\n Hello I'm parent\n");
}

 

 

exec() 시스템콜

:  새로운 프로그램으로 덮어씌우기

:  보통 자식 프로세스는 fork()로 생성된 뒤 바로 exec()을 통해 새로운 프로그램으로 덮어씌워진다

 

int main()
{
	int pid;
    pid = fork(); // 자식 프로세스 생성
    
    ///// 자식 프로세스는 여기서부터 코드 실행 //////
    
    if (pid == 0) // 자식 프로세스일 경우
    {
    	print("\nHello I'm child\n");
        exelp("/bin/date", "bin/date", (char *)0); // 새로운 프로그램으로 덮어씌우기
    }   
    
    ////// 자식 프로세스는 exelp() 이후의 코드를 실행하지 않음 //////
    
    else if (pid > 0 ) // 부모 프로세스일 경우
    	print("\n Hello I'm parent\n");
}

 

 

wait() 시스템콜

:  자식 프로세스가 종료될 때까지 부모 프로세스를 sleep시키기(blocked 상태)

:  자식 프로세스가 종료되면 부모 프로세스를 다시 깨움(ready 상태)

 

wait()를 안 하면 자식과 부모는 자원을 가지고 계속 경쟁하는 상태,

따라서 자식이 주도적으로 실행되어야 하는 환경에서 부모를 sleep 시키는 것임

 

 

exit() 시스템콜

:  프로세스 종료시키기

 

자발적 종료

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

비자발적 종료

  • 부모 프로세스가 자식 프로세스를 강제 종료시킴
    • 자식 프로세스가 한계치를 넘어서는 자원을 요청할 경우
    • 자식에게 할당된 태스크가 더이상 필요하지 않을 경우
  • 키보드로 kill, break 등을 친 경우
  • 부모가 종료하는 경우
    • 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨

 

 

프로세스 간 협력

 

독립 프로세스

:  일반적으로 서로 다른 프로세스는 자원을 서로 차지하려고 하는 일종의 경쟁 관계

:  또한 각자의 주소 공간을 가지며 다른 프로세스의 수행에 영향을 끼치지 못하되므로 독립적인 관계

 

협력 프로세스

:  서로간의 자원 공유가 필요한 상황이 발생하기도 함

:  이때 프로세스 간 협력이 불가피

 

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

  • Message Passing : 커널을 통해 메시지(공유가 필요한 자원) 전달
    • Direct Communication : 통신하려는 프로세스의 이름 명시적으로 표시 (어떤 프로세스한테 줄건지)
    • Indirect Communication : mailbox(or port)를 통해 메시지를 간접 전달 (아무 프로세스나 들여다 볼 수 있음)
  • Shared Memory : 일부 주소 공간을 공유