해결된 질문
작성
·
59
0
안녕하세요 널널강사님! 우선 좋은 강의에 감사인사드립니다.
파일 입/출력 관련해서 질문이 있는데요! 파일 입/출력이 수행되는 과정에서 이 '과정'에 조금이라도 관여하는 컴퓨터 요소들(CPU, RAM, Kernel, ...)이 무엇인지가 궁금한데요.
예를 들어, 아래와 같은 예졔 소스코드를 제가 디버그 모드로 실행해보았는데요.(참고로 MacOS에서 clang 컴파일러를 사용)
#include <stdio.h>
int main(void) {
FILE* fp = NULL;
fp = fopen("../TEST.txt", "w");
if (fp == NULL) {
puts("Error: Failed to open file");
return -1;
}
fprintf(fp, "Hello");
fclose(fp);
return 0;
}
어쨌건 위 소스코드가 하는 일은 "TEST.txt" 라는 파일을 생성하고 개방한 뒤, 해당 파일에 "Hello" 라는 문자열을 쓰는 로직이잖아요? 하지만 소스코드 레벨에서는 어쨌건 fp 라는 구조체 포인터를 할당하고 하는 과정에서 메모리(엄밀히 말하면 가상 메모리)를 사용하게 되고 있구요!
그러면 위 함수같이 순수하게 I/O 동작만 수행할 경우는 CPU는 전혀 관여하지 않고 유휴 상태라고 보면 되나요? 흔히, I/O Bound 작업에서는 CPU가 관여하는 부분이 없기 때문에 비동기로 처리한다고들 하는데.. 이 말은 I/O 작업에서는 CPU가 하나도 사용되지 않고 메모리와 파일 시스템과 상호작용하는 Kernel 정도만 사용한다고 보면 될까요?
약간 질문이 난해할 수 있을 것 같은데.. 답변 주시면 추가로 궁금한 점은 재질문 드리겠습니다!
답변 2
0
아니오. CPU도 사용됩니다. 다만 Disk 쓰기와 관련된 연산 중 실제 입/출력 데이터 처리 및 제어는 SSD가 직접 하더라도 입/출력 요청 및 인터럽트 처리 등 주변기기와 통신하기 위해 필요한 연산은 CPU가 한다고 봐야 하겠습니다.
그리고 사용자 모드 응용 프로그램의 비동기 처리는 결국 Kernel이 대신 처리하는 것입니다. 훨씬 빠르게 스케쥴링되며 시스템을 제대로 활용할 수 있으므로 결과적으로 더 빠른 성능을 얻을 수 있습니다. 참고하시기 바랍니다. 😄
인터럽트 발생은 주변기기 통신 수준으로 제한됩니다. DB는 주변기기가 아니므로 인터럽트를 연결하기는 부적절하겠습니다. 아무튼 모든 입/출력에 CPU가 일정 수준 개입하는 것은 사실입니다. 참고하시기 바랍니다. 😄
0
안녕하세요, 인프런 AI 인턴입니다.
밑바닥개발자님의 질문에 대해 적합한 답변을 찾는 것이 조금 어려웠습니다. 하지만 답변을 제공하기에 앞서, 파일 입/출력 과정에 관여하는 컴퓨터 요소에 대해 간단하게 설명드리고자 합니다.
파일 입/출력(I/O) 과정은 여러 컴퓨터 내부 구성요소가 관여합니다. 예를 들면:
I/O 작업 중에 CPU가 전혀 관여하지 않는다고 보는 것은 오해입니다. CPU는 해당 I/O 작업을 시작하기 위한 명령 해석, 메모리로의 데이터 전송 지시 등 여러 단계에서 중요한 역할을 수행합니다. 하지만 대규모 데이터 전송이 진행되는 동안, CPU는 다른 작업을 수행할 수 있는 상태가 되기도 합니다. 이는 I/O 작업이 메모리나 저장 장치의 속도에 의존적이기 때문에 발생합니다.
제가 찾아본 기존 답변 중 질문에 가장 유사한 내용은 “파일 생성해서 쓰고 읽을 시, 쓰거나 읽을 내용은 메모리에 버퍼 되나요?”라는 질문과 관련된 답변입니다. 이 답변에서는 파일 I/O 과정에서 메모리 버퍼링과 커널의 역할에 대해 설명하고 있습니다.
하지만, 밑바닥개발자님의 질문에서 요구하는 “파일 입/출력 과정 중 CPU의 역할”에 대한 직접적인 정보는 찾지 못했습니다. 따라서, 제공된 정보만으로는 완벽하게 답변하기가 어렵다는 점 양해 부탁드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아하 그렇군요! 말씀하신 "입/출력 요청 및 인터럽트 처리 등 주변기기와 통신"하는 데도 '연산'이라는 것이 필요한 것은 몰랐습니다.
그러면 결국 일종의 입/출력 작업이라고 할 수 있는 외부 API나 DB로부터의 요청/응답도 하기 위해서는 인터럽트가 발생할 것이니까 결국 CPU가 조금이라도 관여하겠다(물론 주요한 처리는 모두 Kernel이 하겠지만..) 라고 생각이 드는데 맞을까요!?