Programming/Computer Science

[혼공학습단 9기] 혼.공.컴.운. - 10. 프로세스와 스레드 (미션 포함)

리버김 2023. 2. 4.

운영체제의 핵심 개념인 프로세스와 스레드에 대해 공부해보자

기본 미션

1. 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. 1부터 5까지 올바른 상태를 적어 보세요.

 

  1. 생성 상태
  2. 준비 상태
  3. 실행 상태
  4. 종료 상태
  5. 대기 상태

10-1. 프로세스 개요

프로세스: 보조기억 장치에 저장된 프로그램을 메모리에 적재하고 실행한 것

프로세스 직접 확인하기

포그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스

백그라운드 프로세스: 사용자가 볼 수 없는 공간에서 실행되는 프로세스(유닉스에서는 데몬, 윈도우에서는 서비스)

 

프로세스 제어 블록

프로세스 제어 블록(PCB): 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분하는 도구. 프로세스를 식별하기 위한 정보들이 저장된다. 커널 영역에 생성된다. 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기된다.

 

PCB에 담기는 정보

  • 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
  • 레지스터 값: 프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원하여 이전 작업들을 이어 실행한다.
  • 프로세스 상태: 입출력장치를 사용하기 위해 기다리는지? CPU를 기다리는지? CPU를 이용하고 있는지?
  • CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
  • 메모리 관리 정보: 프로세스가 어느 메모리 주소에 저장되어 있는지에 대한 정보 + 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보
  • 사용한 파일과 입출력장치 목록: 어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일들을 열었는지에 대한 정보들이 PCB에 기록됨

 

문맥 교환

문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보. 해당 프로세스의 PCB에 표현되어 있다. 실행 문맥을 잘 기억해 두면 언제든 해당 프로세스의 실행을 재개할 수 있다.

문맥 교환: 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것. 문맥 교환이 자주 일어나면 우리 눈에는 프로세스들이 동시에 실행되는 것처럼 보인다.

 

프로세스의 메모리 영역

프로세스는 커널 영역에 PCB가 생성되고, 사용자 영역에는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다. 코드 영역과 데이터 영역은 정적 할당 영역, 힙 영역과 스택 영역은 동적 할당 영역이다.

코드 영역

텍스트 영역이라고도 부른다. 실행할 수 있는 코드, 즉 기계어로 이루어진 명령어가 저장된다. 데이터가 아닌 CPU가 실행할 명령어가 담긴 읽기 전용 공간이다.

 

데이터 영역

잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다. 이런 데이터로는 전역 변수가 대표적이다. 프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수다.

 

힙 영역

프로그래머가 직접 할당할 수 있는 저장공간. 사용이 끝나면 해당 메모리 공간을 반환한다고 운영체제에 말해야 한다. 반환하지 않는다면 할당한 공간이 메모리 내에 계속 남아 메모리 낭비를 초래하는 메모리 누수가 발생한다.

 

스택 영역

데이터를 일시적으로 저장하는 공간. 함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수가 대표적이다.

일시적으로 저장할 데이터는 스택 영역에 PUSH되고, 더 이상 필요하지 않은 데이터는 POP된다.

 

힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.

 

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

프로세스들은 각자의 상태를 가지고 계층적인 구조를 이루고 있다. 운영체제가 동시에 실행되는 수많은 프로세스를 계층적으로 관리하기 때문이다.

프로세스 상태

프로세스는 여러 상태를 거치며 실행된다. 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리한다.

생성 상태(new)

프로세스를 생성중인 상태. 이제 막 메모리에 적재되어 PCB를 할당받은 상태다.

 

준비 상태(ready)

자신의 차례가 아니라서 아직 CPU를 할당 받지 않고 기다리고 있는 상태

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

 

실행 상태(running)

CPU를 할당 받아 실행 중인 상태. 할당된 일정 시간 동안만 CPU를 사용할 수 있다.

프로세스가 할당된 시간을 모두 사용(타이머 인터럽트)하면 다시 준비 상태가 되고, 실행 도중 입출력장치가 사용되면 대기 상태가 된다

 

대기 상태(blocked)

입출력장치의 작업이 끝나 입출력 완료 인터럽트가 들어오기를 기다리는 상태. 입출력 작업이 완료되면 해당 프로세스는 다시 준비 상태로 CPU 할당을 기다린다.

 

종료 상태(terminated)

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

 

프로세스 상태 다이어그램

프로세스 계층 구조

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

부모 프로세스: 새 프로세스를 생성한 프로세스

자식 프로세스: 부모 프로세스에 의해 생성된 프로세스. 부모 프로세스와 각기 다른 PID를 가지며, 때로는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)가 기록되기도 한다.

 

자식 프로세스가 또다른 자식 프로세스들을 생성할 수 있어 트리 구조를 가지게 된다.

 

프로세스 생성 기법

Windows를 제외한 나머지 운영체제의 핵심 개념이다.
  1. 부모 프로세스는 fork라는 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다. 부모 프로세스의 다양한 정보들이 자식 프로세스로 상속된다.
  2. 자식 프로세스는 exec을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다. 자신의 메모리 공간을 새로운 프로그램으로 덮어 쓰는 것이다. 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화된다.
  3. fork와 exec가 계층적으로 반복된다.

*실습하기: https://github.com/kangtegong/self-learning-cs 

 

10-3 스레드

스레드: 프로세스를 구성하는 실행의 흐름 단위. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있다.

프로세스와 스레드

단일 스레드 프로세스: 전통적인 프로세스.

 

스레드: 프로세스를 구성하는 실행 단위. 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성. 따라서 스레드마다 각기 다른 코드를 실행할 수 있다. 프로세스의 자원(스택을 제외한 코드, 데이터, 힙 영역)을 공유하는 것이 스레드의 핵심이다.

 

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

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

멀티스레드: 여러 스레드로 프로세스를 동시에 실행하는 것. 같은 프로세스 내의 모든 스레드는 아래 그림처럼 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유한다.

 

장점: 프로세스의 자원을 공유하기 때문에 서로 협력하여 효율적으로 메모리를 사용할 수 있다.

단점: 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

 

 

프로세스 간 통신(IPC; Inter-Process Communication): 프로세스 간의 자원을 공유하고 데이터를 주고받는 것(기본적으로는 프로세스 간에는 자원을 공유하지 않는다.)

 

공유 메모리: 프로세스들이 공유할 수 있는 메모리 영역

반응형

댓글