OS - "운영체제 아주 쉬운 세 가지 이야기" 정리노트 - 2. 가상화 - 1. 프로세스의 개념

송준섭 Junseop Song·2023년 6월 29일
0

운영체제

목록 보기
2/5
post-thumbnail

⛳️ 목적

이 글은 "운영체제 아주 쉬운 세 가지 이야기" 책을 읽고 공부한 내용들을 두고두고 보기 위해 정리하는 글이다.
읽을 때마다 그 날의 내용들을 꾸준히 이어서 업데이트 할 예정이다.


🗓️ 2023.06.29 작성 ▽

2. 가상화

운영체제의 세 주제중 첫 번째인 가상화

2-1. 프로세스 개념

📌  프로세스

❗️ 프로세스
실행 중인 프로그램으로 정의
프로그램은 디스크 상에 존재하며 실행을 위한 명령어와 정적 데이터의 묶음
이 명령어와 데이터 묶음을 읽고 실행하여 프로그램에 생명을 불어넣는 것이 운영체제

컴퓨터들은 동시에 수십 혹은 수백 개의 프로세스를 실행하는 것처럼 보임
실제로는 한 개의 CPU만 있지만 각 프로그램은 자신만의 CPU를 가지게 되었다고 착각함
-> 운영체제의 CPU 가상화

❓ 핵심 질문: CPU가 여러 개 존재한다는 환상을 어떻게 제공하는가


🗓️ 2023.06.30 작성 ▽

운영체제는 하나의 프로세스를 실행하고, 얼마 후 중단시키고 다른 프로세스를 실행하는 작업을 반복하면서 실제 하나 또는 소수의 CPU로 여러 개의 가상 CPU가 존재하는 듯한 환상을 만들어 냄
-> 시분할(time sharing) 기법
CPU를 공유하므로 각 프로세스의 성능은 낮아짐

CPU 가상화의 효율적 구현을 위해서는 '도구(메커니즘)'와 '지능(정책)'이 필요

메커니즘은 필요한 기능을 구현하는 방법
ex) 문맥 교환 (CPU에서 프로그램 실행을 잠시 중단하고 다른 프로그램을 실행하는 것)

정책은 운영체제에서 어떤 결정을 내리는 데 사용되는 알고리즘
ex) 스케줄링 정책 (다수의 실행 가능한 프로그램이 존재할 때, 운영체제는 어떤 프로그램을 선택해서 실행시켜야 하는가?)


📌  프로세스의 개념

프로세스란 운영체제가 실행 중인 프로그램
특정 순간의 프로세스를 표현하자면 실행되는 동안 접근했거나 영향을 받은 자원의 목록

프로세스의 구성 요소를 이해하기 위해서는 하드웨어 상태를 이해해야 함

하드웨어 상태 종류

  • 메모리 (주소 공간)
    하드웨어 상태 중 가장 중요한 구성 요소
    명령어 및 실행 프로그램이 읽고 쓰는 데이터가 저장되는 장소

  • 레지스터
    명령어들은 레지스터를 직접 읽거나 갱신
    레지스터들 중 특별한 레지스터들이 존재

    • 프로그램 카운터 (명령어 포인터)
      프로그램의 어느 명령어가 실행중인지
    • 스택 포인터, 프레임 포인터
      함수의 변수와 리턴 주소를 저장하는 스택을 관리할 때 사용
  • 영구 저장장치
    프로세스가 현재 열어 놓은 파일 목록을 가지고 있음

정책과 구현(메커니즘)의 분리
다수의 운영체제들이 공통적으로 채택하고 있는 설계 패러다임
메커니즘: "어떻게" vs 정책: "어느 것을"
둘을 분리하면 정책을 변경할 때 기법의 변경을 고민하지 않아도 됨
일반적인 소프트웨어 설계 원칙인 모듈성의 한 형태


📌  프로세스 API

운영체제가 반드시 API로 제공해야 하는 기능들

  1. 생성 (Create)
    새로운 프로세스를 생성할 수 있는 방법을 제공해야 함
    쉘에 명령어를 입력하거나, 응용 프로그램의 아이콘을 더블 클릭하여 프로그램을 실행시키면 운영체제는 새로운 프로세스를 생성

  2. 제거 (Destroy)
    프로세스를 강제로 제거할 수 있는 인터페이스를 제공해야 함
    필요없는 프로세스를 중단시키는 API

  3. 대기 (Wait)
    어떠한 프로세스의 실행 중지를 기다리는 여러 종류의 대기 인터페이스를 제공해야 함

  4. 각종 제어 (Miscellaneous Control)
    프로세스 제거, 대기 이외에 여러 가지 제어 기능들을 제공해야 함
    ex) 프로세스를 일시정지하거나 재개하는 기능

  5. 상태 (Status)
    프로세스 상태 정보를 얻어내는 인터페이스를 제공해야 함
    프로세스가 얼마 동안 실행되었는지 또는 어떤 상태에 있는지 등이 포함


📌  프로세스 생성

프로그램이 어떻게 프로세스로 변형되는가?
운영체제는 어떻게 프로그램을 준비하고 실행시키는가?
실제로 어떻게 프로세스를 생성하는가?

프로그램을 실행하기 위하여 운영체제가 하는 첫 번째 작업은 프로그램 코드와 정적 데이터를 메모리, 프로세스의 주소 공간에 탑재하는 것
프로그램은 디스크 또는 플래시 기반 SSD에 특정 실행 파일 형식으로 존재
디스크의 해당 바이트를 읽어서 메모리의 어딘가에 저장해야 함

초기 운영체제: 프로그램 실행 전에 코드와 데이터를 모두 메모리에 탑재
현대 운영체재: 프로그램을 실행하면서 코드나 데이터가 필요할 때 필요한 부분만 메모리에 탑재
-> 코드와 데이터의 늦은 탑재의 동작을 정확히 이해하기 위해서는 페이징(paging)스와핑(swapping) 동작의 이해가 필요 (추후 설명)

코드와 정적 데이터가 메모리에 탑재된 후 프로세스를 실행시키기 전에 운영체제는 특정 크기의 메모리 공간이 프록램에 스택(stack) 용도로 할당되게 함
ex) C 프로그램에서 지역 변수, 함수 인자, 리턴 주소 등을 저장하기 위해 스택을 사용, 운영체제는 스택을 주어진 인자로 초기화 (특히 main() 함수의 인자인 argc, argv 벡터를 사용하여 스택을 초기화)


🗓️ 2023.07.03 작성 ▽

운영체제는 프로그램의 힙(heap)을 위한 메모리 영역을 할당

여기서 힙은 동적으로 할당된 데이터를 저장하기 위해 사용
힙은 주로 연결 리스트, 해시 테이블, 트리 등 크기가 가변적인 자료구조를 위해 사용됨
이때 프로그램은 필요한 메모리 영역을 요청하고, 사용 후 반환하여 다른 프로그램이 사용할 수 있도록 함

운영체제는 또한 입출력과 관계된 초기화 작업을 수행

이렇게 코드와 정적 데이터를 메모리에 탑재하고, 스택과 힙을 생성하고 초기화하며, 입출력 셋업과 관계된 작업을 마치게 되면 운영체제는 프로그램 실행을 위한 준비를 마치게 됨
프로그램을 실행할때 운영체제는 CPU를 새로 생성된 프로세스에게 넘기게 되고 프로그램 실행이 시작


📌  프로세스 상태

프로세스의 상태를 단순화 하면 실행, 준비, 대기 상태 중 하나에 존재할 수 있음

  • 초기(Initial)
    프로세스가 완전히 생성되기 전까지의 상태
  • 실행(Running)
    실행 상태에서 프로세스는 프로세서에서 실행 중
    프로세스는 명령어를 실행하고 있음
  • 준비(Ready)
    준비 상태에서 프로세스는 실행할 준비가 되어 있지만 운영체제가 다른 프로세스를 실행하고 있는 등의 이유로 대기 중
  • 대기(Blocked)
    프로세스가 다른 사건을 기다리는 동안 프로세스의 수행을 중단시키는 연산
    ex) 프로세스가 디스크에 대한 입출력 요청을 하였을 때 프로세스는 입출력이 완료될 때까지 대기 상태가 되고, 다른 프로세스가 실행 상태가 됨
  • 최종(Final)
    프로세스가 종료되었지만 사용된 자원들이 아직 반납되지 않은 상태

프로세스는 준비 상태와 실행 상태를 운영체제의 정책에 따라 이동
운영체제의 스케줄링 정책에 따라 해당 차례의 스케줄이 되면 준비 상태에서 실행 상태로 전이
실행 상태에서 준비 상태로의 전이는 나중에 다시 스케줄이 될 수 있다는 의미
대기 상태가 되면 요청 완료 등의 이벤트가 발생할 때까지 대기 상태로 유지
이벤트가 발생하면 프로세스는 다시 준비 상태로 전이되고 운영체제의 결정에 따라 바로 다시 실행될 수도 있음


📌  자료 구조

운영체제도 일종의 프로그램이므로 다양한 정보를 유지하기 위한 자료 구조를 가지고 있음
ex) 프로세스 상태를 파악하기 위해 준비 상태의 프로세스들을 프로세스 리스트와 같은 자료 구조로 유지
또한 실행 중 및 대기 중 프로세스를 명시하기 위한 부가적인 자료구조도 유지
문맥 교환이라고 알려진 기법에 사용되는 레지스터 문맥이라는 자료 구조도 존재


📌  요약) 프로세스 관련 주요 용어

  • 프로세스
    실행 중인 프로그램을 나타내는 개념
    프로세스의 상태, 프로세스 주소공간에 있는 메모리 변수 값들, 레지스트 값들(스택 포인터, 프로그램카운터 등), 그리고 입출력 관련 정보(사용중인 파일들)들로 표현됨

  • 프로세스 API
    프로세스와 관련된 함수들
    프로세스의 생성, 삭제 등에 관련된 함수들

  • 프로세스 상태
    실행, 준비, 대기 등
    특정 사건의 발생(CPU 할당, CPU 반납, 입출력 요청 등)으로 프로세스의 상태가 변화할 수 있음

  • 프로세스 리스트
    시스템에 존재하는 모든 프로세스에 대한 정보를 가짐
    이 리스트의 각 노드는 프로세스 제어블럭

0개의 댓글