[개발지식] 커널(kernal), 쉘(shell), 추상화, 시스템 콜(System Call)
운영체제(Operating System, OS)는 컴퓨터 시스템에서 핵심적인 역할을 하는 소프트웨어이다.
운영체제의 구조는 크게 커널과 쉘로 나눌 수 있따. 운영체제는 커널과 셸 및 여러가지 기능(라이브러리, 시스템 프로그램 등등)이 추가된 상태를 통칭해서 운영체제(OS)라고 부른다.
커널( kernel )
- 사전적 의미: 알맹이, 핵심
- 운영체제의 90%를 차지하는 핵심부분으로, 운영체제 내부에서 컴퓨터의 하드웨어를 제어한다.
- 컴퓨터 자원(System Resource)들을 관리하는 역할
* 컴퓨터 자원: CPU, 메모리, 파일, 네크워크, 입출력 장치 등
- 커널은 항상 컴퓨터 자원만 바라보고 있기 때문에 사용자와의 상호작용은 전혀 지원하지 않는다.
(이 때 등장하는 개념이 바로 쉘이다. 사용자는 쉘을 통하여 커널에게 명령을 내릴 수 있다)
- 하드웨어와 응용 프로그램 간의 상호 작용을 관리한다.
- 주요 기능: 프로세스 관리, 메모리 관리, 입출력 관리, 파일 시스템 관리 등
- 시스템의 최상위 권한을 가지고 있어 하드웨어 자원에 직접 접근하고, 응용 프로그램이 원할하게 실행될 수 있도록 관리 한다.
- 응용 프로그램이 파일 생성 및 삭제 등의 기능을 실행하기 위해 직접 하드웨어에 접근이 가능 할까? => NO
응용 프로그램은 파일 관리 및 파일 접근 같은 주요한 기능의 권한이 없기 때문에 해당 기능을 수행하려면 커널을 호출 해야 하고, 커널이 하드웨어에 접근해서 해당 기능을 수행한 뒤 결과값을 응용 프로그램에 알려준다.
컴퓨터와 전원을 켜면 운영체제는 이와 동시에 수행된다. 소프트웨어가 컴퓨터 시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라 가야 한다.
하지만 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라가면 한정된 메모리 공간이 낭비가 심할 것이다. 따라서 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려 놓고, 그렇지 않은 부분은 필요할 떼 메모리에 올려서 사용하게 된다. 이 때 메모리에 상주하는 운영체제의 부분을 커널(kernal)이라고 한다.
즉, 커널은 메모리에 상주하는 부분으로써 운영체제의 핵심적인 부분을 뜻한다.
보통 운영체제라하면 커널을 뜻한다.
추상화
- 커널은 컴퓨터의 자원을 관리하는 역할을 수행한다.
- 그 중 가장 큰 역할은 컴퓨터의 물리적 자원(하드웨어)과 추상화 자원을 관리하는 것이다.
- 추상화란, 일반적으로 우리가 컴퓨터를 사용할 때 여러 사용자를 등록하여 사용할 수 있는데, 이렇게 여러 사용자를 등록하여 사용할 때 마치 하나의 하드웨어를 독점하여 활용하는 것처럼 느끼게 된다.
- 이처럼 하나의 하드웨어를 마치 여러 개 처럼 보여지도록 하는 기술을 추상화라고 한다.
- 커널을 이를 위해 하나의 하드웨어 자원을 여러 사용자들을 위한 여러 개의 추상화된 객체로 관리한다.
- 커널이 물리적인 자원을 추상화하면 용어가 달라지는데 매칭하면 아래와 같이 대응된다.
물리적 자원 이름 | 추상화한 자원 용어 |
CPU | 테스크(Task) |
메모리(Memory) | 페이지(Page), 세그먼트(Segment) |
디스크(Disk) | 파일(File) |
네트워크(Network) | 소켓(Socket) |
- 커널은 컴퓨터의 물리적인 자원과 추상화 자원을 관리한다.
- 커널은 5가지 관리자들로 구성되어 있다.
커널의 5가지 관리자
1. 테스크 관리자: 물리적인 자원인 CPU를 추상자원인 테스크로 제공
2. 메모리 관리자: 물리적인 자원인 메모리를 추상자원인 페이지나 세그먼트로 제공
3. 파일 시스템 관리자: 물리적 자원인 디스크를 추상자원인 파일로 제공
4. 네트워크 관리자: 물리적 자원인 네트워크 장치를 추상자원인 소켓으로 제공
5. 디바이스 드라이버 관리자: 각종 외부장치(프린터, GPU 등) 에 대한 접근을 제공
- 커널이 이런 자원들을 관리하는 이유는 사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 하기 위해서이다.
- 즉, 커널은 사용자가 하드웨어에 접근하고 통신하기 위한 중간 다리 역할을 수행한다라고 볼 수 있다.
CPU 모드
- CPU는 사용자 애플리케이션(User application)이 시스템을 손상시키는 것을 방지하기 위해 2가지 모드를 제공한다.
- CPU에 있는 Mode bit로 모드를 구분하여 0은 커널 모드(kernal mode), 1은 사용자 모드(user mode)로 나뉘어서 구동된다.
- 운영체제에서 프로그램이 구동되는데 있어서 파일을 읽어오거나, 파일을 쓰거나, 혹은 화면에 메세지를 출력하는 등 많은 부분이 커널 모드를 사용한다.
사용자 모드(User Mode)
- 사용자 모드에서 사용자 애플리케이션이 실행된다.
- 사용자가 접근할 수 있는 영역에 제한이 있기 때문에 해당 모드에서는 하드웨어(디스크, I/O 등)에 접근할 수없다.
- 접근을 위해서는 시스템 콜(System Call)을 사용해야 한다.
커널 모드(Kernal Mode)
- 운영 체제가 CPU를 사용하는 모드이다.
- 시스템 콜을 통해 커널모드로 전환이 되면 운영체제는 하드웨어를 제어하는 명령어(Privileged Instructions)를 실행한다.
- Privileged Instructions는 사용자 모드에서 실행되면 exception이 발생한다.
- 위 그림과 같이 사용자 process는 User Mode 에서 실행되다가 시스템 자원을 사용해야 할 때 시스템 콜을 호출해서 커널 모드로 전환되어 작업을 수행하고 완료 시 다시 사용자 모드(User Mode)로 전환 한다.
쉘(shell)
- 커널만으로는 운영체제가 완성되지 않는다. 우리가 커널에 명령을 내리기 위해서는 커널이 이해할 수 있는 언어로 전달해야 한다.
- 우리가 전달한 명령어(스크립트)를 커널에 전달하면서, 커널이 알아들을 수 있도록 해석해 주는 역할이 바로 쉘이다. (쉘을 명령어 해석기 라고도 부른다)
- ex) 윈도우의 cmd, linux/unix 의 bash
- 셸은 명령어 해석기(Parser)와 실행기(Executor)로 구성되어 사용자의 명령을 분석하고 실행한다. 셸은 텍스트 기반의 CLI(Command Line Interface)와 그래픽 기반의 GUI(Graphical User Interface) 종류가 있다.
- 사용자는 셸을 통해 운영체제와 상호작용하고 작업을 수행할 수 있으며, 셸을 통해 커널을 호출해 운영체제 기능과 서비스를 조작할 수 있다
시스템 콜(System Call) = 시스템 호출
- 시스템 호출(system call)은 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다.
- 사용자 프로그램이 디스크 파일을 접근하거나 화면에 결과를 출력하는 등의 작업이 필요한 경우, 즉 사용자 프로그램이 특권 명령의 수행을 필요로 하는 경우, 운영체제에게 특권 명령의 대행을 요청하는 것이 시스템 콜이다.
- OS는 다양한 서비스들을 수행하기 위해 하드웨어를 직접적으로 관리한다. 이와 반면 응용프로그램은 OS가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다. OS가 제공하는 이러한 인터페이스를 '시스템 콜' 이라고 한다.
- 보통 직접적으로 시스템 콜을 사용하기 보다는 API(라이브러리 함수)를 통해 사용하게 된다.
시스템 콜의 종류
시스템 콜은 크게 6가지로 분류할 수 있다.
1. 프로세스 제어 (Process Control)
- 끝내기(exit), 중지(abort)
- 적재(load), 실행(exectue)
- 프로세스 생성(create process) - fork
- 프로세스 속성 획득과 속성 설정
- 시간 대기(time waite)
- 사건 대기(wait event)
- 사건을 알림(signal event)
- 메모리 할당 및 해제
2. 파일 조작(File Manipulation)
- 파일 생성, 삭제(create, delete)
- 열기, 닫기, 읽기, 쓰기(open, close, read, write)
- 위치 변경(reposition)
- 파일 속성 획득 및 설정(get file attribute, set file attribute)
3. 장치 관리(Device Manipulation)
- 하드웨어의 제어와 상태 정보를 얻음(ioctl)
ioctl = Input/Output control
- 장치를 요구(request device), 장치를 방출(relase device)
- 읽기(read), 쓰기(write), 위치 변경
- 장치 속성 획득 및 설정
- 장치의 논리적 부착 및 분리
4. 정보 유지(Inforamtion Maintenance)
- getpid(), alarm(), sleep()
- 시간과 날짜의 설정과 획득 (time)
- 시스템 데이터의 설정과 획득 (date)
- 프로세스 파일, 장치 속성의 획득 및 설정
5. 통신(Communication)
- pipe(), shm_open(), mmap()
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
6. 보호(Protection)
- chmod()
- umask()
- chown()
참고 사이트:
https://post.naver.com/viewer/postView.naver?volumeNo=32073536&memberNo=4146898
https://seohee-ha.tistory.com/255
https://jerryjerryjerry.tistory.com/172
https://didu-story.tistory.com/311