[운영체제] 프로세스 관리 1 : 프로세스 생성, 프로세스 종료, fork(), exec(), wait(), exit() 시스템 콜, IPC

드림보이즈·2023년 8월 14일
1

참고강의 : [kocw 반효경 교수 ] http://www.kocw.net/home/search/kemView.do?kemId=1046323

--

프로세스 생성

  • 항상 부모 프로세스가 자식 프로세스를 생성
  • 프로세스의 트리(계층 구조) 형성
  • 프로세스는 자원이 필요하다.
    - 운영체제로부터 받는다.
    -부모와 공유한다.
  • 자원의 공유
    - 모든 자원 공유
    -일부 공유
    -공유 안함
  • 실행(execution)
    - 부모와 자식은 공존하며 수행되는 모델
    - 자식이 종료될 때(terminated) 까지 부모가 기다리는(wait) 모델

모든 프로세스는 부모 프로세스로 부터 자식 프로세스를 생성함으로써 생성된다.
프로세스는 본래 독립적이기에, 부모와 자식의 경우에도 사실상 공유하는 자원은 없다고 생각해도 된다.
부모와 자식 프로세스는 공존하며 둘다 실행될 수도, 자식이 실행되고 끝날 때 까지 부모는 blocked, 기다리는 상태로
프로그램을 짤 수 있겠다.

  • 주소 공간
    - 자식은 부모의 공간을 복사함(binary, OS data)
    - 자식은 그 공간에 새로운 프로그램을 올림
  • UNIX 예시
    - fork() 시스템 콜이 새로운 프로세스 생성 : 부모 그대로 복사하고 주소 공간 할당
    - fork 다음 exec() 시스템 콜로 새로운 프로그램을 메모리에 올림

위에서 말하는 주소 공간은 virtual memory를 말하는 거고,
일단 fork() 복사한다음 exec()를 하면 복사한 공간에 새로운 프로그램을 덮어 씌우는 방식으로
프로세스가 생성된다.

Copy On Write(COW)

컴퓨터 공학에서 굉장히 자주 나오는 용어로, write 할 때 copy를 해서 쓴다는 의미이다.
굳이 새로운 템플릿 만들어서 적는 거 보다, 있던거 복사해서 몇 개 수정하면 더 쉽고 빠르지 않냐. 그 의미다.

프로세스 종료

    1. 프로세스가 마지막 명령을 수행한 후 운영체제에 이를 알려줌 (wait() 시스템 콜)
      - 자식이 부모에게 output data를 보냄(wait() 시스템 콜)
      - 프로세스의 각종 자원들이 운영체제에 반납됨
    1. 부모 프로세스가 자식의 수행을 종료시킴(abort)
      - 자식이 할당 자원의 한계치를 넘어서는 경우
      -자식에게 할당된 태스크가 더이상 필요하지 않을 경우
      -부모가 종료(exit)하는 경우 : 운영체제가 자식이 더 이상 수행 안되도록, 자식의 자식부터 밑에 부터 순차적 종료

프로세스를 종료하는 경우는 크게 2가지이다.

  • 프로그램이 끝나서
  • 부모가 종료시켜서

fork() 시스템 콜


fork() 시스템 콜을 하면 위 코드와 똑같은 내용의 자식 프로세스가 복사되어 생성된다.
다만, 자식 프로세스의 코드 내용은 동일하지만, fork() 다음 코드 부터 실행된다. 또한 PID가 0인점이 부모와 다르다.

exec() 시스템 콜

exec 시스템 콜을 통해 프로세스가 다른 새로운 프로그램으로 바뀐다.
fork를 한 후 exec 한다면 자식 프로세스를 만들고 그 자식이 아예 다른 프로그램으로 바뀌는 거고,
fork 없이 exec 한다면 내 자신이 아예 다른 프로그램으로 바뀌는 것이다.

위 예시에서 fork로 자식 프로세스 생성 후 exec으로 date 프로그램으로 완전히 덮어씌워 질 것이다.

fork 없는 예시를 본다면

그냥 내 자신이 echo 프로그램으로 덮어 씌워질 것이다.
당연히 printf(2)는 영원히 실행되지 않을 것이다. echo 프로그램을 실행할테니까

wait() 시스템 콜

프로세스 A가 wait() 시스템 콜 호출하는 경우

  • 커널은 child가 종료될 때 까지 프로세스 A를 sleep 시킴 (block 상태로)
  • child process가 종료되면 커널을 프로세스 A를 깨운다. (ready 상태로)

exit() 시스템 콜

프로세스의 종료

  • 자발적 종료
    - 마지막까지 실행후 exit() 시스템 콜을 통해 종료 (프로그램에 명시적으로 안 적어도 컴파일러가 끝에 넣어줌)
  • 비자발적 종료
    - 부모가 자식을 강제 종료 시킴 : 자식이 넘치는 자원 요청, 자식에게 할당된 태스크 더 안 필요함
    -키보드로 kill, break 칠 경우
    -부모가 종료하는 경우 : 부모 프로세스 종료하면 자식이 먼저 종료되는 경우

너무 당연한 내용이다.

  • 코드를 끝까지 실행하거나,
  • 부모가 강제 종료 시키거나,
  • 사람이 프로세스를 강제 종료 시키거나,
  • 부모 프로세스가 종료되서 자식이 먼저 종료되거나(밑부터 올라가면서 종료된다고 했다.)

프로세스 간 협력

독립적 프로세스

  • 프로세스는 각자 주소 공간을 가지고 수행되니, 원칙적으로는 다른 프로세스에 영향을 끼치지 못함

협력 프로세스

  • 프로세스 협렵 매커니즘을 통해 다른 프로세스 수행에 영향을 미칠 수 있음

프로세스간 협력 매커니즘(IPC : InterProcess Communication)

  1. 메시지 전달 : message passing : 커널 통해 메시지 전달
  2. 주소 공간 공유
    • shared memory : 서로 다른 프로세스간 일부 주소 공간을 공유하는 매커니즘이 있음

Q. thread는?

  • 동일한 프로세스를 구성하는 thread 간에는 주소 공간을 공유하므로 협력이 가능!

Message passing : 메시지 전달 방법

공유 변수를 일체 사용하지 않고 커널을 통해 통신하는 시스템


프로세스는 독립적이라 서로의 존재를 모르고, 커널은 프로세스들을 관리하니까 커널을 통해 메시지를 전달할 수 있다.
혹은 shared memory 매커니즘으로 (시스템 콜의 일종, 커널이 해줘야) 주소를 공유해 지들끼리 알아서 공유 자원을 쓰게 할 수도 있다.

profile
10년 후 세계 최고 블록체인 개발자

0개의 댓글

관련 채용 정보