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 단점
장점 | 단점 |
|
|
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 간의 자원 공유는 전역 변수(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://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 |