현대의 운영체제는 여러프로그램을 동시에 실행해야하고, 또한 각종 장치를 관리합니다.
여기서 의문이 생깁니다, 아니 근데 개발자는 웹 어플리케이션을 만드는 사람들인데
굳이 운영체제까지 배워야 할까? 그 질문에 대한 답변은
현대의 웹 어플리케이션 역시 동시에 다양한 일을 처리해야하는 경우가 발생합니다.
그리고 다양한 일을 처리하는 일은 운영체제에서 오랬동안 고민하고 발전시킨 주제입니다.
프론트엔드의 영역에서 UI를 갱신하면서 복잡한 계산이 필요하다면,
브라우저에 표시되는 과정이 느려지는 일이 발생할 수 있습니다.
백엔드 영역에서는 다양한 요청이 하나의 데이터베이스 , 또는 하나의 프로세스에 접근하면서
하나의 데이터를 여러요청이 동시에 수정하면서 데이터가 오염되는 문제 (동시성 문제) 가
발생할 수 있습니다.
이미 많은 어플리케이션은 이러한 문제를 풀기위한 방법을 마련해놓고 있습니다,
웹 개발자는 때때로 이 방법을 그대로 사용하는 것으로 문제를 해결할 수도 있습니다.
그러나 이 방법을 이해하고 사용하기 위해서는 이런 문제를 풀기위한
컴퓨터 공학의 이론을 알아야 합니다.
1) 프로그램이란 무엇인가?
프로그램의 의미는 하나의 실행단위를 뜻합니다, 예를 들면 메모장, 워드와 같은 프로그램일 수 있겠죠.
윈도우의 경우라면 이름 뒤쪽에 .exe 가 붙어있는 파일들을 프로그램이라고 합니다
다시말해 프로그램은 "어떠한 작업을 위해 실행할 수 있는 정적인 상태의 파일" 이라고 볼 수 있겠습니다.
실행가능한 하나의 단위 입니다
2) 프로세스란 무엇인가?
위에서 프로그램에 대한 정의를 살펴봤습니다, 프로그램은 정적인 상태의 파일이라고 했죠?
그런데 이 프로그램을 사용하면서 프로그램이 실행되고 돌아가고 있는 상태가 되었을때,
즉, 컴퓨터가 어떤 일을 하고 있는 상태를 바로 프로세스 라고 합니다.
어떤 컴퓨터가 게임을 다운받고 있는데, 갑자기 움직이지 않습니다. 어떤 이유인지 알아봤더니
게임을 전부 다운받기 전까지는 다른 작업을 할 수 없는 컴퓨터였던겁니다. 이게 말이 되는 일일까요?
예전에는 말이 됬습니다, 예전의 컴퓨터들은 하나의 작업을 실행하면 그것이 끝나고난 후에 다른 작업을
진행할 수 있었기 때문입니다, 그런데 지금은 어떤가요? 게임을 다운받는 중에도 다른 작업을 얼마든지
실행할 수 있죠? 이것이 바로 멀티 프로세스 덕분입니다. 여러개의 프로세스를 한번에 사용할 수 있게되어서
각기 다른작업들을 동시에 사용할 수 있게 된것이지요.
이처럼 여러 프로세스를 동시에 돌리는 작업은 동시적, 혹은 병렬성, 아니면 이 둘의 혼합으로
이루어지게 되는데, 간단하게만 알아보자면
3) 스레드란 무엇인가?
프로세스 하나에 하나의 작업이 진행된다고 했었는데, 예를 하나 들어보겠습니다.
우리가 게임 페이지에 들어가서 게임을 다운받고 있다고 가정해 보겠습니다. 그러면 우리는 이 게임 페이지라는
브라우저 안에서 하나의 작업을 진행중인것이지요. 그렇다면 이 브라우저안에서의 작업은 꽉 찬것이네요?
멀티 프로세스는 하나의 프로세스가 아니라 여러개를 동시에 돌리는것이기때문에 다른 브라우저를 실행하는것은
가능하겠지만, 게임을 다운받고있는 이 브라우저안에서는 아무작업도 할 수 없습니다.
진짜 그런가요? 현재 우리가 쓰고있는 브라우저가 그렇게 동작하나요? 아닙니다. 게임을 다운받는 중에도
이벤트 페이지라던가 공지페이지를 충분히 이동하며 확인할 수 있습니다. 이게 어떻게 된 일일까요?
바로 스레드 덕분입니다. 이 스레드는 하나의 프로세스 안에서 또 여러개의 작업이 가능하게 해줍니다.
4) 프로세스, 스레드 예시로 들어보기
우리가 큰 식당안의 주방에 들어와 있다고 생각해보겠습니다. 이 식당은 워낙 유명해서 손님이 줄지를 않습니다.
그렇기 때문에 주방또한 쉴새없이 돌아가고 있죠.
각 메뉴마다 작업하는 하나의 테이블이 존재하는데 이 하나하나의 테이블이 바로 프로세스 입니다.
총괄셰프는 이 테이블마다 셰프를 분할하여 할당하게 됩니다.
한명이 돌아가면서 동시적으로 요리를 하던, 여러명이 동시에 요리를 하던 아니면 둘을 섞어서 하던
테이블에 할당된 메뉴를 계속해서 만들어 내는겁니다.
만약 한 테이블에서 햄버거를 만든다고 해보겠습니다. 이 테이블에서 진행되는 작업을 스레드라고 본다면
패티를 굽는 스레드를 진행하는동안 야채를 빵위에 얹어 소스를 뿌리는 스레드도 진행되야겠죠.
패티를 굽는동안 아무것도 하지 않으면 햄버거를 만드는 시간이 현저히 느려질테니까요.
그리고 한 메뉴에서 해당하는 스레드는 같은 테이블, 즉 프로세스에서 진행되야 합니다.
만약 이쪽 테이블에서 패티를 굽고 저 건너편의 테이블에서 야채를 얻는 작업을 한다면 비효율적이겠죠.
V8은 Google Chrome과 Node.js에서 사용되고 있는 구글에서 제작한 자바스크립트 엔진입니다.
C++ 로 작성되었으며, 고성능의 자바스크립트 전용의 웹 어셈블리 엔진 (WASM) 이라고 할 수 있습니다.
일반적으로 자바스크립트 엔진은 코드 한줄을 해석하고 바로 실행하는 인터프리터 형식이지만,
v8엔진은 자바스크립트 코드를 바이트코드 (ByteCode) 로 컴파일 하고 실행하는 방식을 사용합니다.
더 자세한 사항은 개별적으로 정리를 해보겠습니다. 일단은 이정도만,
1) 문자열
컴퓨터가 인지할 수 있는 이진법적인 코드를 사람이 확인할 수 있는 각나라의 언어로 변환해주는
약속된 규칙을 나열해 놓은 문자표입니다.
2) 유니코드
세상은 넓고 언어는 많다, 그 사람들은 모두 각자의 나라에서 컴퓨터를 씁니다. 컴퓨터를 각자의 나라에서
각자의 나라끼리만 사용한다면 큰 문제는 없겠지만, 현대는 인터넷을 이용하여 전세계 모든 나라와 소통이
가능합니다. 이런 세상에서 각 나라들이 가지고 있는 고유의 문자표를 전세계에 서로서로 나눠주면서
A 나라의 데이터를 이용할땐 A나라의 문자표를, B나라의 데이터를 이용할땐 B나라의 문자표를
일일이 확인해가며 쓸 수는 없기에 전세계의 거의 모든언어를 하나의 약속된 표준 문자표를 이용하여 소통하자
하고 만든 것이 유니코드 입니다.
3) 인코딩
유니코드를 쓰다보니 한가지 문제점을 발견합니다, 바로 각 나라의 언어들을 출력하는데 있어
사용되는 byte 의 크기가 달랐기 때문입니다, 영어는 1바이트, 한글은 2바이트 .. 이런 식으로 말이죠.
그러다 보니 컴퓨터에게도 혼동이 일어납니다, 어떨때는 1바이트로 읽고, 어떨때는 2바이트로 읽고..
규칙이 없이 너무 가변적이다 보니 컴퓨터가 오류가 날 수 밖에 없죠.
그렇게 해서 나온 해결책이 바로 인코딩입니다, 각각의 바이트마다 뒤에 인식할 수 있는 어떤 규칙을 만듭니다.
1바이트는 a, 2바이트는 b .. 이런식으로 각각의 크기에 따라 약속된 꼬리표를 달아서
컴퓨터가 그 꼬리표를 확인하고 유니코드의 크기를 확인하게 해줍니다,
예로는 utf-8, utf-16 등이 있습니다.
컴퓨터에서 일을하려면 정보들을 넣어놓을 공간이 필요합니다, 그것이 바로 메모리이죠.
메모리가 크면클수록 컴퓨터가 일을 할 수 있는 데이터가 들어갈 공간이 커지기때문에 컴퓨터는 조금 더
원활하게 데이터 작업을 수행할 수 있게 됩니다.
하지만 그 메모리도 언젠가는 가득 차게 될때가 있는데, 그때가 되면 컴퓨터가 과부하가 걸려버립니다.
심지어 지 혼자서는 아무것도 못하여 누군가가 메모리를 정리해줄때까지 가만히 있기만 하죠.
그때 나서서 불필요한 메모리를 정리해주는것이 바로 가비지 컬렉션입니다.
C 나 C++ 같은 오래된 언어에서는 정리해야할 불필요한 메모리를 지우는 작업마저
일일이 작업목록에 넣어서 직접 지워야 했다고 합니다.
하지만 지금에 와서는 가비지컬렉션을 도입하여 컴퓨터가 알아서 메모리를 관리하게 해주게 됬습니다.
이 가비지 컬렉션이 일하는 방식은 여러가지가 있는데 그 중 하나는 mark-and-sweep 입니다.
메모리 전체를 스윽 훑으면서 현재 사용하고 있는것들만 마크를 한다음에 마크되지 않은 데이터는
전부 삭제해 버립니다. 프로그래밍 측면에서는 루트에 닿지 않는 변수들을 치우는것이죠.
또 하나는 reference counting 입니다. 참조카운팅 이라고도 합니다.
한 요소가 다른 요소에게 몇번이나 카운팅이 되는지 찾아서 그 수가 0이 되면 지우는겁니다.
하지만 이 가비지컬렉션 또한 완벽하지 않아서 메모리누수를 100% 막을 수는 없다고 합니다.
그렇기에 가비지컬렉션이 동작하고 있다고 해도 메모리 관리에 신경을 써야하는것은 맞습니다.
캐시는 많은 시간이나 연산이 필요한 작업의 결과를 저장해두는것을 의미합니다.
컴퓨팅에서의 캐시는 일반적으로 일시적인 데이터를 저장하기 위한 목적으로 존재하는
고속의 데이터 저장공간입니다.
첫 작업 이후에 이 데이터에 대한 요청이 있을경우, 데이터의 기본 저장공간에 접근할때보다 더 빠르게
요청을 처리할 수 있습니다. 캐싱을 사용하면 이전에 검색하거나 계산한 데이터를 효율적으로 사용가능합니다.
캐시의 장점은 이러합니다.
캐시의 데이터는 일반적으로 RAM과 같이 빠르게 엑세스 할 수 있는 하드웨어에 저장되며,
소프트웨어 구성요소와 함께 사용될 수 도 있습니다. 캐시는 기본 스토리지 계층 (SDD, HDD) 에 엑세스하여
데이터를 가져오는 더 느린작업의 요구를 줄이고, 데이터 검색의 성능을 높입니다.