컴퓨터 시스템의 계층
- 응용프로그램 층
- 운영체제 층
- 컴퓨터 하드웨어 층
컴퓨터 시스템 계층 구조의 특징
- 사용자는 응용프로그램/도구프로그램을 통해 컴퓨터 활용
- 하드웨어는 모두 운영체제의 배타적 독점적 지배를 받음
- 사용자나 응용프로그램의 하드웨어에 대한 직접 접근 불허 (반드시 운영체제를 통해서만 접근 가능)
계층 구조에서 보는 운영체제의 기능
- 사용자가 하드웨어에 대해 몰라도 컴퓨터를 사용할 수 있도록 함
- 응용프로그램과 하드웨어 사이의 중계
CPU (Central Processing Unit)
- 프로그램 코드, 기계 명령을 해석하여 실행하는 중앙처리장치
- 컴퓨터의 가장 핵심 장치
- 전원이 공급될 때 작동 시작, 메모리에 적재된 프로그램 실행
메모리
- 반도체 메모리 RAM
- CPU에 의해 실행되는 프로그램 코드와 데이터가 적재되는 공간
- 프로그램은 실행되기 위해서 반드시 메모리에 적재되어야 함
캐시 메모리(Cache Memory)
- CPU 처리속도가 메모리 속도에 비해 빠르게 향상 -> CPU는 느린 메모리 때문에 대기시간이 늘게 되었음
- CPU의 프로그램 실행 속도를 높이기 위해, CPU와 메모리 사이에 설치되는 소량의 빠른 메모리, 고가의 메모리
※ 온칩 캐시 - CPU 내부에 설치되는 캐시
※ 옵치 캐시 - CPU 외부에 설치되는 캐시
- 캐시 메모리가 있는 경우 CPU는 캐시 메모리에서만 프로그램 실행 (실행하고자하는 프로그램과 데이터는 먼저 메모리에서 캐시로 옮겨져야 함)
장치들
- 키보드, 프린터, 스캐너 등
버스
- 하드웨어들이 데이터를 주고받기 위해 0과 1의 디지털 신호가 지나가는 여러 가닥의 선을 다발로 묶어 부르는 용어
- 버스의 종류 : 주소 버스, 데이터 버스, 제어 버스
- 주소
버스는 목적에 따라 구분
시스템 버스 입출력 버스 CPU, 캐시, 메모리 등 빠른 하드웨어들 사이에 신호 전송 상대적으로 느린 입출력 장치들로부터 입출력 데이터 전송 비유 : 고속도로 비유 : 일반도로
CPU
- 능동적 소자, 메모리 액세스 시 주소 발생
- 32비트 CPU, 32비트 운영체제, 32비트 컴퓨터
CPU에 32개 주소선
CPU가 액세스하는 주소 범위 : 0~ 2³² -1 번지
CPU가 최대 액세스할 수 있는 메모리의 크기 : 4GB
한 번지의 저장공간이 1바이트이므로, 2³² 바이트 = 4GB
32비트 CPU를 가진 컴퓨터에 4GB이상 메모리를 달아도 소용없음
CPU에 입출력되는 32개의 데이터 선 ( 한 번에 32비트 읽고 쓰기 가능 )
32비트 CPU는 32개 데이터선을 통해 32비트를 한 번에 메모리에서 읽고 쓰고 한 번에 32비트 더하기를 한다.
[참고]
-> 210 = 1KB
-> 220 = 210 x 210 = 1MB
-> 230 = 220x 210 = 1GB
-> 232 = 22 x 230 = 4 x 1GB = 4GB
- CPU와 메모리는 시스템 버스를 통해서 소통을 하면서 데이터를 주고 받는다.
- 메모리의 역할은 CPU에게 데이터를 전달하거나 CPU에서 처리된 데이터를 저장하는 역할을 한다.
- CPU와 메모리가 연결된 버스는 크게 3가지가 있다.
- 컨트롤 버스 : CPU가 메모리에게 데이터를 요청하거나 저장하라고 하는 정보를 주고받는 버스
- 주소 버스 : 메모리에서 해당 데이터의 주소 정보를 주고 받는 버스
- 데이터 버스 : 실제 주소에 저장되어 있는 데이터를 주고 받는 버스
1) 명령 처리 과정
CPU 레지스터들
- PC(Program Counter) - 다음에 실행할 명령의 메모리 주소 저장
- IR(Instruction Register) - 현재 실행하기 위해 메모리로부터 읽어 온 명령 저장
- SP(Stack Pointer) - 스택의 톱 메모리 주소 저장
- 데이터 레지스터들(data registers) - 연산에 사용될 데이터들을 저장
- 상태 레지스터(status register) - CPU의 상태 정보나 인터럽트 금지 등의 제어 정보 저장
- 기타 여러 레지스터 - 페이지 테이블이 저장된 메모리 주소를 가리키는 레지스터 등
명령어 사이클(Instruction cycle)
- CPU 하나의 명령을 실행하는 과정. CPU는 전원이 켜진 후 단순하게 명령 사이클 반복
명령어 사이클 사례 : 메모리 100번지에 저장된 다음 명령을 실행하는 사례
2) 명령 처리 과정 예시
- 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개 공간
- 코드 공간 - 프로그램 코드 적재
- 데이터 공간 - 전역 변수들이 적재되는 공간
- 힙 공간 - 프로그램 동적으로 저장할 데이터를 위한 공간
- 스택 공간 - 함수가 호출될 때 매개변수, 지역변수 등 저장
컨텍스트 : 프로그램이 실행 중인 일체의 상황 혹은 상황 정보 -> 메모리 (프로그램 코드와 데이터, 스택, 동적할당 받아 저장한 값)
- CPU 레지스터들의 값
- PC에는 코드의 주소
- SP에는 스택의 주소
- 다른 레지스터는 이전의 실행 결과나 현재 실행에 사용될 데이터들
축소정의 : 현재 CPU에 들어 있는 레지스터들의 값들
컨텍스트 스위칭
- 현재 실행중인 프로그램의 컨텍스트(CPU레지스터들의 값)를 저장
- 다른 프로그램의 저장된 컨텍스트(CPU레지스트들의 값)를 CPU에 복귀
- 발생
: 계층 간 독립성 확보를 위해
1) 응용프로그램
2) 운영체제
1) 응용프로그램
2) 응용프로그램에 대한 운영체제의 역할
3) 응응프로그램은 하드웨어를 사용하고자 할 때
4) 응용프로그램과 하드웨어 사이의 인터페이스
5) 응용프로그램들의 실행 순서 제어
6) 응용프로그램들 사이의 통신 중계
사용자는 응용프로그램을 통해 컴퓨터 활용 : 탐색기, 메모장 등
사용자에 대한 운영체제의 역할
- 사용자가 하드웨어에 관한 지식이 없어도 컴퓨터 다루기 용이
- 사용자가 하드웨어를 설치하거나 변경하는 것에 도움
- 사용자에게 컴퓨터 시스템을 사용할 때 편리한 인터페이스 제공 ( UI, 마우스, 음성 명령 등 )
- 컴퓨터의 사용을 돕는 여러 도구 응용프로그램(유틸리티) 제공 ( Windows 의 탐색기와 작업관리자 )
- 사용자 계정관리
- 사용자의 컴퓨터 사용 시간 계산, 과금 처리 등
운영체제
운영체제의 전체기능
1) 프로세스와 스레드 관리
2) 메모리 관리
3) 파일 관리 혹은 파일 시스템 관리
4) 장치 관리
5) 사용자 인터페이스
6) 네트워킹
7) 보호 및 보안
운영체제의 구성 요소와 커널
운영체제 구성
운영체제 = 커널 + 툴 + 디바이스 드라이버
1) 커널
2) 도구(tool) 소프트웨어와 GUI
3) 디바이스 드라이버
** 운영체제 커널 인터페이스 : 시스템 호출과 인터럽트
커널과 응용프로그램 사이의 인터페이스
응용프로그램에서 커널 기능을 사용할 수 있는 유일한 방법
- 시스템 호출 라이브러리를 통해 다양한 시스템 호출 함수 제공
- 예 : open(), close(), read(), write(), fork(), exit(), wait() 등의 시스템 함수 호출
커널과 하드웨어 장치 사이의 인터페이스
장치들이 입출력 완료, 타이머 완료 등을 CPU에게 알리는 하드웨어적 방법 (인터럽트 하드웨어 신호가 직접 CPU에 전달)
CPU는 하는 일을 중단하고 인터럽트 서비스 루틴 실행
- 인터럽스 서비스 루틴은 커널이 적재된 메모리 영역에 있는 코드
- 인터럽트 서비스 루틴은 일반적으로 디바이스 드라이버 내에 있음
예 : 키를 입력하면 커널의 키보드 인터럽트 서비스 루틴 실행, 키를 읽어 커널 버퍼에 저장
- 인터럽트 서비스 루틴의 실행을 마치면 하던 작업 계속
인터럽트 활용
- 운영체제가 장치에게 지시한 입출력 작업의 완료, 예고 없는 네트워크 데이터의 도착, 키모드나 마우스의 입력, 부족한 배터리의 경고등 장치와 관련된 모든 이벤트 처리
오늘 날 운영체제는 다중프로그래밍 운영체제
- 응용프로그램이 직접 컴퓨터 자원에 접근하면 충돌과 훼손 발생
다른 응용프로그램이 적재된 메모리 훼손 가능
다른 응용프로그램이 만든 파일 삭제 및 훼손 가능
응용 프로그램이 커널이 적재된 영역 훼손 가능
해결책
** 운영체제는 컴퓨터 메모리를 두 공간으로 분리
사용자 공간 크기
한 응용프로그램의 최대 크기
- 프로그램 코드 + 데이터(전역변수) + 동적할당 + 스택을 합친 크기
예 : 32비트 Windows 운영체제에서 사용자 공간 2GB -> 응용프로그램의 크기가 최대 2GB
사용자 공간의 주소 범위
- 응용프로그램은 운영체제가 설정한 사용자 공간의 주소 범위를 넘어설 수 없음
[참고]
Memory Management는 CPU가 가상주소체계를 통해 실제물리주소에 존재하는 프로그램을 읽고 실행시키기 위해 필요한 과정을 관리해주는 알고리즘을 말한다. 만약 MMU가 지원되지 않으면 물리메모리에 직접 접근해서 프로그램을 동작시켜야 하기 때문에, 가상메모리만으로도 물리 메모리를 신경쓰지 않고 해결할 수 있도록 해주는 것이 MMU이다.가상메모리를 통해 우리는 우리에게 실제로 할당된 물리메모리 이상을 사용할 수도 있고, 또한 메모리를 어떻게 할당해주어야 할지에 대한 고민없이 프로그래밍을 할 수 있다. 즉, 아래 3가지가 가능해진다.
1) 사용자가 기억장소를 일일이 할당하는 불편을 없애준다.
2) 프로세스의 크기가 실제 메모리의 총량을 초과해도 사용할 수 있다.
3) 설사 물리적 메모리의 용량이 충분히 크다고하더라도 다중 프로그래밍이 가능하다.그러니까, 실제적으로 각 프로그램의 일부만이 메모리로 계속 올라가는 것이므로, 어느 시점에서 보면 프로세스의 개수는 많다고 하지만, 실제로 메모리로 올라가는 크기의 총합은 결코 메모리를 초과하지 않는다. 그렇지 만들지 않는다. 설사 메모리가 가득차게 된다고 하더라도 swapping 기술이 적용되어 해결된다.
RAM 공간이 부족할 때 HDD에 파일 형태로 따로 확장하는 가상 메모리 공간
** CPU는 사용자 모드와 커널 모드 중 한 모드로 실행 (CPU 내부에는 모드 상태를 나타내는 모드 레지스터가 있음)
1) 사용자 모드
** 특권 명령 : 입출력 장치 등 하드웨어나 시스템 중단 등 시스템 관련 처리를 위해 설계된 특별한 명령
2) 커널 모드
3) 사용자 모드에서 커널 모드로 변경되는 경우
사용자모드 | 커널모드 | |
---|---|---|
CPU의 메모리 액세스 범위 | 사용자 공간에 국한, 커널 공간 액세스 불가 | 커널 공간을 포함한 모든 메모리 공간 |
CPU의 하드웨어 액세스 여부 | 불가 | 모든 하드웨어 액세스 가능 |
CPU가 처리 가능한 명령 | 특권 명령을 제외한 모든 CPU 명령 | 특권 명령을 포함한 모든 CPU 명령 |
오류 발생 시 처리 | 사용자 프로그램만 실행 종료. 시스템이 종료되지 않으므로 안전 | 시스템에 심각한 오류가 발생한 것으로 시스템 종료 |
** 특권 명령 : 커널 모드에서 실행할 특별한 목적으로 설계된 CPU 명령
1) I/O 명령
2) Halt 명령
3) 인터럽트 플래크 켜고 끄는 명령
4) 타이머 설정 명령
5) 컨텍스트 스위칭 명령
6) 메모리 지우기 명령
7) 장치 상태 테이블 수정 등의 명령
** 커널의 실체
커널은 부팅 시에 커널 공간에 적재 함수들과 데이터의 집합
- 커널은 컴파일된 바이너리 형태, 하드디스크 특정 영역에 저장
- 부팅 시에 커널 공간의 메모리에 적재
커널 코드는 함수들의 집합
프로세스나 스레드가 스택이나 힙 소유함
커널 공간에 스레드를 위한 스택이 만들어진다. 스레드가 커널 코드를 실행하고 있을 때 커널 스택 형성
커널의 존재
- 커널은 스스로 실행되는 코드(프로세스)가 아님
커널이 스케줄링 한다 -> (커널 속의)스케줄링 함수가 실행된다.
-응용프로그램이 활용하는 라이브러리는 2가지 유형
1) 함수 호출
사용자 공간에 적재된 함수가 다른 함수나 라이브러리 함수 호출
사용자 공간에서, 사용자 모드에서 실행
실행 과정
- 사용자 공간의 스택에 돌아올 주소, 매개변수 전달, 호출된 함수의 지역변수 생성
- 호출된 함수가 끝나면 함수를 호출한 곳으로 복귀
2) 시스템 호출
응용프로그램이 운영체제의 기능을 사용하고자 하는 경우
커널에 작성된 함수를 실행하고자하는 경우
시스템 호출 라이브러리에서 커널 기능 요청
사용자 모드에서 커널 모드로 변경된 후 커널 함수 실행
실행 과정
- 시스템 호출을 일으키는 특별한 기계 명령 실행 ( 커널 함수마다 매겨진 고유 번호 전달, 사용자 모드에서 커널 모드로 변경 )
- 커널의 시스템 호출 핸들러 실행 ( 이 핸들러가 커널 함수의 고유 번호를 분석하여 해당 커널 함수 호출 )
함수 호출 | 시스템 호출 | |
---|---|---|
메모리 영역 | 사용자 영역의 코드에서 사용자 영역의 함수 호출 | 사용자 영역의 코드에서 커널 함수 호출 |
CPU 실행 모드 | 사용자 모드 | 사용자 모드에서 커널 모드로 전환 |
비용 | 함수 호출에 따른 비용 | 커널 모드로 전환하는 등 함수 호출에 비해 큰 비용 |
1) 시스템 호출
사용자 공간의 코드에서 커널 서비스를 요청하는 과정
- 사용자 공간의 코드가 커널 함수를 호출하는 과정
- 커널 콜, 트랩으로도 불림
- 응용프로그램에서 커널 기능을 활용하도록 만들어놓은 기능
시스템 호출 라이브러리 제공
- 시스템 호출 함수 혹은 커널 API
- Unix/Linux 의 커널 API - open(), read(), write(), fork(), exit()
- Windows의 커널 API - CreateProcess(), WaitForSinlgeObject()
- 대략 200개 이상
시스템 호출을 일으키는 기계 명령
CPU마다 시스템 호출을 실행하는 특별한 기계 명령 제공
2) 사례
3) 라이브러리를 통해 간접적으로 이루어지는 시스템 호출
[참고 : 버퍼의 개념]
- 단순히 메모리상에 있는 값을 화면에 바로 출력하거나 입력한 값을 메모리상에 바로 저장하기전에 겉으로 보이지않는 버퍼(buffer) 라는 것을 통하게 된다. 버퍼란 사전적의미 그대로 데이터 전송시 양쪽의 속도차를 보완하기 위해 만들어진 개념이다. 버퍼가 없다면 컴퓨터는 바이트단위로 데이터를 읽거나 출력하기위해 메모리에 접근하는 횟수가 엄청나게 늘어나게되고 CPU에도 부하가 많이 걸리게 될 것이다. 그래서 버퍼라는 공간에 입출력할만큼 데이터를 받아놓고 전송하게 되는 것이다.
시스템 호출은 함수 호출에 비해 많은 시간 비용
- 시스템 호출을 많이 할 수록 프로그램 실행 속도 저하
파일에서 100바이트를 읽는 2가지 유형의 코드. 실행 비교 결과는?
1) 함수 호출 fread()와 시스템 호출 read() 비교
표준 라이브러리 함수, fread(fp, buf, size) 동작
- fread() 를 처음 호출하면 라이브러리 내 버퍼가 비어 있음
- read() 를 호출하여 라이브러리 내 버퍼를 채운다
- 라이브러리 버퍼에서 요청한 size 만큼 buf 로 복사한다.
- 라이브러리 버퍼가 비거나 부족하면 그때 read() 호출
시스템 호출 함수, read(fd, buf, size) 동작
- 시스템 호출을 이용하여 커널 코드 실행
- 커널 코드에서 디스크 읽기
- 라이브러리를 거치지 않고 바로 buf로 읽어들임
** 인터럽트 : CPU가 현재 하는 일을 중단하고 다른 일을 하도록 시키는 비동기적 방법
1) 하드웨어 인터럽트
2) 소프트웨어 인터럽트
3) 컴퓨터에서 인터럽트 활용
** 인터럽트 핸들러라고도 부른다.
위치 : 디바이스 드라이버나 커널 코드, 임베디드 컴퓨터 ROM
이 글이 문제가 된다면 삭제하겠습니다.