본문 바로가기
카테고리 없음

커널과 시스템 호출

by winter_sunshine 2023. 7. 3.

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

 

1.  커널의 실체

  • 부팅 시 메모리에 적재되는 함수/데이터의 집합
    • 컴파일된 바이너리. 보조저장장치(Hard Disk)의 특정 영역에 저장됨.
    • 여기서 '함수/데이터' 는 '커널 코드'를 의미
    • '함수/데이터'는 '커널 모드'에서 실행되고, 시스템 관리 및 운영을 위해 주로 수행됨.

'커널'의 실체

 

2.  커널과 관련된  이슈

  • 커널은 스스로 실행되는 프로세스인가?
    • X : '시스템 호출'을 통해 호출되는 단순 함수/데이터의 집합
  • 커널은 실행 중이다?
    • X : 시스템 호출/인터럽트를 통해 커널 코드/ISR이 실행되고 있을 뿐이다.
  • 커널은 스택이나 힙을 갖는가?
    • X : 각 프로세스/스레드가 스택/힙을 소유
      • App이 '커널 코드' 실행 시, 커널 공간에 커널 코드 실행을 위한 스택 생성, 복귀시 해제

 

3.  응용 프로그램을 위한 라이브러리 유형

  • 라이브러리 (library)
    • 응용 프로그램에서 활용하도록 미리 작성된 함수들을 컴파일한 바이너리
  • 라이브러리의 두가지 유형
    1.  표준 라이브러리 (standard library)
      • OS나 H/W에 상관없이 이름과 사용법 동일
      • 사용자가 작성하기 힘들거나 번거로운 함수 제공
      • 표준 라이브러리 함수 예)  printf(), scanf() ... 등
    2.  시스템 호출 라이브러리 (system call API)
      • '시스템 호출'을 진행해 '커널 모드'로 바꾸고, 커널로 진입해서 커널에서 제공하는 함수 실행 (커널의 다양한 기능 수행)
      • OS마다 함수 이름이 다름
      • 시스템 호출 라이브러리 함수  ==  시스템 호출 함수  ==  커널 API   (같은 의미)
      • OS마다 시스템 호출 함수 이름이 다르므로, Windows OS에서 컴파일한 파일은 Windows에서만, Linux에서 컴파일한 파일은 Linux에서만 실행 가능하다.

 

  • 응용 프로그램의 빌드 과정

응용 프로그램의 빌드 과정

 

  • 응용 프로그램의 실행 과정

응용 프로그램의 실행 과정

 

4.  '시스템 호출' 이란?

  • 사용자 공간의 코드에서 커널 함수(서비스)를 요청하는 과정
    • 커널 콜(Kernel Call),  트랩(Trap) 이라고도 부름
    • 응용 프로그램이 커널 기능을 활용하도록 제공
    • '시스템 호출 라이브러리'를 통해 제공  =>  OS마다 다르며, 약 200여개 이상 제공

 

  • 시스템 호출로 커널 코드의 실행 예

시스템 호출을 통한 커널 코드의 실행 예

 

5.  printf()의 출력 동작

printf() 출력 동작 과정

  • printf() 함수는 표준 라이브러리 함수
  • printf() 함수를 호출하면 '시스템 호출'이 일어날까?
    • 디스플레이에 접근하는 것은 '커널'만 가능
    • printf() 함수는 디스플레이에 직접 출력 불가능
    • printf()는 C 표준 라이브러리의 버퍼에 출력
    • 버퍼가 꽉 차면, printf()는 시스템 호출 함수 write() 호출
    • write() 함수는 '시스템 호출 CPU 명령' 실행
    • 커널에 작성된 함수가 디스플레이어에 "hello" 출력

 

6.   write()  시스템  호출

 

write 시스템 호출

 

7.  시스템 호출 비용

  • 시스템 호출은 일반 함수 호출에 비해 많은 시간/비용 발생
    • 시스템 호출을 많이 할 수록 프로그램 실행 속도 저하
  • fread()read() 비교
    • 파일에서 1000 바이트 읽기
    • fread()는 '표준 입출력 라이브러리 함수',  read()는 '시스템 호출 라이브러리 함수'이다.
    • fread()는 서브루틴을 돌면서 주기억장치에 있는 입력버퍼에 저장해놓고, 1번의 시스템 호출을 발생시킨다.
    • read()는 서브루틴 주기마다 시스템 호출을 발생시켜, 버퍼에 저장한다.
    • 통계에 의해 fread()가 read()에 비해 약 8배 빠르다고 한다.
     

fread()와 read()의 시스템 호출 횟수
fread()와 read()의 동작 과정

 

 

 

 

지금까지 '커널'과 '시스템 호출'에 대해 자세히 알아보는 시간을 가져봤습니다~

다음 시간에는 '인터럽트'를 운영체제 관점에서 바라보는 시간을 가져보겠습니다!!

오늘 하루도 고생 많으셨습니다~ ㅎㅎ 다음 시간에 뵈어여!!