[혼공컴운]4주차_Chap10 | 프로세스와 스레드

곽나현·2024년 1월 24일
0

혼공컴운

목록 보기
11/16
post-thumbnail

<학습목표>

  • 프로세스 제어 블록이란 무엇인지 이해한다.
  • 문맥 교환의 정의와 과정을 학습한다.
  • 프로세스는 메모리에 어떻게 배치되는지 학습한다.
  • 프로세스 상태와 프로세스 계층 구조를 학습한다.
  • 스레드의 개념을 이해하고, 멀티 프로세스와 멀티 스레드의 차이를 이해한다.

🎇 프로세스 개요

🔗 프로세스 (process)

실행중인 프로그램. 보조기억장치에 있는 프로그램이 메모리에 적재되어 실행되는 순간 그 프로그램은 프로세스가 됨

  • 두 가지 종류가 있음
프로세스 종류
포그라운드 프로세스 (foreground process)사용자가 보는 앞에서 실행되는 프로세스
백그라운드 프로세스 (background process)사용자가 보지 못하는 뒤에서 실행되는 프로세스
  • 백그라운드 프레세스에는 사용자와 직접 상호작용 할 수 있는 프로세스도 있지만 사용자와 상호작용 하지 않는 프로세스가 있음
    • 이를 유닉스에서는 데몬(deamon)이라고 하고, 윈도우에서는 서비스(service)라고 함

🔗 프로세스 제어 블록 (PCB : Process Control Block)

프로세스와 관련된 정보를 저장하는 자료구조

  • 운영체제가 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하기 위해 이용

  • PCB는 메모리의 커널 영역에 생성됨

  • 운영체제는 수많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단함

  • PCB는 프로세스 생성 시에 만들어지고 프로세스 종료 시에 폐기됨

🔗 PCB에 담기는 대표적인 정보

⚪ 프로세스 ID (PID)

PID는 프로세스를 식별하기 위해 부여하는 고유한 번호 기록

⚪ 레지스터 값

프로세스는 자신의 실행차례가 돌아오면 이전까지 사용했던 레지스터들의 중간값을 복원하여 그대로 이어 실행하므로 프로그램 카운터를 비롯한 레지스터 값들 기록

⚪ 프로세스 상태

현재 프로세스가 어떤 상태인지 기록

⚪ CPU 스케줄링 정보

프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보도 PCB에 기록

⚪ 메모리 관리 정보

베이스 레지스터, 한계 레지스터 값과 같은 정보와 프로세스의 주소를 알기 위한 페이지 테이블 정보도 기록

⚪ 사용한 파일과 입출력장치 목록

어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들 기록

🔗 문맥 교환 (Context Switching)

기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것

  • 문맥 (context) : 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
  • 하나의 프로세스 문맥은 해당 프로세스의 PCB에 저장

🔗 프로세스의 메모리 영역

🔎 사용자 영역에 프로세스가 어떻게 배치되나?

메모리의 사용자 영역은 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 구분됨

⚪ 코드 영역

  • CPU가 실행할 명령어(기계어)가 저장.

  • 읽기 전용(read-only) 공간

⚪ 데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장
    • 대표적으로 전역변수

⚪ 힙 영역

  • 사용자가 직접 할당할 수 있는 공간
  • 메모리 공간을 할당했다면 꼭 반환해야 함
    • 반환하지 않는다면 메모리 누수 (memory leak)문제를 초래

⚪ 스택 영역

  • 데이터를 일시적으로 저장하는 공간
    • 대표적으로 매개 변수와 지역변수

코드 영역데이터 영역은 그 크기가 변하지 않기 때문에 정적 할당 영역이라고 하고, 힙 영역스택 영역은 그 크기가 변하기 때문에 동적 할당 영역이라고 함

🎇 프로세스 상태와 계층

🔗 프로세스 상태

  • 운영체제는 프로세스 상태를 PCB를 통해 인식하고 관리함

🔗 프로세스의 대표적인 상태

⚪ 생성 상태 (new)

프로세스를 생성 중인 상태

  • 메모리에 적재되어 PCB를 할당받은 상태로 생성상태를 거쳐 실행 준비가 완료된 상태는 준비 상태가 됨

⚪ 준비 상태(ready)

CPU를 할당받기를 기다리는 상태

  • 디스패치 : 준비상태인 프로세스가 실행 상태로 전환되는 것

⚪ 실행 상태(running)

CPU를 할당받아 실행 중인 상태

  • 프로세스가 할당된 시간을 모두 사용하여 타이머 인터럽트가 발생하면 다시 준비상태가 됨

  • 실행 도중 입출력장치를 사용했다면 입출력장치의 작업이 끝날 때까지 기다리는 대기 상태가 됨

⚪ 대기 상태 (blocked)

입출력장치의 작업 완료를 기다리는 상태

  • 입출력장치의 작업이 완료되면 프로세스는 다시 준비 상태가 됨

⚪ 종료 상태 (terminated)

프로세스가 종료된 상태

  • 운영체제는 PCB와 프로세스가 사용한 메모리를 정리함

<프로세스 상태 다이어그램 (process state diagram)>

🔗 프로세스 계층 구조

◼ 최초의 프로세스

  • 최초의 프로세스 PID는 항상 1이고, 모든 프로세스 최상단에 있는 부모 프로세스이다.

  • 유닉스에서는 init, 리눅스에서는 systemd, macOS에서는 launchd이다.

🔗 프로세스 생성 기법

  • 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성

    • 자식 프로세스는 부모 프로세스의 메모리 내용, 열린 파일 목록 등의 정보상속
  • 자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 새로운 프로그램 내용으로 덮어씀

    • exec을 호출하면 코드 영역데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화됨

    ➡ 부모가 자식 프로세스를 실행하며 프로세스 계층 구조를 이루는 과정은 forkexec가 반복되는 과정

🎇 스레드

스레드는 프로세스를 구성하는 실행의 흐름 단위이다.

  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있고, 이를 이용해서 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

🔗 프로세스와 스레드

⚪ 단일 스레드 프로세스

한 번에 하나의 부분만 실행되는 프로세스

⚪ 멀티 스레드 프로세스

한 번에 여러 부분이 동시에 실행되는 프로세스


  • 스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터를 비롯한 레지스터 값, 스택으로 구성됨
    ➡ 스레드마다 각기 다른 코드를 실행할 수 있음

⭐ 스레드는 프로세스의 자원을 공유하는 것이 핵심

➡ 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원공유하며 실행됨

🔗 멀티프로세스와 멀티스레드

멀티프로세스 : 여러 프로세스를 동시에 실행하는 것
멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것

◼ 프로세스끼리는 기본적으로 자원을 공유하지 않지만 스레드끼리는 같은 프로세스 내의 자원을 공유함

➡ 같은 작업을 하는 동일한 프로그램을 반복하게 하려면

  • 프로세스의 경우는 fork를 통해 세 번 실행하도록 함

    • 이는 동일한 코드 영역, 데이터 영역, 힙 영역, 스택 영역등을 비롯한 모든 자원복제되어 메모리에 적재되는 것으로 낭비가 될 수 있음
  • 스레드의 경우에는 스레드를 세 개 만들어 세 번 실행하도록 함

    • 스레드 ID, 프로그램 카운터를 포함한 레지스터, 스택을 제외한 프로세스의 자원공유하므로 메모리를 효율적으로 사용 가능

    • 더하여 스레드는 자원을 공유하기 때문에 협력통신에 유리함

    • 다만 멀티스레드 환경에서는 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있음

0개의 댓글