[CS] 운영체제 2강

tpwhzla·2023년 3월 22일
0

CS

목록 보기
8/11

운영체제 2강


프로세스

프로세스의 개요

실행 중인 프로그램을 의미한다.

흔히, Ctrl + alt + delete를 이용하여 프로그램을 강제 종료 시킬 때 사용하는 작업 관리자를 보면 실행중인 프로그램이 나오는데, 앱 부분에 나온 프로그램들이 사용자가 실행시킨 프로세스이다.

각 앱마다 할당되는 메모리, 디스크, CPU, 네트워크의 값들이 있고, 작업 관리자에는 각 프로세스들에게 얼마만큼의 컴퓨터 자원을 할당했는지 표시된다.


PID는 프로세스 아이디로서, Hwp.exe파일을 2개 실행시켰을 때 중복된 파일을 표시할 수 없어 프로세스 각각의 ID가 있다.
사용자는 어떤 사용자가 실행 시켰는지를 표시한다, (SYSTEM 항목은 말 그대로 시스템에서 실행된 프로세스)

프로세스 자체는 프로그램 사이즈보다 훨씬 크다(참고)

⭐ 프로그램 : 동작을 하지 않는 정적, 수동적 개체
⭐ 프로세스 : 동작을 하는 능동적 개체

저장 장치에 저장되어 있던 프로그램이 어떻게 동작을 하는 능동적 개체가 될까?
= > 운영체제로부터 자원을 할당 받아 동작하게 된다.

  • 자원 : CPU, 메모리, 입출력장치, 파일 등
  • 동작 : CPU가 프로세스의 명령을 실행

운영체제(프로세스 관리자)가 처리하는 작업

  1. 프로세스를 생성 및 종료한다.
  2. 프로세스를 실행시키기 위한 스케줄링 작업을 실행한다.
  3. 프로세스의 상태를 관리한다.
    ex) 프로그램이 대기중인지, 실행 중인지, 종료 되었는지 등

프로세스의 구성

프로세스는 정적인 프로그램을 동적으로 실행시키는 것이다.

메모리 구조

프로그램 실행에 직접적으로 필요한 코드와 데이터

코드 영역 : int a, a = 4 printf("%d\n", a); 등등...

데이터 영역
프로그램을 실행할 때 필요한 데이터들을 보관한다

  • 프로그램 실행 시 필요한 데이터들 (상수나 변수의 값)
  • 서브 프로그램 호출 상태 등

데이터 영역은 또 다시 정적 데이터 영역, 스택 영역, 힙 영역으로 나뉘게 된다.

  1. 정적 데이터 영역
    상수나 변수의 값, 프로그램 시작과 끝까지 항상 보관해야 하는 값

  2. 스택 영역
    서브 프로그램(전역변수) 등 호출상태 말 그대로 스택처럼 쌓이게 된다.

  3. 힙 영역
    동적 변수들 중에서 사용자가 수동으로 할당하는 것들을 의미한다. (Malloc, Calloc)
    malloc(int *)sizeof(int) = int의 크기인 4바이트만큼(윈도우 기준) Heap에 메모리를 할당한다.

정적이었던 프로그램이 실행 가능한 프로그램이 되려면, 코드 + 데이터까지 필요!

프로세스 제어 블록(Process control block : PCB)

운영체제가 프로세스를 관리하기 위해 필요한 정보

  • 프로그램 카운터 : 코드 영역에서 코드가 실행되고 있을 때(명령어가 실행되고 있을 때) 다음 명령어는 어떤 것을 처리할지? 어떤 순서인지?를 구분할 수 있는 영역

  • 레지스터 : CPU에서 사용하는 여러 레지스터 값들을 저장할 수 있는 공간.
    ⭐ 일반적으로는 CPU 내부에 레지스터를 보관하고 있는데, 굳이 왜 PCB에 필요할까?

    만약 프로세서가 동작 중 CPU를 다른 프로세서에게 넘겨줄 일이 있다면, 현재 레지스터의 값들을 모두 PCB에 저장시키고, 다시 CPU를 사용할 일이 생기면 모든 레지스터들을 다 CPU에 저장시킨다.

  • 메모리 관리 정보

  • 프로세스의 우선 순위 (프로세스 스케줄링 결과를 저장한다.)

프로세스 제어 블록 (PCB)는 각 프로세스마다 존재하며, 여러 프로세스가 번갈아 실행되는 경우 PCB에 저장된 정보를 활용한다.

프로세스 상태 관리

  1. 생성 단계 : 처음 작업이 시스템에 주어진 상태
    ex) 바탕화면에서 hwp.exe를 실행 시켰을 때
    프로세스를 실행 시키려면?
    1-1. 프로세스를 실행 시키기 위해 PCB를 만들어낸다.
    1-2. PID가 몇 번인지? 어떤 상태인지 알려준다.
    1-3. 메모리를 할당시킨다.
    1-4. hwp.exe 실행에 필요한 코드를 읽어 온다
    1-5. 데이터 영역에서 읽어온다.
    1-6. PCB상에 메모리 구조를 모두 읽어온다.

  2. 준비 단계 : 실행 준비가 되어 CPU 할당을 기다리는 상태
    1-1. 준비 큐에 CPU 할당을 기다리는 상태

  3. 실행 : 프로세스가 처리되는 상태
    1-1. 명령어를 처리시킨다.
    1-2. PCB를 실행 상태로 바꾼다.

  4. 대기 상태 : 프로세스가 In and out 작업이 끝날 때까지, 또는 특정 자원을 할당받을 때까지 보류되는 상태

  5. 종료 : 프로세스가 더 이상 실행되지 않도록 끝난 상태

프로세스 상태 변화

최초에, 프로세스가 생성 단계에 있다가 PCB,메모리 구조가 준비되면 준비 큐에 들어가게 된다.
따라서, 생성에서는 준비 단계로밖에 갈 수가 없다.

준비 큐에서 준비를 하다가, CPU에서 할당 받게 되는 것을 디스패치라고 표현한다.
다만, 실행 중 CPU 할당 시간이 만료될 경우 준비 상태로 돌아가게 되어 기다려야 한다.

따라서, 할당시간이 만료되었을 경우 실행에서 준비 단계로 돌아갈 수 있다.

실행 과정에서 이벤트가 발생하여 CPU를 사용할 수 없다면, 대기 상태로 돌아가게 된다.

대기 상태에서 CPU의 이벤트가 끝나게 되면 다시 준비 상태로 돌아가게 되고, 다시 준비 큐에서 실행할 수 있게 된다.

실행 상태가 완전히 끝났을 때, 종료 상태로 돌아가게 되는데, 프로그램 실행에 치명적인 오류가 발생하는 경우 프로그램이 종료 상태가 된다.

부모 프로세스와 자식 프로세스

프로세스 생성 방법

  1. 사용자가 프로그램을 직접 실행
  2. 한 프로세스가 다른 프로세스를 생성
    프로세스 생성 시스템 호출 이용
    부모 프로세스 : 시스템 호출을 하는 프로세스
    자식 프로세스 : 시스템 호출을 통해 새로 생성된 프로세스

⭐ 부모 프로세스
이미 존재하는 부모 프로세스가 시스템 호출을 하여, 자식 프로세스를 만들어 낸다.

프로세스 생성 시스템 호출

UNIX,Linux : fork()

  • 자식 프로세스는 부모 프로세스의 복제본

UNIX, Linux : exec()

  • 자식 프로세스는 부모 프로세스와는 다른 프로그램 실행

리눅스 및 유닉스는 다음과 같은 방법으로 프로세스를 호출하게 된다.

Windows : CreateProcess()

처음부터 새로운 프로그램을 생성할 수 있는 시스템 호출이다.

CreateProcess가 여러개의 인자를 받아 온다. (prg2, ... &pid); 처리하고 나면 이들이 부모 프로세스가 되고, 자식 프로세스가 만들어진다.

만들어진 자식 프로세스는 prg2, 데이터도 prg2, 프로세스 아이디(PID)만 부모 프로세스와 다르다.

프로세스 종료 방법

  1. 프로세스가 모든 처리를 완료한다(정상적 종료한다)
  2. 부모 프로세스에 의해 자식 프로세스가 강제로 종료된다.
    2-1. 프로세스 종료 시스템 호출을 이용한다.
    2-2. 자식 프로세스 생성 시 얻은 자식 PID를 이용한다.

자식 프로세스 중 무엇을 종료 시켜야 하는가? 를 알기 위해, 생성 시 알아두었던 자식 PID를 이용하여 이를 호출 후 강제 종료 시킬 수 있다.

  1. 부모 프로세스가 종료되는 경우 운영체제가 자식 프로세스를 종료시킨다.

쓰레드

전통적인 프로세스

하나의 프로그램을 실행하기 위한 기본적인 단위

  • 자원 소유의 단위
    하나의 메모리 구조

  • 디스패칭의 단위
    하나의 제어 흐름
    즉, 디스패칭 과정도 하나의 프로세스이다.

  • 프로세스 내에서 다중처리 불가능

전통적인 프로세스의 경우 다중처리가 불가능했기 때문에, 프로세스 안에 새로운 개념을 집어 넣기 위해 쓰레드(thread)라는 개념이 제안되었다.

쓰레드(thread)

  • 프로세스 내에서의 다중처리를 위해 제안된 개념
  • 전통적인 프로세스의 경우 하나의 프로그램을 실행하기 위한 기본적인 단위가 프로세스였는데, 최근에는 쓰레드 단위로 내려왔다.
  • 디스패칭의 단위 (프로세스 별로 디스패칭 하는 것이 아니라, 쓰레드 별로 디스패칭 할 수 있게 되었다.)

프로세스의 구조 안에 쓰레드가 생겼는데, 하나의 프로세스 PC를 쓰레드 안에 저장하게 된다.
쓰레드 : PC 정보를 따로 갖고 있으며, 다음 번에 이 쓰레드가 CPU를 할당받게 되면, 코드 영역에 있는 명령어를 실행하게 된다.

각 쓰레드마다 실행할 수 있는 위치가 다를 수 있기 때문에, 제어의 흐름이 다른 것이 하나의 프로세스 안에 여러 개를 가질 수 있다.

⭐ 쓰레드가 발전함으로서, 자원 소유의 단위는 프로세스가 되었고, 디스패칭의 단위는 쓰레드가 되었다.
⭐ 디스패칭(복기) : 프로세스 상태가 준비 큐에서 실행 과정으로 가는 과정

⭐ 하나의 프로세스 내에는 하나 이상의 쓰레드 존재 ⭐

전통적인 프로세스, 쓰레드 있는 프로세스 비교

거의 비슷한 형태이나, 프로세스 내부에 쓰레드가 하나 이상 존재하여 각각의 쓰레드마다 PC 위치가 서로 다르게 관리될 수 있기 때문에, 제어를 따로따로 할 수 있게 된다.

쓰레드와 프로세스

  1. 쓰레드는 실행에 필요한 최소한의 정보만 갖고 있다.
    1-1. PC를 포함한 레지스터 값(각 쓰레드마다 레지스터 값들을 갖고 있어야 한다.)
    1-2. 상태정보
    1-3. 스택 영역

  2. 나머지 정보는 프로세스에 두고, 다른 쓰레드와 공유한다.

다중 쓰레드로 구성된 프로세스

  1. 멀티 CPU 또는 멀티코어 컴퓨터 시스템
    1-1. 다중 쓰레드를 병렬로 처리 가능
  2. 처리 속도 별로 쓰레드가 나눠진 경우
    2-1. 효율적인 처리 가능

    다음과 같이 각각의 용도가 나뉘어져 있어, 효율적으로 처리를 수행할 수 있다.(CPU가 하나밖에 없더라도)

내용 정리

  1. 프로세스는 실행 중인 프로그램일 의미하며, CPU, 메모리, 파일, 입출력장치 등 실행에 필요한 자원이 할당된다.
  2. 프로세스 제어 블록은 프로세스를 명시해주는 다양한 내용을 포함하고 있다.
  3. 프로세스는 생성, 준비 ,실행, 대기, 종료의 다섯 상태 중 하나로 존재하며, CPU의 스케줄링, 입출력 대기 등에 따라 준비, 실행, 대기 등으로 상태가 변화되며 동작한다.
  4. 쓰레드는 프로세스에서 실행의 개념만 분리한 것으로 디스패칭의 단위이다.
  5. 하나의 프로세스 내에는 하나 이상의 쓰레드가 있을 수 있어, 다중 쓰레드를 생성하여 프로세스 내에서의 다중처리를 할 수 있다.
profile
DevOps / Infrastructure / Cloud Native / Platform Engineering

0개의 댓글

관련 채용 정보