리눅스 구조 (커널)

문린이·2024년 2월 28일
0

커널

커널이란?

리눅스 커널은 운영 체제의 핵심 구성 요소로, 하드웨어와 소프트웨어 사이의 인터페이스 역할을 한다. 사용자 프로그램과 하드웨어 사이에서 메시지를 전달하며, 시스템 리소스를 효율적으로 관리하고, 다양한 시스템 서비스를 제공한다.

커널의 주요 기능

  1. 프로세스 관리: 프로세스 생성, 스케줄링, 관리 및 종료 등 프로세스의 생명 주기를 관리한다. 멀티태스킹 환경을 지원하여, 여러 프로세스가 동시에 실행될 수 있도록 한다.

  2. 메모리 관리: 물리 메모리와 가상 메모리의 할당 및 해제를 관리한다. 메모리 보호, 메모리 매핑, 페이지 교체 알고리즘 등을 통해 효율적인 메모리 사용을 보장한다.

  3. 파일 시스템 관리: 리눅스는 다양한 파일 시스템을 지원한다. 파일 생성, 삭제, 읽기, 쓰기 등의 파일 시스템 관련 작업을 처리한다.

  4. 장치 드라이버: 하드웨어 장치와의 통신을 위한 드라이버를 포함하고 있다. 이를 통해 키보드, 마우스, 디스크 드라이브, 네트워크 카드 등 다양한 하드웨어 장치를 제어할 수 있다.

  5. 네트워킹: TCP/IP 프로토콜 스택을 내장하고 있어, 인터넷 및 네트워크 기반의 통신을 가능하게 한다.

  6. 보안: 사용자 권한 관리, 액세스 제어 목록(ACL), SELinux와 같은 보안 기능을 제공하여 시스템 보안을 강화한다.

커널의 구조

리눅스 커널은 모듈식 구조를 가지고 있다. 이는 필요에 따라 기능을 추가하거나 제거할 수 있음을 의미한다.

  • 커널 코어: 시스템의 핵심 기능을 담당하며, 프로세스 관리, 메모리 관리 등을 포함한다.

  • 장치 드라이버: 다양한 하드웨어 장치를 지원하기 위한 드라이버 모듈이다.

  • 파일 시스템: ext4, Btrfs, XFS 등 다양한 파일 시스템을 지원한다.

  • 네트워크 스택: 네트워킹 기능을 구현한 부분으로, 데이터의 송수신을 담당한다.

커널의 특징

  • 오픈 소스: 소스 코드가 공개되어 있어 누구나 열람, 수정, 배포가 가능하다.

  • 휴대성: 다양한 하드웨어 아키텍처에서 실행될 수 있도록 설계되었다.

  • 모듈식 설계: 필요한 기능을 모듈로 추가하거나 제거할 수 있어 유연한 시스템 구성이 가능하다.

  • 멀티태스킹: 여러 프로세스와 스레드를 동시에 실행할 수 있다.

  • 멀티유저: 다수의 사용자가 동시에 시스템을 사용할 수 있다.

커널의 동작 방식

터미널의 ls 명령어를 입력한다면?

사용자 공간에서의 동작

  1. 명령어 입력: 사용자가 터미널에 ls 명령어를 입력하고 엔터를 누르면, 터미널 프로그램은 이 입력을 받아들인다.

  2. 쉘 처리: 터미널은 사용자의 입력을 쉘(shell)로 전달합니다. 쉘은 명령어 해석기로, 입력된 명령어를 해석하고 실행할 프로그램을 결정한다.

  3. 명령어 실행: 쉘은 ls 명령어에 해당하는 실행 파일을 찾아 실행한다.

커널 공간에서의 동작

  1. 시스템 호출: ls 프로그램이 실행되면, 해당 디렉토리의 내용을 읽기 위해 파일 시스템 관련 시스템 호출을 커널에 요청한다. 예를 들어, open(), read(), readdir() 등의 시스템 호출이 사용될 수 있다.

  2. 커널의 파일 시스템 접근: 커널은 요청받은 시스템 호출을 처리하기 위해 파일 시스템을 접근한다. 이 과정에서 커널은 해당 디렉토리의 메타데이터와 내용을 읽어 메모리에 적재한다.

  3. 결과 반환: 커널은 읽은 디렉토리의 내용을 ls 프로그램에게 반환한다. 이 데이터는 사용자 공간으로 복사되어, 프로그램이 사용할 수 있게 된다.

  4. 출력: ls 프로그램은 받은 데이터를 가공하여 터미널에 출력한다. 사용자는 터미널 화면에서 디렉토리의 내용을 볼 수 있다.

서버를 실행시킨다면?

1. 프로세스 생성

  1. 프로그램 실행 요청: 사용자가 서버 프로그램을 실행시키는 명령을 입력한다. 이 때 쉘(Shell)이나 다른 실행 메커니즘을 통해 실행 요청이 이루어진다.

  2. 실행 파일 로딩: 커널은 실행 파일을 찾아서 메모리에 로드한다. 이 과정에서 필요한 바이너리와 라이브러리가 메모리에 적재된다.

  3. 프로세스 생성: 커널은 새로운 프로세스를 생성하고, 프로세스에 실행 파일을 연결한다. 이때 프로세스에 고유한 프로세스 식별자(PID)가 할당됩니다.

2. 자원 할당 및 초기화

  1. 메모리 할당: 커널은 프로세스 실행에 필요한 메모리를 할당한다. 이는 코드, 데이터, 스택 영역을 포함한다.

  2. 프로세스 컨텍스트 초기화: 프로세스의 실행 환경(예: 환경 변수, 파일 디스크립터)이 초기화된다.

  3. 네트워크 소켓 설정: 서버 프로그램이 네트워크 요청을 받기 위해, 커널은 네트워크 소켓을 열고, IP 주소와 포트를 바인딩한다.

3. 실행 및 요청 처리

  1. 프로세스 스케줄링: 커널은 프로세스 스케줄러를 통해 서버 프로그램의 실행을 시작합니다. CPU 시간이 프로세스에 할당된다.

  2. 클라이언트 요청 수신 대기: 서버 프로그램은 지정된 포트에서 클라이언트의 네트워크 요청을 대기합니다.

  3. 시스템 호출을 통한 요청 처리: 클라이언트로부터 요청이 도착하면, 서버 프로그램은 이를 받아 처리하기 위해 시스템 호출을 사용합니다. 이 과정에서 파일 읽기/쓰기, 네트워크 데이터 송수신 등이 이루어질 수 있습니다.

4. 자원 정리 및 종료

  1. 서비스 종료 요청: 사용자로부터 종료 요청이 오거나 서버 프로그램이 작업을 완료하면, 종료 절차가 시작된다.

  2. 자원 해제: 커널은 서버 프로그램에 할당된 모든 자원(메모리, 파일 디스크립터, 네트워크 연결)을 해제한다.

  3. 프로세스 종료: 마지막으로 커널은 프로세스를 종료시키고, 사용했던 모든 시스템 자원을 시스템에 반환한다.

profile
Software Developer

0개의 댓글