인프런 공룡책 정리 - Section 02 | CS Study

hoya·2022년 2월 8일
0

CS Study

목록 보기
3/13
post-thumbnail

⚠️ 해당 포스팅은 인프런 공룡책 강의를 듣고 개인적으로 정리하는 글입니다. 정확하지 않은 정보가 있을 수 있으니 주의를 요합니다.

Section 02

Chapter 3 Process


Process Concept

Definition

  • 프로세스는 실행 중인 프로그램을 의미한다.
  • 프로세스는 O/S에서 작업의 단위(unit of work)를 표현하는데 사용된다.
  • 프로세스는 작업을 수행함에 있어 여러 자원이 필요하다.
    -> CPU 점유 시간, 메모리, 파일, I/O 디바이스

Section

  • 프로세스는 기본적으로 여러 섹션으로 구분된다.

  • Text Section : 명령어를 모아놓은 섹션
  • Data Section : 전역변수와 같은 데이터를 모아놓은 섹션
  • Heap Section : 동적 할당 메모리를 모아놓은 섹션 (예 : 자바에서의 new)
  • Stack Section : 함수 호출, 지역 변수와 같은 임시 데이터를 모아놓은 섹션

State

  • 프로세스는 실행되면 여러 상태(state)로 변경된다.
    • new : 프로세스가 생성된 상태를 일컫는다.
    • running : 프로세스가 CPU를 점유, 실행 중인 상태를 일컫는다.
    • waiting : 프로세스 실행을 대기 중으로, I/O 혹은 특정 이벤트의 완료를 기다리는 상태를 일컫는다.
    • ready : 프로세스를 실행할 준비가 완료된 상태를 일컫는다.
    • terminated : 프로세스 실행을 마치고 종료된 상태를 일컫는다.

PCB

  • PCB(Process Control Block)는 프로세스의 모든 정보를 저장해놓은 구조체를 의미한다.
  • 다시 말해, 각각의 프로세스들은 O/S에서 PCB에 의해 모든 정보가 표현된다.
  • PCB가 가지고 있는 정보는 아래와 같다.
    • Process State : 위에서 이야기한 프로세스의 상태를 저장한다.
    • Program Counter : 다음에 실행할 명령어의 주소를 저장한다.
    • CPU registers : CPU 안의 레지스터 정보를 저장한다.
    • Memory-management information : 메모리 정보를 저장한다.
    • Accounting information : 계정 정보를 저장한다.
    • I/O status information : 프로세스에 할당되어 있는 I/O의 정보를 저장한다.

Process Scheduling

Backdrop

  • 프로그램은 기본적으로 하나의 스레드에서 실행이 이루어진다. (Single thread of execution)
  • 이는 곧 따로따로, 오직 하나의 작업만 수행할 수 있음을 의미하고, CPU의 효율 역시 감소한다.
  • 그래서 등장한 것이 바로 멀티 프로그래밍(Multi-Programming)으로, 여러 스레드에서 동시에 실행이 이루어져 CPU의 효율을 높이는 방법이다. (Multiple threads of execution)

⚠️ 여기서 이야기하는 스레드는 우리가 익히 알고 있는 스레드와 다르며, 정말 단순하게 실타래로 직역하는 것이 맞다.

Time Sharing

  • 기본적으로 멀티 프로그래밍의 목적은 동시에 여러 프로세스를 실행함으로서 CPU의 사용 효율을 높이는 것이다.
  • 여기서 나오게 된 시분할(Time Sharing)은, 프로세스를 매우 자주 스위칭하여 사용자의 입장에서는 동시에 실행되는 것처럼 보이게 하는 방법이다.
  • 그렇다면, 프로세스를 실행하고 다음에 어떤 프로세스를 실행할 것인지 결정해야 한다. 그래서 나온 것이 스케줄링이다.

Scheduling Queues

  • 프로세스는 시스템에 들어서면 Ready 큐로 들어가 CPU의 코어에서 실행되기를 기다린다.
  • 프로세스는 I/O 혹은 특정 이벤트의 발생을 대기할 때는 Waiting 큐로 들어가 인터럽트를 기다린다.
  • 스케줄링 큐는 일반적으로 Linked List를 사용하여 구현된다.

Context Switch

  • 프로세스의 컨텍스트는 PCB에 표현되어 있다.
  • 인터럽트가 일어났을 때, 즉 다른 프로세스에게 CPU를 넘기는 단계로 들어섰을 때 시스템은 현 프로세스의 컨텍스트를 저장하고, 나중에 해당 프로세스를 재실행할 때 복구한다.
  • 이렇게 되면, 프로세스가 CPU 실행 상태에서 빠져나왔다 다시 실행되더라도 처음부터 명령어를 실행하는 것이 아니라, 어느 시점에서부터 명령어를 수행해야 하는지 알 수 있게 된다.


Operation on Processes

  • 기본적으로, O/S는 프로세스 생성과 종료에 대한 메커니즘을 반드시 제공해야 한다.
  • 프로세스에서 새로운 프로세스를 생성할 때, 부모 프로세스와 자식 프로세스로 나뉘어진다.
  • 이럴 때, 여러 가능성이 제시된다. 우선 첫 번째로, 실행과 관련된 두 가지 가능성은 아래와 같다.
    • 부모, 자식이 동시에 실행되는 경우
    • 부모가 자식의 종료를 기다리고, 종료되면 남은 명령어를 실행하는 경우
  • 주소공간과 관련된 두 가지 가능성은 아래와 같다.
    • 자식 프로세스가 부모 프로세스의 코드를 그대로 복제하는 경우
    • 자식 프로세스가 새로운 프로그램을 로드하는 경우

Zombie and Orphan

  • 기본적으로 프로세스가 모든 실행을 완료하고 exit() 시스템 콜을 하여 O/S에게 삭제를 요청하면, O/S는 모든 리소스를 회수하고 프로세스를 완전히 종료시킨다.
  • 부모 프로세스는 wait() 시스템 콜을 하여 자식 프로세스가 종료될 때까지 기다릴 수 있고, 부모가 자식의 종료 상태를 얻어 낼 수 있도록 하나의 인자를 전달 받는다. 이 시스템 콜은 부모의 입장에서 어떤 자식이 종료되었는지 구별할 수 있도록 종료된 자식의 프로세스 식별자를 반환한다.
  • 여기서 나오는 개념이 좀비 프로세스와 고아(Orphan) 프로세스이다.
  • 좀비 프로세스 : 자식 프로세스가 종료되었지만, 부모 프로세스가 wait 시스템 콜을 하여 종료 상태를 회수하지 않은 경우를 의미하며, 이 경우 O/S에서 리소스를 낭비하게 된다.
  • 고아 프로세스 : 자식 프로세스보다 부모 프로세스가 먼저 종료되어 부모 프로세스가 없는 경우를 의미하며, 이 경우 새로운 부모 프로세스로 최상위 프로세스인 init 프로세스가 지정되어 문제를 해결하게 된다.

👀 init 프로세스는 주기적으로 wait() 시스템 콜을 하여 고아 프로세스의 종료 상태를 회수한다.

profile
즐겁게 하자 🤭

0개의 댓글