[CS스터디]시스템 콜

지영·2023년 5월 29일
0

CS

목록 보기
9/77
post-custom-banner

운영체제에서 active하게 될 때의 작업의 단위인 프로세스, 관리는 어떻게 해야 하는 걸까?

1. 시스템 콜이란,

운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스

여기서는
fork(), exec(), wait()와 같이 프로세스 생성과 제어를 위한 함수를 알아보겠습니다.

1) 프로세스 생성 : fork, exec

2) 프로세스 제어 : wait

2. 시스템 콜이 중요한 이유?

  • 사용자가 직접 커널에 접근을 할 수 없기 때문에 시스템 콜을 활용해야함
  • 보통 해당 시스템 콜을 사용해서 만든 각 언어별 라이브러리(API)를 사용함 → 운영체제의 기능을 호출하는 함수 → 사용자 프로세스가 소프트웨어 인터럽트를 통해 커널을 이용하기 위한 서비스를 요청하는 하나의 방법

3. 각 함수 자세히 보기 📜

1) fork

  • 새로운 프로세스 생성 시 사용하는 함수

    fork()로 생성된 프로세스 : child, 자식 프로세스
    fork()를 실행한 프로세스 : parent, 부모 프로세스

  • child는 parent과 거의 동일한 복사본을 가진다. pid를 제외하고 부모프로세스의 영역 PCB를 포함한 대부분(변수, 스택, 힙)을 공유함.

  • 자식 프로세스가 또 다시 fork()를 하면 손자 프로세스가 생성됨.

  • 부모 프로세스에서 wait()함수가 불려지면 자식 프로세스가 끝날 때까지 기다린 후에 진행

  • 장점

    • 프로세스 생성이 빠름 : 하드디스크에서 새로 프로그램을 가져오는 것이 아니라 기존 메모리에서 복사하기 때문에 생성 속도가 빠름
    • 추가 작업 없이 자원을 상속할 수 있음 : 부모 프로세서가 사용하던 모든 자원을 추가 작업 없이 자식 프로세스에 상속됨
    • 시스템 관리를 효율적으로 할 수 있음 : 자식 프로세스 구분자, 부모 프로세스 구분자로 자식과 부모가 연결되어 있음 -> 자식 프로세스가 종료되면 자식이 사용하던 자원을 부모 프로세스가 정리할 수 있음.(즉 자식 프로세스의 자원 정리를 부모 프로세스에게 맡김)
  • ✔️ fork가 사용되는 목적

    • 동일한 프로세스의 내용을 여러 번 동작하고 싶을 때!

2) exec

  • 프로세스는 그대로 둔 채 내용만 변경하는 기능

  • ✔️ exec를 사용하는 목적

    • exec를 실행한 프로세스는 완전히 다른 프로세스로 변화함
    • 자식 프로세스에서는 부모 프로세서와 다른 동작을 하고 싶을 때
    • 프로세스의 구조체를 재활용하기 위함
기존방법exec 사용
* 새로운 프로세스를 만들기 위해서는 PCB가 필요, 메모리 자리 확보프로세스 종료 후에는 사용한 메모리를 청소하기 위해 상위 프로세스와 부모-자식 관계를 생성해야 함이미 만들어진 PCB, 메모리, 부모-자식 관계 재활용할 수 있음, 기존 코드 영역에 있는 것을 지우고 새로운 코드 영역만 가져오면 됨. 또한 데이터 영역이 새로운 변수로 채워지고, 스택 영역이 리셋됨, 그 외에 프로그램 카운터 레지스터 값 & 각종 레지스터 & 사용한 파일 정보 리셋


3) wait

  • 자식 프로세스가 종료 상태를 얻기 위해 기다리는 작업
  1. 자식 프로세스가 동작 중이면 호출 차단이 차단되기 때문에 상태를 얻어올 때까지 대기

  2. wait() 함수 호출자(=부모프로세스)가 시그널을 받을 때까지 대기

  3. 자식 프로세스가 종료된 상태라면 즉시 호출이 반환되어 상태를 얻음, 이 때 wait() 함수는 자식 프로세스의 프로세스 ID를 반환

  4. 자식 프로세스가 없다면(비정상) 호출이 즉시 반환되며, 에러값을 반환

1) 부모가 자식 프로세스보다 먼저 종료되면? -> 고아 프로세스
- 이때 init 프로세스(부팅 과정 중 생성되는 최초의 프로세스)가 새로운 부모로 되며 고아 프로세스를 종료시키기 위해 wait 함수를 대신 호출

2) 자식 프로세스가 종료되었는데도 부모가 종료 상태를 보고받지 못하면 ? -> 좀비 프로세스
- 인자값(종료상태)를 부모에게 전달되기 위해서는 부모 프로세스가 운영체제게 함수호출로 요청해야 함 (방법 : wait()함수를 사용하면 자식 프로세스가 전달한 값을 부모 함수가 거둬감)
- 부모 프로세스가 요청하지 않으면 자식 프로세스가 좀비 프로세스가 됨

profile
꾸준함의 힘을 아는 개발자📍
post-custom-banner

0개의 댓글