Skip to content

Latest commit

 

History

History
189 lines (126 loc) · 8.42 KB

3. System Call.md

File metadata and controls

189 lines (126 loc) · 8.42 KB

System Call이란?

이 문서는 2022년 11월 03일에 @unchaptered에 의해서 작성되었습니다.

1. System Call은 무엇일까?
    1.1. (일반적으로) System Call이 제공하는 서비스
    1.2. (일반적으로) System Call의 범주
    1.3. 참고
2. Linux에서 살펴보는 System Call
    2.1. Process Control
        2.1.1. fork란?
        2.1.2. exec이란?
        2.1.3. exit이란?
    2.2. File Management
    2.3. Information Maintenance
        2.3.1. getpid 란?
        2.3.2. alarm 이란?
        2.3.3. sleep 이란?
    2.4. Communication
        2.4.1. pipe 란?
        2.4.2. shmget 이란?
        2.4.3. mmap 이란?
    2.5. 참고

1. System Call은 무엇일까?

System Call은 프로세스와 운영 체제 간의 Interface를 제공하는 절차입니다.

일반적으로 프로그래밍 영역에서, Interface는 일종의 도구와 같은 개념으로 쓰인다고 이해하면 편합니다.
예를 들어, MySQL Workbench와 같이 DBMS를 직관적으로 보고 사용할 수 있게 해주는 툴을 GUI, Graphic User Interface라고 부릅니다.
또한, 어떠한 응용프로그램을 외부에서 사용할 수 있다면 그 툴을 API, Application Programming Interface라고 부릅니다.

현재 단계에서는, 프로세스은 일반적으로 (예외의 경우는 있으나) 하나의 프로그램이라고 생각해도 무방합니다.
따라서 작업관리자를 실행하였을 때, 나오는 프로그램들이 프로세스라는 카테고리로 분류되고 있는 것도 확인할 수 있습니다.

image

일반적으로 컴퓨터 프로그램은 운영체제의 커널에 요청할 때, System Call을 합니다. 이러한 System Call은 다양한 API로 구성되어 있으며, 따라서 운영체제 별로 상이한 형태와 구성을 가지고 있습니다.

중요한 것은, System Call은 Kernel System의 진입점이 되어 준다는 것입니다. 이 Kernel System에 대해서는 다른 문서에서 더 자세히 다루도록 하겠습니다.

1.1. (일반적으로) System Call이 제공하는 서비스

Computing Resource가 필요한 모든 프로그램은 System Call을 사용해야 합니다. 이러한 System Call은 (일반적으로) 다음과 같은 서비스를 제공합니다.

  1. 프로세스 생성 및 관리
  2. 메인 메모리 관리
  3. 파일 엑세스, 디렉토리 및 파일 시스템 관리
  4. 디바이스 핸들링(I/O)
  5. 보호
  6. 네트워킹

1.2. (일반적으로) System Call의 범주

System Call은 다음과 같은 범주로 구성되어 있습니다.

  1. 프로세스 제어 : 종료, 중단, 생성, 종료, 메모리 할당 및 해제
  2. 파일 관리 : 생성, 열기, 닫기, 삭제, 파일 읽기 등
  3. 기기 관리
  4. 정보 유지
  5. 의사소통

1.3. 참고

System Call 에 대한 의미론적 정의는 다음의 문서를 참고하였습니다.

2. Linux에서 살펴보는 System Call

앞서 1.1.2.에서 말했던 것처럼, System Call은 다음과 같은 범주로 구성되어 있습니다.

Basis of syscall
Process control fork(), exit(), exec()
File Management open(), read(), write(), close()
Information Maintenance getpid(), alarm(), sleep()
Communication pipe(), shmget(), mmap()

2.1. Process Control

Linux의 프로세스 제어, System Call은 크게 fork(), exit(), exec() 으로 구성되어 있습니다.

2.1.1. fork란?

fork()는 프로세스 관리에서 가장 일반적으로 사용되는 System Call 중 하나입니다.

  1. fork() syscall에 의해서 새 프로세스 생성
  2. fork() syscall을 연달아 호출하여 parent process의 child process를 호출 가능

Node.js 프로세스 매니저 라이브러리인 pm2를 이용하여 pm2 start app.js를 하면, fork 모드로 켜집니다.

2.1.2. exec이란?

exec()은 오버레이 방식으로 작동하는 System Call입니다.

  1. 새 실행일 경우, syscall에 의해서 새 프로세스를 생성
  2. 기존의 프로세스가 있을 경우, syscall에 의해서 기존의 프로세스를 완벽히 대체
  3. 즉, 프로세스 식별자 PID는 변하지 않습니다.
  4. 하지만, 프로세스의 Machine Code, Data, Heap, Stack은 변경됩니다.

2.1.3. exit이란?

exit()은 프로세스 종료와 자원 회수를 진행하는 System Call입니다.

역시나, pm2 kill을 하거나 혹은 *.js 파일 안에서 process.exit(1)을 하면 pm2.instance 및 node.instance가 종료되는 것을 알 수 있습니다.

2.2. File Management

Linux의 파일 관리, System Call은 open(), read(), write(), close() 로 구성됩니다.

2.3. Information Maintenance

Linux의 정보 유지, System Call은 getpid(), alarm(), sleep() 으로 구성됩니다.

2.3.1. getpid 란?

getpid()는 프로세스 식별자 PID를 얻기 위한 syscall입니다. 이 syscall은 항상 성공해야 하며, 오류를 나타내기 위한 예약된 반환값이 없습니다.

2.3.2. alarm 이란?

alarm()은 timer계열의 syscall로 프로세스에 도달하는 신호의 도달 시간을 제어할 수 있습니다. 아래의 링크에서 실제로 Linux 기반의 운영체제에서의 alarm 설명을 확인할 수 있습니다.

2.3.3. sleep 이란?

sleep()은 (alarm과 다른) timer 계열의 syscall로 특정한 프로세스를 일정시간 잠재우는 기능을 합니다.

이 부분은 실제로 프로그래밍 영역에서 유용하게 사용할 수 있는 가능성이 있습니다. 예를 들어, CI/CD 가 완료되고 일정 시간 동안 관측을 하고 그 결과가 성공적이라면 어떠한 Action을 해야 할 때, 매우 유용합니다.

for (( i = 1 ; i <= 250 ; i++ )); 
   do  
    sleep 1
    qsub computation"${i}".pbs
done

2.4. Communication

이 유형의 System Call은 프로세스 간의 통신을 위해서 지원됩니다. 이를 활용하여 멀티 프로세스와 같은 방식으로 프로그램을 가동시킬 수 있는 발판이 될 수 있습니다. 대표적으로 pipe(), shmget(), mmap() 등의 syscall이 존재합니다.

2.4.1. pipe 란?

pipe()는 서로 다른 Linux 프로세스 간의 통신을 담당하는 syscall입니다.

  1. 추가적으로, file descriptors를 여는데 사용됩니다.

열려 있는 모든 file은 모두 고유한 file descriptors를 가지게 됩니다. 이 부분의 내용은 너무나 생소한 개념이라서 아래의 링크를 첨부해두었습니다.

2.4.2. shmget 이란?

shmget()은 공유 메모리 세그먼트를 위한 syscall 입니다.

  1. 즉, 복수의 프로세스가 하나의 메모리를 공유하는 것을 지원합니다.

이 부분 또한 memory 섹션에서 자세히 다룰 예정입니다.

2.4.3. mmap 이란?

mmap()은 파일이나 장치를 (가상)메모리에 매핑 및 매핑 해제하는 데 사용되는 syscall 입니다.

2.5. 참고