Pintos로 기술 면접 대답하기 [ 크래프톤 정글 81일차 ]

jinsung·2025년 7월 30일

크래프톤 정글 9기

목록 보기
58/59
post-thumbnail

✅ [ WEEK10-11 ] 정글 끝까지(PintOS) - User Programs


WEEK 진행률

🎯 1. 키워드 공부

  • ☑️ User mode vs Kernel mode
  • ☑️ Register vs Memory
  • ☑️ User Stack
  • ☑️ System Call
  • ☑️ Cache
  • ❗️ Atomic Operation
  • ☑️ rax register
  • ☑️ 32 bit OS vs 64 bit OS
  • ☑️ Interrupt
  • ☑️ Segmentation Fault

🎯 2. 테스트 케이스

94 of 95 passed

진행률 : 80%


드디어 User Programs 주차가 끝났네요.

비록 모든 테스트케이스를 통과하진 못했지만, 지금까지 열심히 공부한 지식들이 오래도록 머리속에 남아있다면 도움이 될 거예요. 앞으로 개발일을 해 나가는데요.

핀토스 주간동안 공부한게 헛되지 않도록
열심히 공부한것들이 실제 기술면접에서는 어떻게 물어보는지
어떻게 대답해야할지 정리해봤어요. 도움이 되도록


🔍 기술면접 질문 목록

1. 🤔 컨텍스트 스위칭 ( Context Switching ) 이 뭐예요?

threads , userprog 프로젝트를 진행하면서 나왔던 컨텍스트 스위칭이 나왔습니다.

우리가 alarm 과 priority 를 구현할 때,
4tick 마다 쓰레드를 변경해거나 우선순위에 따라서 실행될 쓰레드를 변경해줬던 거 기억나세요?

그게 바로 컨텍스트 스위칭이예요!

우리는 1tick 마다 타이머 인터럽트를 발생시켜서 tick을 하나씩 더해줬어요.
그리고 thread_tick 이 4일 경우는 현재 실행중인 쓰레드를 ready_list에 넣어줬었죠.
그리고 우선순위에 따라서 새 쓰레드를 실행했어요.

이 때, 우리는 thread 구조체 안에있는 tf에 현재 컨텍스트를 저장하고 다른 쓰레드를 실행한거예요.

struct intr_frame tf 에는 다시 이 쓰레드가 실행되면 어디서 부터 다시 실행되어야 하는지에 대한 정보가 담겨 있는거예요.

그래서 우리가 shcedule 함수가 실행될 때마다 thread_launch 함수가 실행되고 있는데
여기서 실제로 컨텍스트 스위칭이 일어납니다.

static void
thread_launch (struct thread *th) {
    uint64_t tf_cur = (uint64_t) &running_thread ()->tf;  // 현재 쓰레드의 컨텍스트
    uint64_t tf = (uint64_t) &th->tf;                     // 다음 쓰레드의 컨텍스트
    
    /* 주요 전환 로직.
     * 먼저 전체 실행 컨텍스트를 intr_frame으로 복원한 다음
     * do_iret을 호출하여 다음 스레드로 전환합니다. */
    __asm __volatile (
        // 현재 쓰레드의 레지스터들을 저장
        // 자세한 어셈블리어는 생략했어요!
        // 다음 쓰레드의 레지스터들을 복원
        "call do_iret\n"  // 실제 컨텍스트 전환
    );
}

위의 과정을 깔끔하게 요약하면 다음과 같아요!

컨텍스트 스위칭은 인터럽트를 발생시켜서 CPU에서 실행중인 쓰레드의 컨텍스트를 저장하고 중단한 뒤, 다른 쓰레드를 실행하기 위한 과정입니다.

컨텍스트 스위칭을 통해서 운영체제는 여러 쓰레드 간에 CPU를 공정하게 분배하고, 멀티태스킹을 구현할 수 있어요.

한 번에 하나의 작업만 할 수 있는 CPU를 컨텍스트 스위칭을 사용해서 사용자에게 "동시에 여러 작업이 일어나는 것 처럼 느껴지게 해요."

우리가 노래를 들으면서 코드작업을 하는것과 같이요!

1-1 꼬리질문. 🤔 쓰레드를 많이 쓸수록 항상 성능이 좋아질까요?

쓰레드는 동시에 여러작업을 수행하기 위해 많이쓰이는데, 쓰레드들을 통해 동시 처리량이 많으지니까 애플리케이션 성능도 좋아져요.

근데 "항상" 성능이 좋아질까요?

여러가지 이유가 있겠지만 저는 제가 알고있는 한가지만 말해볼게요.

우리는 방금 위에서 여러 작업을 동시에 처리하기 위해서 컨텍스트 스위칭이 일어난다는 것을 알고 있었지만, 컨텍스트 스위칭에도 비용이 발생한다는 사실을 알게 되었어요. 컨텍스트 스위칭 또한 CPU에서 실행되니까요. 이런 간접 비용을 overhead 라고 합니다.

또 cpu가 스위칭하는 동안에는 프로그램이 실행되지 않아요!

예를 들어 CPU코어는 한개인데 쓰레드수는 100개라면 각 코어에서 경합하는 쓰레드 수가 점점 많아질거고 오히려 컨텍스트 스위칭을 하는 비용때문에 성능이 더 안좋아질 것 같다는 생각이듭니다.


2. 🤔 CPU Scheduling 이 무엇인지 설명하고, CPU 스케쥴링의 종류에 대해서 설명해주세요.

우리는 방금 컨텍스트 스위칭을 이용해서 여러 쓰레드 간에 CPU를 공정하게 분배해준다는 것을 알았어요.

다음에 어떤 쓰레드가 실행되야 할지 결정해주는게 CPU Scheduling 이예요!

참고로 핀토스에서는 아무 작업을 하지 않았을 때, 4tick 마다 새로운 쓰레드를 할당해줬었는데요.

그 방식을 Round-Robin 방식이라고 해요.

  • 시간 할당량을 매 쓰레드에 주고 할당된 시간안에 완료하지 못한 프로세스는 레디 큐의 가장 맨 뒤에 배치하는 방식입니다.

만약 당신이 Priority-donation 까지 구현했다면?

  • 우선순위에 따라 다음에 실행할 쓰레드를 결정하는 우선순위 스케쥴링 방식입니다.

만약 당신이 MLFQS 까지 구현했다면?

  • 이건 저도 구현 못해서 잘 모릅니다. ㅋ

그 외에도

SJF ( Shortest Job First )

  • CPU 점유 시간이 가장 짧은 프로세스에 CPU를 먼저 할당하는 방식
  • 기아문제발생

FCFS ( First Come First Served )

  • 큐에 도착한 순서대로 실행

등이 있어요! 저희가 핀토스에서 했던 RR과 Priority 방식만 제대로 설명할 수 있어도 좋을 것 같아요!


3. 🤔 멀티 쓰레드 프로그래밍을 작성할 때 뭘 조심해야하나요?

우리는 Pintos 에서 하나의 CPU코어가 있고 여러개의 쓰레드가 컨텍스트 스위칭을 하면서 공유자원에 접근했었습니다.

그 때 우리는 항상 어떤 작업을 해줬습니다.

- 인터럽트를 막아주고
- 세마포어와 락을 사용해서 공유자원의 접근을 제한했습니다.

즉, 같은 공유자원에 여러 개의 쓰레드가 접근하면서 발생하는 동시성 문제를 해결해줬었죠.

멀티쓰레드 프로그래밍은 CPU 코어가 여러개이고 정말로 실제로 여러 쓰레드가 동시간에 실행될 때 같은 공유자원에 동시에 접근하면서 발생하는 동시성 문제를 해결해줘야해요.

그건, 우리가 핀토스에서 해줬던 동시성문제를 해결하는 방식과 완전히 유사합니다.

이 질문에는 이렇게 대답할 수 있을 것 같아요.

멀티 쓰레드는 서로 한 프로세스 내의 자원을 공유하므로 동기화를 항상 고려해야 합니다.

그 외에도 핀토스에서 공부할 수 있었던 다양한 기술면접질문이 있을거예요.

근데 더 정리하기 제가 너무 부족합니다. 아디다스...

0개의 댓글