Homework: 프로세스

Homework: 프로세스#

| 추상화: 프로세스 | process-run.py 실행 |

Note

본 과제는 프로젝트를 위해 생성한 본인의 개별 폴더에 제출하기 바랍니다. 제출기한은 5/1(수)입니다.

소개#

이 프로그램 process-run.py를 통해 프로그램이 실행되고 CPU를 사용하거나(예: 명령어 추가 수행) I/O를 수행할 때(예: 디스크에 요청을 보내고 완료될 때까지 기다림) 프로세스 상태가 어떻게 변하는지 볼 수 있습니다. 자세한 내용은 README를 참조하세요.

질문#

  1. 다음 플래그와 함께 process-run.py를 실행하세요: -l 5:100,5:100. CPU 활용률(예: CPU가 사용 중인 시간의 백분율)은 어떻게 되어야 할까요? 왜 그렇게 알 수 있나요? -c-p 플래그를 사용해 여러분의 생각이 맞는지 확인해 보세요.

  2. 이제 다음 플래그로 실행해 보세요: ./process-run.py -l 4:100,1:0. 이 플래그는 4개의 명령어(모두 CPU 사용)를 가진 하나의 프로세스와 I/O를 실행하고 완료될 때까지 기다리는 하나의 프로세스를 지정합니다. 두 프로세스를 모두 완료하는 데 얼마나 걸리나요? -c-p를 사용해 여러분의 생각이 맞는지 확인해 보세요.

  3. 프로세스의 순서를 바꿔 보세요: -l 1:0,4:100. 이제 어떻게 되나요? 순서를 바꾸는 것이 중요한가요? 왜 그런가요? (항상 그렇듯이 -c-p를 사용해 여러분의 생각이 맞는지 확인해 보세요)

  4. 이제 다른 플래그들을 살펴보겠습니다. 중요한 플래그 중 하나는 -S인데, 이는 프로세스가 I/O를 실행할 때 시스템이 어떻게 반응하는지 결정합니다. 플래그를 SWITCH_ON_END로 설정하면 한 프로세스가 I/O를 수행하는 동안 시스템은 다른 프로세스로 전환하지 않고 해당 프로세스가 완전히 끝날 때까지 기다립니다. 다음 두 프로세스를 실행할 때 어떤 일이 일어나나요(-l 1:0,4:100 -c -S SWITCH_ON_END), 하나는 I/O를 수행하고 다른 하나는 CPU 작업을 수행합니다?

  5. 이제 같은 프로세스를 실행하되, 한 프로세스가 I/O를 기다리는(WAITING) 동안 다른 프로세스로 전환되도록 switching 동작을 설정해 봅시다(-l 1:0,4:100 -c -S SWITCH_ON_IO). 이제 어떤 일이 일어나나요? -c-p를 사용해 여러분의 생각이 맞는지 확인해 보세요.

  6. 또 다른 중요한 동작은 I/O가 완료될 때 수행할 작업입니다. -I IO_RUN_LATER를 사용하면 I/O가 완료될 때 그것을 실행한 프로세스가 반드시 즉시 실행되는 것은 아닙니다. 오히려 그 시점에 실행 중이던 프로세스가 계속 실행됩니다. 이러한 프로세스 조합을 실행하면 어떤 일이 일어나나요? (./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_LATER -c -p) 시스템 자원이 효율적으로 활용되고 있나요?

  7. 이제 같은 프로세스를 실행하되, -I IO_RUN_IMMEDIATE를 설정해 I/O를 실행한 프로세스를 즉시 실행하도록 해 봅시다. 이 동작은 어떻게 다른가요? 방금 I/O를 완료한 프로세스를 다시 실행하는 것이 왜 좋은 생각일 수 있을까요?

  8. 이제 무작위로 생성된 프로세스로 실행해 봅시다: -s 1 -l 3:50,3:50 또는 -s 2 -l 3:50,3:50 또는 -s 3 -l 3:50,3:50. 추적 결과가 어떻게 될지 예측해 보세요. -I IO_RUN_IMMEDIATE 플래그와 -I IO_RUN_LATER 플래그를 사용할 때 어떤 일이 일어나나요? -S SWITCH_ON_IO-S SWITCH_ON_END를 사용할 때 어떤 일이 일어나나요?

용어 설명#

  • 프로세스(Process): 실행 중인 프로그램의 인스턴스입니다. 프로세스는 자체 메모리 공간을 가지며 CPU 시간을 할당받습니다.

  • CPU 활용률(CPU Utilization): CPU가 작업을 수행하는 데 사용되는 시간의 비율입니다. 높은 CPU 활용률은 CPU가 효율적으로 사용되고 있음을 의미합니다.

  • I/O: Input/Output의 약자로, 프로세스가 디스크, 네트워크 등의 외부 장치와 통신하는 것을 말합니다. I/O 작업은 일반적으로 CPU 작업보다 훨씬 더 많은 시간이 걸립니다.

  • 문맥 교환(Context Switch): 한 프로세스에서 다른 프로세스로 CPU 제어를 전환하는 프로세스입니다. 문맥 교환에는 현재 프로세스의 상태를 저장하고 새 프로세스의 상태를 로드하는 작업이 포함됩니다.

  • 스케줄링(Scheduling): 어떤 프로세스가 CPU 시간을 받을지 결정하는 프로세스입니다. 운영 체제의 스케줄러는 공정성과 효율성의 균형을 유지하려고 합니다.

코드 예제#

process-run.py 프로그램을 실행하는 방법의 예입니다:

# 두 개의 프로세스를 실행하고 CPU 활용률과 각 프로세스의 통계를 출력합니다
./process-run.py -l 5:100,5:100 -c -p

# I/O 완료 시 프로세스 전환 동작을 설정하고 결과를 출력합니다
./process-run.py -l 3:0,5:100,5:100,5:100 -S SWITCH_ON_IO -I IO_RUN_LATER -c -p

# 무작위 프로세스를 생성하고 실행합니다
./process-run.py -s 1 -l 3:50,3:50 -c -p

이러한 예제는 process-run.py 프로그램의 다양한 옵션과 플래그를 보여줍니다. -l 플래그는 프로세스 목록을 지정하고, -c-p는 각각 CPU 활용률과 프로세스 통계를 출력합니다. -S-I 플래그는 I/O와 관련된 스케줄링 동작을 제어합니다.

결론#

이 과제는 프로세스, I/O, 스케줄링과 같은 운영 체제의 핵심 개념을 탐구할 수 있는 기회를 제공합니다. process-run.py 프로그램을 사용하면 다양한 시나리오를 시뮬레이션하고 결과를 관찰할 수 있습니다.

프로세스가 CPU 작업과 I/O 작업을 수행할 때 프로세스 상태가 어떻게 변하는지, 스케줄링 정책이 시스템 성능에 어떤 영향을 미치는지 이해하는 것이 중요합니다. 문맥 교환에는 오버헤드가 수반되므로 너무 자주 발생하면 성능이 저하될 수 있습니다. 그러나 I/O를 기다리는 동안 다른 프로세스를 실행하면 CPU를 더 효율적으로 활용할 수 있습니다.

다양한 플래그와 옵션을 사용하여 실험함으로써 이러한 개념을 직접 경험할 수 있습니다. 결과를 예측해 보고 -c-p 출력을 사용하여 검증해 보세요. 직관과 일치하지 않는 것이 있다면 그 이유를 파악해 보세요.

운영 체제가 어떻게 프로세스를 관리하고 컴퓨터 자원을 할당하는지 이해하는 것은 효율적이고 안정적인 소프트웨어를 설계하는 데 있어 필수적입니다. 이 과제는 그 방향으로 나아가는 작지만 중요한 첫걸음입니다. 계속해서 탐구하고 배우세요!