본문 바로가기
Programming/DevOps, Tools

[운영체제] 프로세스 (Process)와 스레드 (Thread)

by kghworks 2022. 2. 25.

목차

  • 프로세스 (Process)
  • 스레드 (Thread)
  • 스케줄링(scheduling)
  • 참고

프로세스 (Process)

 프로세스란 운영체제에서 현재 실행 중인 프로그램입니다. 크롬 브라우저를 예로 들면 평소 실행되지 않을 때에는 프로그램 (동작을 하지 않는 정적, 수동적 개체)이었다가 실행을 하면 프로세스 (동작을 하는 능동적 개체)가 됩니다.

프로세스를 간단히 확인할 수 있는 작업관리자

 위 스크린샷에서 제 메모리를 가장 많이 점유하는 프로세스는 Intellij IDEA입니다. 여기서 IntelliJ 프로그램이 3개의 프로세스 (서로다른 PID, 인스턴스)로 띄워져 있고 서로 완전히 다른 독립적인 프로세스입니다. Intellij IDEA는 프로그램이고 이 프로그램이 3개의 프로세스가 실행 중인 상황인 겁니다.

 

 프로세스를  Task라고도 합니다.  나아가 하나의 운영체제에서 프로세스가 여러개 작동 중인 위 상황을 Multi-Tasking이라고 합니다.

 

 프로세스는 운영체제로부터 자원(CPU, 메모리, I/O, 파일 등)을 할당받아 동작하게 됩니다. "동작"한다는 것은 CPU가 프로세스의 명령을 실행하는 것을 의미합니다. 

 

프로세스의 가상 메모리 (Virtual Memory)

 OS는 가상 메모리 (Virtual Memory)를 프로세스에 할당하고, 프로세스는 할당받은 가상 메모리 공간 안에서 자신의 스레드들에게 메모리를 할당합니다. 이 가상메모리는 RAM, SSD, HDD 등 기억장치입니다. (주로 RAM) 뒤에서 설명할 스레드 역시 스레드 자신이 사용가능한 메모리는 OS가 자신의 프로세스에게 할당받은 가상 메모리 공간으로 제약됩니다.

 

프로세스 관리자가 하는 일

  • 프로세스를 생성,  삭제
  • 프로세스의 실행을 위한 스케줄 결정
  • 프로세스의 상태를 관리, 상태 전이를 처리

 

 프로세스의 상태는 총 5개로 분류할 수 있으며 아래를 5-상태 모델이라고 합니다.

  • 생성 : 처음 작업이 시스템에 주어짐
  • 준비 : 실행 준비가 되어 CPU 할당을 기다림
  • 실행 : 프로세스 처리
  • 대기 : 프로세스가 특정 자원을 할당받을 때까지(또는 I/O 작업이 끝날 때까지) 작업이 보류
  • 종료 : 모든 처리가 완료되어 사용자에게 반환

 

프로세스 5-상태 모델

 

프로세스 제어 블록 (Process Control BLock, PCB)

 프로세스의 관리를 위한 목적으로 프로세스의 정보를 저장하는 커널 안의 자료구조입니다. 각 프로세스마다 존재하고, 프로세스가 진행함에 따라 그 내용이 변경됩니다. 이 안에는 일반적으로 프로세스의 상태, PID (프로세스 식별자), 프로그램 카운터, 메모리 관리 정보, 프로세스 우선순위 등이 들어갑니다. PCB 자료구조에 들어가 있는 정보들을 문맥이라고도 합니다.

 

프로세스의 생성과 종료

 프로세스를 생성하는 방법은 하나의 프로세스를 통해 프로세스 생성 시스템을 호출하는 것입니다. (예 fork(); ) 이때 호출하는 프로세스를 부모 프로세스 생성되는 프로세스를 자식 프로세스라 합니다. 시스템 프로세스, 사용자 프로세스 모두 부모 프로세스가 가능합니다. (= 프로세스를 만들 수 있음) 이렇게 부모 프로세스를 통해 생성함으로써 자식 프로세스의 자원은 부모 프로세스의 자원으로 한정하여 과도한 자식 프로세스 생성에 따른 시스템 과부하를 방지할 수 있습니다.

 

 프로세스가 생성되면 프로세스의 이름 (번호, PID, 프로세스 식별자)이 생성되고, 준비 큐에 삽입됩니다. 초기 우선순위를 부여하고 이렇게 생성된 일반적인 정보들을 토대로 PCB를 생성합니다. 

 

 프로세스의 종료는 해당 프로세스의 마지막 명령이 실행을 마치는 경우나 부모 시스템에 의해 exit(); 과 같은 프로세스 종료 시스템을 호출하는 경우 일어납니다. 종료 후에는 부모 프로세스에게 실행결과를 반환합니다. 부모 프로세스는 자식 프로세스에 할당된 자원이 초과할 때나 더 이상 필요치 않을 때에 종료 시스템을 호출할 수 있습니다.

 

독립적 프로세스와 유기적 프로세스

 다른 프로세스로부터 영향을 받는 여부에 대하여 아래와 같이 분류할 수 있습니다.

  독립적 프로세스 유기적 프로세스
의미 다른 프로세스와 영향을 주고받지 않음 다른프로세스와 영향을 주고받음
프로세스의 상태정보, 데이터 다른 프로세스와 공유 안함 다른프로세스와 공유함
실행 결정적이고, 재생 가능함
다른 프로세스와 무관하게 중단, 재시작 가능
 

 

 


스레드 (Thread)

 

프로세스는 최소 1개 이상의 스레드를 가진다.

 

 프로세스 하나에서는 동시처리가 불가능하므로 과거에는 프로세스가 곧 처리의 기본 단위였습니다. 

 

 이 점을 극복하기 위에 고안된 것이 스레드입니다. 프로세스 내에 하나 이상의 스레드를 둠으로서 다중처리가 가능해지는 것입니다. 프로세스에 하나의 실행점 (프로그램 카운터, PC) 두는 것과 달리 스레드 각각에 하나씩 실행점을 두어서 병렬 처리가 가능한 것입니다. 하나의 스레드 내에는 하나의 실행점만이 존재하고 그 실행점이 디스패칭의 단위가 됩니다. 

스레드가 고안된 프로세스의 구조 (아래)

 스레드는 실행에 필요한 최소한의 정보만을 가지고, 자신이 속해있는 프로세스의 실행환경을 서로 공유합니다.  

 

멀티 스레드의 장점

 2개 이상의 스레드를 가진 환경을 말합니다. 다중 스레드는 멀티 CPU (멀티코어, 멀티 프로세스)에서 병렬 처리가 가능하게 함으로써 효율적인 처리가 가능해집니다.

다중 스레드

 

 

* 단일 코어 환경에서도 스레드를 2개 이상 배치한다면, 직렬적으로 처리되지만, 겉으로 보기에 병렬적으로 처리되는것 처럼 보이게 할 수 있습니다. 이를 동시성 (Concurrency)을 높인다고 합니다.

 

동시성과 병렬성(Parallelism)

  • 동시성 : 단일 코어 + 멀티 스레드 환경에서 문맥 교환 (context-switch)이 일어나며 마치 병렬로 처리하는 것처럼 보임
  • 병렬성 : 멀티 코어 + 멀티 스레드 환경에서 각 코어가 병렬로 자신에게 할당한 스레드를 수행하는 것

 

 

프로그램 안에서 스레드의 동시성으로 인해 발생할 수 있는 문제는 JAVA로 아래 포스팅해 두었습니다. 참고 바랍니다.

2023.01.19 - [Programming/JAVA] - [JAVA] Thread 1편 - 멀티스레드에서의 공유자원

 

[JAVA] Thread 1편 - 멀티스레드에서의 공유자원

이번 포스팅에서는 JAVA (JVM)이 어떤 식으로 스레드를 구현하도록 설계해 두었는지 알아봅니다. 또한 멀티스레드 환경에서 공유자원으로 연산할 때 발생할 문제점과 해소방안을 확인합니다. 2편

kghworks.tistory.com

 


 

스케줄링(scheduling)

 하나의 프로세스가 끝나면 다음 프로세스를 동작해야 합니다.  작업을 요청한 순서대로 프로세스를 실행하면 간단하지만 사용자가 지정한 우선순위가 있을 것이고, 또는 그 우선순위를 알고리즘을 통해 자체적으로 판단해야 할 것입니다. 이렇게 모든 프로세스가 효율적으로 적정 수준을 유지하면서 CPU  작업을 할 수 있도록 하고 (공정성), 시스템의 자원들이 충분하게 고루 활용 (균형)될 수 있게 하는 것을 스케줄링이라 합니다. 

 

 스케줄링은 크게 3단계로 분류할 수 있습니다.

 

  1. 상위단계 스케줄링
  2. 하위 단계 스케줄링
  3. 중간단계 스케줄링

 

스케줄링의 단계

1. 상위단계 스케줄링

 시스템에 들어오는 작업들을 선택하여 프로세스를 생성한 후 준비 큐에 전달합니다.  선택 기준은 시스템의 자원을 효율적으로 이용할 수 있는 것을 우선으로 합니다.

 

2. 하위 단계 스케줄링

 디스패처 (dispatcher)가 사용 가능한 CPU를 준비상태의 프로세스 중 어느 곳에 할당할지 결정합니다. CPU를 배당받으면 프로세스는 실행상태가 되어 처리됩니다. 

 

3. 중간단계 스케줄링

 시스템에 발생한 단기적인 부하를 조절하기 위해  프로세스를 일시적으로 메모리에서 제거하여 중지시킵니다.

 

선점 (preemtive) 스케줄링 정책

 대화식 시분할 시스템이나 높은 우선순위의 프로세스를 긴급하게 처리해야 할 때가 있습니다. 이럴 때는 진행 중인 프로세스에 인터럽트를 걸고 다른 프로세스에 CPU를 할당해 주는 스케줄링 전략을 택합니다. 이것이 선점 스케줄링 정책입니다. 이때는 문맥 (context, PCB) 교환에 따른 오버헤드가 발생합니다. 

 

 문맥 교환이란 CPU가 현재 실행하는 프로세스의 문맥(PID, 상태 등)을 PCB에 저장하여 사용 중인 상태에서 다른 프로세스가 CPU를 사용하기 위해 이전의 문맥을 따로 보관하고 새로운 프로세스의 상태를 PCB에 적재하는 것을 말합니다.

 

비선점 (nonpreemtive) 스케줄링 정책

 선점 정책과 반대로 프로세스가 CPU를 할당받아 실행이 시작되었다면 작업 자체가 I/O인터럽트를 걸거나, 작업이 종료되기 전까지 실행상태에 있는 것을 말합니다. 그러므로 모든 프로세스는 준비 큐에 삽입된 대로 공정하게 순서를 지켜 실행됩니다. 따라서 응답 시간이 예측이 가능합니다. (오버헤드 없음) 그러나 짧은 프로세스가 먼저 실행된 긴 프로세스를 기다려야 하는 비효율이 발생할 수 있습니다.

 


참고

https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4

 

프로세스 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EB%AC%B8%EB%A7%A5_%EA%B5%90%ED%99%98

 

문맥 교환 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EC%98%A4%EB%B2%84%ED%97%A4%EB%93%9C

 

오버헤드 - 위키백과, 우리 모두의 백과사전

오버헤드(overhead)는 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리 등을 말한다. 예를 들어 A라는 처리를 단순하게 실행한다면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는

ko.wikipedia.org

 

댓글