리눅스는 무엇 인가요 ?
리눅스(Linux) 는 App 관리, HW 자원관리를 하는 운영체제(OS) 입니다. 이론이나 역사적인 관점을 생략하고 실질적으로 어떤 기능과 역할을 하는지 알아봅니다.
리눅스는 어떤 SW 인가요 ?
리눅스는 일반적인 사용자 어플리케이션(예: 카카오톡, 브라우저, 엑셀)과는 다릅니다. 다양한 SW 들이 동작할 수 있는 "SW 환경(OS)" 을 제공하는 C언어 프로그램 입니다. (아래 링크는 리눅스 OS 소스코드 저장소 입니다.)
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/
리눅스는 어디에 쓰이나요 ?
특히 일반 고객들보단 산업(서버, 모바일, 슈퍼컴퓨터, 공장, 차량,IoT 등)에서 많이 쓰이고 국내에서는 삼성전자, LG전자, 현대모비스 등과 같이 전자기기, HW 제작을 하는곳 또는 카카오톡, 네이버, 당근 등과 같이 대규모 서버 컴퓨터, 슈퍼 컴퓨터를 사용하는곳에서 많이 쓰입니다. 최근에는 인공지능(AI), 데이터 수집,분석 등을 위한 서버환경으로 많이 쓰입니다.
리눅스 등장배경
예를 들어 카카오톡(App)이 동작할때는 반드시 네트워크와 디스크라는 HW 자원이 필요합니다. 따라서 단순하게 생각해볼때 카카오톡(App)은 네트워크 카드 HW 장비를 사용할 수 있어야하고 해당 HW 를 제어하기위한 프로그래밍을 해야합니다. 하지만 진짜로 그렇게 직접다룬다면 수많은 회사들의 네트워크 카드 HW 장비 모델, 버전별에 맞춰서 모두 프로그래밍 해야하는 상황이 벌어지고 배(메신저 기능 프로그래밍)보다 배꼽(네트워크 HW 제어 프로그래밍)이 커지는 상황이 벌어집니다. 뿐만 아니라 다른 App(예: 크롬브라우저) 역시 중복된 작업(네트워크 등 HW 제어 프로그래밍)을 해야하는 상황이 벌어집니다.
따라서 전세계의 수많은 네트워크, 디스크, 메모리, CPU 등 HW 자원을 통합적으로 다루는 역할의 SW가 필요했고 그런 역할을 하는 SW 중에 하나가 리눅스 입니다.
리눅스 핵심역할
리눅스의 핵심역할은 App 관리, HW 자원관리 2가지 입니다.
(1) 사용자 프로그램(Application) 관리
많은 사용자 프로그램(Application)들이 동작할 수 있는 환경을 제공하고 다양한 HW 자원들을 쉽게 활용하고 최대한 공정하게 나눠쓸 수 있도록 관리 역할을 합니다. 다양한 프로그램들이 정상적으로 실행할 수 있도록 프로세스 또는 쓰레드(task_struct) 라는 단위로 프로세스들을 관리하고 어떤 파일을 열고 있는지 어떤 자원들을 얼마나 사용하고 있는지 모두 효율적으로 관리합니다.
(2) HW 자원(CPU, 메모리, 디스크, 네트워크 등) 관리
대표적으로 시스템 호출(system call)이라는 방식을 통해서 손쉽게 HW 자원(예: USB, 디스크, 네트워크)를 사용할 수 있게 합니다. 사용자 프로그램들에게 약 200~400여개 정도의 시스템콜 함수를 제공하고 그중에 가장많이 쓰이는게 open, read, write 입니다. 어떤 HW 자원(예: USB, 디스크, 네트워크)이든 대부분 read, write 라는 아주 단순한 방식으로 쉽게 이용할 수 있는 SW 환경을 제공합니다.
CPU 자원은 공평하게 나눠 쓸 수 있도록 CFS 스케줄러 등의 기능을 내장하고 있습니다. 특히 CFS 스케줄러는 우선순위를 고려하면서도 동시에 Starvation(CPU를 점유하지 못하는 기아 상태)을 방지하는 특징을 가지고 있습니다.
메모리 자원은 가상메모리 매커니즘을 기반으로 관리하여 가상메모리 주소와 물리메모리 주소를 연결시켜 활용하는 방식을 사용합니다. 기본적으로 후매핑 전략을 두고 있어 처음엔 가상주소와 물리주소를 연결하지 않은 (깡통) 가상주소를 기반으로 사용자 프로그램들이 동작하고 실제로 읽고 쓰는 메모리 주소 영역에 대해서만 차후에 연결(후매핑) 시켜 물리메모리주소를 할당해 주는 방식을 쓰고 있습니다. 무작정 메모리를 할당해주지 않고 나중에 할당(후매핑)해주는 방식이기 때문에 메모리를 아낄 수 있는 장점을 가지고 있습니다. (가상메모리 매커니즘 관련해서는 추가다른 포스팅으로 설명 올리겠습니다)
리눅스 배포판
윈도우에도 XP, 7, 8 등 다양한 버전이 있는것과 유사하게 같은 리눅스 이지만 다양한 목적에 맞춰 다양한 유틸리티, 설정, 세팅등이 다른 데비안(Debian), 우분투(Ubuntu), 레드헷(RedHat), 센트오에스(CentOS), 페도라(Fedora) 등의 배포판이 존재한다.
리눅스 활용사례
최근 리눅스는 물리서버에 설치해서 사용하는경우는 많이 적어졌습니다.
대부분 클라우드 환경(AWS, GCP 등)을 활용해서 가상머신(VM) 환경에 이미 리눅스가 설치된 상태 서비스(IaaS)를 활용하는 경우가 많고 그위에 필요한 미들웨어(DB,WAS 등) 등을 아예 미리 설치까지 마친 서비스(PaaS)로 활용하는 경우도 많습니다. 또한 Application(예: nginx, tomcat, mysql 등) 들끼리의 다양한 충돌문제를 방지할 수 있는 컨테이너 환경의 리눅스로도 많이 활용 되고 있습니다.
(참고: 컨테이너 관련해서는 다른 포스팅에 게시하도록 하겠습니다.)