[+WEEK1] PART1

prana·2025년 6월 15일
0

Linux

목록 보기
34/37

1장

OS가 공개하는 api-> 시스템 콜 (system call, syscall)
고, 러스트, 파이썬, 자바 등의 고급 프로그래밍 언어는 시스템 콜 위에서 빌드되며, 시스템 콜을 감싼 라이브러리가 제공된다.

  • 시스템 콜 + 디바이스 드라이버의 집합: 리눅스 커널, 커널이라는 용어를 사용

리눅스 아키텍처

  • 하드웨어 계층
    • CPU, 메인 메모리, 디스크 드라이브, 네트워크 인터페이스, 키보드, 모니터 등 디바이스 모두
  • 커널 계층(user land)
  • 사용자 영역 계층
    • shell 같은 운영체제 구성 요소, ps, ssh 같은 유틸리티, x윈도우 시스템 기반 데스크톱 같은 GUI를 비롯한 대부분의 앱이 실행되는 곳

커널과 사용자 영역 사이에는 시스템 콜(system call, syscall) 인터페이스가 있다.

하드웨어와 커널 사이의 인터페이스

  • 시스템 콜과 달리 단일 인터페이스가 아니라, 일반적으로 하드웨어별로 그룹화된 개별 인터페이스 모음으로 구성된다.
  1. cpu 인터페이스
  2. 43p 주 메모리와의 인터페이스
  3. 네트워크 인터페이스와 드라이버(유선과 무선)
  4. 파일 시스템과 블록 디바이스 드라이버 인터페이스
  5. 캐릭터 디바이스, 하드웨어 인터럽트, 키보드, 터미널, 기타 i/o 등의 입력 디바이스를 위한 디바이스 드라이버

커널모드와 사용자 모드

  • 커널 모드 : 추상화를 제한
  • 사용자 모드: 상대적으로 느리지만, 더 안전하고 편리한 추상화

CPU 아키텍처

  • 리눅스 인기 있는 이유: 다양한 cpu 아키텍처에서 실행된다는 점 때문
  • 리눅스 커널은 아키텍처별 코드도 포함하고 있다. 이러한 코드 분리 덕분에 리눅스를 새 하드웨어에 이식, 빠르게 사용할 수 있게 됨

x86 아키텍처

  • 인텔에서 개발, 나중에 AMD도 라이선스된 명령어 셋 제품군
  • X64는 인텔 64비트 프로세서를 나타냄
  • x86: 인텔 32비트, 퍼블릭클라우드 기반의 강력
  • amd64: AMD 64비트 프로세서를 의미

커널 구성 요소

주요 기능

  • 프로세스 관리: 실행 파일 기반으로 프로세스 시작
  • 메모리 관리: 프로세스에 메모리를 할당하거나 파일을 메모리에 매핑함
  • 네트워킹: 네트워크 인터페이스 관리나 네트워크 스택 제공
  • 파일 시스템: 파일 관리를 제공하고, 파일 생성과 삭제를 지원함
  • 캐릭터 디바이스와 디바이스 드라이버 관리

리눅스 단위

  • 세션: 하나 이상의 프로세스 그룹을 포함하고, 선택적으로 tty가 연결된 상위 수준의 사용자 대면 유닛을 나타낸다
    • 커널은 세션 id(SID)라는 번호를 통해 세션을 식별
  • 프로세스 그룹: 하나 이상의 프로세스가 포함되어 있고, 한 세션에는 포어그라운드 프로세스 그룹이 둘 이상일 수 없다.
    • 커널은 프로세스그룹(PGID)라는 숫자를 통해 프로세스 그룹을 식별
  • 프로세스: 여러 리소스 등을 그룹으로 추상화, 커널은 /proc/self를 통해 현재 프로세스를 사용자에게 노출한다.
    • 커널은 프로세스 id(pid)라는 숫자를 통해 프로세스를 식별한다.
  • 스레드: 커널에 의해 프로세스로 구현된 유닛
    • 스레드를 나타내는 전용 데이터 구조는 없음
    • 스레드는 특정 리소스(메모리나 시그널 처리기)를 다른 프로세스와 공유하는 프로세스다.
    • 커널은 스레드id(TID), 스레드그룹(TGID)를 통해 스레드를 식별, 공유된 TGID 값은 멀티스레드 프로세스를 의미한다.
  • 태스크
    • 커널에는 sched.h에 정의된 task.struct라는 데이터 구조가 있으며, 이는 프로세스와 스레드 구현의 기반을 형성한다.
    • 이 데이터 구조는 스케쥴링 관련 정보, 식별자(pid, tgid), 시그널 처리기, 성능이나 보안과 관련된 기타 정보를 수집
    • 앞서 언급한 모든 유닛은 태스크에서 파생, 또는 고정된다. 그러나 커널 외부에 그대로 노출되는 일이 없다.

메모리 관리

  • 가상 메모리는 시스템이 물리적으로 갖고 있는 것보다 더 많은 메모리를 갖고 있는 것처럼 보이게 한다.
  • 모든 프로세스는 (가상) 메모리를 얻는다.
  • 물리 메모리와 가상 메모리는 모두 페이지라고 부르는 고정 길이의 청크로 나뉜다.
  • 이 페이지 테이블은 프로세스의 가상 페이지를 주 메모리(ram)의 물리적 페이지에 매핑한다.

메모리의 페이지 테이블이란?

  • 운영체제에서 가상 메모리를 물리 메모리로 매핑(연결)하기 위해 사용하는 데이터 구조이다.
  • 왜 필요할까?
    • CPU는 실제 메모리 주소(물리 주소)를 모르고, 가상 주소를 사용한다.
    • 가상 주소는 프로그램마다 독립적이기 때문에, 충돌없이 여러 프로그램을 동시에 실행할 수 있다.
    • 실제 데이터를 읽거나 쓸 때는 물리 주소가 필요하므로 변환을 위한 페이지 테이블이 필요하다.
  • 메모리 관리의 핵심
    • 기존 공간을 최적으로 사용하면서, 각 프로세스에 그들의 페이지가 실제로 RAM에 존재한다는 환상을 효과적으로 일으키는 방법이다.

TLB(translation lookaside buffer)

  • 조회용 온칩 지원
  • TLB는 매우 작은 캐시, 누락된 경우 CPU가 프로세스 페이지 테이블을 통해 페이지의 물리적 주소를 계산하고 TLB를 업데이트한다.
  1. cpu가 가상 주소를 생성함
  2. TLB에 변환 정보가 있는지 확인(TLB hit)
  • 있다면: 바로 물리 주소로 변환 (빠름)
  • 없다면: 페이지 테이블에 접근하여 변환(느림), 그리고 TLB에 새로 저장함 (TLB Miss)
  • 전통적으로 기존 페이지 크기는 4KB였으나, 커널 버전 v2.6.3부터는 huge page를 지원한다.

huge page

  • ex) 64bit 리눅스에서는 프로세스당 총 최대 128tb 가상 주소 공간(주소 지정 가능한 메모리 주소의 개수)을 사용 가능, 약 64tb 물리 메모리(머신의 RAM의 양)를 사용할 수 있다.
  • grep MemTotal /proc/meminfo
  • grep VmallocTotal /proc/meminfo
  • grep Huge /proc/meminfo

네트워킹

  • 커널의 중요한 기능 중 하나. (http, ssh 같은 애플리케이션 계층 프로토콜은 주로 사용자 영역에서 구현된다)
  • 소켓: 추상화 커뮤니케이션을 위해 필요
  • 전송 제어 프로토콜(tcp;transmission control protocol)
    및 사용자 데이터그램 프로토콜(udp; user datagram protocol) 각각 연결형 통신과 비연결형 통신용
  • 인터넷 프로토콜 (ip): 기기의 주소 지정을 위해 필요

네트워크 인터페이스 개요

  • $ ip link
  • ip route 라우팅 정보도 제공함

파일 시스템

  • 리눅스는 파일 시스템을 사용해 hdd, ssd, 플래시 메모리같은 저장 디바이스의 파일과 디렉터리를 구성한다.
    ext4, btrfs, NTFS 같은 다양한 유형의 파일 시스템이 있으며, 동일한 파일시스템의 인스턴스도 여러 개 사용할 수 있다.
  • 가상 파일 시스템(VFS)는 원래 여러 파일 시스템 유형과 인스턴스를 지원하고자 도입됨
    • 최상위 계층: 공통 API 추상화 제공
    • 최하위 계층: 주어진 파일 시스템에 대한 플러그인이라 불리는 파일 시스템 추상화 -- 5장

디바이스 드라이버

  • 커널에서 실행되는 코드다.
  • 키보드, 마우스, 하드디스크 드라이브 -- 실제 하드웨어 디바이스나 /dev/pts/ 아래의 의사 터미널 pseudo-device를 관리하는 것보다
  • pseudo 디바이스는 물리 디바이스처럼 취급될 수 있다.
  • 드라이버는 커널에 정적으로 빌드될 수도 있고, 동적으로 로드될 수 있도록 커널 모듈로 빌드될 수도 있다.

GPU

  • 전통적으로 그래픽 출력을 가속화, cpu의 부하를 완화할 때 사용되었으나 최근에는 머신러닝에 새롭게 사용되고 있다.

  • 리눅스 시스템 디바이스 개요: ls -al /sys/devices/

  • 마운트된 디바이스 나열: mount

시스템 콜

  • 커널이 노출하는 서비스 인터페이스와 해당 사용자 영역의 엔티티 호출은 시스템 호출의 모음이라 하며, 시스템 콜이라 부른다.
  • 이러한 시스템 콜을 직접 호출하지 않고, c 표준 라이브러리라고 부르는 것을 통해 호출한다.
  • 표준 라이브러리는 래퍼 기능을 제공하여 glibc나 musl 같은 다양한 구현체에서 사용할 수 있다.

래퍼 라이브러리

  • 시스템 콜 실행의 반복적인 저수준 처리를 다룬다.
  • 시스템 콜은 software interrupt 로 구현, 예외 처리기로 제어권을 넘기는 예외를 발생시킨다.
  1. syscall.h와 아키텍처 종속 파일(커널은 시스템 콜 테이블이라 부르는 파일을 사용)에 정의되어
    메모리에 있는 함수 포인터 배열(sys_call_table이라는 변수에 저장)을 통해 시스템 콜과 해당 핸들러를 추적

0개의 댓글