본문 바로가기
카테고리 없음

[혼공컴운] CH10. 프로세스와 스레드

by _YUJIN_ 2025. 4. 8.

10-1. 프로세스 개요

프로세스 관리는 운영체제의 핵십 서비스이다. 운영체제가 관리하는 프로세스가 무엇인지 알아보고 프로세스가 실행되는 과정들을 살펴본다.

프로세스

  • "실행 중인 프로그램" = "프로세스"
  • 프로그램은 실행되기 전가지는 그저 보조기억장치에 있는 데이터 덩어리일 뿐이지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 그 프로그램은 프로세스가 된다. = "프로세스를 생성한다."

프로세스 직접 확인하기 

  • 컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행된다. 
  • 윈도우에서는 작업 관리자의 [프로세스] 탭에서 확인할 수 있고, 유닉스 체계의 운영체제에서는 ps 명령어로 확인할 수 있다. 

포그라운드 프로세스

  • 사용자가 볼 수 있는 공간에서 실행되는 프로세스 

백그라운드 프로세스

  • 사용자가 보지 못하는 편에서 실행되는 프로세스
  • 사용자와 직접 상호작용할 수 있는 백그라운드 프로세스도 있지만, 사용자와 상호작용하지 않고 그저 묵묵히 정해진 일만 수행하는 백그라운드 프로세스
  • 데몬 (daemon) : 유닉스 체계의 운영체제에서 부르는 용어
  • 서비스 (service) : 윈도우 운영체제에서 부르는 용어

프로세스 제어 블록

타이머 인터럽트

  • 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트 
  • 타임아웃 인터럽트라고도 부른다. 

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

  • 프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조 
  • 커널 영역에 생성됨
  • 특정 프로세스를 식별하고 해당 프로세스를 처리하는 데 필요한 정보를 판단. 
  • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다. 
    • 새로운 프로세스가 생성되었다 = 운영체제가 PCB를 생성했다. 
    • 프로세스가 종료되었다 = 운영 체제가 해당 PCB를 폐기했다.

프로세스 ID

  • PID : Process ID
  • 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 
  • 같은 일을 수행하는 프로그램이라 할지라도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성된다. 

레지스터 값

  • 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간 값들을 모두 복원한다. 

프로세스 상태

  • 현재 프로세스가 입출력장치를 사용하기 위해 기다리고 있는 상태인지, CPU를 사용하기 위해 기다리고 있는 상태인지, 아니면 CPU를 이용하고 있는 상태인지 등의 프로세스 상태 

CPU 스케줄링 정보

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

메모리 관리 정보 

  • 프로세스마다 메모리에 저장되는 위치가 다르기 때문에 어느 주소에 저장되어 있는지에 대한 정보
  • 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보 

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

  • 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용할때 저장되는 정보
  • 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록됨

문맥 교환

  • 프로세스 A가 운영체제로부터 프로세스 B에 CPU 사용을 양보한다고 가정할 때, 바로 직전까지 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력장치 등 지금까지의 중간 정보를 백업한다. 
  • 중간 정보, 즉 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보를 문맥이라고 한다. 
  • 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환이라고 한다. 
  • 문맥 교환이 자주 일어나면 프로세스는 그만큼 빨리 번갈아가며 수행한다는 의미 
  • 단, 오버헤드가 발생할 수 있어서 문맥 교환이 자주 일어난다고 해서 반드시 좋은 것은 아니다.

프로세스의 메모리 영역

  • 하나의 프로세스에는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

코드 영역

  • 코드 영역 (code segment) = 텍스트 영역 (text segment) 
  • 기계어로 이루어진 명령어 저장
  • 데이터가 아닌 CPU가 실행할 명령어가 담겨 있다. 
  • 읽기 전용 공간 
  • 정적 할당 영역 (크기가 고정된 영역)

데이터 영역

  • 잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
  • 전역 변수(global variable)가 대표적
  • 정적 할당 영역 (크기가 고정된 영역)

힙 영역 

  • 동적 할당 영역 (크기가 변할 수 있는 영역)
  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간 
  • 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야한다. 
  • 메모리 공간을 반환한다는 의미는 "더 이상 메모리 공간을 사용하지 않겠다"라고 운영체제에 말해주는 것과 같다.
  • 메모리 공간을 반환하지 않는다면 할당한 공간은 메모리 내에 계속 남아 메모리 낭비를 초래한다. = 메모리 누수

스택 영역

  • 동적 할당 영역 (크기가 변할 수 있는 영역)
  • 데이터를 일시적으로 저장하는 공간 
  • 잠간 쓰다가 말 값들을 저장하는 공간 
  • 매개 변수, 지역 변수가 대표적 
  • 일시적으로 저장할 데이터는 스택 영역에 PUSH, 더 이상 필요하지 않는 데이터는 POP됨으로써 스택 영역에서 사라진다

10-2. 프로세스 상태와 계층 구조

프로세스들은 각자의 상태를 가지고 계층적인 구조를 이루고 있다. 
프로세스 상태란 무엇인지, 프로세스 계층구조란 무엇인지 알아보기 

프로세스 상태 

  • 여러 프로세스가 빠르게 번갈아 가면서 실행될 때 그 과정에서 하나의 프로세스는 여러 상태를 거치며 실행된다. 

생성 상태 (new)

  • 프로세스를 생성 중인 상태 
  • 이제 막 메모리에 적재되어 PCB를 할당 받은 상태를 말함
  • 생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비 상태가 되어 CPU의 할당을 기다린다.

준비 상태 (ready)

  • CPU를 할당받아 실행하기 전에 자신의 차례를 기다리는 상태
  • 준비 상태인 프로세스가 실행 상태로 전환되는 것을 디스패치(dispatch)라고 한다.

실행 상태 (running)

  • CPU를 할당받아 실행 중인 상태 
  • 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다

대기 상태 (blocked)

  • 입출력 작업은 CPU에 비해 처리 속도가 느림
  • 입출력 작업을 요청한 프로세스는 입출력장치가 입출력을 끝낼 때까지 기다려야한다
  • 입출력장치의 작업을 기다리는 상태
  • 입출력 작업이 완료되면 다시 준비 상태로 CPU할당을 기다린다

종료 상태 (terminated)

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

프로세스 계층 구조

  • 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고 한다.
  • 부모와 자식 프로세스는 서로 다른 프로세스라서 다른 PID를 가진다
  • PPID : Parent PID가 기록되기도 한다. (일부 운영체제)

프로세스 생성 기법

fork

  • 자기 자신의 복사본을 만드는 시스템 호출
  • 복사본이 자식 프로세스!
  • 부모는 fork를 통해 자신의 복사본을 자식 프로세스로 생성한다.
  • 복사본은 부모 프로세스의 자원, 메모리 내용, 열린 파일등을 갖고 있고, 이 내용들은 자식 프로세스에 상속된다. 

 

exec

  • 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰기
  • 새로운 프로그램 내용으로 전환해 실행한다.
  • 코드영역, 데이터영역이 실행할 프로그램의 내용으로 변경, 나머지 영역은 초기화

10-3. 스레드

  • 프로세스를 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러개의 스레드를 가질 수 있다.

프로세스와 스레드

  • 전통적인 관점에서 하나의 프로세스가 하나의 일만 처리했었음 (단일 스레드 프로세스)
  • 스레드라는 개념이 도입되며 하나의 프로세스는 한번의 여러개의 일을 처리할 수 있게 됨
  • 스레드는 프로세스 내에서 각자의 스레드ID, PC, 레지스터값, 스택으로 구성
  • 프로세스의 스레드들은 실행에 필요한 최소한의 정보만을 유지한 채 프로세스 자원을 공유하며 실행
  • 코드/데이터/힙영역은  스레드 123이 공유하고 있음

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

  • 멀티프로세스 : 여러개의 프로세스를 동시에 실행
  • 멀티스레드 : 여러개의 스레드로 프로세스를 동시에 실행
  • 둘의 차이는 "자원의 공유" 여부
  • fork를 한후 동시 실행하면, 코드/데이터/힙/등 모든 자원이 메모리에 적재되며 동일한 내용들이 메모리에 중복해 존재하게 된다. (낭비)
  • 스레드들은 프로세스가 가진 자원을 공유하기 떄문에 메모리를 더 효율적으로 사용할 수 있다. 
  • 서로 협력하고 통신하는 것에도 유리하다.
  • 단 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길수 있다는 단점도 있다. 

 

반응형