컴퓨터는 크게 하드웨어와 소프트웨어로 나뉜다.
하드웨어
는 눈에 보이고 , 손으로 만질 수 있는 것들 예를 들면 모니터 , 데스크톱, CPU 등이 될 수 있다.
소프트웨어
는 하드웨어와 반대로 눈에 보이지 않고 손으로 만질 수 없는 것들 , 예를 들면 현재 우리가 이 블로그를 볼 수 있도록 도와주는 웹브라우저 , ppt를 만들 수 있게 도와주는 MSoffice 등 그 밖에도 소프트웨어의 종류를 상당히 다양하다.
소프트웨어는 위 그림처럼 다시 한번 응용프로그램
과 운영체제
로 나뉜다. 위에서 말씀드린 웹브라우저와 MSoffice를 엄밀히 따지자면 소프트웨어 중에서도 응용 프로그램에 속한다. 그리고 운영체제, 이 운영체제에 속해 있는 것이 커널
이다.
(운영체제의 예로는 Window, Mac OS, 리눅스, 우분투 등이 있다.)
리눅스 커널의 OS의 중추 역할
을 하며 주로 디바이스 관리 , 프로세스 관리 , 메모리 관리 , 시스템 콜 제공과 같은 기능을 가지고 있다. 쉽게 말하면 컴퓨터 자원
을 관리해준다.
커널은 항상 컴퓨터 자원들만 바라보고 있으며 사용자와 직접적인 상호작용은 하지 않는다. 사용자와 상호작용
을 하기 위해 필요한 것이 바로 시스템 프로그램
이다.
커널의 사전적 의미는 '알맹이'이며 , 운영체제에 있어 가장 핵심이며, 운영체제 맨 하층에서 작동되는 소프트웨어이다. 여러 개의 프로세스들을 관리하기 위해 스케줄링 또한 한다.
💡 커널의 가장 큰 역할은 컴퓨터의 물리적 자원과 추상화 자원을 관리하는 것이다.
추상화
란 물리적으로 하나 뿐인 하드웨어를 여러 사용자들이 번갈아 사용하게 중재함으로써, 마치 한 개의 하드웨어가 여러개인 것처럼 보여지도록 하는 기술
을 말한다.
추상화된 환경에서 각 사용자들은 본인이 하나의 하드웨어를 독점하여 활용하는 것처럼 느낄 수 있다.
물리적 자원이라 할 수 있는 하드웨어에 접근하기 위한 방법은 매우 복잡하고 어렵다. 따라서 사용자가 이를 직접 접근하기에는 무리가 있다. 이러한 물리적 자원을 추상화하여 사용자가 보다 쉽게 접근할 수 있도록 도와주는 것이 커널
이다.
커널이 추상화하여 관리하는 물리적 자원들과 이를 추상화한 자원을 칭하는 단어를 대응시켜보았다.
커널의 주요 기능은 다음과 같다.
리눅스 커널은 디바이스 드라이버 라는 하드웨어 입출력을 제어하는 소프트웨어를 이용하여 장치를 관리한다.
리눅스에서는 프로그램을 실행할 때 파일 시스템 내 특정 디렉토리에 있는 프로그램의 파일을 읽어와 메모리에 적재한다. 이 프로그램이 메모리에서 실행되는 프로세스가 된다. 프로그램이 종료된다며 프로세스 역시 삭제된다.
사용자가 시스템에 로그인하게 되면 보통 약 100여개의 프로세스가 동시에 실행되는데, 프로세스가 이용할 수 있는 CPU는 하나이므로, 여러 프로세스를 동시에 이용할 수는 없다. 따라서 동시에 실행되는 프로세스 간 CPU를 이용할 수 있는 시간을 분해하게 된다. 각 프로세스에는 PID(process id)가 부여되며 커널은 이 PID를 통해 프로세스를 관리하게 된다.
프로그램이 실행 될 때 메모리에는 프로그램뿐만 아니라 프로그램이 이용하는 데이터 영역 또한 메모리에 할당된다. 사용자 프로그램의 요구에 따라 메모리 영역을 분배하거나 이용이 끝난 메모리 영역 회수 등을 담당하는 것이 커널이 수행하는 메모리 관리이다.
메모리 관리에서는 가상 메모리 또한 지원한다. 가상 메모리라는 것은 이름에서 알 수 있듯이 실제로는 없는 메모리지만, 실제로 존재하는 것처럼 메모리를 사용할 수 있게 해준다. 가상 메모리는 실제 메모리가 아닌 HDD와 같은 보조 기억 장치의 일부도 프로세스가 볼 때에는 같은 메모리인 것처럼 보이게 하기 때문에 실제 내장된 메모리보다 더 큰 용량이 메모리 사용이 가능하다.
이미지 출처 : https://sangyeon96.gitbooks.io/linux-system/content/chapter3_section1.html
이 HDD에 마련된 가상 메모리 영역을 '스왑(swap)'이라고 한다. 메모리에 있는 프로그램 전체 영역을 보조 기억 장치로 내보내는 것을 '스왑 아웃' 반대로 내보냈던 데이터를 메모리에 다시 가져오는 것을 '스왑 인'이라고 한다.
시스템 콜이란 표준 출력이나 파일을 쓰는 write, 읽어들이는 read, 프로세스를 포크하는 기능 등을 갖고 있어 사용자 프로그램에서 엑세스 할 수 있도록 도와준다.
커널은 왜 이러한 자원들을 관리해줄까 ?
바로 사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 매개하기 위해서이다.
컴퓨터만의 언어와 규칙으로 하드웨어 접근하고 통신해야 하는데 일반 사용자들은 이러한 언어와 규칙을 전혀 모른다. 따라서 커널은 사용자와 컴퓨터 중간에서 상호작용 할 수 있도록 도와주는 '번역가'같은 역할을 한다고 보면 된다.