운영체제(Operating System) - 컴퓨터 시스템과 운영체제

InAnarchy·2022년 4월 16일
2

Operating System

목록 보기
1/4

1. 컴퓨터 시스템과 하드웨어

컴퓨터 시스템의 계층 구조의 특징

  1. 사용자는 응용 프로그램이나 운영체제 패키지에 포함된 GUI와 도구 프로그램(툴/유틸리티 프로그램)을 통해 컴퓨터를 활용한다.
  2. 하드웨어들은 모두 운영체제의 배타적이고 독점적인 지배를 받는다.
  3. 사용자와 응용프로그램은 직접 하드웨어에 접근할 수 없고, 반드시 운영체제를 통해서만 접근할 수 있다.

컴퓨터의 구조

CPU(Central Processing Unit): 기계명령을 실행하는 중앙처리장치로 컴퓨터의 가장 핵심적인 장치. 전원이 공급될 때 작동 시작, 메모리에 적재된 프로그램 실행

메모리: CPU에 의해 실행되는 코드와 데이터가 적재되는 공간

캐시 메모리: CPU의 프로그램 실행 속도를 높이기 위해 사용됨. 시스템 버스에 연결되는 초기의 방식은 off-chip cache, 이후 CPU의 내부에 두는 on-chip cache로 발전

버스: 컴퓨터 하드웨어들이 서로 데이터를 주고받기 위해 0과 1의 디지털 신호가 지나가는 선의 다발. 지나다니는 정보에 따라 주소, 데이터, 제어버스로 분류

  • 시스템 버스: CPU,메모리,캐시메모리 등 빠르게 작동하는 하드웨어 사이 신호를 전송하기 위한 버스
  • 입출력(I/O)버스: 상대적으로 느린 입출력 장치들로부터 입출력 데이터를 전송하기 위한 버스

입출력 제어 장치 및 시스템 제어 회로(I/O Controller & control circuits): CPU 개입 없이 입출력 장치-메모리 사이 데이터를 전송하는 DMAC(Direct Memory Access Controller)나 입출력을 완료하였을 때 발생시키는 인터럽트 신호를 받아 CPU에 전달하는 인터럽트 제어장치(INTC, Interrupt Controller) 포함

CPU와 메모리 관계

32비트 CPU: 32개의 주소선을 가진 CPU,
2^32개의 서로 다른 주소를 가짐-> 2^32바이트 = 최대 4GB 액세스

CPU의 레지스터

PC(Program Counter): 다음에 실행할 기계명령의 메모리 주소를 저장하는 레지스터로 IP(Instruction Pointer) 레지스터로도 불림
IR(Instruction Register): 실행하기 위해 메모리에서 읽어온 명령이 저장된 레지스터
SP(Stack Pointer): 스택 영역의 꼭대기 메모리 주소를 저장하는 레지스터
데이터 레지스터: 연산에 사용될 데이터를 저장하는 레지스터
상태 레지스터: CPU의 상태정보나 인터럽트 금지 등 제어 정보를 가지는 레지스터

CPU의 명령 싸이클

스택(STACK)

프로그램의 지역변수,매개변수 값들,함수를 마치고 돌아갈 주소 등을 할당하도록 할당된 메모리 영역으로, 각 프로그램에는 자기만의 스택공간이 할당됨
CPU의 SP(Stack Pointer) 레지스터는 현재 실행 중인 프로그램의 스택 영역 꼭대기 주소를 가리킴

컨텍스트(Context)

메모리와 CPU 레지스터에 담겨있는 어떤 프로그램이 실행 중인 일체의 상황

메모리에 담긴 것: 프로그램의 코드, 전역변수 데이터, 힙(동적 할당 받아 저장한 데이터), 호출된 함수들의 매개변수와 지역변수 등이 저장된 스택
PC레지스터에 담긴 것: 현재 실행 중인 코드의 메모리 주소
데이터 레지스터에 담긴 것: 이전에 실행된 결과 값이나 현재 실행에 사용될 데이터 값
상태 레지스터에 담긴 것: CPU의 상태 정보
SP 레지스터에 담긴 것: 스택의 톱 주소

현재 실행 중인 프로그램을 일시중단하고 다른 프로그램을 실행시킬 때, 현재 실행중인 프로그램의 컨텍스트를 복사해야한다. 이 때 메모리는 그대로 있기 때문에 메모리 내용은 복사할 필요가 없고, CPU의 레지스터들만 복사해두면 된다.
이렇게 현재 실행 중인 프로그램의 컨텍스트를 저장해두고, 다른 프로그램의 컨텍스트를 CPU로 옮기는 것을 컨텍스트 스위칭이라고 한다.

운영체제는 프로그램A를 구성하는 현재 CPU레지스터들의 값을 메모리의 특정 영역에 저장한다. 컨텍스트 정보들은 운영체제만 접근할 수 있는 메모리 영역에 저장되는데 구체적으로 프로세스 제어 블록이라고 불린다. 그리고나서 프로그램B의 저장된 컨텍스트 정보를 CPU레지스터에 적재한다.

이 때부터 CPU의 PC레지스터는 프로그램B가 실행을 재개할 코드의 주소를 가리키게 되고 SP레지스터 역시 프로그램B의 스택 영역을 가리키게 된다. 이 스택에는 프로그램B가 중단될 때 실행하던 함수의 매개변수나 지역변수 등이 그대로 들어있다. CPU가 실행을 시작하면 중단되기 전과 동일한 상태에서 프로그램B가 실행된다.

멀티코어 CPU

코어: 레지스터들과 제어장치, ALU, 외부버스와 연결되는 인터페이스 장치를 독립적으로 갖추고 하나의 프로그램을 실행할 수 있는 완벽한 프로세서
멀티코어: 여러 개의 코어를 가지고 동시에 여러개의 프로그램을 실행할 수 있는 CPU

컴퓨터 시스템의 계층 구조


사용자가 컴퓨터 하드웨어에 대한 지식 없이 컴퓨터를 사용할 수 있다(->계층 간의 독립성)

운영체제와 운영프로그램 사이의 관계

운영체제는 응용프로그램 사이에 하드웨어 사용 충돌을 막기 위해 독점적으로 컴퓨터 하드웨어를 조작하고, 응용프로그램이 직접 하드웨어를 다루지 못하도록 차단한다. 응용프로그램은 시스템 호출함수를 이용하여 운영체제에게 서비스를 요청한다.
또 하드웨어로부터 물리적인 신호(인터럽트)가 발생하든지 데이터가 도착하면, 응용프로그램에게 알리고 데이터를 전달한다.

운영체제와 사용자의 관계

운영체제는

사용자가 새로운 하드웨어를 설치하거나 변경하는 것을 돕는다.
사용자에게 컴퓨터 시스템을 사용할 편리한 사용자 인터페이스를 제공한다.
컴퓨터의 사용을 돕는 여러 도구 응용프로그램을 제공한다(작업관리자, 쉘 등)
사용자의 계정을 관리한다.

운영체제와 하드웨어의 관계

디스플레이에 hello를 출력할 하는 경우,
printf()함수가 직접 출력하는 것이 아니라
printf()에서 시스템 호출을 통해 운영체제에게 디스플레이에 출력해줄 것을 요청한 것이고, 운영체제가 그래픽 제어장치를 통제하여 디스플레이에 출력한 것이다.

운영체제의 전체 기능

프로세스와 스레드 관리(process and thread management)
디스크에 저장된 프로그램이 메모리에 적재되어 실행될 때 프로세스라 부르고, 프로세스는 하나 이상의 스레드로 구성된다. 운영체제에 의해 스케줄되고 다루어지는 실행단위는 스레드이다.

메모리 관리
프로세스/스레드를 실행시키기 위한 메모리 할당, 반환, 메모리 보호 등의 기능이다. 메모리가 부족할 때 하드디스크 영역까지 확장하는 가상 메모리 기술도 포함한다.

파일 관리
파일 생성, 저장, 읽기, 복사..

장치 관리
입출력 장치나 저장 장치를 제어하여 사용자나 응용 프로그램의 요청에 따라 입출력을 수행하는 기능

사용자 인터페이스

네트워킹

보호 및 보안

운영체제와 커널

운영체제는 도구/GUI 소프트웨어, 커널, 디바이스 드라이버들로 구성되는 소프트웨어

도구/GUI 소프트웨어

도구 소프트웨어는 사용자가 컴퓨터를 편리하게 사용할 수 있또록 운영체제 패키지에 포함되어 제공되는 프로그램으로 작업관리자, 제어판, 장치관리자, 쉘 등이 있다. 윈도우의 바탕화면은 GUI소프트웨어에 해당한다.

커널

커널은 부팅 후 부터 메모리에 상주하면서 CPU,캐시,메모리 등 하드웨어를 관리하고 프로세스 실행과 중단, 파일시스템 관리 등 운영체제의 핵심적인 기능을 실행하는 코드와
이를 관리하기 위해 필요한 프로세스 테이블, 페이지 테이블 등 여러 자료구조의 집합이다.
운영체제의 핵심 기능(프로세스와 스레드 관리, 메모리 관리, 파일 및 파일 시스템 관리, 장치 입출력 등)은 거의 모두 커널 코드에 의해 실행되고, 사용자가 직접 접할 수는 없다.

커널코드는 함수의 형태로 존재한다. 응용프로그램은 함수 호출이라는 방식을 통해 응용 프로그램 내에 작성한 함수나 라이브러리를 포함된 함수를 호출한다. 그러나 함수 호출의 방법으로 커널에 있는 함수를 호출할 수는 없고, 시스템 호출이라는 방법을 통해 커널의 함수를 호출한다.

디바이스 드라이버

디바이스 드라이버는 입출력 장치를 구동하고 제어하여 실질적인 입출력을 수행하는 소프트웨어이다.

운영체제 커널 인터페이스: 시스템 호출과 인터럽트

시스템 호출: 응용프로그램에서 커널 코드(커널에 작성된 함수)를 실행하는 기법
운영체제는 시스템 호출 라이브러리를 제공하여 응용프로그램이 시스템 호출 함수(fork, exit, open, write 등)를 호출할 수 있도록 한다.

인터럽트: 하드웨어 장치들이 CPU에게 하드웨어 신호(인터럽트 신호)를 물리적으로 발생시켜, 입출력 완료나 타이머 완료 등을 CPU에 알리는 방법이다. CPU가 인터럽트 신호를 받게되면 하던 일을 멈추고 인터럽트의 요청을 처리하는 코드를 실행한다. 이 코드를 인터럽트 서비스 루틴(ISR)이라 부르고 커널 코드나 디바이스 드라이버 내에 작성된다. 운영체제는 인터럽트라는 방법을 통해 운영체제가 입출력 장치에게 지시한 입출력 작업의 완료나 예고없는 네트워크 데이터의 도착, 키보드나 마우스 입력, 배터리 경고 등 장치와 관련된 모든 이벤트를 처리한다.

커널과 시스템 호출

운영체제는 CPU로 액세스 할 수 있는 전체 주소 공간을 사용자 공간(user space)와 커널 공간(kernal space)으로 나누고, 응용 프로그램이 커널 공간을 함부로 접근할 수 없도록 시스템의 실행 모드를 사용자 모드와 커널 모드로 나누며, 응용프로그램은 사용자 모드에서 실행되고 커널 모드는 커널모드에서만 실행되도록 하였다.

사용자 공간과 커널 공간

사용자 공간: 응용 프로그램이 적재되고 응용 프로그램의 변수가 만들어지고 동적 할당 받는 공간으로 활용하는 공간
커널 공간: 커널 코드와 커널 데이터, 커널 함수들이 실행될 때 필요한 스택 공간, 디바이스 드라이버 등이 탑재되는 공간

사용자 공간 크기의 의미

32비트 윈도우 운영체제에서 사용자 공간의 크기가 2GB로 설정된다함은 응용프로그램의 크기가 최대2GB로 제한된다는 의미다. 응용프로그램의 크기란 응용프로그램의 코드, 전역변수, 동적 할당받는 메모리(힙), 실행 중 사용하는 스택의 크기를 모두 합친 크기이다.

사용자 공간과 커널 공간은 가상 주소 공간이다.


응용프로그램이 사용하는 번지는 가상주소이다.
Q1. 만약 각 응용프로그램이 0번지에서 시작한다면 응용프로그램의 주소 공간이 충돌하지 않을까?
Q2. 메모리의 크기가 4GB보다 작은 경우 어떻게 될까?


A1. 운영체제는 각 응용프로그램의 가상 주소 공간을 물리 메모리 공간으로 매핑시켜 가상 주소 공간의 충돌을 해결한다. 각 응용프로그램마다 커널 공간에 매핑 테이블을 두고 사용자 공간을 물리 메모리의 공간으로 매핑한다.
A2. 물리 메모리가 부족하게 되면 운영체제는 그 일부를 하드디스크에 저장하여 물리 메모리의 빈 영역을 확보한다(가상 메모리)

CPU의 사용자 모드와 커널 모드

사용자 모드

사용자 모드에서 응용프로그램은 하드디스크, 입출력 장치 등 어떤 하드웨어에도 접근할 수 없고 다른 응용프로그램에게 할당된 메모리도 접근할 수 없다. CPU는 사용자 모드에서 특권명령을 실행할 수 없다.

커널 모드

커널모드에서 CPU는 모든 메모리 공간을 액세스할 수 있고 특권 명령을 실행할 수 있고 어떤 하드웨어든지 접근하고 제어할 수 있다. 그래서 커널모드는 특권모드, 감독자 모드라고도 불린다.

사용자모드에서 커널모드로 전환

사용자 모드에서 커널모드로 전환이 일어나는 경우는 두가지다.
1. 시스템 호출: 시스템 호출을 일으키는 기계명령이 실행되면 CPU는 사용자 모드에서 커널 모드로 전환된다. 시스템 호출이 끝나고 사용자 프로그램으로 돌아갈 때 시스템 호출을 종료하는 기계명령에 의해 사용자 모드로 바뀐다.
2. 인터럽트: 입출력장치나 저장장치가 CPU에게 인터럽트를 거는 경우 CPU는 자동으로 커널모드로 전환되고, CPU는 인터러트 서비스 루틴으로 점프하여 실행한다. 예를 들어, 응용프로그램이 실행되는 도중 사용자가 키를 입력하면 CPU에 인터럽트 신호가 전달되고 CPU는 자동으로 커널모드로 바뀌고 키보드 인터럽트 서비스 루틴을 실행한다. 커널모드로 바뀌는 이유는 인터럽트 서비스 루틴이 커널공간에 있기 때문이다.

특권 명령

CPU제조업체에 의해 특별히 설계된 CPU명령이다.

I/O 명령: 컴퓨터 본체 하드웨어, 입출력 장치, 저장장치를 제어하고 읽기쓰기에 사용되는 CPU 기계 명령. 입출력 장치는 CPU가 액세스할 수 있는 여러개의 레지스터를 내장하고 있는데 이를 I/O 포트라고 부르고, 각 포트마다 I/O 주소가 할당됨.

Halt 명령: 커널은 처리할 작업이 없을 때 Halt 명령을 실행하여 CPU작동을 중지시키고 유휴 상태로 만들어 전력소모를 줄인다.

인터럽트 플래그 켜고 끄기: 인터럽트가 발생할 때 처리할지 무시할지를 나타내는 비트를 인터럽트 플래그라고 부른다.(인텔의 경우 cli, sti) cli 명령을 실행하면 CPU는 인터럽트 플래그를 끄고, sti 명령이 실행될 때 까지 프로그램 실행 도중에 발생하는 어떤 인터럽트도 처리하지 않는다.

타이머 설정

컨텍스트 스위칭

사용자 모드/커널 모드와 관련한 몇가지 이슈

Q1. 사용자 모드와 커널 모드는 CPU에 의해 구현되는가 커널모드에 의해 구현되는가?
A1. CPU에 의해 구현되어 운영체제가 활용하는 기능이다.

Q2. 운영체제가 사용자/커널 모드를 나누어 작동시키는 이유는?
A2. 커널코드와 데이터에 대한 보안과 보호를 위해서이다.

Q3. 응용 프로그램이 커널 기능을 어떻게 활용할 수 있는가?
A3.시스템 호출을 통해서 커널 코드를 호출한다.

Q4. CPU가 커널 모드에서 실행되는 시간과 사용자 모드에서 실행되는 시간을 알 수 있는가?
A4. 윈도우의 경우 작업관리자를 사용하면 각 모드로 작동한 시간을 비교하여 보여준다.
보통 응용프로그램이 실행되는 경우라면 커널모드보다 사용자 모드의 시간 비율이 높아야한다.
커널 모드의 시간 비율이 높은 경우는 커널모드에서 실행되는 시스템 유휴 프로세스 때문일 수 있다. 시스템 유휴 프로세스는 부팅 시부터 생성되어 커널 모드에서 실행되는 특별한 프로세스이다.

커널의 실체

커널은 부팅 시 커널 공간에 적대되는 함수들과 데이터들의 집합으로, 컴파일된 바이너리 형태로 운영체제가 설치되는 하드디스크의 특정 영역에 있다가 부팅 시에 메모리에 적재되며 커널 모드에서 실행될 함수들과 시스템을 관리하기 위한 여러 종류의 테이블과 구조체 등으로 구성된다.

커널공간은 수백개의 함수들과 이들이 생성하고 사용하는 많은 자료구조들, 여러 디바이스 드라이버들로 이루어져있다. 1개의 CPU가 있는 시스템에서 4개의 응용프로그램이 메모리에 적재되어 실행 중이며, CPU는 app2를 실행 중이다.
app2가 시스템 호출을 통해 커널에 작성된 함수를 호출하고 이 함수는 다시 디스크 장치 드라이버를 호출하여, 디스크 장치 드라이버가 디스크 장치를 제어하는 모습을 보여준다. 프로그램 실행은 app2에서 시작되어 커널코드-디바이스 드라이버 코드까지 이어진다.

Q1. CPU가 app2를 실행하던 중 시스템 호출을 통해 커널 모드로 바뀌어 커널 모드를 실행하고 있을 때 app2가 실행중인가, 커널 프로세스가 실행중인가?
A1. app2프로세스이다. 커널모드에서 실행되는 프로세스는 있을 수 있지만 커널 프로세스라는 말은 없다.

Q2. 커널은 프로세스인가?
A2. 커널은 시스템 관리 기능을 하도록 만들어진 함수와 데이터의 집합이며, 스스로 실행되는 프로세스는 아니다.

Q3.커널은 실행중이다?
A3. 커널이 실행중이다 라는 말은 틀렸다. 시스템 호출이나 인터럽트가 발생하여 커널 코드가 실행되고 있을 뿐이다.

Q4. 커널은 스택이나 힙을 가지는가?
A4. 아니다. 스택이나 힙은 프로세스 실행 중 데이터를 저장하는 공간이며 프로세스마다 별도로 주어지는데, 커널은 프로세스가 아니기 때문에 성립되지 않는다. 그러나 프로세스가 생성될 때 프로세스가 커널모드에서 사용할 스택이 커널 내에 할당된다.
프로세스가 시스템 호출을 통해 커널에 진입하면 자신에게 할당된 커널 스택을 활용하여 커널에 있는 함수를 호출할 때 매개변수나 지역변수를 저장한다.

응용프로그램 빌딩

시스템 호출 라이브러리에 들어있는 함수들을 시스템 호출 함수나 커널 API라고 부른다.
응용프로그램은 사용자가 작성한 함수들과 이들에 의해 호출되는 라이브러리 함수들이 링크 과정을 거쳐 하나의 실행 파일 내에 결합되어 저장된다. 응용프로그램이 실행될 때 실행파일이 사용자 공간에 적재된다.

라이브러리 기능 활용 - 함수 호출
커널 기능 활용 - 시스템 호출

함수 호출로 라이브러리 활용

사용자 공간에 적재된 사용자 함수들은 함수호출을 통해 라이브러리 함수들을 활용한다. 함수 호출의 과정은 같은 주소 공간 내에서 한 함수가 다른 함수의 코드를 실행하는 과정으로, 돌아올 주소와 함수에게 전달할 매개변수 값들을 사용자 스택에 저장한 후 함수의 번지로 점프하고 함수 코드를 실행한 후 함수를 호출한 곳으로 돌아온다. 함수 호출 과정에서는 커널 모드로 바뀌는 일 없이 사용자모드에서 실행된다.

시스템 호출로 커널코드 호출

시스템 호출 라이브러리에 있는 시스템 호출 함수는 고유번호(시스템 호출 번호)로 커널 함수를 구분한다. 시스템 호출은 CPU를 커널모드로 바꾸고 커널 공간 내에 미리 정해진 주소에 있는 시스템 호출 핸들러 코드를 실행하는 과정이다. 시스템 호출 함수들은 시스템 호출을 일으키는 특별한 기계명령을 실행시키고 레지스터를 통해 커널 함수의 고유ID를 전달한다. 시스템 호출 핸들러가 실행되면 시스템 호출 번호를 분석하여 해당 커널 함수를 실행시킨다.

응용프로그램이 라이브러리와 커널 코드를 활용하는 과정

main()함수가 표준 라이브러리의 printf()함수를 호출하고 printf()함수는 상황에 따라 write()를 호출할 수도 있고 안할 수도 있다. printf()함수 write()를 호출하지않고 리턴하면 main()은 다시 f()를 호출하고, f()는 표준라이브러리의 abs()코드를 호출한다. 다시 돌아오면 f()는 g()함수를 호출하고 g()함수는 u()함수를 호출한다. u()함수는 파일을 열기 위해 시스템 호출함수 open()을 호출한다.
open()은 표준라이브러리의 함수들과 달리 시스템 호출을 유발시킨다. 그 결과 CPU가 커널모드로 바뀌고 파일을 여는 커널함수의 시스템 호출번호가 시스템호출 핸들러에게 전달된다. CPU는 시스템 호출 핸들러를 통해 파일을 여는 커널함수를 실행하게 되며 이 함수가 커널 내 다른 함수를 호출하는 등 파일 열기를 마치고 리턴할 때 사용자 모드로 바뀌어 open()함수로 돌아온다.

시스템 호출

공간의 코드에서 커널 공간의 코드를 호출하는 과정으로 커널콜 이라고도 부른다. 운영체제는 사용자가 응용프로그램 내에서 직접 커널 함수를 호출하는 시스템 호출 코드를 작성하는 수고를 들어주기 위해 시스템 호출 라이브러리를 제공한다. 시스템 호출 라이브러리에 포함된 함수들을 시스템 호출 함수 혹은 커널 API라고 부른다.

유닉스/리눅스 - open(), read(), write(), fork(), exit()
윈도우 - CreateProcess(), WaitForSingleObject()

시스템 호출을 일으키는 기계 명령

CPU마다 시스템 호출을 일으키는 기계명령을 두고 있다.

int 0x80/iret - 인텔 x86계열
syscall/sysret - AMD
sysenter/sysexit 

syscall은 시스템 호출을 일으키는 CPU, sysret은 시스템 호출을 끝내고 사용자 코드로 돌아가도록 하는 명령이다.(systenter/sysexit도 동일)
시스템 호출을 트랩이라고도 부르고, 시스템 호출이 진행되는 과정을 트랩을 실행한다고도 한다.

시스템 호출 과정 사례


1. read()함수를 호출한다.
2. 커널 내에는 시스템 호출 표가 있고, 이 표에 시스템 호출 번호를 인덱스로 하여 커널함수의 주소가 저장되어있다. 시스템 호출 함수는 시스템 호출을 일으킬 때 CPU의 특정 레지스터에 시스템 호출 번호를 넘겨준다.
3. syscall, systenter, int 0x80 등 시스템 호출 CPU 명령을 실행한다.
4. CPU는 사용자 모드에서 커널 모드로 바꾸고, 미리 약속된 커널 내의 시스템 호출 핸들러 함수로 점프한다.
5. system_call_handler()는 현재 응용프로그램이 생성될 때 미리 할당된 커널 스택에 현재 CPU의 모든 레지스터값을 저장한다. 응용프로그램은 사용자 스택과 커널 스택을 소유하게 된다.
6. system_call_handler()는 CPU의 특정 레지스터에 저장된 시스템 호출 번호를 알아내고 시스템 호출 표에서 sys_read()함수의 주소를 알아내어 sys_read()를 호출한다.
7. sys_read()커널함수는 디스크로부터 파일 데이터를 읽는다.
8. system_call_handler()는 작업을 끝낸 후 응용프로그램으로 돌아가기 전에 커널 스택에 저장해둔 레지스터 값들을 CPU레지스터에 복귀시킨다.
9. system_call_handler()함수에서 sysret 기계명령을 실행하고 CPU는 커널모드에서 사용자 모드로 바꾸고 read()함수로 돌아간다.
10. read()함수는 자신을 호출한 응용 프로그램으로 리턴한다.

시스템 호출의 종류


시스템 호출에 따른 비용

파일을 읽는 방법은 foppen(),fread()같은 표준 라이브러리를 사용하는 방법과 open(), read()같은 시스템호출 함수를 사용하는 방법이 있다.
fread()의 시스템 호출은 처음 1번만 일어나지만 read()는 매번 시스템 호출이 일어난다.

운영체제와 인터럽트

인터럽트는 장치들이 비동기적인 어떤 상황이 발생하였음을 CPU에게 알리는 하드웨어적 방법이다.키보드 키가 눌러지면 인터럽트 신호가 CPU에게 전달되고, CPU는 현재 프로그램의 실행을 멈추고 키보드에서 눌러진 키 값을 일어 커널에 있는 입력 버퍼에 저장한다. 그리고 나서 중단한 프로그램을 계속 실행한다.

인터럽트 발생 및 처리 과정

CPU에는 일반적으로 인터러브 수신 핀이 1개뿐이기 때문에 여러 입출력 장치로부터 인터럽트를 받기 위해, CPU와 입출력 장치 사이에 APIC(Advanced Programmable Interrupt Controller)라는 하드웨어가 사용되며 인터럽트 제어기라고 한다. APIC는 입출력장치로부터 직접 인터럽트 신호를 받는 I/O APIC 장치와 I/O APIC로부터 인터럽트 정보를 받아 CPU의 INTR핀에 직접 인터럽트 신호를 발생시키는 Local APIC 장치로 분리 구성된다.
현대의 I/O APIC는 24개의 인터럽트 수신 핀을 두고 있어 24개의 장치로부터 인터럽트 신호를 받을 수 있다. 여러 CPU가 있는 병렬 시스템에서 각 CPU마다 혹은 멀티코어 CPU에서 각 코어에 Local APIC장치가 하나씩 연결되며, I/O APIC는 대체로 컴퓨터당 1개만 사용된다.

인터럽트 벡터 테이블

x86 인텔 CPU는 256개의 인터럽트를 제공하고, 각 인터럽트 번호를 인터럽트 벡터라고 한다. 인터럽트 벡터 테이블은 커널 영역에 저장되고 커널 코드에 의해서만 수정되는, 256개의 인터럽트에 대해 인터럽트 서비스 루틴의 주소를 저장하는 테이블이다.

어떤 CPU코어가 인터럽트를 처리할까?

I/O APIC는 인터럽트 신호가 수신되면 모든 Local APIC에게 균등하게 인터럽트를 분배하여 전달하지만, 운영체제가 특정 인터럽트를 특정 Local APIC에게만 보내 특정 CPU 코어에서 인터럽트 서비스 루틴을 실행하도록 제어하기도 한다.(인터럽트 친화성)
어떤 시스템의 경우 모든 인터럽트를 한 코어가 처리하도록 전담시키기도 한다.

인터럽트 서비스 루틴과 운영체제

인터럽트 서비스 루틴은 인터럽트 핸들러라고 부르기도 하는데 디바이스 드라이버나 커널 코드에 들어있다. 디바이스 드라이버는 장치마다 하나씩 필요하며 커널코드가 장치와 무관하게 작성되고 운용될 수 있도록 해주는 중요한 역할을 한다.

인터럽트는 다중 프로그래밍의 키

다중 프로그래밍의 핵심은 프로세스가 입출력으로 인해 대기하게 되었을 때, 입출력이 완료될 때 까지 프로세스를 중단 상태로 만들고 CPU가 다른 프로세스를 실행하게 하여 CPU 활용률을 높이는 것이다. 이 때 인터럽트의 역할은 입출력 장치가 처리를 완료하는 시점을 통보하는 것이다.
인터럽트가 없다면 입출력이 완료되었는지를 계속 검사하면서 기다려야하는데(폴링), CPU에 의해 처리되기 때문에 CPU는 다른 작업을 할 수 없어 다중프로그래밍이 실행되기 어렵다.

profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글