cs

[크래프톤 정글 week 08] Pintos-Project1 키워드 정리

하루이2222 2024. 11. 12. 05:31

Pintos-kaist-project1 Alaram Clock 키워드 정리

이 포스트에서는 project1의 Alarm Clock을 구현하는 데 있어 필요한 키워드만 정리한다.


Process

CS 전반을 깊게 다루어 보면서 이전에도 마찬가지 였지만 항상 이 추상화 라는 개념이 항상 잘 이해가 되지 않았었는데 다른 여러 개념을 다루면서 어느정도 감을 잡을 상태였다.

내가 생각했던 프로세스는 단순히 커널에서 이루어지는 작업을 분류 하고 운영체제가 작업의 관리 를 수월 하게 하기 위한 거라고만 생각하고 있었는데 도무지 이 프로세스가 운영체제 에서 어떻게 사용되는지 감이 잡히지 않고 있었다.

그러다 운영체제 책 을 읽던중 추상화 에 대한 내용을 읽었는데 자바에서도 추상화를 이용해 클래스의 구현 내용을 숨기는 것 처럼 프로세스도 이러한 추상화의 일종이라는 생각이 들었다.

결론적으로는 컴퓨터 시스템은 다양한 수준의 추상화가 쌓여 이루어진 복잡한 구조물이라 생각한다.

그 중에 프로세는 자원과 실행흐름 을 캡슐화 하여 다른 프로세스들로 부터 분리된 환경을 제공하는것이다.

이 추상화들은 하드웨어와 소프트웨어 간의 상호작용을 단순화하고, 자원을 효율적으로 관리할 수 있도록 돕는다.

이런 관점에서 볼 때, 내 생각에는 프로세스는 컴퓨터 자원의 추상화라고 생각한다. 프로세스는 하드웨어 자원인 CPU와 메모리를 독립적이고 효율적으로 사용하게 하며, 사용자 프로그램이 시스템 자원을 활용할 수 있도록 지원하는 역할을 한다.

즉, 컴퓨터 시스템 위에서 실행되는 사용자 프로그램은 단일 프로그램이 아니라 여러 프로그램이 동시에 실행될 수 있으며, 각 프로그램은 시스템의 하드웨어 자원을 활용하여 개별적으로 연산되고 실행된다. 조금 더 엄밀히 말하면, 프로세스는 운영체제가 시스템 자원을 효과적으로 관리하고 분배하기 위해 만든 논리적 단위이다.

이를 쉽게 설명하기 위해 다음과 같은 예시를 들어보자:

배와 컨테이너를 통한 프로세스 개념 설명

  • 여러 회사의 물건을 실어야 하는 상황
    여러 회사가 배를 이용해 각자의 제품을 수출하려고 한다. 각 회사는 독립된 컨테이너에 물건을 담아 배에 실어야 하지만, 배는 하나뿐이므로 여러 회사의 물건을 동시에 실을 수 없다.
  • 프로세스의 추상화
    각 회사는 물건을 실을 공간을 가상으로 컨테이너라는 단위로 할당받는다. 물리적으로 한 배에 여러 회사의 물건이 실리지만, 각 회사는 마치 자신만의 배를 사용하는 것처럼 독립적인 컨테이너를 할당받아 관리된다. 이 컨테이너프로세스로 볼 수 있다. 각 회사는 배의 하나의 컨테이너 공간을 독립적으로 배정받아 다른 컨테이너와 분리 되고 , 해당 공간을 사용하여 물건을 실을 수 있다.
  • 배의 출발 순서 (CPU 스케줄링)
    배가 언제 출발할지, 그리고 어떤 회사의 물건이 먼저 실릴지는 출발 순서목적지를 기준으로 운영체제가 정한다. 예를 들어, A 회사의 물건이 가장 먼저 도착해야 한다면, A 회사의 컨테이너가 배에 먼저 실린다. 각 회사가 독립적인 컨테이너(프로세스)를 가지고 있지만, 배가 하나이기 때문에 물건의 운송 순서는 운영체제가 조정한다. 이는 CPU 스케줄링과 비슷한 개념이다.
  • 공유 자원의 효율적 사용
    여러 회사가 배라는 자원을 공유하되, 이 배는 동시에 한 번에 하나의 순서대로만 사용할 수 있다. 배는 하나의 자원이므로, 운영체제는 배의 출발 순서와 적재량을 최적화하여 여러 회사가 배를 효율적으로 사용할 수 있도록 관리한다.
  • 물건이 도착하는 방식
    물건이 최종 목적지에 도착하는 것은 마치 프로세스가 완료되는 것과 비슷하다. 각 회사는 자신만의 독립적인 컨테이너를 통해 물건을 보낼 수 있지만, 최종적으로는 배가 전체 운송 계획에 따라 이동하여 모든 물건이 목적지에 도착한다. 즉, 각 회사는 자원의 사용(배)을 기다리며, 최적화된 방식으로 자원을 사용할 수 있다.

이처럼 프로세스는 운영체제가 각 사용자 프로그램을 효율적으로 관리하기 위해 만든 논리적 추상화다.


Thread

스레드는 프로세스 내에서 실행되는 작은 실행 단위이다. 프로세스가 하나의 독립적인 실행 단위라면, 스레드는 프로세스 내부에서 작업을 더 세밀하게 나눈 작업 단위라고 볼 수 있다. 스레드는 공유 자원을 함께 사용하여 가볍게 작업을 나눌 수 있는 점에서, 다수의 작업을 동시에 수행하고 효율적으로 CPU 자원을 활용하기 위해 사용된다.

프로세스와 스레드의 비유

운동을 예로 들어보자. "운동하기"는 프로세스로 볼 수 있다면, 벤치 프레스, 풀업, 렛 풀다운 등 각각의 개별 운동은 스레드에 해당한다. 이들은 모두 운동이라는 큰 흐름 내에서 각각 독립적인 작업을 수행하는 것이다.

핵심 개념 요약:

  • 프로세스: 독립적으로 실행되는 프로그램 단위로, 각각의 메모리 공간을 할당받아 실행된다.
  • 스레드: 프로세스 내부에서 병렬로 실행될 수 있는 작업 단위로, 프로세스가 가진 자원(메모리, 파일 등)을 공유하며 작동한다.

스레드의 특성

스레드는 프로세스 내부에서 여러 개가 생성될 수 있으며, 아래와 같은 특성을 가진다:

  1. 자원 공유: 하나의 프로세스 내에 있는 스레드는 같은 메모리 공간, 파일 핸들, 네트워크 리소스 등을 공유한다.
  2. 독립적인 실행 흐름: 각 스레드는 프로세스 내에서 독립적으로 실행 흐름을 가지고 있으며, 서로 다른 코드 부분을 동시에 실행할 수 있다.
  3. 스케줄링 단위: 운영체제는 각 스레드를 스케줄링 단위로 처리하여 CPU에서 스레드마다 실행될 순서를 결정한다.
  4. 가벼운 컨텍스트 스위칭: 같은 프로세스 내에서는 스레드 간의 자원 공유가 쉬워 컨텍스트 스위칭이 프로세스 간보다 빠르고 가볍다.

스레드가 중요한 이유

현대의 컴퓨터 시스템에서 스레드는 다수의 작업을 동시에 수행하는 데 필수적이다. 다수의 스레드를 사용하면 멀티코어 CPU의 성능을 최대한 활용할 수 있으며, 사용자가 동시 작업을 수행할 수 있도록 응용 프로그램의 응답성을 높일 수 있다.

스레드와 동시성

스레드를 사용할 때 중요한 개념은 동시성이다. 다수의 스레드를 사용함으로써, 동시에 여러 작업을 처리할 수 있는 것처럼 보이게 한다. 실제로는 CPU가 여러 스레드를 빠르게 전환하면서 동작하기 때문에 병렬로 처리하는 것처럼 보이는 동시성을 제공하는 것이다.

스레드의 종류

  • 커널 스레드: 운영체제에서 지원하는 스레드로, 운영체제가 직접 스케줄링하고 관리한다.
  • 유저 스레드: 응용 프로그램 레벨에서 관리하는 스레드로, 운영체제의 지원 없이 라이브러리나 프로그램 코드로 스케줄링할 수 있다.

스레드와 동기화 문제

여러 스레드가 동시에 자원을 공유할 때, 동기화 문제가 발생할 수 있다. 예를 들어, 여러 스레드가 같은 변수나 메모리 위치에 동시에 접근할 경우 경쟁 상태가 생길 수 있으며, 이를 방지하기 위해 뮤텍스나 세마포어 같은 동기화 도구가 필요하다.

스레드의 동시성 문제와 락에 대한 문제는 project2 의 개념을 정리하면서 더 자세하게 다룰 것이므로 일단 여기까지만


timer interrupt

Project1 의 alaram-clock 구현에 있어서 가장 중요한게 timer interrupt 라고 생각한다.
컴퓨터 시스템은 내부에 하드웨어 타이머 와 커널 타이머가 존재한다

1. 하드웨어 타이머

하드웨어 타이머는 CPU와 메모리, I/O 장치처럼 물리적인 하드웨어에 내장된 타이머다. 주요 역할은 정확한 시간 간격으로 신호(인터럽트)를 발생시키는 것으로, 보통 초당 일정 횟수만큼 인터럽트를 발생시켜 커널에 시간을 알린다. 하드웨어 타이머는 시스템 전체의 시간을 기준으로 하는 시간제어 및 시간측정이 필요할 때 사용되며, 다음과 같은 하드웨어 장치들이 주로 쓰인다.

  • Programmable Interval Timer (PIT): 정해진 간격마다 인터럽트를 발생하는 타이머로, 초창기 x86 아키텍처에서 많이 사용됨.
  • Real-Time Clock (RTC): 실제 시간을 유지하는 역할을 하며, 주로 시스템 부팅 시간과 같은 긴 주기 시간 측정에 사용됨.
  • APIC Timer (Advanced Programmable Interrupt Controller Timer): 다중 코어 환경에서 각 CPU가 독립적으로 인터럽트를 발생할 수 있게 하는 타이머로, 멀티코어 시스템에서 사용됨.

하드웨어 타이머 동작 방식 예시 (PIT 기준)

  1. 타이머 초기화: PIT 레지스터에 인터럽트 발생 주기를 설정.
  2. 타이머 시작: 설정된 주기마다 인터럽트를 생성해 CPU에 알림.
  3. 타이머 인터럽트 핸들링: CPU는 커널에 인터럽트를 전달하고, 커널은 타이머 인터럽트 핸들러에서 시간을 갱신하거나 스케줄링 작업을 수행.

2. 커널 타이머

커널 타이머는 소프트웨어적으로 운영체제 커널에서 구현된 타이머로, 주로 스케줄링과 이벤트 처리를 위한 시간 제어를 담당한다. 커널 타이머는 하드웨어 타이머의 인터럽트 신호에 의존해 동작하며, 커널에서 정해진 작업이 특정 시간에 실행될 수 있도록 스케줄링을 지원한다.

커널 타이머 동작 방식 예시

  1. 타이머 설정: 커널은 특정 함수나 작업을 일정 시간 후에 실행할 수 있도록 타이머를 설정한다.
  2. 타이머 핸들러 호출: 하드웨어 타이머 인터럽트가 발생할 때마다 커널 타이머 핸들러가 실행되어, 각 커널 타이머가 만료되었는지 확인한다.
  3. 작업 실행: 만료된 타이머가 있다면, 해당 타이머에 등록된 작업을 실행.

다음 포스트에서 더 자세히 작성하겠지만 Project 1 에서 구현하게될 Alaram clock , Priority scheduler , MLFQS 전부 스케쥴링 방법 이라기 보다 스케쥴러가 실행 시킬 스레드를 선택 하기위한 ready 큐 에 스레드를 어떤 순서로 삽입 할지에 대한 방법론 인 것이다.

그중에서 alram-clock 기능은 가장 단순한 방법으로 , 특정시간동안 스레드를 재우고 지정된 시간이 지나면 다시 스레드를 꺠우는 방식을 사용하여 레디큐에 삽입 순서를 지정한다. 이과정에서 타이머 인터럽트와 ticks 가 중요하게 사용된다.


ticks

tick는 시스템에서 하드웨어 인터럽트가 발생할때마다 isr에서 증가시키는 변수값이다. 이는 즉 인터럽트가 발생한 횟수를 의미하며 이값을 통해 os 에서 일정한 간격으로 작업을 실행거나 스레드를 관리 할수 있다.