개발놀이터

리눅스 커널 본문

CS 지식/운영체제

리눅스 커널

마늘냄새폴폴 2024. 6. 2. 12:16

리눅스를 공부하다보니 리눅스 커널이라는 것을 공부하면 좋다고 하더군요. 원래 이론공부는 나중에 하는 편이지만 이론공부도 좋아하기 때문에 한번 공부해봤습니다. 

 

리눅스 커널

우선, 커널이 뭔지 개념을 잡고 넘어가면 좋을 것 같습니다. 커널은 컴퓨터에 장착되어 있는 하드웨어 제품들 (하드디스크, 메모리, CPU, 키보드, 마우스, 모니터 등등...) 을 소프트웨어로 추상화하여 OS가 사용할 수 있도록 하는 것입니다. 

 

즉, 쉽게 말해 커널은 OS가 하드웨어 디바이스를 제어하기위한 중계자 역할을 한다는 것입니다. 

 

우리는 그 중에서 리눅스 커널에 대해서 알아볼 것입니다. 윈도우도 커널이 있습니다! 하지만 우리는 윈도우로 개발할 것은 아니기 때문에 리눅스로 한번 알아봤습니다. 

 

리눅스 커널에는 크게 다섯가지 관리 체계가 있습니다. 

  • 프로세스 관리
  • 메모리 관리
  • 디바이스 관리 (키보드, 모니터 등등)
  • 파일시스템 관리
  • 네트워크 관리

 

이제 하나씩 한번 살펴보죠!

 

프로세스 관리

  • 프로세스 관리 시스템은 주로 CPU에 존재하는 프로세스를 관리하는 역할을 합니다. 리눅스는 CPU의 프로세스를 생성하고 폐기하는데  이때 PID라는 것으로 관리를 합니다. 보통 프로세스가 생성되는 것을 fork라고 합니다. 
  • 프로세스 관리 시스템은 프로세스를 스케줄링을 이용해 관리합니다. 이때 우선순위를 정하기도 하고 컨텍스트 스위칭을 이용해 프로세스의 상태를 관리합니다. 

  • 리눅스는 프로세스를 네가지 상태로 관리합니다. 
    • Running : 프로세스가 현재 CPU에 의해 실행되는 상태 혹은 실행을 기다리는 상태입니다. 
    • Waiting : 프로세스가 이벤트로 인해 잠시 대기하고 있는 상태입니다. 
    • Stopped : 프로세스가 멈춰있는 상태입니다. 보통 시그널을 받으면 멈추게됩니다. 
    • Zombie : 프로세스가 실행이 끝났지만 멈춰있지 않고 계속 실행이 되고 있는 상태입니다
  • 리눅스 커널이 관리하는 프로세스는 서로 통신을 할 수 있습니다. 프로세스간 통신을 위해 내부적으로 메세지 큐를 이용하여 메모리 공간을 공유합니다. 이때 메모리 자원을 공유하면 race condition이 발생할 수 있기 때문에 세마포어나 뮤텍스와 같은 방법론을 이용해 race condition을 방지합니다. 

    프로세스간 통신이 필요한 경우는 클라이언트에서 서버로 동시다발적인 요청이 들어올 때 프로세스에게 역할을 분담시켜 요청을 처리하는 경우입니다. 이 때문에 프로세스간 통신이 필요하죠. 
  • 프로세스는 init process부터 시작해 위계 (hierarchy) 를 가집니다. init process를 제외한 모든 프로세스는 부모 프로세스를 가지고 이렇게 함으로써 프로세스를 관리하기 더 쉬워지게 됩니다. 

  • 프로세스는 프로세스 내부적으로 스레드라는 개념으로 경량화를 합니다. 스레드는 메모리의 모든 자원을 공유하기 때문에 컨텍스트 스위칭에 대한 비용이 낮고 속도가 빠르다는 장점이 있습니다. 그렇다고 스레드가 컨텍스트 스위칭에 대한 오버헤드가 전혀 없다는 것은 아니고 프로세스에 비해 낮다는 이야기입니다. 

 

메모리 관리

  • 각각의 프로세스는 고유한 가상 메모리 (virtual memory) 공간을 부여받는데 가상 메모리 공간은 물리 메모리 공간을 추상화한 것입니다. 리눅스 커널은 페이지 테이블이라는 것을 이용해 가상 메모리와 물리 메모리 공간을 매핑합니다. 이 매핑은 메모리를 격리할 수 있고 이렇게 함으로써 각각의 프로세스들은 다른 프로세스에 접근할 수 없게됩니다. 이는 보안과 안정성을 높일 수 있는 방법이기 때문에 리눅스 커널에서 주로 사용하는 방법입니다. 
  • 메모리는 정해진 사이즈의 블록인 페이지 (page) 로 나누어져 있습니다. 커널은 이 페이지를 이용해서 메모리를 관리하죠.

    프로세스가 현재 물리 메모리가 부족한 상태에서 메모리를 할당받으려 한다면 메모리에 장애가 발생할 수 있습니다. 이를 대비해서 커널은 페이지를 위한 메모리를 하드디스크에서 떼와서 물리메모리처럼 사용합니다.

    페이징이라는 기술을 사용함으로써 실제로 물리 메모리만큼 사용할 수 있었던 것 보다 더 많은 메모리를 사용할 수 있게 됩니다. 이때 페이징은 스와핑이라는 기술을 이용해 위에서 말했던 메모리의 공간을 확보합니다. 

  • 커널은 프로세스가 사용해야하는만큼 메모리를 할당해주는 능력이 있습니다. 프로세스가 메모리를 많이 잡아먹으면 메모리를 더 많이 할당해주고 적게 잡아먹으면 할당했던 것을 돌려주는 능력이죠. 

  • 커널은 인가되지 않은 접근으로 메모리를 사용하는 것을 막을 수 있습니다. 보통 메모리를 사용하는 것은 프로세스인데 프로세스가 인가되지 않은 접근으로 생성된 것이라면 메모리의 사용을 막아서 실행을 막을 수 있는 것이죠. 

  • 메모리를 페이징과 스와핑으로 실제 물리 메모리보다 더 많이 사용하기 때문에 웬만한 OOM (Out Of Memory) 을 막을 수 있습니다. 

 

디바이스 관리

  • 디바이스 드라이버는 하드웨어와 OS를 연결해주기 위한 드라이버입니다. 우리가 흔히 아는 그래픽 드라이버가 여기에 포함됩니다. 

  • 리눅스 커널은 키보드, 하드디스크, 네트워크 인터페이스 (NIC), USB와 같은 하드웨어 디바이스를 OS와 연결해주는 디바이스 드라이버를 가지고 있습니다. 

 

파일 관리

  • 리눅스 커널은 파일을 관리하고 폴더에 저장공간을 할당해 데이터를 저장합니다. 

  • 파일을 읽고, 쓰고, 실행하는 역할을 리눅스 커널이 도맡아서 하게됩니다. 

 

네트워크 관리

  • 리눅스 안에 있는 네트워킹은 포괄적으로 OS와 다른 네트워크에 존재하는 시스템과 통합하기위해 존재합니다. 

  • 리눅스에는 실제 하드웨어 디바이스에 장착되어 있는 pysical interface인 이더넷 카드 (LAN카드, NIC 이라고도 불립니다.) 혹은 wireless interface (wlan)을 연결할 수 있고, virtual interface인 virtual ethernet interface (veth0) 와 bridge interface (br0)를 가지고 있습니다. 

  • TCP/IP 프로토콜에 잘 어울리는 구현체를 가지고 있습니다. 예를 들어 IP, TCP, UDP, ICMP등 프로토콜에 최적화되어있습니다. 또한, 소켓 통신에도 유연하게 대처할 수 있습니다. 그냥 웬만한 통신은 다 된다고 보면 될 것 같네요. 
  • IPv4, IPv6를 지원하고 정적 라우팅, 동적 라우팅을 지원합니다. 또한, iptable을 이용한 방화벽과 4계층인 TCP, UDP 7계층인 HTTP, FTP, SMTP등을 구현하고 있습니다. 

  • 네트워크 트러블슈팅을 위해 제공하는 다양한 명령어가 있습니다. 
    • ping : ping을 이용해서 도메인과 연결된 IP를 확인할 수 있습니다. 
    • traceroute : traceroute는 해당 도메인으로 들어가는 패킷을 분석할 수 있습니다. 
    • netstat : netstat는 네트워크 커넥션, 라우팅 테이블, 인터페이스를 분석할 수 있습니다. 
    • tcpdump : tcpdump 명령어는 특정 이더넷 카드로 들어노는 네트워크 패킷을 분석할 수 있습니다. 

 

ping google.com

traceroute google.com

netstat -tuln

sudo tcpdump -i eth0

 

 

마치며

제가 아는 내용도 있고 모르는 내용도 있었던 것 같습니다. 리눅스 커널에 대해서 공부하니 리눅스와 좀 더 잘 소통(?)할 수 있겠다 싶은 내용인 것 같습니다. 

 

이제 리눅스 명령어에 대해서 본격적으로 공부할 수 있을 것 같습니다. 긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

'CS 지식 > 운영체제' 카테고리의 다른 글

세마포어와 뮤텍스  (0) 2023.04.27
교착상태 (DeadLock) 와 기아상태 (Starvation)  (0) 2023.04.24
프로세스 동기화  (0) 2023.04.16
동시성문제와 Thread-safe  (0) 2023.04.13
프로세스와 스레드  (0) 2023.04.08