[운영체제] 3주차 과제
3주차 과제
1. 학생은 지금 게임회사 넥슨에서 면접을 보고 있다. ‘커널이 무엇인가’라고 질문 받을 때, 학생의 답을 기술하라. 전공자로서 정확하고 충분히 답을 못하면 면접에서 떨어진다. 최소 5줄을 꽉 채울 수준으로 설명하라.
- 커널이란 부팅 후부터 메모리에 상주하면서 CPU, 캐시, 메모리 등 하드웨어를 관리하고 프로세스의 실행과 중단, 파일 시스템 관리 등 운영체제의 핵심적인 기능을 실행하는 코드와 이들을 관리하기 위해 프로세스 테이블, 페이지 테이블 등 여러 자료구조의 집합으로 사용자가 커널 코드와 데이터를 훔쳐보거나 훼손하는 것을 방지하기 위해 직접 접근할 수 없다. 운영체제의 핵심 기능은 거의 모두 커널 코드에 의해 실행되며 커널은 구체적으로 함수의 형태로 존재하며 프로세스가 아니다. 운영체제와 하드웨어와 운영체제와 응용 프로그램 사이의 중계 역할을 위해 System call (커널과 응용 프로그램), Interrupt (커널과 하드웨어) 두 가지의 인터페이스를 두고 있다. 응용 프로그램이 커널 함수를 활용할 수 있는 유일한 방법은 System call이라는 방법이다.
2. 사용자 공간과 커널 공간에 대해
2.1 사용자 공간과 커널 공간에는 각각 무엇이 적재되는가?
- 사용자 공간 - 응용 프로그램이 적재되고 응용 프로그램의 변수가 만들어지고 동적 할당 받는 공간으로 활용되는 공간이다.
- 커널 공간 - 커널 코드와 커널 데이터, 커널 함수들이 실행될 때 필요한 스택 공간, 디바이스 드라이버 등이 탑재되는 공간이다.
2.2 사용자 공간과 커널 공간을 두는 이유는 무엇인지 최소 3줄 정도로 기술하라.
- 사용자 응용 프로그램이 커널 코드와 데이터를 훔쳐보거나 훼손하는 것을 막아 응용 프로그램으로 부터 커널 코드와 데이터를 지키는 방법이다. 만약 커널이 개방되어 있다면 바이러스 침범, 시스템 훼손, 시스템 중단 등 심각한 문제가 발생할 수 있다.
3. 응용프로그램(프로세스)이 실행되는 동안 CPU는(프로세스는)은 사용자 모드와 커널 모드로 왔다 갔다 하면서 실행된다.
3.1 사용자 모드와 커널 모드를 간단히 설명하라.
- 사용자 모드 - 응용 프로그램을 실행할 때의 CPU 모드이며, 커널 공간 및 하드웨어에 직접적인 액세스가 불가능하고 특권 명령을 제외한 모든 CPU 명령 처리가 가능하다.
- 커널 모드 - 커널 코드를 실행하기 위한 CPU 모드이며, 커널 공간 및 모든 하드웨어에 대한 액세스가 가능하고 특권 명령을 포함한 모든 CPU 명령 처리가 가능하다.
3.2 사용자 모드와 커널 모드로 나눈 이유는?
- 사용자 모드에서는 하드웨어 및 커널 공간에 대한 접근을 막아 커널 코드와 데이터에 대한 보안과 보호를 위함
3.3 응용프로그램이 사용자 모드에 있는 경우는 어떤 경우이며, 커널 모드에 있는 경우는 어떤 경우인가?
- 사용자가 작성한 함수와 라이브러리 함수 모두 사용자 모드에서 실행되며, 시스템 호출 라이브러리에 작성된 시스템 호출 함수를 통해 커널 함수가 호출되어 커널 코드가 실행될 때 이는 커널 모드에서 실행된다.
3.4 어떤 경우에 CPU가 사용자 모드에서 커널 모드로 바뀌는가? 경우를 나열하고 설명하라
- 사용자 모드에서 커널 모드로 바뀌는 경우는 두 가지 경우가 있다.
- System call - 응용 프로그램에서 파일을 읽는 시스템 호출 라이브러리의 함수인 read() 등을 통해 시스템 호출이 일어나면 커널 코드를 실행하기 위해 CPU는 사용자 모드에서 커널 모드로 전환한다.
- Interrupt - 키보드 입력, 하드 디스크의 쓰기 종료 등의 경우에 인터럽트가 발생하며 이를 처리하기 위해 CPU는 사용자 모드에서 커널 모드로 전환한다.
4. 일반적으로 응용프로그램이라 함은 어떤 사용자가 작성한 프로그램이 컴파일 되어 최종적으로 만들어진 실행 파일을 일컫는다. 32비트 Windows 운영체제에서 사용자 영역의 크기를 2GB로 정하였을 때, 응용프로그램과 라이브러리에 관해 답하라.
4.1 응용프로그램의 크기란 어떤 크기를 말하는가? 다른 말로 무엇을 합친 크기인가?
- 사용자 공간의 크기이다. 이는 응용 프로그램의 코드, 응용 프로그램에서 선언한 전역 변수, 그리고 실행중에 동적으로 할당받는 메모리(힙), 실행 중에 사용하는 스택의 크기를 모두 합친 크기이다.
4.2 응용프로그램의 크기는 최대 얼마까지 가능한가? 답에 대한 이유도 함께 설명하라.
- 최대 2GB이다. 응용 프로그램의 크기는 사용자 영역의 크기라고도 한다. 이 외의 공간은 커널 공간으로 응용 프로그램 간 공유되어 사용되는 커널 공간이기에 응용 프로그램이 직접 사용 및 접근할 수 없다.
4.3 응용프로그램에서 printf()를 호출하는 코드가 있다. printf() 함수의 코드는 응용 프로그램의 크기에 포함되는가?
- 그렇다. printf()함수는 표준 라이브러리에 포함된 함수로써, 링킹 과정에서 사용자가 작성한 코드와 합쳐서 하나의 파일로 컴파일되어 저장된다.
4.4 응용프로그램에서 printf()를 호출한다고 하자. printf() 함수의 코드는 사용자 공간에 적재 되는가? 커널 공간에 적재되는가? 그 이유는 무엇인가?
- 사용자 공간에 적재된다. printf()함수는 커널 코드가 아닌 표준 라이브러리 함수로써, 링킹 과정에서 사용자가 작성한 코드와 하나의 파일로 합쳐져 컴파일을 거치고, 실행 시 그대로 사용자 공간에 적재된다.
5. 특권 명령에 대해
5.1 어떤 유형의 명령인지 한 줄로 말하라
- 타이머, 인터럽트 처리 등 커널 모드에서만 실행 가능한 특별한 목적으로 설계된 CPU 기계 명령이다
5.2 한 개의 명령을 사례로 들어 왜 특권 명령인지 말하라
I/O 명령 - 하드웨어 제어나 I/O 장치, 저장장치를 제어하고 읽기 쓰기에 사용되는 CPU 기계 명령
I/O장치는 CPU가 액세스 할 수 있는 여러 레지스터(I/O 포트)를 내장하는데 이를 통해 I/O 장치를 액세스 하는 명령은 in, out이 있다.
해당 명령은 하드웨어 장치를 직접 접근하며, 이는 응용 프로그램에서는 실행할 수 없고 커널에서 실행되어야 하기 때문에 특권 명령이다.
5.3 특권 명령이 커널 모드에서만 사용하도록 한 이유는 무엇인가?
- 하드웨어 조작, 인터럽트 처리 등 사용자 모드에서 응용 프로그램이 임의로 접근하면 시스템에 심각한 오류를 야기할 수 있기 때문에 임의 접근을 막아 이를 방지한다.
6. 시스템 호출에 관해
6.1 시스템 호출을 하기 위해 반드시 시스템 호출을 일으키는 기계 명령이 필요한가?
- 그렇다. 시스템 호출을 일으키는 기계 명령을 통해 시스템 호출이 진행된다.
6.2 운영체제의 기능(커널 기능)을 사용하기 위해 시스템 호출 외에 다른 방법이 있는가?
- 없다. 시스템 호출은 응용 프로그램에서 커널 기능을 활용할 수 있는 유일한 방법이다.
6.3 printf()가 실행되는 동안 시스템 호출이 발생하는가? 아닌가? 간단히 설명하라.
- 버퍼의 상황에 따라 다르다. 출력 버퍼가 차거나, ‘\n’을 만나면 write() 시스템 호출 함수를 호출하며 write()는 시스템 호출을 일으킨다. 다만 printf()가 시스템 호출을 직접 발생시키지는 않는다.
7. read() 함수를 통해 파일이 읽혀지는 과정을 시스템 호출을 포함하여 그림으로 그리고 간단히 설명하라.
8. 응용프로그램에서 시스템 호출을 많이 사용할수록 좋은가 나쁜가? 아니면 관계없는가? 이 답에 대한 이유를 표준 라이브러리 함수 fread()와 시스템 호출 함수 read()를 사용하는 사례를 들어 설명하라.
나쁘다. 먼저 text.txt 파일을 한 번에 100바이트 씩 총 1000바이트를 읽는 프로그램이며, 입력 버퍼는 비어있다고 가정한다.
표준 라이브러리인 fread()는 먼저 입력 버퍼의 상태를 보고 read() 함수를 호출하여 디스크 블록의 크기(4KB)만큼의 파일을 읽어오도록 지시한다.
read()는 시스템 호출을 통해 커널 함수를 호출하고 커널 함수는 파일에서 요청된 바이트만큼 파일에서 읽어 라이브러리의 입력 버퍼에 저장한다.
fread()로 돌아오면 fread()는 표준 라이브러리의 입력 버퍼에서 100바이트를 사용자 코드 buf[]배열로 복사하고 리턴하는데 버퍼에서 읽어오는 이 과정을 9번 더 반복하여 1000바이트를 가져온다.
만약 read()를 호출하여 파일을 읽어온다면 read()는 시스템 호출을 통해 커널 함수를 호출하여 커널함수는 요청받은 100바이트를 파일에서 읽어 사용자 코드의 buf[]에 저장한다.
두 경우에서 표준 라이브러리의 경우는 시스템 호출이 1번, 시스템 호출 함수에서는 시스템 호출이 10번 이루어졌다. 시스템 호출에는 긴 시간이 걸리기 때문에 시스템 호출이 많이 사용되는 경우 성능에 영향을 끼칠 수 있다.
9. 컴퓨터의 입출력 장치들은 입출력 완료가 끝났을 때 인터럽트를 통해 CPU에게 이를 알린다.
9.1 인터럽트 벡터 테이블이란 무엇인가? 이 테이블은 사용자 영역에 있는가? 커널 영역에 있는가? 그리고 그 곳에 있어야 하는 이유는 무엇인가?
- 인터럽트 벡터 테이블은 256개의 인터럽트에 대해 인터럽트 서비스 루틴(ISR)의 주소를 저장 하고 있는 테이블이다. 인터럽트 벡터 테이블은 커널 영역에 적재된다. 인터럽트 벡터 테이블은 인터럽트를 처리하는 ISR의 주소를 저장하고 있기 때문에 사용자 영역에 두어 사용자가 이를 보고 수정한다면 심각한 오류가 발생할 수 있기 때문에 커널 영역에 두어 응용 프로그램의 직접적인 접근을 막는다.
9.2 인터럽트가 처리되는 하드웨어 과정을 그리고 각 단계별로 설명하라.
10.(프로그래밍 문제) 복합문제 4번을 참고하되 자신의 영문 이름을 스크린에 출력하는 어셈블리 프로그램을 작성하라. 그리고 리눅스에서 편집하고 실행하라. 리눅스는 자신의 컴퓨터에 설치한 것이든, CoCalc 사이트에서 작업했던 상관없다. 작성한 프로그램 소스와 컴파일하고 실행하는 명령, 그리고 실행 결과를 모두 캡쳐하여 답으로 제출하라.
.global _start
.text
_start:
mov $1, %rax
mov $1, %rdi
mov $msg, %rsi
mov $12, %rdx
syscall
mov $60, %rax
xor %rdi, %rdi
syscall
msg:
.ascii "SANGJUN KIM\n"