반응형

1. 프로그램(Program)

: 어떤 작업을 위해 실행할 수 있는 파일로 일반적으로 Application(End User가 사용할 수 있는 Software)이라고 많이 표현된다.

☞ Process를 이용해 실행시킨다.

 

2. 프로세스(Process)

: 컴퓨터에서 실행되고 있는 컴퓨터 프로그램으로 하나의 실행 단위가 된다.

☞ OS(Operating System)에서 실행 가능한 File을 Memory에 올리면 해당 File을 Process로 실행한다.

☞ 하나의 Application을 실행하면 최소 1개의 Process가 뜬다.

 

2.1. 구성 요소

  • Register : 명령이나 주소를 갖고 있는 CPU의 한 부분
  • Counter : Program 안에서 현재 어느 위치를 실행시키고 있는지 가리키는 용도로 사용
  • Stack : Function Call을 했을 때 Call Stack 등이 쌓이는 곳으로 지역 변수, 매개 변수, 반환값 등 일시적인 Data가 저장됨
  • Heap : Process가 가지고 있는 Memory 중 위쪽에 할당되어 있는 부분으로 동적으로 할당 가능한 Memory
    ☞ Memory Size에 제한이 없다.
  • Data : Static 변수, Global 변수 저장
  • Code : 실행 명령들을 포함하는 Code

 

2.2. 특징

  • 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
  • 기본적으로 Process 당 최소 1개의 Thread를 가지고 있다.
  • 각 Process는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료 구조에 접근할 수 없다.
  • 한 Process가 다른 Process의 자원에 접근하려면 프로세스 간의 통신(IPC, Inter Process Communication)을 사용해야 한다.
    e.g., 파이프, 파일, 소켓 등을 이용한 통신 방법 이용

 

3. 스레드(Thread)

: Process 내에서 실행되는 여러 흐름의 단위

☞ Process는 여러 개의 Thread를 가질 수 있으며 Thread 간 자원을 공유하면서 동시에(Concurrency) 수행된다.

동시성(Concurrency) vs 병렬(Parallelism)

- 동시성(Concurrency) : 보이기에는 동시에 수행되는 것처럼 보이지만 실제로는 시간을 매우 잘게 쪼개서 CPU의 자원을 나눠서 쓰는 것 (진정한 의미의 병렬은 아님)
Multi-Threading은 Concurrency에 가깝다.

- 병렬(Parallelism) : 실제로 동시에 수행되는 것
Multi-Processing은 Parallelism에 가깝다.

 

3.1. 특징

  • Thread는 Process 내에서 각각 Stack 영역만 따로 할당받고 Code, Data, Heap 영역은 공유한다.
  • 한 Thread가 Process 자원을 변경하면, 다른 이웃 스레드(Sibling Thread)도 그 변경 결과를 즉시 볼 수 있다.

 

4. Thread vs Process

  Process Thread
의미 실행중인 Program Process의 실행 단위
프로세스 종료 시간 오래 걸림 덜 걸림
생성 시간 오리 걸림 덜 걸림
Context Switching 소요 시간 오래 걸림 덜 걸림
Communication 측면에서의 효율성 떨어짐 효율적
자원 소비 더 많은 자원 소비 적은 자원 소비
메모리 공유 X O
무게에 따른 이름 Heavy-weight Process Light-Weight Process
전환 방식 OS의 Interface 사용 OS를 호출해 전환시킬 필요 없음

 

5. 멀티 태스킹(Multi Tasking)

: 한번에 여러 개의 Application을 실행시키는 것

☞ Multi-Processing과 Multi-Threading 기술이 가능해졌다고 설명할 수 있다.

Multi-Processing과 Multi-Threading

CPU의 최대 활용을 위해 프로그램의 둘 이상의 부분을 동시에 실행하는 기술
e.g., 하나의 Program 안에서 2개의 부분 동시 실행, 2개의 Program 동시 실행 등

 

5. 멀티 프로세스 (Multi Process)

: 하나의 응용프로그램을 여러 개의 프로세스로 구성해 각 프로세스가 하나의 작업(Task)을 처리하도록 하는 것

☞ Single Core에서 Multi Process 불가능

 

5.1. 장점 vs 단점

장점 단점
  • 여러 개의 자식 Process 중 하나에 문제가 발생하면 그 자식 Process만 죽는 것 이상으로 다른 영향이 확산되지 않음
  • Context Switching에서의 Overhead
    : Context Switching 과정에서 Cache Memory 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 Overhead가 발생한다. Process는 각각의 독립된 Memory 영역을 할당받아 Process 사이에서 공유하는 Memory가 없으므로 Context Switching이 발생하면 Cache에 있는 모든 데이터 모두 리셋하고 다시 캐시 정보 불러와야 한다.

  • Process 사이의 어렵고 복잡한 통신 기법(IPC)
    : Process는 각각 독립된 Memory 영역을 할당받아 하나의 Program에 속하는 Process들 사이의 변수를 공유할 수 없다.
Context Switching (컨텍스트 전환, 작업 전환, 프로세스 전환)
: 기본적으로 CPU의 자원을 Process/Thread에서 다른 Process/Thread로 전환하는 것으로 Context 전환을 통해 여러 Process가 단일 CPU를 공유할 수 있다.
e.g., Process ↔ Process, Thread ↔ Thread, Process ↔ Thread
☞ Multi Tasking 운영체제의 주요 기능이다.
더보기

과정 : 프로세스 제어 블록(PCB, Process Control Block)에서 CPU의 컨텍스트 상태를 복원하고 저장해 나중에 같은 시점에서 Process 실행을 재개
☞ Context 전환에 따른 비용 발생

e.g., Thread ↔ Thread
1. Thread1에서 하고 있는 작업을 PCB에 저장

2. Thread2에서 PCB로부터 기존 작업을 Load해 이어서 실행

 

5.3. Code

# Multi Processing
import multiprocessing
import threading
import os
import time

def hello(s):
  # pid : Process ID
  print('Function start!', s, 'pid:', os.getpid(), 'thread id:', threading.get_ident())
  time.sleep(1)

# Process 생성
t1 = multiprocessing.Process(target = hello, args = ['Hello World'])
t2 = multiprocessing.Process(target = hello, args = ['Hello Jjyoung'])

t1.start()
t2.start()

# 각 Process가 끝날 때까지 기다림
t1.join()
t2.join()
# 출력을 보면 pid가 다름
Function start! Hello World pid: 1890 thread id: 139996320056768
Function start! Hello Jjyoung pid: 1891 thread id: 139996320056768

 

6. Multi Thread

: Process 하나에 Thread 여러 개가 들어있는 것으로 하나의 Core를 여러개의 Thread가 동시에(Concurrent하게) 접근해 Context Switching이 일어난다.
☞ Single Core에서 Multi Thread 가능

 

6.1. 특징

  • Stack 영역은 독립적으로 할당받지만 Heap, Code 영역은 공유하고 있다.
  • Windows, Linux 등 많은 운영체제들이 Multi-Porcessing을 지원하고 있지만 Multi-Threading을 기본으로 하고있다.
  • Web Server는 대표적인 Multi-Thread 응용 프로그램이다.

 

6.2. 장점 vs 단점

장점 단점
  • 시스템 자원 소모 감소 (자원의 효율성 증대)
    : 프로세스를 생성해 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
  • 시스템 처리량 증가 (처리 비용 감소)
    : Thread 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들며 Thread 사이의 작업량이 작아 Context Switching이 빠르다.
  • 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
    : Thread는 Process 내의 Stack 영역을 제외한 모든 Memory를 공유하기 때문에 통신의 부담이 적다.
  • 깊은 설계가 필요하다.
  • 디버깅이 까다롭다.
  • 단일 Process System의 경우 효과를 기대하기 어렵다.
  • 다른 Process에서 Thread를 제어할 수 없다. (즉, Process 밖에서 Thread 각각을 제어할 수 없다.)
  • 자원 공유의 문제가 발생한다. (동기화 문제)
  • 하나의 Thread에 문제가 발생하면 전체 Process가 영향을 받는다.
동기화 문제
: Thread 간의 자원 공유는 전역 변수(Data Segment)를 이용하므로 함께 사용할 때 충돌이 발생할 수 있다.

 

6.3. Code

# Multi Threading
import threading
import os
import time

def hello(s):
  # pid : Process ID
  print('Function start!', s, 'pid:', os.getpid(), 'thread id:', threading.get_ident())
  time.sleep(1)

# Thread 생성
t1 = threading.Thread(target = hello, args = ['Hello World'])
t2 = threading.Thread(target = hello, args = ['Hello Jjyoung'])

t1.start()
t2.start()

# 각 Thread가 끝날 때까지 기다림
t1.join()
t2.join()
# 출력을 보면 pid는 같지만 thread id는 다름
Function start! Hello World pid: 1882 thread id: 139995620914752
Function start! Hello Jjyoung pid: 1882 thread id: 139995612522048

 

[참고]

https://youtu.be/RrfASw-jfZ4

https://youtu.be/dzfij2nZbRw

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

반응형

'CS기술 지식 > 운영체제' 카테고리의 다른 글

[운영체제] 교착상태란?  (0) 2022.03.13
[운영체제] Spin Lock, Mutex, Semaphore  (0) 2022.03.13

+ Recent posts