[혼공컴운] CH 10 프로세스와 스레드

sookyoung.k·2024년 1월 28일
0

🤓 [혼공학습단] 

목록 보기
14/23
post-thumbnail

🌐 프로세스 개요

👀 프로세스 직접 확인하기

윈도우에서는 작업 관리자의 [프로세스] 탭에서 확인
유닉스 체계의 운영체제에서는 ps 명령어로 확인

내가 실행한 프로세스 외에도 알 수 없는 여러 프로세스가 실행되고 있다!

  • 포그라운드 프로세스(foreground process): 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process): 보이지 않는 공간에서 실행되는 프로세스

백그라운드 프로세스 중에서는 사용자와 직접 상호작용 할 수 있는 백그라운드 프로세스도 있지만, 사용자와 상호작용 하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스도 있다.

  • 유닉스 체계의 운영체제에서는 데몬
  • 윈도우 운영체제에서는 서비스라고 부른다

🧱 프로세스 제어 블록

CPU 자원은 한정적이다! -> 프로세스들은 차례대로 돌아가며 한정된 시간 만큼만 CPU를 이용한다

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하기 위해 프로세스 제어 블록(PCB, Process Control Block)를 이용한다

  • 프로세스와 관련된 정보를 저장하는 자료구조
  • 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장!
  • 커널 영역에 생성
  • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기

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

♟️ 프로세스 ID(PID)

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

♟️ 레지스터 값

해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값 (이전까지 사용했던 레지스터들의 중간값)
→ 프로세스는 이를 통해서 중간값을 복원하고 자신의 실행차례가 돌아오면 이전에 진행했던 작업들을 그대로 이어 실행할 수 있다

♟️ 프로세스 상태

현재 프로세스가 어떤 상태인지에 대한 정보

  • 입출력장치를 사용하기 위해 기다리고 있는 상태인가?
  • CPU를 사용하기 위해 기다리고 있는 상태인가?
  • CPU를 이용하고 있는 상태인가? 등

♟️ CPU 스케줄링 정보

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

♟️ 메모리 관리 정보

프로세스가 어느 주소에 저장되어 있는지에 대한 정보
→ 베이스 레지스터, 한계 레지스터 값과 같은 정보들과 페이지 테이블 정보 등

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

특정 입출력장치나 파일을 사용한 내용

🔄️ 문맥 교환

하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥(contexts)이라고 한다

하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있음

기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것문맥 교환(contexts switching)이라고 한다

여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 것은 문맥 교환의 원리로 설명할 수 있다. 엄청나게 빠르게 번갈아 실행되기 때문에 우리 눈에는 프로세스들이 동시에 실행되는 것처럼 보일 뿐이다.

📦 프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB가 생성된다. 그렇다면 사용자 영역에 프로세스는 어떻게 배치가 될 것인가?!

코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다!

💽 코드 영역

= 텍스트 영역(text segment)

  • 문자 그대로 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다
  • 데이터가 아닌 CPU가 실행해야 하는 명령어가 담겨있기 때문에 쓰기 금지! (읽기 전용 공간)

💾 데이터 영역

  • 일시적으로 사용되었다가 사라지는 데이터가 아니라 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
  • 전역 변수 (global variable)
    • ‘프로그램이 실행되는 동안 유지되며, 프로그램에 접근할 수 있는 변수’

코드 영역과 데이터 영역은 그 크기가 변하지 않는다. 때문에 ‘크기가 고정된 영역’이라는 점에서 정적 할당 영역이라고도 부른다.

💿 힙 영역

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간
  • 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 한다
  • 반환하지 않을 경우 할당한 공간이 메모리 내에 계속 남아 메모리 낭비를 초래한다 = 메모리 누수

📀 스택 영역

  • 데이터를 일시적으로 저장하는 공간 (잠깐 사용하는 값들이 저장되는 공간)
  • 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수 등
  • 일시적으로 저장할 데이터는 스택 영역에 PUSH되고, 더이상 필요하지 않은 데이터는 POP된다

힙 영역과 스택 영역은 실행 과정에서 그 크기가 변할 수 있는 영역이다. 때문에 동적 할당 영역이라고도 부른다.
힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다

🌐 프로세스 상태와 계층 구조

👀 프로세스 상태

운영체제는 프로세스의 상태를 PCB를 통해서 인식하고 관리한다

프로세스의 상태를 표현하는 방식은 운영체제마다 조금씩 차이가 있지만, 대표적인 상태는 다음과 같다

♟️ 생성 상태

프로세스를 생성 중인 상태

이제 막 메모리에 적재되어 PCB를 할당받은 상태

♟️ 준비 상태

당장이라도 CPU를 할당받아 실행할 수 있지만, 아직 자신의 차례가 아니기에 기다리고 있는 상태

* 준비 상태인 프로세스가 실행 상태로 전환되는 것응ㄹ 디스패치라고 한다

♟️ 실행 상태

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

프로세스가 할당된 시간을 모두 사용한다면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하여 입출력장치의 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다

♟️ 대기 상태

입출력장치의 작업을 기다리는 상태

프로세스가 실행 도중에 입출력장치를 사용하는 경우에 발생한다

입출력 작업은 CPU에 비해서 처리 속도가 느리기 때문에 프로세스가 기다려야 한다! 입출력 작업이 완료되면 다시 준비 상태로 CPU 할당을 기다리게 된다

♟️ 종료 상태

프로세스가 종료된 상태

프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다

🌐 프로세스 상태 다이어그램

🌐 프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다!

새 프로세스를 생성한 프로세스를 부모 프로세스
부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다

  • 각기 다른 PID를 가진다
  • 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID가 기록되기도 한다

많은 운영체제는 프로세스가 프로세스를 낳는 계층적인 구조로 프로세스들을 관리한다!

위의 사진과 같이 트리 구조를 띄게 되는데 이를 프로세스 계층 구조라고 한다

✔️ 프로세스 생성 기법

복제와 옷 갈아입기

  • 부모 프로세스는 fork를 통해 자신의 복사본을 자식 프로세스로 생성
  • 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체
    • 메모리 공간에 새로운 프로그램 내용이 덮어 써진다는 점에서 옷 갈아입기라고 표현함
  • 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 된다

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

🧶 스레드

🧵 프로세스와 스레드

전통적인 관점에서 보면 하나의 프로세스는 하나의 일만 처리한다

단일 스레드 프로세스 - 실행의 흐름 단위하가 하나

스레드라는 개념이 도입되면서 하나의 프로세스가 한 번에 여러 일을 동시에 처리한다!
→ 프로세스를 구성하는 여러 명령어를 동시에 실행할 수 있게 되었다

스레드 - 프로세스를 구성하는 실행 단위

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

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

프로세스 - 실행되는 프로그램
스레드 - 프로세스를 구성하는 실행의 흐름 단위

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

컴퓨터는 실행 과정에서 여러 프로세스가 동시에 실행될 수 있고, 그 프로세스를 이루는 스레드는 여러 개 있을 수 있다

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

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

→ 프로세스를 fork하여 같은 작업을 하는 동일한 프로세스 두 개를 동시에 실행하면 모든 자원이 복제되어 메모리 영역에 적재된다
* fork를 한 직후 같은 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않는 방법 : 카피-온-라이트

  • 서로 남남처럼 독립적으로 실행

→ 스레드들은 각기 다른 스레드ID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지고 있는 자원을 공유

  • 프로세스의 자원을 공유하기 때문에 서로 협력과 통신에 유리
  • 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수도 있다

* 프로세스 간 통신
’기본적으로‘는 자원을 공유하지 않지만, 프로세스 간 통신(IPC)를 통해서 프로세스 간의 자원을 공유하고 데이터를 주고 받을 수 있다
모든 자원을 처음부터 공유하는 스레드에 비해서 방법이 복잡할 뿐, 불가능한 일은 아니다

profile
영차영차 😎

0개의 댓글