크래프톤 장병규의장과 정글 교육생간 티타임 기회가 있었다.
의미있었던 답변이 있어 나름대로의 해석을 기록해 둔다.
여기서 비트는 2진법으로 표현된 숫자(데이터) 그 자체이다.
즉 컨텍스트 없이는 프로그램, 데이터, 네트워크 데이터, 파일, 명령어, 문자열, 숫자 모두 비트 덩어리일 뿐이라는 것이다.
이들을 구분하는 유일한 방법은 컨텍스트 뿐이다.
컴파일러를 말한다.
C소스코드는
여기서 어셈블리어는 기계어 인스트럭션의 집합
현재 모든 컴퓨터는 폰노이만 구조를 따른다.
폰노이만 구조에서는 변수도 프로그램도 메모리에 저장된다.
프로세서는 메모리에 저장된 명령어(인스트럭션)을 읽어 실행할 뿐이다.
프로그램을 실행하면 프로그램을 메모리에 저장해야 한다.
이런 복사/읽기 작업들이 작업을 느리게 한다.(오버헤드)
그렇다고 모든 저장장치들에 비싼 SRAM을 사용할 수는 없다.
하지만 프로그램은 보통 코드와 데이터의 일부분에만 접근하기 때문에(지역성)
접근할 내용들을 미리 (작고 비싸지만)빠른 저장장치에 로드해 사용하는 것을 캐시라고 한다.
즉 캐시도 구체적인 실체라기보다는 추상화된 개념이다.
추상화는 복잡한 시스템에서 중요한 사항만을 강조하고, 불필요한 세부 구현을 감추어 단순화하는 것
어려운 개념인 추상화가 등장한다.
프로세서, 메인 메모리, 입출력장치들은 모두 구분 가능한 실체를 지칭한다.
프로세스, 가상메모리, 파일은 실체에 대한 추상화(된 개념이)다.
프로세스:
독립적으로 실행되는 프로그램의 인스턴스(인스턴스는 개념으로부터 구현된 실체)
프로세서, 메인 메모리, 입출력장치를 아우르는 추상화다.
실행 중인 프로그램에 대한 운영체제의(에 의한) 추상화다.
프로그램은 프로세서, 메인 메모리 등 자원을 점유하고 입출력장치들과 상호작용할 뿐, 그렇다고 이들 그 자체인 것은 아니다.
프로그램이 작업을 수행하고, 프로그램이 메모리를 차지하는 것 같지만, 현실에서는 모두 하드웨어가 한다.
자원 점유와 상호작용, 명령을 실행하고 동작하는 주체를 추상적인 개념으로 표현한 것이라고 보면 되겠다.(그런 주체가 물리적으로 실존하는 것이 아니므로)
이런 프로세스들이 모두 동시에 실행되는 것처럼 보이는 이유는 운영체제가 문맥 전환을 통해서 교차실행하기 때문이다.
스레드:
프로세스 내부의 실행 흐름 단위
프로세스와 비슷한 개념으로 한 프로세스에서 실행되는 다른 프로그램이라고 대강 이해할 수 있다.
스레드는 동일한 프로세스 내에서 구분된다.(두 개 이상의 프로세스에 걸친 스레드는 있을 수 없다.)
같은 프로세스 내에서 코드, 데이터, 힙 영역을 공유하나 스택은 공유하지 않는다.
스택은 입출력 순서가 중요하기 때문에 반드시 순서에 따라 실행되는 단위(스레드, 프로세스)가 독립적으로 가지고 있어야 한다.
스레드를 구분하는 이유
프로세스를 두고 스레드라는 개념을 별도로 정의한 이유는:
스레드간 문맥전환은 프로세스 간 문맥 전환보다 빠르다.(메모리와 자원을 공유하기 때문에 교체해야 하는 정보가 적다.)
데이터 공유가 용이하다. 그러므로 같은 프로세스 내에서 병렬처리가 필요할 때 유용하다.
문맥전환이란
프로세서가 현재 실행 중인 프로세스/스레드의 상태(레지스터 값, 프로그램 카운터 등)를 저장하고, 다음에 실행할 프로세스/스레드의 상태를 복원하는 과정
가상메모리:
가상메모리는 각 프로세스들이 각자의 메인 메모리를 사용하고 있는 것 같은 환경을 제공하는 추상화이다.
각 프로세스는 실제 메모리의 주소를 통해 접근하지 않고 가상주소를 통해 메모리에 접근한다.
모든 프로세스가 실제로 메모리 공간을 일정부분씩 점유를 한다고 하면 메모리 공간이 매우 많이 필요할 것이다.
프로세스가 할당된 메모리 공간을 모두 사용하는 경우는 적으니 일단 가상메모리 주소로 넉넉하게 할당해주고, 실제 데이터를 운영체제가 메모리에 알맞게 정리해서 관리한다.
그래서 가상 메모리 공간의 합은 실제 메모리 공간보다 클 수 있고, 이 경우 보조 저장장치에 기록하여 관리한다.
아래 사진에서 보듯 프로세스는 메모리 공간을 유동적으로 사용한다.
파일:
파일이 추상화라는 것이 잘 감이 안 오지만
디스크, 키보드, 네트워크 등 모든 입출력장치들은 파일로 모델링한다.
시스템은 네트워크를 사용하여 다른 시스템과 통신한다
네트워크는 또 다른 입출력장치일 뿐이라고도 볼 수 있다.