문제

Scanf ()/printf ()가 실제로 하드웨어 및 OS 레벨에서 어떻게 작동하는지 궁금합니다. 데이터는 어디에서 흐르고 OS는이 시간을 정확히 무엇을하고 있습니까? OS는 어떤 전화를합니까? 등등...

도움이 되었습니까?

해결책

scanf () 및 printf ()는 libc (c Standard Library)의 함수이며, 그들은 각각 read () 및 write () 운영 체제 syscalls를 호출하여 파일 설명자 stdin 및 stdout (fscanf 및 fprintf를 허용합니다. 읽거나 쓰려는 파일 스트림을 지정하십시오).

read () 및 write () (및 모든 syscalls)는 사용자 수준 애플리케이션에서 '컨텍스트 스위치'가 커널 모드로 나옵니다. 즉, 하드웨어에 직접 대화하는 것과 같은 권한있는 작업을 수행 할 수 있습니다. 애플리케이션을 시작한 방법에 따라 'stdin'및 'stdout'파일 디스크립터는 아마도 콘솔 장치 (예 : TTY0) 또는 일종의 가상 콘솔 장치 (예 : XTerm에 의해 노출 된)에 바인딩 될 수 있습니다. read () 및 write ()는 'UIO'라는 커널 버퍼로 데이터를 안전하게 복사합니다.

Scanf 및 Printf의 형식 스트링 변환 부분은 커널 모드에서 발생하지 않지만 일반 사용자 모드 ( 'libc'내부)에서만 SyScalls가있는 일반적인 경험 법칙은 가능한 한 드물게 커널 모드로 전환하는 것입니다. 컨텍스트 전환의 성능 오버 헤드를 피하고 보안을 위해 (커널 모드에서 발생하는 모든 일에 대해 매우주의해야합니다! 커널 모드의 코드가 적 으면 운영 체제의 버그/보안 구멍이 줄어 듭니다).

BTW ..이 모든 것이 유닉스 관점에서 작성되었습니다. MS Windows가 어떻게 작동하는지 모르겠습니다.

다른 팁

내 OS에서 나는 scanf로 작업하고 있으며 printf는 getch () ant putch ()를 기반으로합니다.

OS는 입력을위한 두 개의 스트림과 출력을위한 두 개의 스트림을 제공한다고 생각합니다. 스트림은 출력 데이터가 어떻게 제시되는지 또는 입력 데이터의 출처를 추상화합니다.

따라서 Scanf & Printf가 수행하는 일은 어느 개 스트림에서 바이트 (또는 소비 바이트)를 추가하는 것입니다.

Scanf, Printf 등 내부적으로 이러한 모든 유형의 기능은 C/C ++ 언어로 직접 작성할 수 없습니다. 내부적으로 그들은 모두 조립 언어로 작성됩니다 사용하여 keword "asm", 키워드 "ASM"으로 작성된 것은 컴파일에 관계없이 (컴파일 후에도 변경되지 않음) 객체 파일에 직접 소개됩니다. 어셈블리 언어로 이러한 모든 기능을 구현할 수있는 사전 정의 된 코드가 있습니다. scanf printf 등은 모두 내부적으로 어셈블리 언어로 작성됩니다. 키워드를 사용하여 고유 한 입력 기능을 설계 할 수 있습니다 "ASM".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top