itsource

시스템 호출 대 함수 호출

mycopycode 2023. 7. 26. 22:04
반응형

시스템 호출 대 함수 호출

시스템 호출과 함수 호출의 차이점은 무엇입니까?fopen()은 시스템 호출입니까, 아니면 함수 호출입니까?

시스템 호출은 일반적으로 인터럽트를 실행하여 수행되는 커널 코드에 대한 호출입니다.인터럽트로 인해 커널이 요청된 작업을 인계하고 수행한 다음 제어 권한을 응용 프로그램에 다시 넘겨줍니다.이러한 모드 전환은 시스템 호출 실행이 동등한 애플리케이션 수준 기능보다 느린 이유입니다.

fopen는 내부적으로 하나 이상의 시스템 호출을 수행하는 C 라이브러리의 함수입니다.일반적으로 C 프로그래머인 당신은 C 라이브러리가 당신을 위해 시스템 호출을 랩하기 때문에 거의 사용할 필요가 없습니다.

fopen은 함수 호출입니다.

시스템 호출은 리소스를 관리하는 기본 OS와 상호 작용합니다.시스템 호출을 수행한 프로세스의 상태를 보존하기 위해 많은 단계를 거쳐야 하기 때문에 함수 호출보다 크기 순서가 더 비쌉니다.

*nix 시스템에서는 시스템 호출을 수행하는 열림 랩이 열립니다(열림은 시스템 호출의 C - 래퍼입니다).fread/read, fwrite/write 등에서도 동일한 현상이 발생합니다.

다음은 유닉스 시스템 호출에 의해 실행되는 작업에 대한 좋은 설명입니다.

사실 시스템 호출은 함수 호출과 관련이 없습니다.이 두 메커니즘의 유일한 공통점은 둘 다 발신자에게 서비스를 제공한다는 것입니다.

  • 스레드 실행 보기에서 시스템 호출 보기:

    시스템 호출은 애플리케이션 모드 프로그램이 밑줄 OS에서 제공하는 서비스를 요청하는 기능입니다.시스템 호출은 실행 중인 스레드를 사용자 모드에서 커널 모드로 전환하고 시스템 호출 처리기 기능을 실행한 다음 사용자 모드로 돌아갑니다.

  • 시스템 호출 매개 변수:

    시스템 호출의 매개 변수는 (시스템 호출 번호, 매개 변수...)입니다.파라미터의 의미와 형식은 syscall 번호에 따라 달라집니다.

  • 사용자 및 프로그램에 제공된 syscall 라이브러리 보기:

    사용자 모드 프로그램은 일반적으로 glibc의 라이브러리를 호출하여 시스템 호출을 합니다.예를 들어 glibc의 open() 함수는 다음과 같습니다.

    1. 시스템 호출 번호 SYS_OPEN을 eax 레지스터에 입력합니다.
    2. 소프트웨어 인터럽트 또는 sys_enter 명령을 호출하여 시스템 호출을 요청합니다.

시스템 호출은 실제로 커널 공간에서 실행되는 API를 호출합니다.이에 따른 모든 관련 비용(자세한 내용은 Wiki 또는 이 링크 참조)

함수 호출은 사용자 공간의 코드 조각에 대한 호출입니다.

그러나 함수 호출은 실행 과정에서 시스템 호출을 수행하는 함수에 대한 것일 수 있습니다. "fopen"은 그러한 예 중 하나입니다.따라서 열기 호출 자체는 함수에 대한 호출이지만 시스템 호출이 실제 IO를 처리하지 않는다는 것을 의미하지는 않습니다.

이 논의에 추가해야 할 관점은 일반적으로 가장 낙관적인 경우의 함수 호출이 x86에서 몇 개의 8비트 명령어(평균 4-10)의 오버헤드를 가지고 있다는 것입니다.

시스템 호출에는 다음과 같은 속성이 있습니다.

  1. 훨씬 더 많은 명령을 실행합니다. 단순히 스택 상태가 아닌 프로세스를 동결해야 합니다.
  2. 관련된 타이밍은 대부분 비결정론적입니다.
  3. 이는 종종 예약 지점이며 스케줄러는 예약을 다시 하도록 선택할 수 있습니다.

이 세 가지 기본적인 이유(아마도 더 있을 것이다)로 인해, 가능한 경우 시스템 호출의 양을 줄여야 합니다. 예를 들어, 네트워크 시스템 소프트웨어는 소켓 핸들(및 연결에 의해 사용되는 다른 애플리케이션별 내부 데이터 구조)을 새로운 연결에 할당하기 위해 주변에 두고 있는데, 커널을 귀찮게 하는 이유는 무엇입니까?

소프트웨어는 거꾸로 된 피라미드처럼 만들어졌다는 것을 기억하세요.시스템 호출은 기본에 있습니다.

질문은 이미 훌륭한 답변을 가지고 있지만, 저는 제가 무언가를 추가할 수 있다고 생각합니다(다른 답변에 없는 단계의 한 부분).

때때로 시스템 호출과 함수 호출은 동일한 서명을 갖습니다. 예를 들어,open():

open() - 시스템 호출

--- ~/Documents » man open(2)

OPEN(2)                 Linux Programmer's Manual           OPEN(2)

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
...

open() 함수호출호출

$ man open(3)

--- ~/Documents » 
OPEN(3P)                        POSIX Programmer's Manual          OPEN(3P)
...

int open(const char *path, int oflag, ...);

...

견적서 OSTEP

다음과 같은 시스템 호출에 대한 호출 이유가 궁금할 수 있습니다.open()또는read()C의 일반적인 프로시저 호출과 똑같이 보입니다. 즉, 프로시저 호출과 똑같이 보이는 경우 시스템은 시스템 호출임을 어떻게 알고 모든 올바른 작업을 수행합니까?간단한 이유는 프로시저 호출이지만 프로시저 호출 안에 숨겨져 있는 것이 유명한 트랩 명령입니다.좀 더 구체적으로, 당신이 전화할 때.open()(예를 들어) C 라이브러리로 프로시저 호출을 실행하고 있습니다.거기서, 그것 때문에.open()또는 제공된 다른 시스템 호출 중 하나인 라이브러리는 커널과 합의된 호출 규약을 사용하여 잘 알려진 위치(: 스택 또는 특정 레지스터)에서 열도록 인수를 배치하고, 시스템 호출 번호를 잘 알려진 위치(다시 스택 또는 레지스터)에도 배치합니다.그런 다음 앞서 언급한 트랩 명령을 실행합니다.트랩이 반환 값을 풀고 시스템 호출을 실행한 프로그램에 제어를 반환한 후 라이브러리의 코드입니다.따라서 시스템 호출을 하는 C 라이브러리의 부분은 어셈블리에서 수동으로 코딩됩니다. 이는 인수를 처리하고 값을 올바르게 반환하고 하드웨어별 트랩 명령을 실행하기 위해 관례를 주의 깊게 따라야 하기 때문입니다.이제 여러분은 왜 여러분이 개인적으로 OS에 갇히기 위해 어셈블리 코드를 작성할 필요가 없는지 알게 되었습니다. 누군가가 이미 여러분을 위해 그 어셈블리를 작성했습니다.

Linux를 사용하는 경우 트레이스를 통해 응용 프로그램에서 수행하는 시스템 호출을 모니터링할 수 있습니다.

strace /path/to/app

그것의 출력은 libc 내에서 무슨 일이 일어나고 있는지, 그리고 어떤 기능이 실제로 시스템 호출인지에 대한 좋은 통찰력을 제공할 수 있습니다.

fopen는 함수 호출이지만 궁극적으로 "시스템"(OS)에 의해 처리되기 때문에 시스템 호출이라고도 할 수 있습니다.fopen는 C 런타임 라이브러리에 내장되어 있습니다.

다른 사람들이 제시한 그림을 완성하기 위해서,fopen일반적으로 주위의 래퍼로 구현됩니다.open사용자가 액세스할 수 있는 기능이기도 합니다.fopen어떤 의미에서, 보다 더 높은 수준입니다.open이래로FILE*사용자를 위해 캡슐화된 내용을 반환하는 구조입니다.는 일부사는사용을 합니다.open특별한 필요를 위해 직접적으로그러므로 전화를 하는 것은 옳지 않습니다.fopen어떤 식으로든 "시스템 호출".시스템 호출을 직접 실행하지도 않습니다.open는 사용자가 호출할 수 있는 기능이기도 합니다.

시스템 호출은 하드웨어에 액세스하는 데 일부 권한이 필요하기 때문에 사용자 공간이 아닌 커널 수준에서 실행됩니다.

을 하고 그므로사공간서에프용자로하고밍다때할래같함호평출을수범은과 같은 일반적인 을 할 때fopenC 언어에서 libc는 일반적으로 이 함수를 사용자 공간에서 커널 공간으로 전환하기 위해 인터럽트가 생성되는 특정 코드 코드로 랩합니다. 그러면 커널 공간에서 하드웨어 수준에서 함수 호출의 기능을 수행하기 위해 필요한 시스템 호출이 커널 공간에서 실행됩니다.

언급URL : https://stackoverflow.com/questions/2668747/system-call-vs-function-call

반응형