이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

컨텍스트 스위치를 발생시키는 시스템 콜과 아닌 시스템콜

  • 2024.10.28 11:05
  • 카테고리 없음
글 작성자: Coding Groot

모든 시스템 콜이 컨텍스트 스위치를 발생시키는 것은 아니다.

하지만 컨텍스트 스위치를 유발하지 않는 시스템 콜을 떠올리려 하니 명확한 예시가 바로 생각나지 않았다. 이를 명확히 이해하기 위해, (gpt와) 리눅스 소스 코드를 분석하며 특정 시스템 콜이 컨텍스트 스위칭을 발생시키는지 여부를 확인해보았다.

컨텍스트 스위치가 일어나는 경우

우선 비교를 위해, 컨텍스트 스위치를 발생시키는 시스템 콜부터 찾아보았다.

컨텍스트 스위치가 발생하는 가장 명확하고 간단한 시스템 콜이 무엇일지 고민한 끝에, 일정 시간 동안 프로세스를 Blocking 상태로 만드는 sleep()을 선택했다.

sleep()과 관련된 시스템 콜은 nanosleep으로 구현되어 있다.

  • 소스코드: https://elixir.bootlin.com/linux/v6.11.5/source/kernel/time/hrtimer.c

이를 통해 hrtimer_nanosleep 함수가 호출되는 것을 확인할 수 있었다.

  • 해당 라인: https://elixir.bootlin.com/linux/v6.11.5/source/kernel/time/hrtimer.c#L2069

그 과정에서, do_nanosleep(&t, mode);라는 함수가 실제로 sleep 관련 로직을 수행하는 것을 알 수 있었다.

  • 해당 라인: https://elixir.bootlin.com/linux/v6.11.5/source/kernel/time/hrtimer.c#L2021

이 함수에서 다음과 같은 코드가 존재했다.

if (likely(t->task))
        schedule();

대기 상태로 전환될 때 schedule() 함수가 호출되며 컨텍스트 스위칭이 발생하는 것을 확인할 수 있었다.

결론1. 시스템 콜 중 sleep은 컨텍스트 스위치가 일어날 수 있다

컨텍스트 스위치가 일어나지 않는 경우

GPT에게 물어본 결과, getpid와 같은 시스템 콜은 컨텍스트 스위치 없이 수행된다고 했다. 이를 확인하기 위해 kernel/sys.c 파일에서 이 시스템 콜을 정의하는 매크로를 찾아보았다.

  • 관련 소스코드: https://elixir.bootlin.com/linux/v6.11.5/source/kernel/sys.c#L967

이 매크로는 task_tgid_vnr(current);를 호출하도록 되어 있었고 이 함수의 정의는 다음과 같다.

  • 해당 라인: https://elixir.bootlin.com/linux/v6.11.5/source/kernel/pid.c#L505
pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type,
            struct pid_namespace *ns)
{
    pid_t nr = 0;

    rcu_read_lock();
    if (!ns)
        ns = task_active_pid_ns(current);
    nr = pid_nr_ns(rcu_dereference(*task_pid_ptr(task, type)), ns);
    rcu_read_unlock();

    return nr;
}

이 함수 내부에는 컨텍스트 스위치를 유발할 수 있는 코드가 존재하지 않는 것을 확인했다.

결론2. 시스템 콜 중 getpid는 컨텍스트 스위치 없이 수행된다.

반응형

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (188)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (20)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • aws
  • git
  • 회고
  • Github
  • javascript
  • 서평
  • 한빛미디어
  • tutorial
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바