프로그램(Program)
- 어떤 작업을 위해 실행할 수 있는 파일
- 파일이 저장 장치에 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태 (모든 프로그램은 운영체제가 실행되기 위한 메모리 공간을 할당해 줘야 실행될 수 있음.)
프로세스(Process)
- 메모리에 올라와 실행되고 있는 프로그램
- 동적인 개념으로는 실행된 프로그램을 의미
- 운영체제로부터 자원을 할당받은 작업의 단위
- CPU 시간 (일반적으로 CPU는 한번에 하나의 프로세스만 관리할 수 있음)
- 멀티태스킹은 한번에 다수의 프로세스를 실행하고 있는 것이 아니고 사용자로 하여금 다수의 프로세스가 동시에 실행되는 것 ‘처럼’ 보이게 만드는 것.
- → 즉, CPU가 빠른 시간 동안 각각의 프로세스를 순차적으로 실행하는 것
- 운영되기 위해 필요한 주소 공간
- Code, Data, Stack, Heap의 구조로 되어 있는 독립된 메모리 영역
- 프로세스는 각각 독립된 메모리 영역을 할당 받음
- Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
- Data : 전역변수, 정적변수, 배열 등
- 초기화된 데이터는 data 영역에 저장
- 초기화되지 않은 데이터는 bss영역에 저장
- Heap : 동적 할당 시 사용 (new(), malloc() 등)
- Stack : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
- 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 가지고 있음
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없음
- 한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스 간의 통신(IPC, Inter-Process Communication)을 사용해야 함. (Ex. 파이프, 파일, 소켓 등을 이용한 통신 방법 이용)
멀티프로세스
- 하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것
- 장점 : 안전성 (메모리 침범 문제를 OS 차원에서 해결)
- 단점 : 각각 독립된 메모리 영역을 갖고 있어, 작업량이 많을 수록 오버헤드 발생. Context Switching으로 이한 성능 저하
스레드(Thread)
- 프로세스 내에서 실행되는 흐름의 단위
- CPU 이용의 기본 단위
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고 Code, Data, Heap 영역은 공유함
- 스레드는 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들(힙 공간 등)을 같은 프로세스 내에 스레드끼리 공유하면서 실행됨
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유함 반면, 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없음
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있음. (한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있음)
- 싱글스레드
- 하나의 프로세스에서 하나의 스레드 실행
- 하나의 레지스터와 스택으로 표현
- 요청에 대한 빠른 반응을 요구하는 네트워크 서버의 프로그램일 경우 단일 스레드 모델이 더 적합
- 장점
- 자원 접근에 대한 동기화를 신경쓰지 않아도 됨
- 여러 개의 스레드가 공유된 자원을 사용할 경우 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며, 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킴. 단일 스레드 모델에서는 이러한 작업이 필요하지 않음
- 문맥 교환(Context Switching) 작업을 요구하지 않음
- 자원 접근에 대한 동기화를 신경쓰지 않아도 됨
- 단점
- 한 번에 하나의 일밖에 처리할 수 없기 때문에 작업에서 블로킹이 발생하면 다음 일을 처리하기까지 기다려야 하는 문제가 발생
- 멀티스레드
- 프로그램을 다수의 실행 단위로 나누어 실행
- 프로세스 내에서 자원을 공유하여 자원생성과 관리의 중복을 최소화
- 서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
- 각각의 스레드가 고유의 레지스터와 스택으로 표현됨
- 다양한 요인들이 결합된 데이터에 대한 통계적 분석 연산의 경우는 멀티 스레드 모델이 더 적합
- 필요한 구간에 여러 개의 스레드를 배치해 시스템 자원을 최대한 활용하여 빠르게 연산을 완료하도록 설계할 수 있음
- 장점
- 응답성 : 프로그램의 일부분(스레드)이 중단되거나 긴 작업을 수행하더라도 프로그램의 수행이 계속 되어 사용자에 대한 응답성이 증가 함.
- Ex) 멀티 스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 로드하고 있는 동안, 다른 스레드에서 사용자와 상호작용 가능
- 경제성 : 프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 시스템 자원 소모가 줄어듦. 스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있으며, 스레드 간의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더 빠름.
- 멀티프로세서 활용 : 다중 CPU 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가함
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답시간이 빠름
- 단점
- 임계 영역(Critical Section) → 둘 이상의 스레드가 동시에 실행하면 문제를 일으키는 코드 블록.
- 공유하는 자원에 동시에 접근하는 경우, 프로세스와는 달리 스레드는 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있음. 따라서 동기화가 필요.
- 동기화를 통해 스레드의 작업 처리 순서와 공유 자원에 대한 접근을 컨트롤할 수 있음
- Java에서 Synchronized 키워드 → 불필요한 부분까지 동기화를 하는 경우, 과도한 lock으로 인해 병목 현상을 발생시켜 성능이 저하될 가능성이 높기 때문에 주의해야함.
- 임계 영역(Critical Section) → 둘 이상의 스레드가 동시에 실행하면 문제를 일으키는 코드 블록.
'CS > OS' 카테고리의 다른 글
[CS] PCB & Context Switching (0) | 2024.02.01 |
---|---|
[CS] 시스템 콜(System Call) (0) | 2024.02.01 |
[CS] 인터럽트 (Interrupt) (0) | 2023.11.29 |
[CS] 프로세스 주소 공간 (0) | 2023.10.28 |
[CS] 운영체제 (0) | 2023.10.28 |