커널과 스레드 (시스템콜을 곁들인...)

정은영·2022년 11월 28일
1

CS

목록 보기
8/24

커널이란?

커널은 운영체제의 핵심 부분으로, 하드웨어(CPU, 메모리 등)과 소프트웨어 사이를 중재하는 역할을 합니다. 우리가 프로그램을 실행하거나 스레드를 만들 때, 실제로 하드웨어를 다루는 건 커널이에요.

스레드와 커널의 관계

스레드는 프로그램 안에서 실행되는 작은 단위인데, 운영체제가 이를 인식하고 관리해야 실제로 CPU에서 실행될 수 있어요. 이 과정에서 커널이 관여합니다.

스레드를 만들 때 커널은 자원 할당을 해야 해요.

  • 스택 메모리: 각 스레드에 독립적인 스택을 할당하기 위해 메모리를 예약합니다.
  • 스레드 제어 블록(TCB): 스레드의 상태(실행중, 대기 중 등), 우선순위, 레지스터 값 등을 저장하는 데이터 구조를 만듭니다.
  • CPU 스케줄링: 이 스레드가 언제, 어느 CPU 코어에서 실행될지 결정합니다.

스레드가 실행되는 동안 커널은 스레드 관리도 해야 합니다.
스레드가 CPU를 얼마나 사용할지 조정하고(스케줄링), 스레드가 종료되면 할당했던 자원(메모리 등)을 회수합니다.

커널은 이런 작업을 하려면 CPU와 메모리를 사용하게 돼서 다음과 같은 비용이 발생합니다.
스레드를 만들 때마다 커널이 메모리를 할당하고 TCB를 초기화하는 데 시간이 걸립니다.
또한 사용자 프로그램(유저 모드)에서 커널 모드로 전환하는 시스템 콜이 필요한데 이 전환 자체에도 오버헤드가 있습니다.

보충 설명: 시스템 콜

프로그램이 혼자 할 수 없는 작업(예: 하드웨어 접근, 파일 읽기/쓰기 등)을 운영체제에게 부탁하려면 커널모드로 전환해야 합니다. 이를 System call 이라고 부릅니다.

먼저 기본 개념을 짚고 갈게요.

  • User Mode: 일반 프로그램이 실행되는 환경이에요. 여기서는 CPU, 메모리, 하드웨어에 직접 접근할 권한이 제한돼 있어요.
  • Kernel Mode: 운영체제의 커널이 실행되는 환경으로, 하드웨어(CPU, 메모리, 디스크 등)에 직접 접근할 수 있는 권한이 있습니다. 커널은 시스템 자원을 관리하고 보호하는 역할을 합니다.

User Mode에서 실행되는 프로그램이 커널의 도움을 받으려면 System Call이라는 요청을 보내서 Kernel Mode로 전환해야 합니다.
시스템 콜은 다음과 같은 상황에서 발생해요.

(1) 파일 읽기/쓰기
파일은 디스크에 저장돼 있고, 디스크는 하드웨어이기 때문에 유저 모드에서 직접 접근할 수 없어요. 운영체제가 대신 읽어야 하기 때문에 open(), read(), write() 같은 시스템 콜을 호출합니다.
프로그램에서 file.txt라는 파일을 읽으려고 할 때, 프로그램이 read()를 호출하면 커널 모드로 전환돼 디스크에서 데이터를 읽고, 결과를 프로그램에 돌려줍니다.

(2) 네트워크 통신
네트워크 카드(하드웨어)를 통해 데이터를 보내거나 받으려면 커널의 네트워크 스택이 필요해요. send(),recv(),connect() 같은 시스템 콜이 호출됩니다.

(3) 메모리 할당
메모리 할당은 운영체제가 관리하는 자원이라, 유저 모드에서 직접 메모리를 확보할 수 없어요. 커널이 메모리를 할당해 주기 위해 brk(), mmap()같은 시스템 콜이 필요합니다. 프로그램이 동적으로 메모리를 요청할 때 이러한 시스템 콜이 발생합니다.

(4) 프로세스 / 스레드 생성
스레드 생성은 커널이 스택 메모리를 할당하고, 스케줄링 정보를 설정해야 하는 작업이에요. fork(), clone(), pthread_create() 같은 호출이 시스템 콜을 유발합니다.

  • 스레드 생성을 위한 pthread_create() 호출 시
    • 유저 모드에서 호출되지만, 실제로 스레드를 만들려면 커널이 스택 메모리를 할당하고 스케줄링을 준비해야 합니다.
    • 이 과정에서 clone() 같은 시스템 콜이 호출되며, 커널 모드로 전환됩니다.

0개의 댓글