본문 바로가기
IT정보&정보처리기사

프로세스와 스레드

by Technocrat 2024. 1. 12.

시스템에서 실행되는 프로그램을 프로세스라고 한다. 실행되고 있다는 건 메모리에 적재되어 있다는 뜻이다.

프로세스에는 여러가지가 있다. 

먼저 사용자의 눈 앞에서 실행되고 있는 포그라운드(Foreground) 프로세스, 사용자에게 보이지 않는 곳에서 실행중인 백그라운드(Background) 프로세스, 사용자와 상호작용 없이 뒤에서 실행되고 있는 데몬(Daemon, 윈도우의 서비스)

시스템에서 돌아가고 있는 프로세스를 보고 싶으면 콘솔에서 ps -ef를 입력하면 된다.

 

프로세스 제어 블록 (PCB) 

CPU자원은 한정되어 있으므로 프로세스들은 자신의 차레가 되면 CPU를 사용하고 정해진 시간이 지나면 CPU자원을 반납하고 다음 차례가 올 때 까지 기다려야 한다. 

프로세스의 실행 순서 등 자원관리는 운영체제가 하는데 프로세스 제어블록(Process Control Block : PCB)를 이용하여 프로세스들을 관리한다. PCB는 프로세스의 정보를(프로세스 식별 및 프로세스 처리에 필요한 정보) 저장하는 자료구조로서 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다. 

PCB에 입력되는 정보는 아래와 같다.

1) 프로세스ID(PID) : 프로세스에 부여되는 고유번호로 동일 프로그램이라도 실행되는 때에 따라 다른 PID가 할당된다.

2) 레지스터 값 : 프로세스가 사용했던 프로그램 카운터 등의 레지스터 내용

3) 프로세스 상태 : 프로세스의 현 상태(생성, 준비, 실행, 대기, 종료)

4) CPU스케줄링 정보 : 프로세스가 CPU를 할당받는 순서와 시기에 대한 정보

5) 메모리 관리 정보 : 프로세스가 저장되어 있는 메모리 주소, 페이지 테이블 정보

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

 

문맥교환(Context Switching)

기존 프로세스의 문맥(Context)를 PCB에 백업하고 새로운 프로세스의 문맥을 PCB로부터 복구하여 실행하는 것을 문맥교환(Context Switching)이라고 하는데 여기서 문맥이란 프로세스의 정보를 말한다. 즉 레지스터값, 메모리 주소, 실행에 필요한 파일, 사용하는 입출력장치 등의 정보들이다. 이런 정보가 있어야 중단되었던 프로세스를 다시 실행시킬 수 있다.

 

프로세스 메모리 영역

프로세스가 생성되면 커널영역에 PCB가 생성된다. 사용자 영역에는 코드영역, 데이터영역, 힙영역, 스택영역에 배치된다.

1) 코드영역 : 텍스트영역이라고도 불리는데 실행하는 코드(기계어로 된 명령어)가 저장된다. CPU가 실행할 명령문들이 담겨 있으므로 쓰기금지 영역이다.

2) 데이터영역 : 프로그램이 실행되는 내내 유지되어야 하는 데이터가 저장되어 있다. 이를 전역변수라고 한다. 전역변수는 프로그램 전체에서 접근할 수 있는 변수이다. 실행 내내 유지되므로 크기가 고정되어 있다(정적 할당 영역)

3) 힙영역(Heap Segment) : 프로그래머가 할당할 수 있는 저장공간, 프로그램 실행중에 사용하고 반납되는 메모리 공간이다. 반납이 제대로 이루어지지 않으면 메모리 누수(Memory Leak)이 발생한다. 크기가 고정되어 있지 않다(동적 할당 영역)

4) 스택영역(Stack Segment) : 일시적으로 사용되는 데이터들이 저장된다. 매개변수나 지역변수가 이에 해당된다. 크기가 고정되어 있지 않다(동적 할당 영역). 저장을 PUSH라고 하고 사용되어 사라지는 것을 POP이라고 한다.

 

프로세스상태와 계층

프로세스는 생애기간에 여러 상태를 거친다. 운영체제는 프로세스의 상태를 PCB를 통해 관리한다.

1) 생성상태(NEW) : 새로 메모리에 적재되어 PCB를 할당받은 상태

2) 준비상태(Ready) : 생성 후 CPU할당을 기다리는 상태로 차례가 되어 CPU를 할당받아 실행상태로 전환되는 것을 Dispatch라고 한다.

3) 실행상태(Running) : CPU를 할당받아 실행중인 상태로 정해진 시간만큼만 CPU를 사용하고 반납해야 한다.(인터럽트 발생 시 반납). 반납 후에는 다시 준비상태로 돌아간다. 만약 실행 중 입출력장치를 사용하여 입출력작업이 끝날 때 까지 기다리는 상황이면 대기상태가 된다.

4) 대기상태(Blocked) : 프로세스가 실행 중 입출력장치를 사용하는 경우 입출력을 끝낼 때 까지(특정 이벤트를 기다리는 상태) 기다려야 한다면 대기상태에 들어간다. 입출력 작업이 완료되면 다시 준비상태가 된다.

5) 종료상태(Terminated) : 프로세스가 종료된 상태로 PCB와 사용한 메모리를 정리한다.

 

프로세스는 실행중에 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 새로 생성된 프로세스는 자식(Child) 프로세스가 되고 생성한(호출한) 프로세스는 부모(Parent) 프로세스가 된다. 부모 프로세스와 자식 프로세스는 별개의 PID를 갖는다. 이때 자식 프로세스에는 부모 프로세스의 PID가 기록된다. 프로세스들의 부모자식 관계를 프로세스 계층구조라고 한다. 계층구조는 트리 형식을 갖는다. 최상위 프로세스(최초로 실행되는 프로세스는 운영체제마다 다르다.

유닉스에서는 init, 리눅스에서는 systemd, macOS에서는 launchd이며 PID가 1이다. 프로세스 계층구조를 보는 명령어는 pstree 이다. 부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성한다. 만들어진 복사본(자식 프로세스)는 exec시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.(코드영역과 데이터영역이 실행할 프로그램의 내용으로 바뀌고 나머지 영역은 초기화 됨)

 

스레드(Thread)

스레드는 프로세스를 구성하는 실행단위이다. 스레드별로 스레드ID, 프로그램 카운터등의 레지스터 값, 스택을 별개로 갖는다. 나머지 프로세스의 자원은 공통으로 활용한다. (리눅스에서는 프로세스와 스레드를 구분하지 않고 Task라고 부른다)

같은 프로세스의 스레드 간에는 공통자원을(코드, 데이터, 힙, 파일) 사용하기 때문에 메모리 활용을 효율적으로 하며 스레드간 협력과 통신에 유리하다.

반면에 프로세스간에도 자원공유나 데이터를 주고받을 수 있는데 이를 프로세스간 통신(IPC : Inter-Process Communication)이라고 부른다. 프로세스 간 통신은 공유메모리, 소켓, 파이프 등을 이용해 이루어진다.

 

 

'IT정보&정보처리기사' 카테고리의 다른 글

프로세스 동기화  (2) 2024.01.14
CPU 스케줄링  (0) 2024.01.13
RAM(Random Access Memory)  (0) 2024.01.07
CPU, Core, Thread  (0) 2024.01.07
소프트웨어 개발 프로세스  (2) 2023.12.31