CS지식/운영체제

[운영체제]프로세스 관리

초보개발자.. 2022. 3. 27. 11:45

프로세스 관리

프로세스 생성

 

  • 부모가 자식을 생성(주로 복제 생성 -> 문맥을 그대로 복사하는 개념)
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스가 실행이 되려면 자원(CPU, 메모리, 기타 등등)을 필요로 함
    • 운영체제로부터 받는다
    • 부모와 공유한다
  • 자원의 공유(3가지가 존재하지만 전혀 공유하지 않는 모델이 일반적)
    • 부모와 자식이 모든 자원을 공유하는 모델
    • 일부를 공유하는 모델
    • 전혀 공유하지 않는 모델
      • 프로세스가 생성이 되면 서로 자원을 얻으려고 경쟁을 하기 때문에 전혀 공유하지 않는 모델이 일반적입니다.
  • 수행
    • 부모와 자식은 공존하며 수행되는 모델
    • 자식이 종료될 때까지 부모가 기다리는 모델

 

주소 공간

  • 자식은 부모의 주소 공간을 그대로 복사를 합니다.(운영체제에 있는 data PCB와 같은 자원들도 그대로 복사)
  • 자식은 그 공간에 새로운 프로그램을 올립니다.(복제된 공간에 새로운 것을 올리는 개념)

프로세스의 생성의 과정

①부모 프로세스의 주소를 그대로 복사 후 공간 할당(fork() ) 

②exec()라는 시스템 콜을 통해 새로운 프로그램을 메모리에 올리기(똑같은 프로세스만 복제되면 의미가 없으니)

위의 과정은 독립적이기 때문에 

fork()만 하고 exec()를 안 할 수도 있고, 

fork()를 하고 exec()를 수행한 이후에 새로운 인생을 살아보자?!라는 개념으로 한번 더 exec()를 실행할 수 있습니다.

 

프로세스의 종료

 

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

 

  • 자식이 부모에게 output data를 보냄(via wait) 자식이 항상 먼저 죽음
  • 프로세스의 각종 자원들이 운영체제에게 반납됨

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

  • 자식이 할당 자원의 한계치를 넘어섬(자식 프로세스가 너무 과소비를 한 개념)
  • 자식이 할당된 태스크가 더 이상 필요하지 않음(더 이상시킬 일이 없는..)
  • 부모가 종료하는 경우
    • 운영체제는 부모 프로세스가 종료하는 경우 자식이 더 이상 수행되도록 두지 않는다.

 

fork() 시스템 콜(새로운 프로세스 생성)

운영체제에서의 fork을 C언어로 구현

여기서 궁금한 점.

fork()를 부르면 main()부터 시작해 계속 fork()를 실행시켜 무한히 자식을 생성시키는 것이 아닌가?

이것에 대한 해답은 fork()를 할 때 프로그램 카운터 등 문맥을 그대로 복사함으로 main에서 다시 시작하는 것이 아닌 fork() 다음부터 실행을 하게 됨으로 무한히 자식을 생성시키지는 않습니다.

 

복제본과 오리지널(자식 프로세스와 부모 프로세스)을 구분하기 위한 방법

 

부모는 fork() 함수의 결괏값으로 양수가 얻어지고 자식의 경우 0을 얻습니다.

이것을 통해 복제본인지 자식 프로세스인지 확인할 수 있습니다.

 

 

 

 

 

exec() 시스템 콜(완전히 새로운 프로세스로 덮여 쓰이는 느낌)

왼쪽은 exec()를 호출하는 함수 오른쪽은 exec()에서 date에 대한 내용을 담는 함수

오른쪽에서 새롭게 시작한다는 개념 그래서 한번 exec()로(오른쪽 함수) 가버리면 다시 왼쪽 함수로 돌아오는 것은 불가능.. 

 

fork()와 exec()의 차이점

 

fork()의 결과는 프로세스가 하나 더 생기는 것입니다.(프로세스 id가 완전히 다른 또 하나의 프로세스가 생기는 것입니다.)

 

exec() 실행의 결과로 생성되는 새로운 프로세스는 없고, exec()를 호출한 프로세스의 PID가 그대로 새로운 프로세스에 적용이 되며, exec()를 호출한 프로세스는 새로운 프로세스에 의해 덮어 쓰이게 됩니다.

 

 

 

 

wait() 시스템 콜(잠들게 하는 개념)

 

자식 프로세스가 끝날 때까지 기다리게 하는 시스템 콜

프로세스 A가 wait() 시스템 콜을 호출하면

 

  • 커널은 child가 종료될 때까지 프로세스 A를 sleep 시킨다(block상태)
  • 자식 프로세스가 종료되면 커널은 프로세스 A를 깨운다

 

 

 

 

 

 

 

 

exit() 시스템 콜(프로세스 종료)

자발적 종료

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

비자발적 종료(외부에서 종료시키는 개념)

  • 부모 프로세스가 자식 프로세스를 강제 종료시킴
    • 자식 프로세스가 한계치를 넘어서는 자원 요청
    • 자식이 더 이상 할 일이 없음
  • 키보드로 kill, break 등을 친 경우
  • 부모가 종료하는 경우

 

 

프로세스 간 협력 

 

원칙적으로 프로세스는 독립적입니다. 서로 자원에 대해 경쟁하면서 얻으려고 노력하는 개념경우에 따라서 프로세스끼리 협력을 해야 더 효율적인 경우가 존재하여 프로세스 간 협력 메커니즘이 필요합니다.

프로세스 간 협력 매커니즘(IPC:Interprocess Communication) 크게 두 가지가 존재.

 

①메시지를 전달하는 방법

  • message-passing: 커널을 통해 메시지 전달 메시지들 전달하는 방법 

 

Direct Communication과 Indircet communication은 둘 다 커널을 사용한다는 공통점은 있지만, 누구에게 전달하는지 확실히 표시를 하면 Direct Communication, 명시를 하지 않는다면 Indircet Communication이라고 말할 수 있습니다.

 

 

 

 

②주소 공간을 공유하는 방법

  • shared memory :서로 다른 프로세스 간에도 일부 주소 공간을 공유하게 하는 shared memory 매커니즘이 있음