커널과 OS

우리 컴퓨터는 CPU, Hard disk(or SSD), RAM 등의 하드웨어로 구성돼 있다.

다음 이미지를 살펴보자.

사용자 - 운영체제 - 커널 - 하드웨어

커널에 대해 간략하게 말해보면,
사용자(프로세스, 어플리케이션, 프로그램)가 내리는 명령이 운영체제로 들어오면
운영체제 내의 커널이 각각의 하드웨어를 컨트롤하게 된다.


커널을 한 마디로 정의하면


< 커널을 운영체제의 한 부분으로 하드웨어와의 인터페이스이다.>


커널을 제외한 운영체제의 나머지 부분은 부팅을 담당하고,
사용자 공간(프로세스, 어플리케이션, 프로그램)을 관리한다.

가상 머신(Virtual Machine)

윈도우에서 MacOS나 Ubuntu에서 실행하고 싶다면
윈도우에서 가상머신을 부팅시켜서 거기서 프로그램을 실행하면 된다.

가상머신이 돌아가는 원리는 이렇다.


먼저 하이퍼바이저라고 불리는 소프트웨어 조각이
가상 디스크, 가상 네트워크 인터페이스, 가상 CPU 같은 가상화 된 하드웨어를 생성한다.
가상머신에는 이 가상 하드웨어와 소통하는 게스트 커널 또한 포함돼 있다.

하이퍼바이저는 기존 OS를 대체하면서 동작할 수도 있고,
기존 OS위에서 동작할 수도 있다.


어떤 방식이든 하이퍼바이저를 사용하는 접근은 가상화를 필요로 하기 때문에
느리고 무겁다는 느낌이 든다.

 

같은 머신에 다수의 독립적인 그룹을 구성할 필요가 있을 때,
각각의 그룹에 대해 가상머신을 작동시키는 것은 좋은 접근법이라기엔
너무 무겁고, 리소스 낭비가 심하다.

 

다음 두 이미지를 비교해보자.

컨테이너를 이용할 경우 가상 guest OS와 가상 Hardware를 사용할 필요가 없어서
더 효율적인 관리가 가능하다.
하나의 가상머신도 버거운 노트북에서
수십 개의 컨테이너를 실행시킬 수 있을 정도라고 한다.

cgroups

2006년 구글은 Linux "control groups"를 발명했다.
이를 cgroups라고 한다.


cgroups는 유저 프로세스의 리소스 사용(프로세스 자원 사용)을 분리하여 관리하는
Linux의 커널 기능이다.

 

이러한 프로세스들은
같은 리소스 제한(속성)을 공유하는 프로세스의 집합인
네임스페이스(namespace) 에 집어 넣을 수 있다.


하나의 컴퓨터는 여러 개의 네임스페이스를 가질 수 있고,
각각의 네임스페이스는 커널에 의해 강제된 리소스 제한(속성)을 갖는다.

 

네임스페이스를 이용하는 이유는,
네임스페이스가 리소스 제한을 할 수 있기 때문이다.


리소스 제한(할당)은 해당 프로세스 집합이 사용할 수 있는
CPU, RAM의 리소스 양을 제한한다.


예를 들어 tiktok 어플리케이션이 우발적으로
서버를 망가뜨리지 않도록 리소스 제한을 둘 수 있는 것이다.

 

추가로, Linux의 cgroups는 네임스페이스 분리(namespace isolation)
기능을 포함하게 됐다. 네임스페이스 분리는
각 개별적인 프로세스를 분리하고 공유 메모리가 일어나지 않도록 방지한다.

 

cgroup분리는 더 높은 수준의 분리로서,
같은 cgroup 네임프로세스 내의 프로세스들이
다른 네임스페이스의 프로세스들로부터 독립적이도록 보장해주는 것이다.

 

요약하자면 네임스페이스 내부의 프로세스들에게,
각 네임스페이스는 고유한 머신으로 보이게 되는 것이다.

Linux Containers

Linux cgroups는 LXC(Linux container)라는 기술의 기반이 되었다.
리눅스 컨테이너(이하 LXC)는 오늘날 우리가 부르는 컨테이너의 첫 번째 구현이었다.

이 컨테이너는 cgroups와 네임스페이스 분리를 사용하여
별개의 프로세스와 네트워킹 스페이스를 가진 가상 환경을 만들어냈다.

 

LXC는 독립적이고 격리된 유저 스페이스를 어느 정도 가능하게 했다.
컨테이너의 개념은 LXC에 뒤따라 나왔다.

 

리눅스 컨테이너에서는 CPU와 메모리를 프로세스가 필요한 만큼만 추가로 사용하고
성능적으로도 문제가 거의 없다.

하나의 서버에 여러 개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적을 실행돼
가벼운 VM을 사용하는 느낌을 준다.

'Code 42 > Ft_server' 카테고리의 다른 글

ft_server 제출하기  (2) 2020.07.10
FT_server 순서대로 실행해보기(오류 수정 완료)  (4) 2020.07.09
ft_server과제 해석  (0) 2020.03.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
// custom