0. 프로그램(Program)이란?

  • 프로세스(실행 중인 프로그램)의 생성 및 실행 규칙들로 엮어진 파일
  • 컴퓨터가 무엇을 하도록, 구체적으로 알려주는 명령문(명령어)들의 집합
  • 대부분의 프로그램은 저장장치에 바이너리 형식의 파일로 저장되어 있다가 사용자가 실행시키면 메모리에 적재되어 실행된다.

 

1. 프로세스(Process)란?

  • 컴퓨터에서 연속적으로 실행되고 있는 프로그램
  • 스케줄링의 대상이 되는 작업(Task)이라는 용어와 거의 같은 의미로 쓰인다.
  • 프로세스 내부에는 최소 하나의 스레드를 가지고 있는데, 실제로 스레드 단위로 스케줄링을 한다.
  • 저장장치(HDD, SSD)에 있는 프로그램을 실행하면, 실행을 위해 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다. 
  • 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다.
  • 프로세스는 독립적인 특성을 가지고 있다. 

 

1-1. 프로세스의 메모리 구조(프로세스 하나당 하나씩 존재한다)

  • Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라감
  • Data 영역 : 전역(Global) 변수, 정적(static) 변수의 할당, 프로그램이 끝날 때까지 메모리에 남아있는 변수
  • Heap 영역 : 동적할당을 위한 메모리 영역
  • Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역

 

1-2. 프로세스의 상태

커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.

상태 설명
생성(New / Create) 프로세스가 막 생성된 상태
준비(Ready) 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있는 상태
실행(Running) 프로세스가 CPU를 차지하여 명령어들이 실행되고 있는 상태.
일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다.
대기(Waiting / Block)  보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신, 특정 자원이나 이벤트 등 어떤 사건을 기다리고 있는 상태를 말한다.
종료(Exit / Terminated) 프로세스의 실행을 완료한 상태
Suspended Waiting 프로세스가 대기 상태에서 기억 장치를 잃은 상태
Suspended Ready 프로세스가 기억장치를 제외한 다른 모든 필요한 자원들을 보유한 상태

 

 

1-3. 프로세스의 상태전이

하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 준비 리스트의 끝에 들어간다. 준비 리스트 상의 다른 프로세스들이 CPU를 할당받아 준비 리스트를 떠나면, 그 프로세스는 점차 준비 리스트의 앞으로 나가게 되고 언젠가 CPU를 사용할 수 있게 된다.

 

 

동작 설명
생성→준비 생성 상태의 프로세스가 OS로부터 승인을 받아, 준비 상태의 프로세스가 모여 있는 자료구조인 준비 큐(ready queue)에 추가됨
준비실행
(Dispatch)
우선순위가 높은 프로세스 선정하여 명령어 실행.
준비 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행 상태로 바뀌는 것을 디스패치라고 한다.
실행준비
(Timer runout)
운영체제는 프로세스가 프로세서를 계속 독점해서 사용하지 못하게 하기 위해 클럭 인터럽트(Clock interrupt)를 두어서 프로세스가 일정 시간 동안만(시분할 시스템의 time slice) 프로세서를 점유할 수 있게 한다. (Preemption, 독점 방지)
실행대기
(Block)
실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작, 자원 등을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 대기 상태로 넘어 간다. 
대기→ 준비
(Wake up)
입출력 작업 종료 등 기다리던 사건이 일어났을 때 대기 상태에서 준비 상태로 넘어가는 과정
실행→종료 실행 중인 프로세스가 정상적으로 끝나서 종료 상태로 변경됨
Swap-out
(Suspend)
준비(대기) 상태에서 기억 장치를 반납하고 지연 준비(지연 대기) 상태로 전이
Swap-in(Resume) 지연 준비(지연 대기) 상태에서 기억 장치를 할당받아 준비(대기) 상태로 전이

 

 

2. 스레드(Thread)란?

스레드(thread)란 프로세스(process) 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위로

실제로 작업을 수행하는 주체

  • 스레드는 프로세스 내부의 작업의 흐름, 단위.
  • 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.
  • 스레드는 한 프로세스(process)내부에는 적어도 하나의 스레드가 존재한다.
  • 스레드가 여러개 존재하는 것을 멀티스레드(mulitread)라고 한다.
  • 멀티스레드(multitread)에서 각 스레드끼리는 프로세스의 일정 메모리 영역을 공유한다. 
  • 스레드마다 stack을 생성한다.
  • 일정 메모리 영역을 공유하기 때문에 동일한 프로세스 내부의 스레드 간 문맥교환(context switching)할 때가, 프로세스끼리 문맥교환(context switching)을 할 때보다 빠르며, 상대적으로 스위칭해야 할 메모리 영역이 적기 때문이다.

 

* 문맥교환(context switching) :  하나의 프로세스나 스레드가 cpu를 사용하고 있는 상태에서 다른 프로세스나 스레드가 cpu를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 과정

 

2-1. 스레드의 목적

  • 프로그램의 응답성 향상 : 스레드를 사용하면 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있기 때문에, 다른 스레드에서 실행 중인 작업이 끝나기를 기다리지 않고, 동시에 여러 작업을 처리하여 프로그램의 응답성을 향상할 수 있다.
  • 자원 공유 : 스레드를 사용하면 같은 프로세스 내에서 메모리 공간을 공유할 수 있다. 이를 통해 데이터를 공유하고, 프로세스 간의 통신을 더욱 효율적으로 할 수 있다.
  • 비용 감소 : 스레드를 사용하면 새로운 프로세스를 생성하는 것보다 적은 비용으로 여러 작업을 처리할 수 있다.
  • 병렬 처리 : 스레드를 사용하면 하나의 작업을 여러 개의 스레드로 나누어 병렬적으로 처리할 수 있다. 이를 통해 작업을 더욱 빠르게 처리할 수 있다.

2-2. 멀티스레드

  • 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것.
  • 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고, 멀티 스레딩을 기본으로 하고 있다. 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.

2-3. 멀티스레드의 장점 / 단점

[장점]

  • 높은 성능 : 여러 개의 스레드가 병렬적으로 작업을 처리하므로, 작업 처리 속도가 빠르고, 시스템 전체의 성능이 향상한다.
  • 높은 자원 활용도 : 멀티 스레드는 하나의 프로세스에서 여러 개의 스레드가 작동하므로, 프로세스가 가진 자원들을 스레드들이 공유하여 더 효율적으로 사용할 수 있다. 또한 문맥교환을 할 때 공유하고 있는 메모리만큼 메모리 자원을 아낄 수 있다.
  • 높은 응답성 : 멀티 스레드는 각각의 스레드가 별도의 작업을 처리하므로, 어떤 스레드에서 오류가 발생하더라도 다른 스레드는 정상적으로 작동하여 시스템이 멈추지 않고 계속해서 작업을 처리할 수 있다.

[단점]

  • 동기화 문제 : 멀티 스레드에서는 여러 개의 스레드가 공유 자원을 사용하기 때문에, 동기화 문제가 발생할 수 있다.
    한 스레드가 공유 자원을 사용하는 동안 다른 스레드가 해당 자원을 사용하게 되면 데이터의 일관성이 깨질 수 있다.
  • 교착상태 :  멀티 스레드에서는 여러 개의 스레드가 서로 대기하면서 무한정 기다릴 수 있는 상황이 발생할 수 있다.
  • 디버깅의 어려움 : 멀티 스레드에서는 여러 개의 스레드가 동시에 실행되기 때문에, 디버깅이 어려울 수 있다.
    스레드 간의 의존성이 복잡하게 얽혀 있을 경우 디버깅이 더욱 어려워진다.

+ Recent posts