컴퓨터 시스템은 다음 3개의 요소들이 층을 이루는 구조로 구성되어 있다.
- 응용소프트웨어 층
- 운영체제 층
- 컴퓨터 하드웨어 층
컴퓨터 시스템의 계층구조는 다음과 같은 중요한 특징을 보여준다
- 사용자는 응용프로그램이나 운영체제 패키지에 포함된 GUI와 도구 프로그램(툴/유틸리티 프로그램)을 통해 컴퓨터를 활용한다.
- 하드웨어들은 모두 운영체제의 배타적이고 독점적인 지배를 받는다.
- 어떤 사용자나 응용프로그램이라도 직접 하드웨에 접근하는 것은 허용되지 않으며, 반드시 운영체제를 통해서만 접근하도록 한다.
운영체제는 응용프로그램과 하드웨어 사이의 중계 역할을 수행한다.

CPU(Central Processing Unit)
프로그램 코드 즉 기계 명령(machine instruction)을 실행하는 중앙처리장치로 컴퓨터의 가장 핵심적인 장치이다.
전원이 공급될 때 작동을 시작하여 메모리에 적재된 프로그램을 실행한다.
메모리(Memory)
CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간으로 반도체 메모리 RAM이 사용된다. 프로그램은 실행되기 위해 반드시 메모리에 적재되어야 한다.
캐시 메모리(Cache Memory)
CPU 기술의 발전이 메모리의 발전 속도보다 빨라 느린 메모리 때문에 CPU가 대기하는 시간을 줄일 필요가 있었다. 그래서 CPU의 프로그램 실행 속도를 높이기 위해 CPU와 메모리 사이에 빠른 캐시 메모리를 소량 사용하게 되었다.
옵칩 캐시(off-chip-cache)
캐시 메모리가 시스템 버스에 연결되는 방식. 초기에 사용됨
온칩 캐시(on-chip-cache)
CPU의 빠른 실행을 위해 캐시 메모리를 CPU 내부에 두는 방식.
현대에 사용되는 방식
캐시 메모리를 가진 컴퓨터에서 CPU는 캐시 메모리로부터만 명령과 데이터를 읽어 실행하기 때문에 실행될 프로그램 코드나 데이터는 메모리에서 캐시 메모리로 복사된다.
Question: 캐시 메모리 대신 시스템 버스의 속도를 높이면?
Answer:
메모리 벽(Memory Wall) 문제
시스템 버스의 속도를 높이는 것은 물리적/경제적 한계 때문에 불가능
- 물리적 거리와 신호 감쇄
신호 왜곡: 전자기 신호가 긴 선을 타고 흐르면 주변 노이즈의 영향을 받고 신호가 약해짐. 속도를 무한정 높이면 데이터가 깨지는 전자기적 간섭이 발생함
빛의 속도: 아주 미세한 차이지만, 전기 신호가 메인보드 위를 이동하는 시간조차 CPU에게는 한참 기다려야 하는 시간임지역성의 원리(Principle of Locality)
버스를 무한정 빠르게 할 수 없으므로, 데이터의 시간적/공간적 지역성을 활용해 CPU 근처에 데이터를 미리 가져다 놓는 캐시 계층 구조가 효율적이다.
Question: 비싼 온칩 캐쉬 대신 옵칩 캐쉬와 빠른 속도의 버스를 사용하는 것이 경제적으로 더 효율적일 수 있지 않을까?
Answer:
- 전력과 전압 소모 문제
칩 외부로 신호를 보내려면 높은 전압이 필요함. 따라서 CPU와 메인보드가 소모하는 전력이 기하급수적으로 높아짐- 버스가 아무리 빨라도 문을 열고 나가는 행위 자체가 엄청난 지연을 만듦
온칩 캐쉬
CPU 코어 바로 옆에 붙어 있어서 1~10사이클 내에 끝남
오프칩 캐쉬
버스가 아무리 빨라도 CPU 패키지를 통과해 외부 핀으로 나가고,
메인보드 선로를 타고 캐시 칩에 도달해 다시 도달하는 과정이
수십~백 단위 이상의 사이클이 낭비됨
Question: 메모리를 CPU 내부에 배치하면?
Answer:
- 면적의 한계
16GB~32GB의 메모리를 CPU에 담기에는 물리적인 크기가 문제가 됨- 대안
CPU 바로 옆에 메모리를 배치하는 방식이 존재함
애플의 M1, M2칩이 그 예
장치들(Devices)
컴퓨터의 키보드, 프린트, 스캐너, 마우스, 디스플레이, 네트워크 장치와 같은 입출력 장치와 디스크, SSD, USB 등의 저장 장치
버스(BUS)
CPU, 캐시 메모리, 메모리, 입출력 제어장치 및 시스템 제어 회로 등 하드웨어들이 서로 데이터를 주고받기 위해 0과 1의 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어.버스는 지나다니는 정보에 따라 다음의 3가지 종류로 나뉘며, 컴퓨터에서의 버스는 이 3가지 버스를 모두 지칭한다.
- 주소 버스(address bus): 주소 신호가 지나다니는 버스
- 데이터 버스(data bus): 데이터 신호가 지나다니는 버스
- 제어 버스(control bus): 제어 신호가 지나다니는 버스
시스템 버스(System bus)와 입출력 버스(I/O bus)
버스는 목적에 따라 시스템 버스와 입출력 버스로 나뉨
- 시스템 버스(System bus)
CPU, 캐시 메모리, 메모리 등
빠르게 작동하는 하드웨어들 사이에 신호를 전송하기 위한 버스- 입출력 버스(I/O bus)
상대적으로 느린 입출력 장치들로부터 입출력 데이터를 전송하기 위한 버스
시스템 버스와 입출력 버스 모두 각각 주소/데이터/제어 버스로 구성됨
입출력 제어 장치 및 시스템 제어 회로(I/O Controll & control circuits)
입출력 장치들을 제어하기 위한 여러 하드웨어 회로들을 포함한다.
입출력 장치에게 명령을 내리고 메모리와 입출력 장치 사이에 혹은
CPU와 입출력 장치 사이에 데이터가 전달되도록 중계하는 역할을 한다.DMAC(Direct Memory Access Controller)
입출력 장치와 메모리 사이의 데이터 전송에 있어 CPU의 개입 없이 전송
I/O 장치 ↔ 메모리
인터럽트 제어장치(INTC, Interrupt Controller)
장치들이 입출력을 완료하였을 때 발생시키는 인터럽트 신호를 받아 CPU에게 전달함
I/O 장치 ↔ CPU
현대 PC의 구조
현대 PC의 구조에서 큰 축을 형성하는 것이 NorthBridge와 SouthBridge로 각각 단일 칩으로 만들어진다.
NorthBridge
메모리 액세스 량이 많고 메모리와 빠르게 정보를 주고받아야하는 하드웨어들을 연결하는 허브 역할을 한다.
메모리와의 교통량이 많은 하드웨어는 CPU 다음으로 그래픽 제어 장치(그래픽카드)또한 이곳에 연결된다.
메모리 제어 허브(Memory Controller Hub)라고도 부른다.SouthBridge
입출력 장치들을 제어하는 모든 회로를 가지고 있는 통합 칩.
ATA 버스, PCI 버스 등 여러 종류, 여러 개의 입출력 버스를 통제하여 입출력 버스에 연결된 마우스, 키보드 등과 같은 다양한 입출력 장치와 하드디스크, USB 메모리 등의 저장 장치들을 제어하고 관리한다.
인터럽트 제어 장치(INTC), DMA 제어 장치(DMAC) 등을 내장함
입출력 제어 허브(I/O Controller Hub)라고도 부른다.
운영체제란 컴퓨터에 생명을 주고 하드웨어를 완벽히 통제하여 사용자 응용프로그램이 실행되도록 하는 기반 소프트웨어이다
CPU
- 능동적 메모리 소자
- 메모리 액세스 시 주소 발생
32비트 CPU, 32비트 운영체제, 32비트 컴퓨터
- CPU에 32개의 주소선이 존재함
CPU의 액세스 범위: 개의 주소(0 ~ 번지)
CPU가 최대 액세스할 수 있는 메모리의 크기: 4GB
한 번지의 공간이 1바이트이므로
= 1KB
= 1MB
= 1GB
= X = 4GB
32비트를 가진 컴퓨터에 4GB이상 메모리를 설치할 경우 4GB를 넘어선 영역은 사용할 수 없음- CPU에 입출력되는 32개의 데이터 선 있음
한번에 32비트 읽고 쓰기 가능
예
CPU가 4번지로부터 데이터(Int, 32비트)를 읽을 때,
메모리는 4, 5, 6, 7, 총 4개의 바이트(32비트)를 데이터 버스로 싣게 됨
4번지의 값을 읽어와라(X)
4번지부터 시작하는 정수값을 읽어와라(O)
32비트 컴퓨터에서 메모리 또한 한번에 32비트의 데이터를 전달할 수 있음
CPU 명령
CPU가 해석하고 실행할 수 있는 기계 명령(machine instruction)
- C언어나 자바의 프로그램 소스 코드와 다름
- CPU를 설계하는 기업이 명령어들, 명령어 개수, 형태 등을 결정
- 한 CPU의 명령 개수는 수십개~수백개 정도
- CPU마다 명령 이름, 기계어 코드, 크기, 개수 등이 다름
- CPU마다 명령들의 호환성 없음
변수를 할당하는CPU 명령 사례
CPU 명령 사이클(instruction cycle)
CPU가 한 개의 명령을 처리하는 세부 과정
CPU 레지스터들
- PC(Program Counter): 다음에 실행할 명령의 메모리 주소 저장
- IR(Instruction Register): 현재 실행하기 위해 메모리로부터 읽어 온 명령 저장
- SP(Stack Pointer): 스택의 톱 메모리 주소(데이터가 마지막으로 저장된 위치) 저장
- 데이터 레지스터들(data registers): 연산에 사용될 데이터들을 저장
- 상태 레지스터(status register): CPU의 상태 정보나 인터럽트 금지 등의 정보 저장
- 기타 여러 레지스터: 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터 등
명령 사이클 사례: 메모리 100번지에 저장된 다음 명령을 실행
mov eax, [300];메모리 300번지의 값을 읽어 eax 레지스터에 저장
1) CPU는 PC 레지스터가 가리키는 주소(100)를 주소 버스에 싣는다.
2) 메모리는 100번지에 저장된 데이터(mov eax, [300])를
데이터 버스에 싣는다.
3) CPU는 데이터 버스에 담긴 바이너리 값들을 IR 레지스터에 저장.
PC를 다음 번지로 수정한다.
4)CPU는 연산에 필요한 데이터를 읽기 위해 데이터의 주소(300)을 주소 버스에 싣는다.
5)메모리는 300번지에 저장된 50을 데이터 버스에 싣는다.
6)CPU는 데이터 버스로부터 50을 임시 데이터 레지스터에 저장한다.
7)CPU는 명령을 해석하고 실행한다.
명령 결과, 50이 eax 레지스터에 저장된다.
운영체제는 프로그램을 실행시킬 때 각 프로그램마다 다음 4개의 공간을 제공한다.
- 코드(code)공간: 프로그램 코드가 적재되는 메모리 공간
- 데이터(data)공간: 전역 변수들이 적재되는 공간
- 힙(heap)공간: 프로그램이 실행 중 동적으로 저장할 데이터를 위한 공간
- 스택(stack)공간: 함수가 호출될 때 매개변수나 지역 변수,
함수가 실행을 마치고 돌아갈 주소 등을 저장하기 위한 공간
스택(stack)
프로그램의 지역 변수 등을 저장하도록 할당되는 메모리 영역.
스택이라는 별도의 하드웨어는 존재하지 않는다.
각 프로그램에게는 자신만의 스택 공간이 할당되며, CPU의 SP(Stack Pointer) 레지스터는 현재 실행 중인 프로그램의 스택 영역 꼭대기(top) 주소를 가리킨다.✔스택에 저장되는 내용
- 함수의 지역변수들
- 매개변수 값들
- 함수를 마치고 돌아갈 주소
- 함수 코드가 의도적으로 스택에 저장한 값
프로그램이 실행 중인 일체의 상황 혹은 상황 정보
- 메모리
프로그램 코드와 데이터, 스택, 동적할당 받아 저장한 값(heap에 저장된 값)- CPU 레지스터들의 값
PC: 코드의 주소
SP: 스택의 주소
다른 레지스터는 이전의 실행 결과나 현재 실행에 사용되는 데이터들축소 정의
현재 CPU에 들어 있는 레지스터의 값들
메모리에 저장된 상황 정보들은 그대로 있기 때문임
컨텍스트 스위칭(context switching)
운영체제가 현재 실행중인 프로그램 A의 컨텍스트(CPU 레지스터들의 값)를 저장해두고,
다른 프로그램 B를 실행시키기 위해
프로그램 B의 저장된 컨텍스트(CPU 레지스터들의 값)를 CPU로 옮기는 것.
메모리에 저장된 데이터의 경우 PC, SP가 가리키는 주소값만 변경하면 됨
CPU 내부의 레지스터에 저장된 값을 메모리로 저장하는 과정이 필요함
2001년 IBM에 의해 PowerPC라는 멀티코어 PC 개발
코어(core)
레지스터들과 제어장치(Control Unit), 산술논리연산장치(ALU), 그리고 외부 버스와 연결되는 인터페이스 장치를 독립적으로 갖추고 하나의 프로그램을 실행할 수 있는 완벽한 프로세서
멀티 코어 CPU
여러 개의 코어를 가지고 여러 개의 프로그램을 실행할 수 있는 CPU
운영체제는 부팅 후부터 메모리에 상주하면서 하드웨어를 완전히 장악한 채 제어하며, 사용자와 응용프로그램에게 서비스를 제공하는 실체가 있는 코드
컴퓨터 시스템 계층
- 사용자
- 응용프로그램
- 운영체제
커널 코드
디바이스 드라이버- 하드웨어
컴퓨터 시스템은 왜 계층 구조로 설계되었는가?
계층 간의 독립성(independency)을 확보하기 위해
- 사용자
운영체제나 하드웨어에 대해 몰라도 응용프로그램으로 컴퓨터 활용- 응용프로그램
컴퓨터 하드웨어의 타입이나 구조, 제어 방법을 몰라도 개발 가능
예)
CPU 크기, 메모리의 크기가 얼마인지 모르고 프로그램 작성
저장 장치가 하드디스크인지 SSD인지, 저장 장치의 크기는 얼마인지, 디스크 헤드는 몇개가 있는지 몰라도 파일 입출력 프로그램 작성
운영체제에 요청하여 해결
컴퓨터 하드웨어가 바뀌어도 응용프로그램을 다시 작성할 필요가 없음- 운영체제
장치 관련된 모든 작업을 디바이스 드라이버에 요청
응용프로그램과 하드웨어 사이의 인터페이스
왜 운영체제가 필요한가?
- 운영체제가 없다면
응용프로그램이나 사용자가 직접 하드웨어를 제어해야 함
하드웨어에 대한 지식, 충돌, 관리, 보안의 문제 발생- 실례
프로세스 관리
2명이 동시에 프로그램을 실행시키고자 할 때, 1명이 어떤 프로그램을 실행하는 도중, 다른 사람이 프로그램을 실행시키고자 할 때, 2개의 응용프로그램에 대한 스케줄링은 누가 할 것인가?
메모리 관리
응용프로그램이 메모리가 필요할 때, 사용 중이지 않는 메모리와 사용중인 메모리로 나누어 관리하고, 응용프로그램이 종료하면 사용한 메모리 회수 등 메모리 관리를 누가 할 것인가?
장치 관리
2명의 사용자가 동시에 프린터에 프린팅을 시킬 때 등, 장치 사용에 대한 충돌이 생기지 않게 하려면 누가 할 것인가?
파일 시스템 관리
데이터를 파일에 기록하려는데, 하드 디스크의 어느 위치에 기록해야 할지 결정해야 하고, 내가 기록한 디스크 위치에 다른 응용프로그램이 덮어쓰지 못하게 하려면 누가 할 것인가?
입출력 관리
키가 입력되면 실행 중인 여러 응용프로그램중 어떤 응용프로그램에게 키를 전달할지 누가 결정할 것인가?- 운영체제의 필요성
자원에 대한 충돌 해결, 성능 최적화, 사용자의 시스템 사용의 효율화
운영체제와 응용프로그램 사이의 관계
- 응용프로그램(application)
워드, 웹브라우저 등
사용자가 컴퓨터를 활용하도록 작성된 다양한 프로그램들- 응용프로그램에 대한 운영체제의 역할
응용프로그램이 직접 하드웨어를 다루지 못하도록 차단
운영체제의 하드웨어 완벽 독점 장악
응용프로그램들 사이의 하드웨어 사용 충돌을 막기 위함응용프로그램은 하드웨어를 사용고자 할 때
반드시 운영체제에 요청하여 운영체제가 대신하여 하드웨어 조작
유일한 요청 방법이 바로 시스템 호출(system call)응용프로그램과 하드웨어 사이의 인터페이스
응용프로그램들의 실행 순서 제어
응용프로그램들 사이의 통신 중계
운영체제와 사용자의 관계
사용자는 응용프로그램을 통해 컴퓨터 활용
탐색기, 메모장 등사용자에 대한 운영체제의 역할
사용자가 하드웨어에 대한 지식이 없어도 컴퓨터 다루기 용이
사용자가 하드웨어를 설치하거나 변경하는 것에 도움
사용자에게 컴퓨터 시스템을 사용할 편리한 인터페이스 제공
UI, 마우스, 음성 명령 등컴퓨터의 사용을 돕는 여러 도구 응용프로그램(유틸리티) 제공
windows의 탐색기와 작업 관리자
리눅스의 쉘
사용자 계정 관리사용자의 컴퓨터 사용 시간 계산, 과금 처리 등
운영체제와 하드웨어의 관계
- 하드웨어를 제어하는 것은 전적으로 운영체제의 몫
응용프로그램에서
printf("hello")
디스플레이 장치에서 "hello"를 출력하는 일은 운영체제가 함응용프로그램에서
scanf()
키보드로부터 문자를 입력받는 일은 운영체제가 함
- 운영체제
사용자/응용프로그램과 하드웨어 사이의 매개체
하드웨어 제어는 전적으로 운영체제의 기능
하드디스크에서 파일을 읽거나 쓰기
마우스의 클릭
키보드 입력 받기
네트워크를 통한 데이터 전송 혹은 수신
디스플레이에 텍스트나 이미지, 그래픽 등 출력
프로세스와 스레드 관리(process and thread management)
디스크에 저장된 프로그램이 메모리에 적재되어 실행될 때 프로세스라고 함
프로세스는 한 개 이상의 스레드로 구성되는데, 프로세스는 실행단위가 아니며 운영체제에 의해 스케줄되고 다루어지는 실행 단위는 스레드이다.
운영체제는 여러 프로세스/스레드를 동시에 실행시키기 위해, 프로세스/스레드의 실행, 일시 중단, 종료, 스케줄링, 컨텍스트 스위치 등의 기능을 갖고 있다.
여러 프로세스/스레드가 동시에 자원을 사용하려고 할 때 충돌하지 않도록 이들을 동기화(synchronization)시키고 프로세스가 자원을 무한정 기다리는 일이 없도록 하는 기능도 포함된다.
메모리 관리(memory management)
프로세스/스레드를 실행시키기 위한 메모리 할당/반환, 다른 프로세스/스레드로부터 메모리 보호 등 메모리 관리 기능.
메모리가 부족할 때 하드 디스크의 영역까지 메모리를 확장하여 사용하는 가상 메모리 기술도 포함한다.
파일 관리(file management) 혹은 파일 시스템 관리
파일 생성, 저장, 읽기, 복사, 삭제, 이동, 파일 보호 등의 파일 관리 기능
이를 위해 디스크 등의 저장 장치에 파일을 저장하기 위한 정책 등이 포함됨
장치 관리(device management)
키보드, 마우스, 프린터 등의 입출력 장치나 하드 디스크 등의 저장 장치를 제어하여 사용자나 응용프로그램의 요청에 따라 입출력을 수행하는 기능
사용자 인터페이스(user interface)
사용자 친화적인 인터페이스를 제공하여 사용자가 컴퓨터를 쉽게 사용하고 원하는 응용프로그램을 쉽게 실행시킬 수 있도록 돕는 기능.
라인 기반 명령 입출력 창,
마우스와 그래픽을 사용하는 GUI 방식의 인터페이스
네트워킹(networking)
사용자나 응용프로그램이 네트워크를 사용할 수 있도록 네트워크 인지, 연결, 닫기, 데이터 송수신 등의 기능을 제공한다.
보호 및 보안(protection & security)
CPU, 메모리, 컴퓨터에 설치된 소프트웨어, 실행 중인 프로그램과 컴퓨터 내부의 시스템 데이터나 사용자 데이터가 바이러스나 웜, 멀웨어, 해킹 등 외부 공격이나 무단 침입으로부터 안전하게 유지되도록 보호하며 외부로 유출되지 않도록 하는 기능

시스템 호출: 응용프로그램 ↔ 운영체제
인터럽트: 하드웨어 ↔ 운영체제
이 유일한 2가지 방법으로 운영체제는 응용프로그램과 컴퓨터 하드웨어와 소통함
운영체제 구성
운영체제 = 커널 + 툴 + 디바이스 드라이버
- 커널(kernal)
운영체제의 핵심 부분, 좁은 의미의 운영체제
부팅 후 메모리에 상주하는 코드와 데이터
운영체제의 핵심 기능 모두 구현
CPU, Memory, MMU 등 컴퓨터의 자원 직접 제어,
관리하는 코드와 자료구조들
커널 코드는 함수들의 집합
커널 기능을 이용하려면 응용프로그램은 반드시 시스템 호출 사용
도구(tool) 소프트웨어와 GUI
GUI(Graphic User Interface)
프로그램이 사용자와 소통하는 방식사용자가 컴퓨터를 편리하게 사용할 수 있도록 제공하는 툴 소프트웨어 혹은 툴 응용프로그램
Windows의 경우 바탕화면 GUI, 탐색기, 명령창, 작업 관리자, 제어판 등
리눅스의 경우 쉘, 로그인 프로그램
디바이스 드라이버(device driver)
장치를 직접 제어하고 입출력하는 소프트웨어
장치마다 전담 디바이스 드라이버가 있음
일반적으로 하드웨어 장치 제작자에 의해 작성되어 배포됨과거 모든 디바이스 드라이버 → 커널 영역에서 실행됨
커널 영역에서 실행되는 디바이스 드라이버가 잘못 작성되었을 경우 시스템을 심각하게 훼손시킴
→ 사용자 공간에서 실행되는 디바이스 드라이버를 허용커널 영역: 모든 하드웨어 자원에 무제한적으로 접근할 수 있음
사용자 공간: 응용프로그램이 실행되는 장소로, 하드웨어 자원에 접근하려면 운영체제의 허가가 있어야 함
두 영역 모두 메모리 공간에 적재되어 있음사례)
키보드/디스크/SCSI/마우스/그래픽/네트워크/usb 드라이버
운영체제는 하드웨어와 응용프로그램 사이의 중계 역할을 위해 다음 2가지 인터페이스를 두고 있다.
- 시스템 호출(system call) -커널 ↔ 응용프로그램
- 인터럽트(interrupt) - 커널 ↔ 하드웨어
시스템 호출(system call)
- 커널과 응용프로그램 사이의 인터페이스
- 응용프로그램에서 커널 기능을 사용할 수 있는 유일한 방법
- 시스템 호출 라이브러리를 통해 다양한 시스템 호출 함수 제공
운영체제 패키지에 포함됨
예) 파일 읽기, 메모리 할당, 프로세스 정보 보기, 프로세스 생성 등
open(),close(),read(),write(),fork(),exit(),wait()등의 시스템 호출 함수
시스템 호출 함수는 운영체제마다 다름시스템 호출 라이브러리는 호환성 없음
표준 라이브러리(standard library)
- 응용프로그램을 쉽게 작성할 수 있도록 복잡한 기능이 미리 작성된 코드
- 운영체제 커널의 기능과 무관한 작업
- 응용프로그램은 표준 라이브러리 함수를 함수 호출(function call) 방법으로 사용
- 예)
printf(),abs(),strcmp()등표준 라이브러리는 호환성 있음
인터럽트(interrupt)
- 커널과 하드웨어 장치 사이의 인터페이스
- 장치들이 입출력 완료, 타이머 완료 등을 CPU에게 알리는 하드웨어적 방법인터럽트 하드웨어 신호가 직접 CPU에 전달
- 인터럽트가 발생했을 때
CPU는 하던 일을 중단하고 인터럽트 서비스 루틴 실행
인터럽트 서비스 루틴은 대부분 디바이스 드라이버 내에 있음
(2.3 그림 참조)예) 키를 입력하면 커널의 키보드 인터럽트 서비스 루틴 실행, 키를 읽어 커널 버퍼에 저장
인터럽트 서비스 루틴은 커널이 적재된 메모리 영역에 적재
커널과 같이 컴퓨터가 부팅되면 커널과 같은 메모리 영역에 적재되어 있는 디바이스 드라이버에 존재하고 있음
(인터럽트가 발생했을 때 적재되는 것이 아님)인터럽트 서비스 루틴의 실행을 마치면 하던 작업 계속
- 인터럽트 활용
운영체제가 장치에게 지시한 입출력 작업의 완료, 예고 없는 네트워크 데이터 도착, 키보드나 마우스의 입력, 부족한 배터리의 경고 등 장치와 관련된 모든 이벤트 처리
오늘날 운영체제는 다중프로그래밍 운영체제
다수의 응용프로그램이 한 컴퓨터에서 동시에 실행
문제
- 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손 발생
다른 응용프로그램이 적재된 메모리 훼손 가능
다른 응용프로그램이 만든 파일 삭제 및 훼손 가능
응용프로그램이 커널이 적재된 영역 훼손 가능
해결
- 응용프로그램의 자원 접근 불허
자원에 대한 모든 접근은 커널에만 부여
구체적인 해결 방법
- 메모리 공간을 사용자 공간과 커널 공간으로 분리
응용프로그램은 사용자 공간에 적재 , 커널은 커널 공간에만 적재
- CPU의 실행 모드를 사용자 모드와 커널 모드로 분리
사용자 공간에서 함부로 커널 공간의 코드를 접근하지 못하게 하기 위해서 응용프로그램은 사용자 모드에서만 실행
커널 코드는 커널 모드에서만 실행
사용자 모드에서 커널 코드를 접근하면 응용프로그램 강제 종료
- 응용프로그램이 커널 기능을 이용하고자 할 때,
시스템 호출을 통해서만 커널 코드 이용
운영체제는 컴퓨터 메모리를 두 공간으로 분리
사용자 공간(user space)
모든 응용프로그램들이 나누어 사용하는 공간
응용프로그램들이 적재되는 공간커널 공간(kernel space)
커널만 사용할 수 있는 공간
커널 코드, 커널 데이터 등 커널에 의해 배타적으로 사용되는 공간
디바이스 드라이버 포함
분리 이유
커널 코드와 데이터를 악의적인 응용프로그램, 코딩 실수로부터 지키기 위함
사용자 공간 크기의 의미
사용자 공간 크기
- 한 응용프로그램의 최대 크기를 결정
프로그램 코드 + 데이터(전역변수) + 동적할당 + 스택을 합친 크기
예)
32비트 Windows 운영체제에서 사용자 공간 2GB란?
응용프로그램을 2GB 크기 이상 개발할 수 없음사용자 공간의 주소 범위
- 응용프로그램은 운영체제가 설정한
사용자 공간의 주소 범위를 넘어설 수 없음
예)
32비트 Windows 운영체제에서 응용프로그램은 0~7FFFFFFF 범위의 주소를 넘어 액세스하게 되면 바로 종료(심각한 오류)
사용자 공간과 커널 공간은 가상 주소 공간이다
- 주소 공간 = 사용자 공간 + 커널 공간
- 주소 공간 = 가상 주소 공간
- 가상 주소 공간
사용자나 응용프로그램 관점에서 보는 주소 범위
사용자가 전체 메모리를 사용하고 있다고 착각- 각 응용프로그램
2GB의 사용자 주소 공간을 가짐
사용자 코드와 데이터 최대 2GB
0~7FFFFFFF의 2GB 메모리 독점 사용 착각- 커널 공간
2GB ~ 4GB의 주소 범위
80000000 ~ FFFFFFFF 범위 주소 공간
모든 응용프로그램은 커널 공간 공유
사용자 공간의 충돌 해결
가상 주소 공간을 물리 메모리에 매핑
- 각 응용프로그램의 가상 주소 공간을 물리 주소 공간으로 매핑
매핑 테이블은 운영체제가 소유하고 관리- 물리 메모리를 여러 응용프로그램의 사용자 공간이 나누어 사용
실제 각 응용프로그램은 사용자 공간의 일부만 사용- 커널 공간 역시 물리 메모리에 매핑
각 응용프로그램의 매핑 테이블에 기록
커널 공간에 대한 매핑 테이블 부분을 모든 응용프로그램에서 동일
물리 메모리가 작은 경우에 대한 해결
물리 메모리가 부족하면 운영체제는 물리 메모리를 하드디스크에 저장하여 물리 메모리의 빈 영역 확보
가상 메모리 기법
가상 주소 공간 충돌을 막기 위한 가상 주소 공간의 물리 메모리 매핑
응용프로그램을 실제 메모리에 나눠서 저장하며, 나눠진 응용프로그램의 실제 주소(물리 주소)는 주소 매핑 테이블에 저장된다.
응용프로그램의 0번지 실행 명령이 오면, 주소 매핑 테이블에서 물리 주소를 찾아서 실행함
만약 프로그램의 크기가 메모리 크기를 초과한다면?
당장 사용되지 않는 코드들은 하드디스크에 저장하고 메모리에 저장함
이러한 기법을 가상 메모리 기법이라고 함주소 매핑 테이블의 위치는?
주소 매핑 테이블은 커널 공간에 위치하며,
자주 사용되는 주소는 CPU 내부에 위치한 TLB(Translation Lookaside Buffer)라는 아주 빠른 캐시 메모리에 저장됨
CPU는 사용자 모드와 커널 모드 중 한 모드로 실행
CPU 내부에 모드 상태를 나타내는 모드 레지스터가 있음
사용자 모드(user mode)
- CPU의 모드 비트 = 1
- CPU는 사용자 공간에 있는 코드나 데이터를 액세스하는 중
- CPU의 커널 공간에 접근 불허 → 응용프로그램으로부터 커널 영역 보호
- 특권 명령(privileged instruction) 실행 불허
특권 명령: 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별한 명령
커널 모드(kernel mode)
- CPU의 모드 비트 = 0
- CPU가 커널 공간에서 실행하는 중, 혹은 사용자 코드를 실행하는 중
어떤 코드도 사용할 수 있음- 특권 명령 사용 가능
사용자 모드와 커널 모드에서의 메모리 액세스
사용자 모드에서 커널 모드로 전환
오직 시스템 호출과 인터럽트 발생으로만 전환 가능시스템 호출
시스템 호출을 실행하는 특별한 기계 명령
기계 명령이 CPU의 모드 비트를 커널 모드로 변환
예) int 0x80/sysenter/trap/syscall 등 CPU마다 다름인터럽트
CPU가 인터럽트를 수신하면 커널 모드로 자동 전환
인터럽트 서비스 루틴이 커널 공간에 있기 때문
CPU는 인터럽트 서비스 루틴 실행
인터럽트 서비스 루틴이 끝나면 CPU는 사용자 모드로 자동 전환
사용자 모드와 커널 모드 비교
특권 명령
커널 모드에서 실행할 특별한 목적으로 설계된 CPU 명령특권 명령 종류
- I/O 명령
하드웨어 제어 및 장치로부터의 입출력
사례)
in eax, 300;I/O 포트 300번지에서 값을 읽어 eax 레지스터에 저장
out 301, eax;eax 레지스터에 있는 값을 I/O 포트 301번지에 쓰기- Halt 명령
CPU의 작동을 중지 시키는 명령. CPU를 유휴 상태로 만듦- 인터럽트 플래그 켜고 끄는 명령
CPU 내에 있는 인터럽트 플래그 비트를 제어하여 CPU가 인터럽트를 허용하거나 무시하도록 지시
사례)
cli/sti 명령- 타이머 설정 명령
- 컨텍스트 스위칭 명령
- 메모리 지우기 명령
- 장치 상태 테이블 수정 등의 명령
특권 명령에 대한 이해
1) 사용자 모드에서 커널 모드로 변경시키는 명령어
특권 명령이 아님
시스템 호출을 위해
모든 응용프로그램에게 허용되어야 하는 명령어이기 때문2) 시계 읽기
특권 명령이 아님
모든 응용프로그램에서 시계를 읽을 수 있어야 하기 때문3) 가상 메모리에서 메모리 지우기
특권 명령이 아님
프로그램이 자신의 메모리 부분을 지우는 것은 다른 프로세스의 영역을 침범하지 않기 때문4) 인터럽트 끄기
특권 명령임
한 프로그램이 인터럽트를 끄면
CPU가 다른 프로그램을 실행하더라도 인터럽트를 받을 수 없게 됨
실행 모드와 관련된 다양한 이슈
1) 사용자 모드와 커널 모드는 CPU에 의해 구현되는가,
운영체제에 의해 구현되는가?
모드는 CPU에 의해 구현되고 운영체제가 활용하는 기능
CPU 내부에 모드를 나타내는 레지스터 존재
운영체제는 CPU 모드 레지스터를 이용하여 커널 영역 지킴2) 운영체제가 사용자/커널 모드로 나누어 작동시키는 이유는?
커널 공간(커널 코드와 데이터)에 대한 보안과 보호
사용자 프로그램은 사용자 모드에서 아무리 심각한 오류가 발생해도 사용자 프로그램만 종료하며, 시스템을 종료하지는 못함3) 사용자 응용프로그램이 커널 코드를 호출하는 일이 있는가?
사용자 프로그램은 직접 커널 코드 호출 불가능
(오직 시스템 호출을 통해서만 가능함)4) CPU가 커널 모드와 사용자 모드 중 어떠 모드로 많이 실행되는가?
커널 모드에서 많이 실행
키보드나 모니터 등의 장치 액세스가 많으면 커널 모드 시간 비율 높음
아무 작업도 없을 때 시스템 유휴 프로세서가 커널에서 작동됨
- 커널은 부팅 시에 커널 공간에 적재된 함수들과 데이터들의 집합
커널은 컴파일된 바이너리 형태, 하드디스크 특정 영역에 저장,
부팅 시에 커널 공간의 메모리에 적재- 커널 코드는 함수들의 집합
커널 모드에서 실행되는 모든 함수들과 데이터들의 집합
현재 커널 코드를 실행시키고 있는 것은 app2 프로세스이며,
커널 프로세스라는 말은 없다. 커널은 프로세스가 아니다.
커널은 스스로 실행되는 프로세스인가?
NO
커널은 단순한 함수들의 집합이며, 시스템 호출을 통해 호출되는 함수들임
스케줄링의 주체 또한 커널이 아니며, 시스템 호출과
인터럽트 서비스 루틴에 의해 커널 내의 스케줄러 함수가 호출되어 실행됨커널은 실행중이다?
NO
커널은 프로세스도, 스레드도 아니므로 아님
응용프로그램이 시스템 호출을 실행하면, 커널 코드가 실행되고 있다
인터럽트가 발생하여 인터럽트 서비스 루틴이 실행되고 있다커널은 스택이나 힙을 가지는가?
NO
커널은 스택이나 힙을 가지는 주체가 아님
스택이나 힙을 가지는 주체는 프로세스나 스레드임
프로세스가 생성될 때 사용자 공간과 커널 공간에 각각 소유
프로세스가 사용자 코드를 실행할 때 사용자 공간의 스택 활용
프로세스가 시스템 호출로 커널 코드를 실행할 때 커널 스택 활용사용자 공간/커널 스택은 프로세스의 시작과 함께 생성되며,
종료와 함께 사라짐
라이브러리(library)
응용프로그램에서 활용하도록 미리 함수들을 작성하여 컴파일하고
바이너리 형태로 만든 파일
라이브러리를 활용하지 않고 응용프로그램 작성 불가능
응용프로그램이 활용하는 2가지 라이브러리
표준 라이브러리(Standard Library)
사용자가 작성하기 힘든 함수 제공
운영체제나 컴퓨터 하드웨어에 상관없이 이름과 사용법 동일
운영체제마다 호환성 있음시스템 호출 라이브러리(System Call API)
시스템 호출을 진행하여 커널 모드로 바꾸고 커널로 진입하여
커널에 만들어진 함수 실행(커널의 다양한 기능 수행)운영체제마다 함수의 이름이 서로 다름
라이브러리에 들어 있는 함수를 시스템 호출 함수 혹은 커널
API(Application Programming Interface)라고 부름
운영체제마다 호환성 없음
사용자 코드와 라이브러리 코드의 링킹
실행 파일이 만들어지는 과정
응용프로그램 코드와 라이브러리 코드의 링킹을 거쳐
하나의 실행 파일로 만들어짐
여러 오브젝트 파일과 라이브러리를 하나로 합침
예)
외부 함수 참조(printf())를 실제 주소로 연결응용프로그램 실행
응용프로그램이 사용자 공간에 적재
실행 파일 내 사용자 코드와 라이브러리 코드의 메모리 적재
실행 파일 내 사용자 전역 변수와 라이브러리 전역 변수 메모리 적재응용프로그램은 사용자 모드로 실행 시작됨
함수 호출과 시스템 호출
함수 호출(function call)로 라이브러리 활용
사용자 공간에 적재된 함수가 다른 함수(라이브러리 함수 포함)호출
사용자 공간에서, 사용자 모드에서 실행
- 함수 호출 과정
1) 사용자 공간의 스택에 돌아올 주소, 매개변수 전달,
호출된 함수의 지역변수 생성
2) 함수의 주소로 점프
3) 함수가 끝나면 함수를 호출한 곳으로 복귀
스택에 저장된 매개변수나 지역변수가 저장된 주소가 스택 포인터가 되돌아가게 되면서 사용 가능한 공간으로 바뀌며 유효하지 않게 됨시스템 호출(System call)로 커널 코드 실행
1) 응용프로그램이 운영체제의 기능을 사용하고자 할 때,
커널에 작성된 함수 실행
2) 시스템 호출 라이브러리에 포함된 시스템 호출 함수가 시스템 호출 일으킴시스템 호출 과정
1) 시스템 호출을 일으키는 특별한 기계 명령 실행
2) 이 명령이 사용자 모드에서 커널 모드로 전환,
커널 함수마다 매겨진 고유 번호 전달
3) 커널의 시스템 호출 핸들러 실행
4) 시스템 호출 핸들러가 전달받은 커널 함수의 고유 번호 분석(커널 함수는 이름이 없고, id 번호로 구분됨),
해당 커널 함수 호출
5) 커널 함수가 리턴할 때 사용자 모드로 전환, 사용자 프로그램으로 복귀모드 변경 → 현재 상태 저장 → 시스템 콜 번호 확인(시스템 콜 테이블 참조) → 해당 시스템 콜 핸들러 호출
현재 상태를 저장하는 이유는 커널 공간에서 사용자 공간으로 돌아올 때의 주소를 기억하기 위해서임
시스템 호출
사용자 공간의 코드에서 커널 서비스를 요청하는 과정
사용자 공간의 코드가 커널 함수를 호출하는 과정
커널 콜(kernel call), 트랩(trap)으로도 불림
응용프로그램에서 커널 기능을 활용하도록 만들어놓은 기능시스템 호출 라이브러리 제공
시스템 호출 함수 혹은 커널 API
Unix/Linux의 커널 API -open(),read(),write(),fork(),exit()
Windows의 커널 API -CreateProcess(),WaitForSingleObject()
대략 200개 이상
시스템 호출을 일으키는 기계 명령
CPU마다 시스템 호출을 실행하는 특별한 기계 명령 제공
시스템 호출 CPU 명령사례
int 0x80- 인텔의 x86계열의 CPU. 32비트에서 사용
syscall/sysret- AMD에서 최초 구현. 64비트에서만 작동
sysenter/sysexit- Intel에서 최초 구현. X84/64 CPU, AMD
라이브러리를 통해 간접적으로 이루어지는 시스템 호출
응용프로그램 → 시스템 호출 라이브러리의 시스템 호출 함수
→ 시스템 호출 CPU 명령응용프로그램 → 표준 라이브러리 함수 → 시스템 호출 라이브러리의 시스템 호출 함수 → 시스템 호출 CPU 명령
탐구 2-1
printf()가 직접 디스플레이에 출력할까?
시스템 콜은 사용자 모드 → 커널 모드 전환 비용이 있기 때문에
매번 호출하면 비효율적임.
따라서 버퍼가 가득 찼을 때 한번에 시스템 콜을 호출하는 것이
훨씬 효율적임
printf()는stdout에 데이터를 쓰는데stdout은 FILE 구조체로 내부적으로 버퍼를 가지고 있음만약 출력 버퍼에 빈 곳이 있는데 다 쓴다면?
printf("hello"); → 버퍼에 저장 return 0; → 프로그램 종료 → 자동 플러시 → write() → 화면 출력printf("hello\n"); → \n 만남 → 즉시 플러시 → write() → 화면 출력printf("hello"); fflush(stdout); → 강제 플러시 → write() → 화면 출력만약 버퍼에 쓰려고 했는데 다 차있다면?
자동적으로 플러시→비우기→새 데이터 저장
탐구 2-2
syscall기계 명령으로write시스템 호출 코드 작성
교재 p.111 표 2-3 참조
fread()와read()의 비교
시스템 호출은 함수 호출에 비해 많은 시간 비용
시스템 호출을 많이 할수록 프로그램 실행 속도 저하파일에서 1000바이트를 읽는 2가지 유형의 코드
표준 C 라이브러리 함수
fread()와 시스템 호출read()실행 비교: 하드디스크의 fp 파일을 읽는 경우표준 C 라이브러리 함수
fread(fp, buf, size)동작
1)fread()를 처음 호출하면 라이브러리 내 버퍼(buffer)가 비어 있음
2)read()를 호출하여 라이브러리 내 버퍼를 채움
3) 라이브러리 버퍼에서 요청한size만큼buf로 복사함
4) 라이브러리 버퍼가 비거나 부족하면 그때read()호출
fread()는 한번 읽을 때 "어차피 계속 쓸 것 같으니 한꺼번에 많이 가져오자" 하고 내부적으로 미리 4096바이트를 미리 읽어두기 때문에 커널 공간에 다시 들어갈 필요가 없음시스템 호출 함수,
read(fd, buf, size)동작
1) 시스템 호출을 이용하여 커널 코드 실행
2) 커널 코드에서 디스크 읽기
3) 라이브러리를 거치지 않고 바로buf로 읽어들임
read()는 필요한 양의 버퍼만 딱 가져오기 때문에 100바이트를 읽은 후 다시 100바이트를 읽으려면 커널 공간에 다시 진입해서 데이터를 읽어들여야 함
시스템 호출에 따른 비용 정리
시스템 호출에 따른 비용은 매우 큼
시스템 호출 함수에 전달할 값을 CPU 레지스터에 저장
사용자 공간 → 커널 공간 이동의 주체는 CPU임
→ 사용자 모드에서 커널 모드로 전환
→ 시스템 호출 핸들러 실행
→ CPU 내 레지스터가 훼손되는 것을 막기 위해 스택에 저장
→ 시스템 호출 표에서 시스템 호출. 함수찾기
→ 시스템 호출 함수 실행
→ 스택에 저장해둔 레지스터 복귀
→ 다시 커널 모드로 복귀시스템 호출 시간을 줄여야 시스템의 처리율이 향상됨
인터럽트
입출력 장치들이 비동기적 사건을 CPU에게 알리는 행위여기서 말하는 비동기적 사건은
CPU가 실행하는 사건과는 관계없이 발생하는 사건을 말함예정되지 않거나 발생시간을 예측할 수 없는 사건
(키보드 입력, 네트워크로부터 데이터 도착 등)하드웨어 인터럽트
장치들이 어떤 상황 발생을 CPU에게 알리는 하드웨어 신호
인터럽트 발생 → CPU는 인터럽트 서비스 루틴 실행소프트웨어 인터럽트
CPU 명령으로 발생시키는 것으로
하드웨어 인터럽트를 수신한 것과 동일한 처리
컴퓨터에서 인터럽트 활용
- 마우스를 움직이거나 클릭하는 등 마우스 조작
- 키보드 입력
- 네트워크로부터 데이터 도착
- 하드디스크의 쓰기 종료
- 시스템 클럭으로부터 일정한 시간 간격으로 알림
- 컴퓨터의 리셋 버튼 누르기
- USB 메모리 부착 혹은 헤제
컴퓨터 시스템에서 인터럽트가 처리되기 위해서는 CPU와 인터럽트 제어기(Interrupt Controller) 등의 하드웨어가 상호 협력해야 함
일반적으로 CPU에는 인터럽트 수신 핀이 1개뿐이기 때문에, 여러 입출력 장치로부터 인터럽트를 받기 위해, CPU와 입출력 장치 사이에 APIC(Advanced Programmable Interrupt Controller, 인터럽트 제어기)라는 하드웨어가 사용된다.
인터럽트 벡터 번호는 미리 I/O APIC에 저장이 됨
SouthBridege(I/O Controller Hub)칩에 내장됨APIC는 입출력 장치로부터 직접 인터럽트 신호를 받는 I/O APIC 장치와 I/O APIC로부터 인터럽트 정보를 받아 CPU의 INTR 핀에 직접 인터럽트 신호를 발생시키는 Local APIC 장치로 분리 구성된다.
외부 장치 → I/O APIC → Local APIC가 CPU의 INTR 핀에 신호 전달
→ CPU가 Local APIC에서 인터럽트 벡터 번호 N을 가져옴
→ CPU가 IDTR을 통해 인터럽트 벡터 테이블에서 N번 ISR(Interrupt Service Routine) 주소 찾기
→ 해당 ISR 실행
IDTR(Interrupt Descriptor Table Register)
CPU 내부에 있는 레지스터로, 인터럽트 벡터 테이블의 시작 주소와 크기를 저장하고 있음세부적으로 따져본다면,
CPU IDTR에 저장된 인터럽트 벡터 테이블의 시작 주소를 보고 이동한 다음,
벡터 번호는 임시 레지스터에 저장함.
그 후 ALU의 오프셋 계산을 통해 벡터 번호(예: 33번)으로 이동함
인터럽트 벡터 테이블
CPU마다 다르지만, Intel CPU의 경우 256개의 인터럽트가 저장되어 있음.인터럽트 벡터 테이블은 커널 영역에 저장되고 커널 코드에 의해서만 수정됨
IRQ(Interrupt ReQuest)
IRQ는 물리적인 전선(핀)에 흐르는 전기적 신호로, 운영체제는 부팅 시 I/O APIC 내부에 24개의 IRQ마다 인터럽트 벡터를 저장하고,
장치로부터 인터럽트가 발생되면 그에 해당하는 IRQ의 인터럽트 벡터를 Local APIC들 중 하나에 전송한다.
256개의 인터럽트가 존재한다면 핀도 256개가 있어야 하는거 아닌가?
인터럽트 벡터 번호와 IRQ핀이 1:1로 대응하긴 하지만,
하드웨어 인터럽트는 24개의 신호로 충분하기 때문에 핀도 24개만 있으면 됨
인터럽트 서비스 루틴의 위치
인터럽트 서비스 루틴은 디바이스 드라이버나 커널 코드에 들어 있음
임베디드 컴퓨터의 경우 컴퓨터 보드의 ROM에 들어 있음위치에 따라 인터럽트 서비스 루틴의 역할이 다름
드라이버 코드: 하드웨어 인터럽트
커널 코드: 소프트웨어 인터럽트인터럽트 서비스 루틴은 인터럽트 핸들러(interrupt handler)라고 부르기도 함
각 키보드나, 마우스 등의 하드웨어가 제거되면
키보드/마우스 드라이버 또한 같이 제거됨
디바이스 드라이버는 커널 공간에 위치하므로 오류가 발생하면 시스템 전체에 영향을 줄 수 있기 때문에 시스템 전체를 강제로 멈춤
따라서 디바이스 드라이버를 짜는것은 매우 중요함
이러한 문제로 인해 최근에는 사용자 모드/공간에서 돌아가는 디바이스 드라이버를 개발하는 추세임
다중프로그래밍의 핵심
프로세스가 입출력으로 인해 대기하게 되었을 때, 입출력이 완료될 때까지 프로세스를 중단 상태로 만들고 CPU가 다른 프로세스를 실행하게 하여
CPU 활용률을 높이는 것.
인터럽트가 없다면?
입출력 작업이 완료되었는지 계속 검사하는 작업(polling, 폴링)을 수행해야 하는데, 이 작업은 CPU가 하므로 이 때문에 CPU는 다른 작업을 할 수 없어서 다중프로그래밍의 실현이 어려움인터럽트의 존재로 인해
입출력 장치와 CPU 장치가 각자의 작업을 수행할 수 있게 됨