2009-08-10 7 views
5

저는 scanf()/printf()가 하드웨어 및 OS 레벨에서 실제로 어떻게 작동하는지 궁금해했습니다. 이 시점에서 데이터 흐름은 무엇이며 OS는 정확히 무엇입니까? 운영 체제는 어떤 전화를합니까? 등등 ...OS 내에서 scanf()는 어떻게 작동합니까?

+2

무슨 OS에 대해 이야기하고 있습니까? –

+0

더 많은 정보가 필요합니다. – rahul

+0

특정 OS가 없습니다. 리눅스/유닉스는 괜찮을 것이다. 나는 단지 상황에 대한 기본적인 이해를 원한다. – jetru

답변

20

scanf() 및 printf()는 libc (C 표준 라이브러리)의 함수이며 각각 운영 체제 syscall을 read() 및 write()를 호출하여 각각 파일 설명자 stdin 및 stdout (fscanf 및 fprintf를 사용하면 읽고 쓰고 자하는 파일 스트림을 지정할 수 있습니다.

read() 및 write() (및 모든 syscalls)를 호출하면 사용자 수준 응용 프로그램에서 커널 모드로 '컨텍스트 전환'이 발생하므로 하드웨어와 직접 대화하는 등의 권한있는 작업을 수행 할 수 있습니다 . 응용 프로그램을 시작한 방법에 따라 'stdin'및 'stdout'파일 디스크립터는 콘솔 장치 (예 : tty0) 또는 가상 콘솔 장치 (xterm에 의해 노출 된 장치)와 연결될 수 있습니다. read()와 write()는 'uio'라는 커널 버퍼로 데이터를 안전하게 복사합니다.

scanf 및 printf의 형식 문자열 변환 부분은 커널 모드에서는 발생하지 않지만 일반 사용자 모드 ('libc'내부)에서 일반적인 시스템 규칙은 커널 모드로 전환하는 것입니다. 컨텍스트 스위칭의 성능 오버 헤드를 피하고 보안 (커널 모드에서 발생하는 모든 것에 대해 매우 신중해야합니다! 커널 모드에서는 코드가 적어 운영 체제의 버그/보안 허점이 적음).

btw ..이 모든 것은 유닉스 관점에서 작성된 것이므로 MS Windows가 어떻게 작동하는지 알지 못합니다.

+0

컨텍스트 스위치가 각 바이트를 개별적으로 읽으면 느리게 소리가납니다. 물론, 그것은이 시대에 정말로 중요하지 않습니다. 그러나 저는이 이해가 올바른지 알고 싶습니다. –

+1

읽기 및 쓰기 syscalls는 매개 변수로 UIO를 통해 전송할 수있는 바이트 수를 사용하므로 모든 단일 바이트에 대해 별도의 syscall을 작성할 필요가 없습니다. 또한 getchar()과 같은 간단한 입력 함수의 경우 각 문자에 대한 별도의 호출이 필요하다고 생각할 수 있습니다. 그러나 사실 요즘 libc는 그보다 조금 더 명료하고 버퍼 (libc 내부)를 유지합니다. 따라서 버퍼를 채우고 컨텍스트 스위칭의 성능 오버 헤드를 피할 수 있습니다. 버퍼를 비울 때까지 getchar() 또는 scanf()를 수행 할 때마다 약간의 처리를 수행 한 다음 다른 시스템 호출 만 수행합니다. –

+0

"이 시대에는별로 중요하지 않습니다"라는 주제에서, 실제로 syscalls를 얼마나 많이 만들어 내면 성능에 영향을 미치는지 놀라게됩니다. syscall이 일반 함수 호출보다 적어도 * 10 배 이상 느린 경우를 고려하십시오. 예를 들어 1024 바이트 크기의 버퍼가있는 경우 1/1024만큼 많은 시스템 호출 만 수행합니다.'cp'명령의 C 구현을 버퍼 사용 여부에 관계없이 작성하는 것이 좋은 예입니다. 몇 분 후에 게시 할 것입니다. –

0

OS는 입력과 출력을위한 두 개의 스트림을 제공한다고 생각합니다. 출력 데이터가 표시되는 방식이나 입력 데이터의 출처는 멀리 떨어져 있습니다.

그래서 scanf & printf가하는 작업은 두 스트림에서 바이트 (또는 소비 바이트)를 추가하는 것입니다.

+0

이것은 높은 수준의 추상화입니다. 이 스트림이 하드웨어와 함께 작동하는 방법과 OS가 모든 데이터를 관리하는 방법을 자세히 알고 싶습니다. – jetru

1

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

+0

와우 그게 뭔가 였어. 나는 하나의 클라이언트가 연결되었을 때 uart에서 TCP/IP로 출력을 변경했습니다. 임베디드 시스템을위한 단순한 비 선점 협동 마이크로 커널이었다. –

관련 문제