logo

시스템 호출 소개

컴퓨팅에서는 시스템 호출 컴퓨터 프로그램이 실행되는 운영 체제의 커널에 서비스를 요청하는 프로그래밍 방식입니다. 시스템 호출은 프로그램이 다음을 수행하는 방법입니다. 운영 체제와 상호 작용 . 컴퓨터 프로그램은 운영 체제의 커널에 요청할 때 시스템 호출을 수행합니다. 시스템 호출 제공한다 API(Application Program Interface)를 통해 운영 체제의 서비스를 사용자 프로그램에 제공합니다. 사용자 수준 프로세스가 운영 체제의 서비스를 요청할 수 있도록 프로세스와 운영 체제 간의 인터페이스를 제공합니다. 시스템 호출은 시스템 호출의 유일한 진입점입니다. 핵심 체계. 리소스가 필요한 모든 프로그램은 시스템 호출을 사용해야 합니다.

사용자 프로그램은 시스템 호출을 사용하여 운영 체제와 상호 작용할 수 있습니다. 프로그램은 여러 서비스를 요청하고 OS는 요청을 이행하기 위해 여러 시스템 호출을 시작하여 응답합니다. 시스템 호출은 C나 Pascal과 같은 고급 언어나 어셈블리 언어로 작성할 수 있습니다. 고급 언어를 사용하는 경우 운영체제는 미리 정의된 함수인 시스템 호출을 직접 호출할 수 있습니다.



시스템 호출은 프로그램이 서비스를 요청하기 위해 사용하는 메커니즘입니다. 운영 체제 (OS). 간단히 말해서, 하드웨어 리소스에 액세스하거나 권한 있는 작업을 수행하는 등 프로그램이 기본 시스템과 상호 작용하는 방법입니다.

시스템 호출은 특정 명령을 실행하는 프로그램에 의해 시작됩니다. 핵심 모드를 사용하면 프로그램이 OS에서 서비스를 요청할 수 있습니다. 그런 다음 OS는 요청을 처리하고 필요한 작업을 수행한 다음 결과를 프로그램에 다시 반환합니다.

시스템 호출은 프로그램이 시스템 리소스에 액세스하는 표준화된 방법을 제공하므로 운영 체제가 제대로 작동하는 데 필수적입니다. 시스템 호출이 없으면 각 프로그램은 하드웨어 및 시스템 서비스에 액세스하기 위한 자체 메서드를 구현해야 하므로 일관성이 없고 오류가 발생하기 쉬운 동작이 발생합니다.



시스템 호출로 제공되는 서비스

  • 프로세스 생성 및 관리
  • 메인 메모리 관리
  • 파일 액세스, 디렉터리 및 파일 시스템 관리
  • 디바이스 핸들링(I/O)
  • 보호
  • 네트워킹 등
    • 프로세스 제어: 메모리를 종료하고, 중단하고, 생성하고, 종료하고, 할당하고, 해제합니다.
    • 파일 관리: 파일 생성, 열기, 닫기, 삭제, 읽기 등
    • 장치 관리
    • 정보유지관리
    • 의사소통

시스템 호출의 특징

  • 상호 작용: 시스템 호출은 사용자 프로그램과 운영 체제 간에 잘 정의된 인터페이스를 제공합니다. 프로그램은 특정 함수를 호출하여 요청을 하고, 운영 체제는 요청된 서비스를 실행하고 결과를 반환하여 응답합니다.
  • 보호: 시스템 호출은 일반 사용자 프로그램에서는 사용할 수 없는 권한 있는 작업에 액세스하는 데 사용됩니다. 운영 체제는 이 권한을 사용하여 악의적이거나 무단 액세스로부터 시스템을 보호합니다.
  • 커널 모드: 시스템 호출이 이루어지면 프로그램은 일시적으로 사용자 모드에서 커널 모드로 전환됩니다. 커널 모드에서 프로그램은 하드웨어, 메모리 및 기타 프로세스를 포함한 모든 시스템 리소스에 액세스할 수 있습니다.
  • 컨텍스트 전환: 시스템 호출에는 현재 프로세스의 상태를 저장하고 커널 모드로 전환하여 요청된 서비스를 실행하는 컨텍스트 전환이 필요합니다. 이로 인해 오버헤드가 발생하여 시스템 성능에 영향을 미칠 수 있습니다.
  • 오류 처리: 시스템 호출은 요청된 서비스에 문제가 있음을 나타내는 오류 코드를 반환할 수 있습니다. 프로그램은 이러한 오류를 확인하고 적절하게 처리해야 합니다.
  • 동기화: 시스템 호출을 사용하여 파일이나 네트워크 연결과 같은 공유 리소스에 대한 액세스를 동기화할 수 있습니다. 운영 체제는 여러 프로그램이 이러한 리소스에 안전하게 액세스할 수 있도록 잠금 또는 세마포어와 같은 동기화 메커니즘을 제공합니다.

시스템 호출의 장점

  • 하드웨어 리소스에 대한 액세스: 시스템 호출을 통해 프로그램은 디스크 드라이브, 프린터, 네트워크 장치와 같은 하드웨어 리소스에 액세스할 수 있습니다.
  • 메모리 관리: 시스템 호출은 프로그램이 메모리를 할당 및 할당 해제하고 메모리 매핑된 하드웨어 장치에 액세스하는 방법을 제공합니다.
  • 공정 관리: 시스템 호출을 통해 프로그램은 프로세스를 생성 및 종료하고 프로세스 간 통신을 관리할 수 있습니다.
  • 보안: 시스템 호출은 프로그램이 시스템 설정을 수정하거나 관리 권한이 필요한 작업을 수행하는 기능과 같은 권한 있는 리소스에 액세스할 수 있는 방법을 제공합니다.
  • 표준화: 시스템 호출은 프로그램이 운영 체제와 상호 작용할 수 있도록 표준화된 인터페이스를 제공하여 다양한 하드웨어 플랫폼과 운영 체제 버전 간의 일관성과 호환성을 보장합니다.

시스템 호출은 어떻게 작동하나요?

다음은 시스템 호출이 작동하는 방식을 단계별로 자세히 설명합니다.

  • 사용자는 특별한 자원이 필요합니다: 때때로 프로그램은 파일 읽기, 파일 쓰기, 하드웨어에서 정보 가져오기, 메모리 공간 요청 등 OS의 허가 없이는 수행할 수 없는 몇 가지 특별한 작업을 수행해야 합니다.
  • 프로그램이 시스템 호출을 요청합니다. 운영 체제에 요청하기 위해 미리 정의된 특별 명령이 있습니다. 이러한 명령은 단지 시스템 호출일 뿐입니다. 프로그램은 필요할 때 코드에서 이러한 시스템 호출을 사용합니다.
  • 운영 체제는 시스템 호출을 확인합니다. OS가 시스템 호출을 보면 현재 프로그램에 도움이 필요하다는 것을 인식하여 프로그램 실행을 일시적으로 중지하고 'Kernel'이라는 특수 부분에 모든 제어권을 부여합니다. 이제 프로그램의 필요성을 'Kernel'이 해결해줍니다.
  • 운영 체제는 다음 작업을 수행합니다. 이제 운영 체제는 프로그램이 요청한 작업을 수행합니다. 예: 파일 등에서 내용 읽기
  • 운영 체제는 프로그램에 다시 제어권을 부여합니다. 특수 작업을 수행한 후 OS는 프로그램의 추가 실행을 위해 프로그램에 제어권을 다시 부여합니다.

Windows 및 Unix의 시스템 호출 예

Windows 및 Unix에 대한 시스템 호출은 다양한 형태로 제공됩니다. 이는 아래 표에 다음과 같이 나열되어 있습니다.

프로세스 윈도우 유닉스
프로세스 제어

생성프로세스()



종료프로세스()

WaitForSingleObject()

포크()

출구()

기다리다()

파일 조작

파일 생성()

파일 읽기()

쓰기파일()

열려 있는()

이름 디렉토리 리눅스 변경

읽다()

쓰다()

닫다()

장치 관리

SetConsoleMode()

읽기콘솔()

쓰기콘솔()

Ioctl()

읽다()

쓰다()

정보유지관리

현재프로세스ID() 가져오기

타이머 설정()

잠()

Getpid()

경보()

잠()

의사소통

파이프 생성()

파일매핑 생성()

MapViewOfFile()

파이프()

Shmget()

엠맵()

보호

파일보안()

보안 설명자 초기화()

보안 설명자 그룹 설정()

Chmod()

무순_맵 C++

마스크 해제()

친()

열려 있는(): open() 시스템 호출을 사용하면 파일 시스템의 파일에 액세스할 수 있습니다. 필요한 파일 리소스와 프로세스가 사용할 수 있는 핸들을 제공합니다. 파일은 여러 프로세스에서 동시에 열 수도 있고 하나의 프로세스에서만 열 수도 있습니다. 모든 것은 구조와 파일 시스템을 기반으로 합니다.

읽다(): 파일 시스템에 있는 파일의 데이터는 이를 사용하여 검색됩니다. 일반적으로 다음 세 가지 인수를 허용합니다.

  1. 파일에 대한 설명입니다.
  2. 읽은 데이터를 저장하기 위한 버퍼입니다.
  3. 파일에서 읽어야 하는 바이트 수
    읽기 전에 파일 설명자로 읽을 파일을 식별하고 open() 함수를 사용하여 열 수 있습니다.

기다리다(): 일부 시스템에서는 계속하기 전에 다른 프로세스의 실행이 완료될 때까지 프로세스를 보류해야 할 수도 있습니다. 상위 프로세스가 하위 프로세스를 생성하면 하위 프로세스가 완료될 때까지 상위 프로세스의 실행이 중지됩니다. wait() 시스템 호출을 사용하여 상위 프로세스를 중지합니다. 하위 프로세스의 실행이 끝나면 상위 프로세스가 제어권을 다시 얻습니다.

쓰다(): 사용자 버퍼의 데이터는 이를 사용하여 파일과 같은 장치에 기록됩니다. 프로그램은 이것을 사용하여 단방향으로 데이터를 생성할 수 있습니다. 시스템 호출 . 일반적으로 세 가지 주장이 있습니다.

  1. 파일에 대한 설명입니다.
  2. 데이터가 저장되는 버퍼에 대한 참조입니다.
  3. 버퍼에서 기록될 데이터의 양(바이트)입니다.

포크(): fork() 시스템 호출은 프로세스가 자신의 복사본을 만드는 데 사용됩니다. 운영 체제에서 프로세스를 생성하기 위해 가장 자주 사용되는 방법 중 하나입니다. 상위 프로세스가 하위 프로세스를 생성하면 하위 프로세스가 완료될 때까지 상위 프로세스의 실행이 일시 중지됩니다. 하위 프로세스의 실행이 끝나면 상위 프로세스가 제어권을 다시 얻습니다.

출구(): 프로그램을 종료하는 데는 Exit()라는 시스템 호출이 사용됩니다. 다중 스레드가 있는 환경에서 이 호출은 스레드 실행이 완료되었음을 나타냅니다. exit() 시스템 함수를 사용한 후 운영 체제는 프로세스에서 사용하는 리소스를 복구합니다.

매개변수를 OS에 전달하는 방법

시스템 호출이 발생하면 운영 체제의 커널 부분에 매개변수를 전달해야 합니다.

예를 들어 주어진 것을보십시오 열려 있는() 시스템 호출:


자바의 추상 클래스



//function call example> #include> int> open(>const> char> *pathname,>int> flags, mode_t mode);>

>

>

여기 경로명 , 깃발 그리고 모드_t 매개변수입니다.

따라서 다음 사항에 유의해야 합니다.

  • 일반적인 함수 호출처럼 매개변수를 직접 전달할 수는 없습니다.
  • 커널 모드에서는 함수 호출을 수행하는 다른 방법이 있습니다.

따라서 프로세스가 이미 생성한 일반 주소 공간에서는 이를 실행할 수 없으며, 처리를 위해 운영 체제의 커널에서 사용할 수 없기 때문에 매개변수를 스택 상단에 배치할 수 없습니다. 따라서 매개변수를 OS의 커널에 전달하려면 다른 방법을 채택해야 합니다.

우리는 그것을 해낼 수 있습니다.

  1. 레지스터에 매개변수 전달
  2. 블록의 주소는 레지스터의 매개변수로 전달됩니다.
  3. 매개변수는 스택에 푸시됩니다.

각 사항에 대해 자세히 논의해 보겠습니다.

1. 레지스터에 매개변수를 전달합니다.

  • 세 가지 방법 중 가장 간단한 방법입니다.
  • 여기서는 매개변수를 레지스터에 직접 전달합니다.
  • 그러나 매개변수 수가 레지스터 수보다 많은 경우에는 제한됩니다.
  • C 프로그램 코드는 다음과 같습니다.




// Passing parameters in registers.> #include> #include> int> main()> {> >const> char>* pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> fd = open(pathname, flags, mode);> >// in function call open(), we passed the parameters pathanme,flags,mode to the kernal directly> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

>

>

2.블록의 주소가 매개변수로 전달됩니다.

  • 레지스터 개수보다 파라미터 개수가 많은 경우에 적용할 수 있습니다.
  • 매개변수는 블록이나 테이블에 저장됩니다.
  • 블록의 주소는 레지스터에 매개변수로 전달됩니다.
  • Linux와 Solaris에서 가장 일반적으로 사용됩니다.
  • C 프로그램 코드는 다음과 같습니다.




//Address of the block is passed as parameters> #include> #include> int> main() {> >const> char> *pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> params[3];> >// Block of data(parameters) in array> >params[0] = (>int>)pathname;> >params[1] = flags;> >params[2] = mode;> >int> fd = syscall(SYS_open, params);> >// system call> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

>

>

3. 매개변수가 스택에 푸시됩니다.

  • 이 방법에서는 프로그램을 사용하여 매개변수를 밀어넣고 운영 체제를 사용하여 팝업으로 표시할 수 있습니다.
  • 따라서 Kernal은 스택 상단에서 정보를 검색하여 데이터에 쉽게 액세스할 수 있습니다.
  • C 프로그램 코드는 다음과 같습니다.




자바의 정적 키워드

//parameters are pushed into the stack> #include> #include> #include> int> main() {> >const> char> *pathname =>'example.txt'>;> >int> flags = O_RDONLY;> >mode_t mode = 0644;> >int> fd;> >asm>volatile>(> >'mov %1, %%rdi '> >'mov %2, %%rsi '> >'mov %3, %%rdx '> >'mov , %%rax '> >'syscall'> >:>'=a'> (fd)> >:>'r'> (pathname),>'r'> (flags),>'r'> (mode)> >:>'%rdi'>,>'%rsi'>,>'%rdx'> >);> >if> (fd == -1) {> >perror>(>'Error opening file'>);> >return> 1;> >}> >// File operations here...> >close(fd);> >return> 0;> }>

>

>

자주 묻는 질문

Q.1: 시스템 호출은 어떻게 작동하나요?

답변:

프로그램이 시스템 호출을 실행하면 사용자 모드에서 더 높은 권한 모드인 커널 모드로 전환됩니다. 전환은 일반적으로 프로그래밍 언어나 운영 체제에서 제공하는 특정 기능을 호출하거나 명령을 중단함으로써 시작됩니다.

커널 모드에 들어가면 시스템 호출은 운영 체제에 의해 처리됩니다. 커널은 프로그램을 대신하여 요청된 작업을 수행하고 결과를 반환합니다. 그 후에 제어권은 사용자 수준 프로그램으로 반환되어 실행을 계속합니다.

Q.2: 시스템 호출이 필요한 이유는 무엇입니까?

답변:

시스템 호출은 여러 가지 이유로 필요합니다:

권한 있는 작업에 대한 액세스: 하드웨어 장치 관리 또는 시스템 구성 수정과 같은 많은 작업에는 시스템 호출을 통해서만 액세스할 수 있는 더 높은 권한이 필요합니다.

자원 관리: 시스템 호출은 메모리, 파일, 장치와 같은 시스템 리소스를 할당하고 관리하기 위한 표준화된 인터페이스를 제공하여 다양한 프로세스의 공정하고 제어된 액세스를 보장합니다.

추출: 시스템 호출은 운영 체제의 기본 복잡성을 추상화하여 애플리케이션 개발자가 더 높은 수준의 플랫폼 독립적인 방식으로 시스템과 상호 작용할 수 있도록 합니다.

보안 및 보호: 시스템 호출은 액세스 제어 및 보안 정책을 시행하여 중요한 리소스에 대한 무단 액세스를 방지하고 시스템 무결성을 보호합니다.