안녕하세요~ 저번 시간에는 처음 보면 다소 생소할 수 있는 '논리 주소공간' 과 'CPU의 실행모드' 에 대하여 알아보았습니다!! 이번 시간에는 운영체제 과목에서 아주 중요한 개념인 '커널'에 대해서 아주~ 자세히 알아볼 예정이구, 커널과 밀접한 연관이 있는 '시스템 호출' 에 대하여 알아보는 시간을 가지겠습니다 ㅎㅎ

1. 커널의 실체
- 부팅 시 메모리에 적재되는 함수/데이터의 집합
- 컴파일된 바이너리. 보조저장장치(Hard Disk)의 특정 영역에 저장됨.
- 여기서 '함수/데이터' 는 '커널 코드'를 의미
- '함수/데이터'는 '커널 모드'에서 실행되고, 시스템 관리 및 운영을 위해 주로 수행됨.
2. 커널과 관련된 이슈
- 커널은 스스로 실행되는 프로세스인가?
- X : '시스템 호출'을 통해 호출되는 단순 함수/데이터의 집합
- 커널은 실행 중이다?
- X : 시스템 호출/인터럽트를 통해 커널 코드/ISR이 실행되고 있을 뿐이다.
- 커널은 스택이나 힙을 갖는가?
- X : 각 프로세스/스레드가 스택/힙을 소유
- App이 '커널 코드' 실행 시, 커널 공간에 커널 코드 실행을 위한 스택 생성, 복귀시 해제
- X : 각 프로세스/스레드가 스택/힙을 소유
3. 응용 프로그램을 위한 라이브러리 유형
- 라이브러리 (library)
- 응용 프로그램에서 활용하도록 미리 작성된 함수들을 컴파일한 바이너리
- 라이브러리의 두가지 유형
- 표준 라이브러리 (standard library)
- OS나 H/W에 상관없이 이름과 사용법 동일
- 사용자가 작성하기 힘들거나 번거로운 함수 제공
- 표준 라이브러리 함수 예) printf(), scanf() ... 등
- 시스템 호출 라이브러리 (system call API)
- '시스템 호출'을 진행해 '커널 모드'로 바꾸고, 커널로 진입해서 커널에서 제공하는 함수 실행 (커널의 다양한 기능 수행)
- OS마다 함수 이름이 다름
- 시스템 호출 라이브러리 함수 == 시스템 호출 함수 == 커널 API (같은 의미)
- OS마다 시스템 호출 함수 이름이 다르므로, Windows OS에서 컴파일한 파일은 Windows에서만, Linux에서 컴파일한 파일은 Linux에서만 실행 가능하다.
- 표준 라이브러리 (standard library)
- 응용 프로그램의 빌드 과정
- 응용 프로그램의 실행 과정
4. '시스템 호출' 이란?
- 사용자 공간의 코드에서 커널 함수(서비스)를 요청하는 과정
- 커널 콜(Kernel Call), 트랩(Trap) 이라고도 부름
- 응용 프로그램이 커널 기능을 활용하도록 제공
- '시스템 호출 라이브러리'를 통해 제공 => OS마다 다르며, 약 200여개 이상 제공
- 시스템 호출로 커널 코드의 실행 예
5. printf()의 출력 동작
- printf() 함수는 표준 라이브러리 함수
- printf() 함수를 호출하면 '시스템 호출'이 일어날까?
- 디스플레이에 접근하는 것은 '커널'만 가능
- printf() 함수는 디스플레이에 직접 출력 불가능
- printf()는 C 표준 라이브러리의 버퍼에 출력
- 버퍼가 꽉 차면, printf()는 시스템 호출 함수 write() 호출
- write() 함수는 '시스템 호출 CPU 명령' 실행
- 커널에 작성된 함수가 디스플레이어에 "hello" 출력
6. write() 시스템 호출
7. 시스템 호출 비용
- 시스템 호출은 일반 함수 호출에 비해 많은 시간/비용 발생
- 시스템 호출을 많이 할 수록 프로그램 실행 속도 저하
- fread()와 read() 비교
- 파일에서 1000 바이트 읽기
- fread()는 '표준 입출력 라이브러리 함수', read()는 '시스템 호출 라이브러리 함수'이다.
- fread()는 서브루틴을 돌면서 주기억장치에 있는 입력버퍼에 저장해놓고, 1번의 시스템 호출을 발생시킨다.
- read()는 서브루틴 주기마다 시스템 호출을 발생시켜, 버퍼에 저장한다.
- 통계에 의해 fread()가 read()에 비해 약 8배 빠르다고 한다.
지금까지 '커널'과 '시스템 호출'에 대해 자세히 알아보는 시간을 가져봤습니다~
다음 시간에는 '인터럽트'를 운영체제 관점에서 바라보는 시간을 가져보겠습니다!!
오늘 하루도 고생 많으셨습니다~ ㅎㅎ 다음 시간에 뵈어여!!
