워밍업 클럽 CS 1주차 발자국 : 미션

워밍업 클럽 CS 1주차 발자국 : 미션

운영체제

1. 아래 코드는 1초 마다 플레이어가 스킬을 사용했는지 체크하는 코드입니다. 이 방식은 폴링방식입니다. 1초마다 체크하기 때문에 성능에 좋지 않습니다. 이를 해결하기 위한 방식으로 어떤 걸 이용해야 할까요?

while(true){
     wait(1); // 1초 멈춤
     bool isActivated = checkSkillActivated(); // 체크
 }

인터럽트를 활용할 수 있습니다.

CPU는 입출력 관리자에게 입출력 명령을 내리고, 이 과정에서 다른 작업을 계속 수행할 수 있습니다.

입출력 관리자는 입출력이 완료되면 CPU에게 신호를 보내고, CPU는 이 신호를 수신하여 서비스 루틴(Interrupt Service Routine, ISR)을 실행해 작업을 완료합니다.

여기서 서비스 루틴이란 특정 인터럽트가 발생했을 때 해당 인터럽트를 처리하기 위해 실행되는 함수를 말합니다.

(이 때, “특정 인터럽트가 발생했을 때 해당 인터럽트를 처리한다”는 것은 CPU가 어떤 특정한 이벤트(인터럽트)를 감지하고, 그 이벤트에 따라 미리 정의된 작업, 즉 서비스 루틴을 실행하는 과정을 의미합니다)

인터럽트는 비동기적으로 동작하기 때문에 성능을 개선할 수 있는 이점이 있습니다.

이와 같이 인터럽트를 사용하면 폴링 방식보다 더 효율적으로 스킬 사용 여부를 체크할 수 있으며, CPU 자원을 보다 효과적으로 활용할 수 있습니다.

 

2. 프로그램과 프로세스가 어떻게 다른가요?

프로그램은 하드디스크나 SSD와 같은 저장장치에 저장된 명령어와 데이터의 집합입니다. 예를 들어, 애플리케이션이나 앱도 프로그램에 해당됩니다. 프로그램은 그 자체로는 실행되지 않으며, 컴퓨터가 실행할 준비 상태에 있는 정적인 존재입니다.

프로세스는 실행 중인 프로그램을 의미합니다. 저장장치에 있던 프로그램이 메모리에 로드되어, 운영체제의 제어를 받으며 CPU, 메모리 등 컴퓨터 자원을 활용해 작업을 수행하는 능동적인 존재입니다. 프로세스는 CPU 스케줄링을 통해 처리되고, 필요에 따라 입력 및 출력 작업도 수행합니다.

 

3. 멀티프로그래밍과 멀티프로세싱이 어떻게 다른가요?

멀티프로그래밍은 하나의 CPU가 여러 프로세스를 시분할 방식으로 처리하는 메모리 관리 개념입니다.

멀티프로세싱은 여러 CPU가 각기 다른 프로세스를 병렬로 처리하는 CPU 관리 개념입니다.

멀티프로그래밍은 메모리 관점에서 여러 프로그램(또는 프로세스)이 동시에 메모리에 올라와 있는 상태를 말합니다. 운영체제는 이 프로그램들 중 하나가 CPU를 사용할 수 없을 때(예: 입출력 작업 대기 시) 다른 프로그램이 CPU를 사용할 수 있도록 하여 자원의 효율성을 높입니다. 즉, 하나의 CPU가 여러 프로그램을 시분할 방식으로 실행하는 것을 말합니다. 멀티프로그래밍의 반대 개념은 유니프로그래밍, 즉 한 번에 하나의 프로그램만 메모리에 올라오는 방식입니다.

멀티프로세싱은 CPU 관점에서 둘 이상의 CPU가 동시에 여러 프로세스를 처리하는 것을 의미합니다. 멀티프로세싱 시스템에서는 각 CPU가 독립적으로 다른 작업을 수행할 수 있기 때문에 작업 처리 속도와 시스템의 효율성이 크게 향상됩니다. 이는 다중 CPU 또는 코어를 활용하는 시스템에서 이루어지며, 이를 통해 여러 프로세스가 동시에 병렬로 처리될 수 있습니다.

 

4. 운영체제는 프로세스를 관리하기 위해서 어떤 것을 사용하나요?

운영체제는 프로세스 제어 블록(PCB: Process Control Block)을 사용하여 여러 개의 프로세스를 관리합니다. 각 프로세스가 실행 중일 때, 운영체제는 해당 프로세스의 상태와 정보를 PCB에 저장하여 추적하고 관리합니다.

프로세스가 생성되면 운영체제는 그 프로세스에 대한 고유한 PCB를 생성합니다. 이 PCB에는 다음과 같은 주요 정보들이 포함됩니다:

  • 프로세스 ID (PID): 프로세스의 고유 식별자

  • 프로세스 상태: 실행, 대기, 준비 등 현재 상태

  • CPU 레지스터 정보: 프로세스가 CPU에서 작업을 하던 도중의 상태(레지스터 값)

  • 메모리 관리 정보: 프로세스의 코드, 데이터, 스택 등이 저장된 메모리 영역 정보

  • 입출력 상태 정보: 입출력 요청이나 장치 사용 상황

  • 우선순위: 프로세스의 우선순위에 따른 스케줄링 정보

운영체제는 이 PCB들을 연결 리스트(또는 다른 자료구조)로 관리하여, 여러 프로세스를 효율적으로 스케줄링하고 제어합니다. PCB는 각 프로세스의 상태를 기억하기 때문에 프로세스가 CPU를 사용하다가 중단될 때, 해당 프로세스의 정보를 PCB에 저장하고, 나중에 다시 해당 프로세스가 CPU를 사용할 때 이전 상태에서부터 이어서 작업할 수 있습니다.

프로세스가 종료되면 운영체제는 해당 프로세스의 PCB를 연결 리스트에서 제거하고 메모리에서 해제하여 자원을 회수합니다.

 

5. 컨텍스트 스위칭이란 뭔가요?

CPU가 한 프로세스에서 다른 프로세스로 전환할 때 수행되는 작업입니다. CPU는 여러 프로세스를 동시에 처리할 수 없기 때문에, 하나의 프로세스를 실행하다가 다른 프로세스를 실행하려면 현재 프로세스의 상태를 저장하고 새로운 프로세스의 상태를 복구해야 합니다. 이러한 상태 정보는 프로세스 제어 블록(PCB)에 저장됩니다.

컨텍스트 스위칭 과정은 다음과 같습니다:

  1. 현재 실행 중인 프로세스의 상태 저장: CPU는 현재 실행 중인 프로세스의 상태(프로그램 카운터, 레지스터 값, 메모리 관리 정보 등)를 PCB에 저장합니다. 이렇게 하면 나중에 이 프로세스를 다시 실행할 때, 중단된 지점부터 작업을 이어서 할 수 있습니다.

  2. 새로운 프로세스의 상태 로드: 다음으로 실행할 프로세스의 PCB에서 저장된 상태 정보를 CPU에 로드합니다. 이때 새로운 프로세스가 실행되기 위한 프로그램 카운터, 레지스터 값, 메모리 정보 등을 CPU가 가져옵니다.

  3. CPU 전환: CPU는 이제 새로운 프로세스의 명령어를 실행하며 작업을 이어나갑니다.

컨텍스트 스위칭은 필수적인 작업이지만, 오버헤드가 발생합니다. 이 과정은 비교적 짧은 시간이 걸리지만, 불필요하게 자주 발생하면 CPU가 실제 작업보다는 프로세스 전환에 더 많은 시간을 소모할 수 있습니다.

따라서 컨텍스트 스위칭은 효율적인 CPU 자원 관리와 동시성 유지를 위한 필수적인 메커니즘이지만, 너무 빈번하게 발생하지 않도록 스케줄러가 잘 조정해야 합니다.

 


 

자료구조와 알고리즘

1. 여러분은 교실의 학생 정보를 저장하고 열람할 수 있는 관리 프로그램을 개발하려고 합니다. 이 때 여러분이라면 학생의 정보를 저장하기 위한 자료구조를 어떤 걸 선택하실 건가요? 이유를 함께 적어주세요.

해시 테이블(Hash Table)을 사용하겠습니다. 해시 테이블은 해시 함수를 사용해 데이터를 효율적으로 저장하고 검색할 수 있는 자료구조입니다. 해시 함수를 통해 학생 정보(예: 학생 ID)를 키로 변환하고, 해당 키에 맞는 위치에 데이터를 저장합니다.

이 자료구조의 장점은 데이터의 삽입, 수정, 삭제, 검색이 평균적으로 O(1)의 시간 복잡도를 가지기 때문에 매우 빠릅니다. 따라서 학생 정보가 많더라도, 특정 학생의 정보를 빠르게 조회하거나 수정할 수 있습니다. 또한, 해시 테이블은 중복을 허용하지 않으므로 학생 ID와 같은 고유 식별자를 기반으로 데이터 관리가 용이합니다.

그러나 해시 테이블의 단점으로는 충돌 관리가 필요하다는 점이 있습니다. 해시 함수가 서로 다른 데이터를 동일한 해시 값으로 변환할 경우, 이를 해결하기 위한 방법(체이닝 또는 오픈 어드레싱 등)을 구현해야 합니다. 하지만 전체적으로 성능과 효율성 측면에서 학생 관리 프로그램에 적합합니다.

 

2. 여러분은 고객의 주문을 받는 프로그램을 개발하려고 합니다. 주문은 들어온 순서대로 처리됩니다. 이 때 여러분이라면 어떤 자료구조를 선택하실 건가요? 이유를 함께 적어주세요.

큐(Queue)를 선택하겠습니다. 큐는 FIFO(First In, First Out) 구조로, 먼저 들어온 데이터가 먼저 처리되는 자료구조입니다. 주문 처리는 보통 고객이 주문한 순서대로 처리되어야 하기 때문에 큐는 자연스럽게 이러한 요구 사항을 충족시킵니다.

큐에서 데이터 삽입(Enqueue)은 뒤쪽에서 이루어지고, 데이터 삭제(Dequeue)는 앞쪽에서 이루어지기 때문에 주문이 들어온 순서대로 처리가 보장됩니다. 즉, 프로그램이 새로운 주문을 받을 때는 큐의 뒤에 추가하고, 주문을 처리할 때는 큐의 앞에서 데이터를 꺼내 처리합니다.

큐는 또한 O(1)의 시간 복잡도로 삽입과 삭제 작업이 이루어지기 때문에, 대량의 주문이 처리될 때에도 효율적으로 관리할 수 있습니다. 이 구조 덕분에 고객 주문의 공평한 처리와 성능 측면에서 매우 유리합니다.

채널톡 아이콘