개발자로서 프로그래밍 언어를 배우는 것이 가장 기본이 되겠지만, 경력을 쌓다 보면 큰 그림의 개념들에 대해서 조금씩 알게 된다. 마치 우리가 발을 딛고 있는 땅 혹은 지구라는 것에 대해서 조금씩 알게 되고 공부하게 되는 것과 비슷하다. 하지만, 이러한 것들도 학습하다 보면 너무 크고 어려운 개념들이 많다. 여기서는 거기서도 아주 기본이 되는 컴퓨터의 구조와 가상화에 대해서 살펴 보자. 발표 자료[1]로 만는 것을 글로도 다시 작성해 본다. 글이 길어져 2개로 나누어 작성한다.

 

1. Process vs Thread – 기본부터 다시 보기

컴퓨터에서 프로그램이 실행된다는 건 ‘프로세스’가 만들어진다는 뜻이다. 상반되게 ‘스레드’는 이 프로세스 내부에서 다시 만들어져서 일어나는 작업 단위로 볼 수 있다.프로세스는 독립적인 주소 공간을 가지고 있어서 다른 프로세스랑 격리된다. 반면 스레드는 같은 프로세스 안에서 주소 공간을 공유해. 그래서 스레드 간 통신은 빠르고, 프로세스 간 통신은 조금 더 복잡하게 된다.

 

Process vs Thread[2]

2. 가상 메모리 – 물리 메모리를 넘어선 확장

리눅스 시스템에서 모든 프로세스는 '가상 주소(Virtual Address)'를 사용한다. 실제로는 이 주소가 우리가 알고 있는 실제 메모리인 물리 메모리나 하드 디스크와 같은 스왑 공간에 매핑된다. 64비트 시스템에서는 최대 256TB까지 접근 가능하다는 점이 상상 이상일 수 있겠다. 이 개념이 중요한 이유는, 각 프로세스가 자신만의 메모리를 가진 것처럼 행동할 수 있게 해줘서 시스템 안정성과 보안을 크게 높여준다.

Virtual Address[2]

3. IPC – 프로세스 간 소통의 기술

프로세스는 고립돼 있으니 서로 대화를 하려면 특별한 기술이 필요하다. 이걸 IPC(Inter Process Communication)라고 한다. 대표적인 예를 살펴 보면 다음과 같다.

  • 공유 메모리: 다른 프로세스에서 함께 접근 가능한 메모리 공간을 만들어 주는 것이다. 빠르지만 동기화가 중요하다.
  • 메시지 패싱: 명확하고 안전하지만 상대적으로 느리다.

[3]

4. 시스템 콜 – 유저 공간과 커널의 다리

우리가 코드를 짜서 실행하면, 실제로는 OS 커널에게 일을 시켜야 해. 그때 사용하는 게 ‘시스템 콜’이다.파일을 읽고 쓰거나, 새로운 프로세스를 만들거나 할 때 반드시 커널의 도움이 필요하다. 위에서 설명한 IPC도 시스템콜로 제공할 수 있다. 아래 그림은 우리가 Linux에서 간단한 프로그램을 작성하고 실행할 때, 발생하는 동작의 간략화 하여 보여 주는 그림이다.

 

OS 동작 설명[4]

 

5. 프로세스 스케줄링 – CPU 자원의 분배자

OS의 동작을 프로세스 처리에 대해서 시간 축으로 살펴 보면 동작에 대해서 좀 더 이해할 수 있다. 하나의 CPU가 수십 개의 프로세스를 동시에 처리하는 것처럼 보이는 건 스케줄링 덕분이다. 우선순위, 타임 슬라이스 등 다양한 정책이 있는데, 이건 성능에 큰 영향을 줄 수 있다. 여기서는 사용자 프로그램 2개 (User Prog. A, User Prog. B)가 어떻게 시스템 콜(Kernel)과 동작하여 하나의 CPU에서 처리되는지 시간 축으로 볼 수 있다.

 

스케줄링 예제[5]

 

마치며

여기서는 컴퓨터 구조(Computer Architecture)와 운영체제(Operating System) 중 개발자가 알고 있으면 도움이 될 만하다고 생각하는 중요한 컨셉을 아주 단순화 하여 살짝 식만 맛보았다. 이 내용들의 상세 내용들을 다루려면 대학교 학부의 한학기 과정 2개 정도를 다뤄야 할 수도 있다. 중요한 것은 이 글은 단순히 리눅스 프로세스와 같은 개념을 나열하였다기 보다는 우리가 웹 서비스와 같은 클라우드에 구현하는 기능들에 대해서 이해하기 위한 개념들 사이의 '연결 고리'를 설명한 것이라 할 수 있다. 시스템을 설계하거나 클라우드 아키텍처를 고민할 때 이 흐름을 이해하고 있으면 완전히 다른 수준의 대화가 가능해 질 것이다. 다음에는 좀 더 상위로 올라가서 가상화를 이용한 클라우드의 개념에 대해서 살펴 보자.

 

참고문헌

[1] 리눅스 프로세스에서 클라우드까지, https://docs.google.com/presentation/d/1PGIYqT5s-qyB4pshJqCFftZ-3r9b4iWWzrdO8dj6nvE/edit#slide=id.g22c5ba03f75_0_20

[2] Difference between Process and Thread in Java, https://javarevisited.blogspot.com/2015/12/difference-between-thread-and-process.html#axzz7ySnCqnZ1

[3] Virtual memory, https://en.wikipedia.org/wiki/Virtual_memory

[4] Inter Process Communication (IPC), https://www.geeksforgeeks.org/inter-process-communication-ipc/

[5] Terminologies: Kernel and Utility, https://velog.io/@sangh00n/User-program-and-System-Call

[6] User program and System Call, https://velog.io/@sangh00n/User-program-and-System-Call

+ Recent posts