프로그램 - 프로그래밍 언어로 짜여진 상태로, 하드 디스크 상에 저장만 되어 있는 상태.
프로세스 프로그램이 메모리에 올라가서 실제 실행 중인 상태
프로그램 | 자세한 요리 레시피(어떤 재료로 어떻게 요리를 해야하는 지 상세하게 적혀진 명세), 서랍(디스크)에 꽂혀 있다.
프로세스 | 레시피 적혀진 대로 불판(메모리) 위에서 요리되고 있는 상태..!
프로세스는 독립적인 메모리 위치에 위치하며 아래의 영역을 가진다.
code(text):동작 방식, 짜여진 코드(바이너리 형태로 컴파일 됨)
data : 전역변수, static 변수, 배열, 구조체 등이 저장되는 영역. 프로그램 시작할 때 할당되어 끝날 때 반환
BSS 영역 : 초기화되지 않은 변수들을 저장하는 영역 (Blocks started by symbol) - RAM에 저장한다.
Data(GVAR) 영역 : 초기화된 데이터 (ROM에 저장)
WHY? 메모리 공간을 효율적으로 사용하기 위해서 구분한다.
초기 값이 있는 데이터들은 그 값 그대로 ROM에 저장하고, 초기화되지 않은 데이터들은 0으로 초기화(커널에서)할 것이기 때문에 굳이 ROM 을 차지하지 않도록 구분한다.
stack : 지역변수, 매개변수, 리턴값, 일시적으로 사용하고 사용이 끝나면 반환, 스택 형태로 쌓임(높은 주소값 -> 낮은 주소값 방향)
----> 프로세스가 로드될 때 크기를 미리 계산해서 로드, stack에서 반복된 재귀함수 호출 등 -> stack overflow error 발생
heap (동적 할당) : 필요에 의해서 할당되는 값(런타임에 결정, 낮은 주소값 -> 높은 주소값 방향) ---> stack와 heap은 같은 영역을 공유하며, 서로의 영역을 침범하면 heap overflow, stack overflow 발생
들어가기에 앞서..
컴퓨터의 내부 작업은 크게 연산 처리 작업과 입출력 작업으로 구분할 수 있다.
CPU 작업과 I/O (Input/Output)작업에 대해 간단히 알아보자.
Context Switching?
컴퓨터 내부의 작업 주도권이 바뀌는 것.
인터럽트(interrupt) 요청이 있을 때 콘텍스트 스위칭이 발생한다.
대표적인 예로, CPU 작업 중 I/O 요청이 발생하면 context switching이 일어나며 CPU의 동작이 멈추고 컴퓨터의 작업 주도권이 I/O 작업으로 넘어간다.
아래의 인터럽트 요청이 있을 때 콘텍스트 스위칭이 발생한다.
1. 입/출력을 요청할 때
2. CPU 사용시간이 만료되었을 때
3. 자식 프로세스를 만들 때
4. 인터럽트 처리를 기다릴 때
(https://beststar-1.tistory.com/26)
문제는, context switching이 발생할 때 오버헤드(overhead)가 발생한다. 따라서 switching이 빈번할수록 성능상 손해를 본다.
메모리 위에 하나의 프로그램만 올라가서 하나의 프로세스만 동작할 수 있는 환경으로, 프로세스에서 I/O 요청이 발생하면 CPU는 대기상태가 되고 I/O가 끝났다는 신호가 오면 다시 CPU가 중단된 시점부터 다시 프로세스가 동작한다.
불판에서 한가지 요리만 할 수 있다. C셰프(CPU)와 I/O셰프는 동시에 바톤 터치하면서 일해야 한다.
메모리 위에 여러 프로그램을 올려놓고, A 프로세스가 I/O 요청을 맞았을 때, CPU는 쉬는 것이 아니고, I/O 요청동안 B 프로세스를 동작한다.
한계) 그래도 사용자가 메인으로 사용하는 프로그램은 A이고, A가 끝날 때 까지 B는 제대로 주도권을 가질 수 없다.
여러 주문을 불판에 올려놓고 한가지 요리에 집중한다. 그 요리에 I/O셰프가 작업할 때 C셰프는 다른 요리도 뒤적거린다.
CPU의 주도권을 여러 프로세스에 짧은 quantum 시간동안 골고루 분배하여, 메모리 위에 실행중인 프로그램(프로세스)가 실질적으로 동시에 동작하고 있는 것처럼 보이게 해줌.
-> 빠른 반응성,하나의 프로세스 장애로 전체 시스템이 다운되는 것을 막음, CPU 효율적 활용, 프로세스 우선 순위 조절(OS의 스케줄링 알고리즘따라) / 단 context switching 자주 일어남.
C 셰프가 불판 위 여러 음식을 0.01초씩 빠르게 요리함. 겉으로 보기에 동시에 요리되고 있는 것처럼 보임.
스레드란?
CPU(core) : 요리사
H/W에서의 스레드 : core가 한번에 할 수 있는 작업량. 요리사의 팔 개수. (원래 코어:스레드 = 1:1 이었으나, hyper threading 기술로 1:n이 가능하게 되었다.)
S/W에서의 스레드 : 프로세스 내에서 논리적 흐름으로, 프로세스 자원을 공유한 상태(stack 영역만 스레드 별로 가지고 나머지 영역은 공유한다)로 프로세스의 업무를 스레드라는 각각의 흐름에서 처리.
멀티 스레드: 공유하고 있는 영역이 있어서 뒤에서 볼 멀티 프로세싱에 비해 context switching이 비교적 가볍다. 단 race condition, critical section 같은 공유 데이터 관리에 유의해야 함.
멀티프로세싱이란?
실제로(물리적으로) 여러 개의 cpu(core)를 둬서 동시에 여러 프로세스가 동작할 수 있도록 한다.
셰프 여러명 채용
①하나의 job을 여러 코어가 동시에 작업하거나 ②여러 코어가 여러 job을 동시에 작업
---> 멀티 프로세싱 + 멀티 태스킹
① 하나의 작업에 대해 여러 core의 각각의 thread가 번갈아가면서 수행
여러 셰프가 빨리 요리를 만들기 위해 달려듦.
② 여러 작업에 대해 여러 core의 각각의 thread가 번갈아가면서 수행
여러 셰프가 각자 맡은 요리들을 왼손에 하나, 오른손에 하나씩 들고 열심히 만들어 주문을 쳐냄.
멀티 프로세싱 vs 멀티 프로세스
멀티 프로세싱 : 실제로 여러 코어에서 작업을 수행 -> 빠른 처리 목적 (많은 연산이 필요한 작업)
멀티 프로세스 : 하나의 프로세스를 여러 프로세스(부모 - 자식 형태)로 나누어 역할 분담(각각의 pid) -> 하나의 작업이 실패해도 전체 프로세스 오류가 되지 않도록 안정성 향상 목적(브라우저 멀티 탭)
ㄴ 독립적인 task 수행, 독립적인 메모리 할당
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-programming-tasking-processing
비슷한 용어 탓에 개념이 헷갈릴 때가 있어 이참에 정리를 해둔다.