일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Thread Multiplexing
- 문자열 불변성
- OS
- 프로세스
- 도커
- hiberbate
- SystemCall
- FunctionalInterface
- strict stubbing
- task_struct
- functional interface
- Spring
- ReflectUtils
- AOP
- 함수형 인터페이스
- custom annotation
- none이미지
- python-socketio
- Thread Library
- 운영체제
- sql-mappler
- django-crontab
- spring-data-jpa
- Process
- 쓰레드 라이브러리
- 문자열 리터럴
- @Header
- java.util.function
- 롬복주의점
- rainbow table
- Today
- Total
JH's Develog
[OS] OS와 System Call 본문
OS는 프로그램의 실행을 위한 환경과 서비스를 제공해줍니다. 즉 하드웨어와 소프트웨어를 관리함으로써 컴퓨터의 리소스를 효율적으로 사용할 수 있게 해주는 시스템이라고 할 수 있습니다.
OS가 제공하는 서비스는 다음과 같습니다.
- 유저 인터페이스 : CLI, GUI 등
- 프로그램의 실행 : Load, Run, End
- I/O 작업 : Read/Write/Create/Delete/Search/List file
- 커뮤니케이션 : 컴퓨터와 컴퓨터 간 혹은 한 컴퓨터 내부의 다른 프로그램간의 커뮤니케이션 -> 기본적으로 네트워킹과 같은 의미입니다.
- Error Detection
- 리소스 할당 : CPU cycles, 메모리 공간, 메모리 대역 등
- Accounting : 유저 혹은 프로세스가 얼마나 많은 리로스를 사용하는지 지속적으로 추적합니다.
- 보호/보안
System Call
모든 프로그램은 OS에 어떠한 작업을 해달라고 요청하며 실제로 작업은 운영체제에 의해 진행된다고 볼 수 있습니다. 프로그램이 OS에 작업을 요청할 때 시스템 콜이 사용됩니다.
또한 시스템 콜은 아주 간단한 작업이라도 아주 많이(초당 수천개) 호출됩니다.
위 그림에서 알 수 있듯이 유저는 API를 통해서 시스템 콜을 간접적으로 사용하며, API위에 또다른 API가 있을 수도 있습니다. 실제로 Java API는 libc API를 기반으로 만들어졌습니다.
그렇다면 왜 시스템콜을 직접 호출하지 않고 API를 사용할까?
일단 한번 프로그램을 작성하면 그 프로그램을 시스템 콜의 Set이 다른(사용할 수 있는 시스템 콜의 종류가 다른) 컴퓨터에서도 컴파일하고 실행할 수 있습니다. 이를 Portability가 있다라고 표현합니다.
게다가 시스템 콜을 호출하기 위해서는 상당히 많은 준비를 해야하기 때문에 직접적인 시스템 콜을 사용하는 것은 어렵습니다. 예를들어, write 시스템 콜은
ssize_t write(int fd, const void * buf, size_t count);
단순히 buf에 들어있는 데이터를 count만큼 fd로 지정된 파일에 쓰는 기능을 가지고 있습니다.
하지만 write 시스템 콜을 사용해 만들어진 printf는 잘 알다시피
int printf(const char *format-string, argument-list);
format string을 사용하여 손쉽게 문자열을 출력할 수 있도록 해줍니다. 이는 printf가 내부적으로 파라미터 포매팅을 알아서 해주고 최종적으로 write 시스템 콜을 사용하기 때문입니다.
System Call Interface
System Call Interface는 시스템 콜의 사용자가 시스템 콜의 내부가 어떻게 구현되었는지는 알 필요없이 그저 interface와 반환값만 알면 되도록 해줍니다.
시스템 콜은 일반 함수와 달리 User space가 아닌 운영체제 내부(Kernel)의 시스템 콜 테이블에 저장되어있고, 하드웨어가 그 기능을 제공합니다. 이런 이유로 유저 어플리케이션에서 시스템 콜을 호출하면 User mode에서 Kernel mode로 Context Switch가 일어나게 됩니다. Context Switch를 하는 동안에는 CPU가 아무런 일도 하지 않는 Overhead가 발생하게 되므로 잦은 Context Switch는 성능을 저하시키는 원인이 됩니다.
System Call Types
시스템콜은 6개의 종류로 분류할 수 있습니다
- Process Control
- fork, exec, exit ...
- 프로세스의 생성/종료, 메모리의 할당/해제, 프로세스의 속성 Get/Set, wait/signal 등의 작업을 수행합니다.
- File manipulation
- create, open, close, read, write, lseek ...
- 파일의 속성을 Get/Set, 파일의 생성/삭제/열기/닫기 등의 작업을 수행합니다.
- Device manipulation
- open, close, read, write, ioctl ...
- 디바이스의 속성 Get/Set, 디바이스의 요청 및 해제 등의 작업을 수행합니다.
- Information maintenance
- time, date, pid ...
- 시간과 날짜 Get/Set, 시스템 데이터(유저목록, 버전정보, 디스크 사용량) Get/Set 등의 작업을 수행합니다.
- Communications
- open, close, connect, accept, read, write, send, recv, pipe, mmap, sendfile ...
- Communication에는 메시지의 교환에 기반하는 Message Passing 모델과 데이터를 공유하는 메모리 공간을 통해 정보를 주고 받는 Shared-memory 모델이 존재합니다.
- Protection
- chmod, umask, chown ...
open, close, read, write는 여러 카테고리에서 공통적으로 나타나는데 여기서 알 수 있는 점은 리눅스는 파일, 디바이스, 다른 프로그램 등 모든 것을 파일로 취급한다는 점 입니다.
'CS > OS' 카테고리의 다른 글
[OS] 쓰레드란? (2) - thread multiplexing, thread library, thread pool (0) | 2022.01.04 |
---|---|
[OS] 쓰레드란? - 쓰레드와 Parallelism/Concurrency (0) | 2022.01.03 |
[OS] 프로세스란?(2) _ PCB, Context switch, Zombie process etc. (0) | 2021.12.30 |
[OS] 프로세스란?(1) (0) | 2021.12.29 |
[OS] OS의 디자인과 구조 (0) | 2021.12.28 |