Homework: 프로세스#
| 추상화: 프로세스 | process-run.py 실행 |
Note
본 과제는 프로젝트를 위해 생성한 본인의 개별 폴더에 제출하기 바랍니다. 제출기한은 5/1(수)입니다.
소개#
이 프로그램 process-run.py
를 통해 프로그램이 실행되고 CPU를 사용하거나(예: 명령어 추가 수행) I/O를 수행할 때(예: 디스크에 요청을 보내고 완료될 때까지 기다림) 프로세스 상태가 어떻게 변하는지 볼 수 있습니다. 자세한 내용은 README를 참조하세요.
질문#
다음 플래그와 함께
process-run.py
를 실행하세요:-l 5:100,5:100
. CPU 활용률(예: CPU가 사용 중인 시간의 백분율)은 어떻게 되어야 할까요? 왜 그렇게 알 수 있나요?-c
와-p
플래그를 사용해 여러분의 생각이 맞는지 확인해 보세요.이제 다음 플래그로 실행해 보세요:
./process-run.py -l 4:100,1:0
. 이 플래그는 4개의 명령어(모두 CPU 사용)를 가진 하나의 프로세스와 I/O를 실행하고 완료될 때까지 기다리는 하나의 프로세스를 지정합니다. 두 프로세스를 모두 완료하는 데 얼마나 걸리나요?-c
와-p
를 사용해 여러분의 생각이 맞는지 확인해 보세요.프로세스의 순서를 바꿔 보세요:
-l 1:0,4:100
. 이제 어떻게 되나요? 순서를 바꾸는 것이 중요한가요? 왜 그런가요? (항상 그렇듯이-c
와-p
를 사용해 여러분의 생각이 맞는지 확인해 보세요)이제 다른 플래그들을 살펴보겠습니다. 중요한 플래그 중 하나는
-S
인데, 이는 프로세스가 I/O를 실행할 때 시스템이 어떻게 반응하는지 결정합니다. 플래그를SWITCH_ON_END
로 설정하면 한 프로세스가 I/O를 수행하는 동안 시스템은 다른 프로세스로 전환하지 않고 해당 프로세스가 완전히 끝날 때까지 기다립니다. 다음 두 프로세스를 실행할 때 어떤 일이 일어나나요(-l 1:0,4:100 -c -S SWITCH_ON_END
), 하나는 I/O를 수행하고 다른 하나는 CPU 작업을 수행합니다?이제 같은 프로세스를 실행하되, 한 프로세스가 I/O를 기다리는(
WAITING
) 동안 다른 프로세스로 전환되도록 switching 동작을 설정해 봅시다(-l 1:0,4:100 -c -S SWITCH_ON_IO
). 이제 어떤 일이 일어나나요?-c
와-p
를 사용해 여러분의 생각이 맞는지 확인해 보세요.또 다른 중요한 동작은 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
) 시스템 자원이 효율적으로 활용되고 있나요?이제 같은 프로세스를 실행하되,
-I IO_RUN_IMMEDIATE
를 설정해 I/O를 실행한 프로세스를 즉시 실행하도록 해 봅시다. 이 동작은 어떻게 다른가요? 방금 I/O를 완료한 프로세스를 다시 실행하는 것이 왜 좋은 생각일 수 있을까요?이제 무작위로 생성된 프로세스로 실행해 봅시다:
-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
출력을 사용하여 검증해 보세요. 직관과 일치하지 않는 것이 있다면 그 이유를 파악해 보세요.
운영 체제가 어떻게 프로세스를 관리하고 컴퓨터 자원을 할당하는지 이해하는 것은 효율적이고 안정적인 소프트웨어를 설계하는 데 있어 필수적입니다. 이 과제는 그 방향으로 나아가는 작지만 중요한 첫걸음입니다. 계속해서 탐구하고 배우세요!