//구글콘솔 광고 추가가
운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나!
운영체제의 심장 "커널"
커널이란?
: 운영체제의 핵심 서비스를 담당하는 부분.
- 운영체제에는 속하는 데 커널에는 속하지 않는 기능 - 유저 인터페이스(UI; User Interface)
>> 사용자와 컴퓨터 간의 통로일 뿐 운영체제의 핵심 기능(커널)은 아님.

- 운영체제는 응용프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호.
응용프로그램이 자원에 접근하려면 운영체제에 도움을 요청(== 운영체제의 코드를 실행)해야 함.

 

이중모드와 시스템 호출
  •  이중모드 : CPU가 명령어를 실행하는 모드를 크게 사용자 모드커널 모드로 구분하는 방식.
사용자 모드 - 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드를 실행할 수 없는 실행 모드
- 자원 접근 불가
커널 모드 - 운영체제의 서비스를 제공받을 수 있는 실행 모드
- 자원 접근을 비롯한 모든 명령어 실행 가능
  • 시스템 호출: 운영체제 서비스를 제공받기 위해 커널 모드로 전환하는 방법. 커널 모드로 전환하여 실행하기 위해 호출, 일종의 소프트웨어 인터럽트. >> 시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사. 

커널모드와 사용자 모드를 왔다 갔다 하면서 실행

운영체제의 핵심 서비스
 프로세스 관리 프로세스 == 실행중인 프로그램. 수많은 프로세스들이 동시에 실행되고 있는데 이걸 관리해줌.
동시다발적으로 생성/ 실행/ 삭제되는 다양한 프로세스를 일목요연하게 관리해줌(프로세스와 스레드, 프로세스 동기화, 교착상태 해결 등등)
운영체제의 자원 접근 및 할당 - CPU (CPU스케줄링: 어떤 프로세스를 먼저, 얼마나 오래 실행할지)
- 메모리 (페이징, 스와핑 등등)
- 입출력장치 (인처럽트 서비스 루틴)
파일 시스템 관리 - 관련된 정보를 파일이라는 단위로 저장 장치에 보관.
- 파일들을 묶에 폴더(디렉토리) 단위로 저장장치에 보관.

 

728x90
모든 프로그램은 실행을 위해 자원을 필요로 한다.
운영체제란?
  • 실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램.
  • 운영체제는 커널 영역에 적재되는 프로그램.
메모리는 커널 영역과 사용자 영역으로 나뉜다.
- 커널 영역 : 운영체제
- 사용자 영역 : 응용프로그램(사용자가 특정 목적을 위해 사용하는 일반적인 프로그램 >> 메모장, 웹브라우져 등)

 

운영체제 - 메모리 관리, CPU 관리(누가 먼저 실행될지, 얼마나 오래 쓸지), 입출력장치 관리

>> 응용프로그램과 하드웨어 사이에 위치해서 연결해주는 프로그램.

 

운영체제 덕분에 개발자는 하드 웨어를 조작하는 코드를 직접 작성할 필요가 없다.
운영체제를 알아야 하는 이유

- 사용자를 위한 프로그램이 아님. 프로그램을 위한 프로그램! 그렇기에 프로그램을 만드는 개발자는 운영체제를 알아야 한다!! 오류메세지에 대한 깊은 이해로 문제 해결 능력이 높아질 수 있음.

728x90
주기억장치의 종류에는 크게 RAM과 ROM 두가지가 있으며,
메모리라는 용어는 그중 RAM을 지칭하는 경우가 많음.
RAM의 특징

: 전원이 꺼지면 저장된 내용이 날아감.

- RAM은 휘발성 저장 장치, 보조기억장치는 비휘발성 저장 장치.

 

RAM의 종류
DRAM(Dynamic RAM) 저장된 데이터가 동적으로 사라지는 램. 데이터 소멸을 막기 위해 주기적으로 재활성화 해야 함. 
상대적으로 소비전력이 낮고 저렴하고, 집적도가 높아 대용량으로 설계하기 용이하기 때문에 실제로 메모리로 사용되는 램.
SRAM(Static RAM) 전원이 연결되어 있다면, 저장된 데이터가 정적인(사라지지 않는) RAM.
DRAM보다 일반적으로 입출력 속도가 빠름.
상대적으로 소비 전력이 높고 가격도 높고, 집적도가 낮아 대용량으로 설계할 필요는 없으나 빨라야 하는 장치에서 사용. 캐시메모리에서 사용되는 RAM.
SDRAM
(Synchronous DRAM)
DRAM의 발전된 램 >> 특별한(발전된 형태의) DRAM. 클럭 신호와 동기화된 DRAM.
DDR SDRAM
(Double Data Rate SDRAM)
특별한(발전된 형태의) SDRAM, 최근 가장 대중적으로 사용하는 RAM. 
대역폭을 넓혀 속도를 빠르게 만든 SDRAM. 대역폭은 데이터를 주고받을수 있는 길의 너비

 

  DRAM SRAM
재충전 필요함 필요없음
속도 느림 빠름
가격 저렴함 비쌈
집적도(오밀조밀 꽉꽉) 높음 낮음
소비 전력 적음 높음
사용 용도 주기억장치(RAM) 캐시메모리

 


메모리의 주소 공간

(물리 주소 & 논리 주소)

CPU와 실행중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 알고 있을까?
NO.
메모리에 저장된 값들은 시시각각 변하기 때문.
- 새롭게 실행되는 프로그램은 새롭게 메모리에 적재
- 실행이 끝난 프로그램은 메모리에서 삭제
- 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라짐.

이러한 점을 극복하기 위해 주소 체계를 물리주소와 논리 주소로 나눈다. 
물리 주소 논리 주소
메모리 입장에서 바라본 주소
말 그대로 정보가 실제로 저장된 하드웨어상의 주소
CPU와 실행 중인 프로그램 입장에서 바라본 주소.
실행중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소
물리 주소와 논리 주소의 변환
CPU와 메모리 사이에 있는 MMU(메모리 관리 장치)라는 하드웨어에 의해  논리주소는 물리 주소로 변환.
CPU가 이해하고 실행하는 주소는 전부 논리주소.
MMU는 논리주소와 베이스 레지스터(프로그램의 기 주소, 시작 주소)값을 더하여 논리 주소를 물리 주소로 변환함. 

*베이스 레지스터 : 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장하는 셈.
*논리 주소 : 프로그램의 시작점으로 부터 떨어진 거리 인 셈.
CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안됨.

 

메모리 보호 기법

1. 한계 레지스터 :

- 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막음.

- 베이스 레지스터가 실행중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장.

2. 주소범위 제한:

- 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상에서부터 베이스 레지스터 값에 한계 레지스터 값을 더한 값 미만까지로 제한된다.

- 베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값 

>> CPU는 메모리에 접근하기 전, 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.
만약 검사를 했는데 논리 주소가 한계레지스터가 크면 인터럽트(트랩)를 발생시킨다.
이런 메모리 보호 기법을 통해 실행중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호한다.

 


 

 

CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 느리다.  

 

저장 장치 계층 구조(memory hierarchy)
: CPU에 얼마나 가까운가를 기준으로 계층적으로 나타낼수 있음

1. CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.

2. 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다. 

메모리 저장 장치 계층 구조

캐시 메모리

- CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM기반의 저장장치

- CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생.

- CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리니, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 쓰자.가 캐시메모리의 취지.

메모리에 접근  ==  물건을 사러가는 것이라 생각하면,
메모리 == 물건은 많지만 집(CPU)과는 멀리떨어져 있어 왕복이 오래 걸리는 대형 마트
캐시메모리 == 물건이 많지는 않아도 집(CPU)과 가까이 있는 편의점 이라 생각해보면 된다. 

 

캐시메모리는 하나가 아님. 계층적으로 구성할수 있음. CPU내부에 있을수도 외부에 있을 수도 있음.

계층적 캐시 메모리(L1 - L2 - L3 캐시) - 일반적으로 L1캐시와 L2캐시는 코어 내부에, L3캐시는 코어 외부에 있다.

L3캐시의 용량은 메모리보다 작지만, L1과 L2캐시보단 크다. 

계층적 캐시 메모리까지 반영한 저장 장치 계층 구조

참조 지역성의 원리
: CPU가 미래에 원하는 데이터를 예측하여 속도가 빠른 장치인 캐시 메모리에 담아 놓는데 이때의 예측률을 높이기 위하여 사용하는 원리 >> CPU가 사용할 법한 데이터를 예측하는 방법.

- 캐시 메모리는 메모리보다 용량이 작다. 당연하게도 메모리의 모든 내용을 저장할 수 없다.

따라서, CPU가 자주 사용할 법한 내용을 예측하여 저장함.

캐시 히트 예측이 들어맞을 경우(자주 사용할 것으로 예측한 데이터가 실제로 들어맞아 CPU가 캐시메모리에 저장된 값을 활용할 경우)
>> 이 경우엔 메모리에 접근하는 것보다 성능이 높아짐
캐시 미스 예측이 틀렸을 경우(자주 사용할 것으로 예측하여 메모리에 저장했지만 예측이 틀려 CPU가 메모리에 접근해야 하는 경우) 
>> 성능 하락!
캐시 적중률 캐시 히트 횟수 / (캐시히트횟수 + 캐시미스 횟수)
>> 적중률이 높으면 높을 수록 성능 높아짐.
참조 지역성의 원리란, CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리.

CPU의 주된 경향 2가지
- CPU는 최근에 접근 했던 메모리 공간에 다시 접근하려는 경향(시간 지역성)이 있다.
- CPU는 접근한 메모리 공간 근처를 접근하려는 경향(공간 지역성)이 있다. 
728x90

명령어 집합구조( Instruction set architecture, ISA )

: CPU가 이해할 수 있는 기계어 명령어들의 집합

명령어 집합(구조)
: CPU의 언어인 셈이며, 명령어가 달라지면 명령어의 해석방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성 등등
많은 것들이 달라진다.

- 소프트웨어와 하드웨어 사이의 약속이다 라고 볼 수도 있다.

- 하드웨어와 시스템 소프트웨어 사이의 인터페이스를 정의하며, 최하위 레벨의 프로그래밍 인터페이스로서 CPU가 실행할 수 있는 모든 명령어를 포함한다.

 

명령어 집합의 두 축 : CISC & RISC
CISC( Complex Instruction Set Computer )
: 복잡한 명령어 집합을 활용하는 CPU

- 복잡하고 다양한 명령어를 활용, 명령어의 형태와 크기가 다양한 가변길이 명령어를 활용.

- 다양하고 강력한 명령어를 활용, 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있음.

메모리를 최대한 아끼며 개발해야 했던 시절엔 인기가 좋았음.
BUT, 가변길이 명령어를 사용하므로 명령어 파이프라이닝이 불리하다는 치명적인 단점이 존재.
: 명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기 까지의 시간이 일정하지 않음.
복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기 필요.
대다수의 복잡한 명령어는 사용 빈도가 낮음. 

일반적으로 하드웨어 스택(Stack)이 내장되어 있으며, 서브루틴의 return 주소나 파라미터, 지역변수 등을 저장하는 데 사용된다. 따라서 call, push, pop 같은 명령어를 통해 스택 데이터를 관리할 수 있다.

 

RISC( Reduced Instruction Set Computer )
: 명령어 집합의 수를 줄여 하드웨어 구조를 간단하게 만든 CPU

- 명령어의 종류가 적고, 짧고 규격화된 명령어 사용.

- 단순하고 적은 수의 고정 길이 명령어 집합을 활용.

 짧고 규격화된 명령어를 사용하여 명령어 파이프라이닝에 유리.
: 메모리 접근을 최소화하고 많은 범용 레지스터를 사용하므로 속도가 빠르며, 전력소모가 적고 가격이 저렴.
다만 명령어 종류가 CISC보다 적어서 더 많은 명령어로 프로그램을 동작시킴.

CISC와 달리 스택 관련 명령어가 존재하지 않기 때문에 서브루틴의 return 주소나 파라미터, 지역변수 등은 소프트웨어적으로 처리해야 한다.

 

CISC와 RISC 정리
CISC RISC
복잡하고 다양한 명령어 단순하고 적은 명령어
가변 길이 명령어 고정 길이 명령어
다양한 주소 지정 방식 적은 주소 지정 방식
프로그램을 이루는 명령어의 수가 적음 프로그램을 이루는 명령어의 수가 많음
여러 클럭에 걸쳐 명령어 수행 1 클럭 내외로 명령어 수행
파이프라이닝 하기 어려움 파이프라이닝 하기 쉬움

 

728x90
어떻게 시간을 알뜰살뜰하게 쓰면서 명령어들을 빠르게 처리할 수 있을까?
명령어 파이프라인
: 순차적으로 명령어를 처리함.
명령어 인출 >> 명령어 해석 >> 명령어 실행 >> 결과 저장 
-같은 단계가 겹치지만 않으면 CPU는 각 단계를 동시에 실행할수 있다. >> 동시에 여러 개의 명령어를 겹쳐서 실행

ex>>
명령어 1  인출 >> 해석 >> 실행 >> 저장
명령어 2                인출 >> 해석 >> 실행 >> 저장
명령어 3                              인출 >> 해석 >> 실행 >> 저장

명령어 파이프라인이 성능향상에 실패하는 경우, 제대로 병렬처리가 되지 않는 경우 >> 파이프라인 위험이라 함.
파이프라인 위험에는 데이터 위험, 제어 위험, 구조적 위험이 있다.

데이터 위험 명령어 간의 의존성으로 인해 아직 수행되지 않은 명령어의 결과값을 참조함으로써 발생하는 위험.
모든 명령어를 동시에 처리할 수는 없다.
(이전 명령어를 끝까지 실행해야만 비로소 실행 할 수 있는 경우)
제어 위험 프로그램 카운터의 갑작스로운 변화로 발생하는 위험.
구조적 위험  서로 다른 명령어가 같은 자원(ALU, 레지스터 등)에 접근함으로써 발생하는 위험
- 슈퍼 스칼라: CPU내부에 여러개의 명령어 파이프라인을 포함한 구조 (오늘날의 멀티스레드 프로세서)
: 이론적으로는 파이프라인 개수에 비례하여 처리 속도가 증가해야 하는데, 현실적으로는 관리해야 하는 파이프라인도 증가를 하고, 파이프라이 위험도의 증가도 있어서 파이프라인 개수에 비례하여 처리 속도가 증가하진 않음.

 

비순차적 명령어 처리( Out-of-Order Execution, OoOE)

:파이프라인의 중단을 방지하기 위해 명령어를 순차적으로 처리하지 않는 명령어 병렬 처리 기법. 

BUT, 아무 명령어가 순서를 바꿀 수는 없다. 전체 프로그램 실행 흐름에 영향이 없어야 함. 

728x90

코어와 멀티 코어

코어(core)란?
: CPU내에서 명령어를 실행하는 부품
현대적인 관점에서 "CPU"라는 용어를 재해석해야 함.
전통적으로 명령어를 실행하는 부품은 원칙적으로 하나만 존재.
그러나, 오늘날 CPU에는 여러개가 존재.
CPU안에서 명령어를 인출하고 해석하고 실행하는 부품 == 오늘날의 "코어"

싱글 코어 == 하나만 있는 코어.
멀티코어 == 두개 이상의 코어.
멀티코어 프로세서 == 여러 개의 코어를 포함하고 있는 CPU.

코어수에 비례해서 CPU의 속도가 증가하는 건 아님.


스레드와 멀티 스레드

스레드(thread)란?
: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
스레드는 하드웨어적 스레드와 소프트웨어적 스레드가 있다.
- 하드웨어 스레드( 논리 프로세서라고도 함): 하나의 코어가 동시에 처리하는 명령어 단위. 
- 소프트웨어 스레드: 하나의 프로그램에서 독립적으로 실행되는 단위.
1코어 1스레드 CPU도 여러 소프트웨어적 스레드를 만들 수 있다.

 

멀티스레드(multi thread)란?

: CPU의 최대 활용을 위해 프로그램의 둘 이상을 동시에 실행하는 기술.


강의를 듣다가 하드웨어 스레드와 프트웨어 스레드에 대해 궁금해져서 더 찾아보았는데,

더 쉽게 이해 할수 있는 글을 읽었다.

 

'4코어 8(하드웨어) 스레드라는 것은, 상하권이 나뉜 4세트의 책과 같습니다. 이 4세트를 가지고 도서관에서 100명의 사람에게 빌려 줄 수 있습니다. 비록 한 번에 읽을 수 있는 사람은 8 사람 (소프트웨어 스레드) 밖에 없지만요.'

 

스레드들을 공부하다가 잘 정리된 블로그가 있어서 추가해둔다.

싱글스레드와 멀티스레드 참고 블로그

https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj

728x90

레지스터란?

CPU 내부의 작은 임시 저장 장치이며,

프로그램 속 명령어 & 데이터는 실행 전 후로 관련된 값들이 레지스터에 저장된다.

 

반드시 알아야 할 레지스터의 종류
1 프로그램 카운터 메모리에서 가져올 명령어의 주소를 저장 (메모리에서 읽어 들일 명령어의 주소)
>> Instruction Pointer(명령어 포인터) 라고도 부르는 cpu도 있음
2 명령어 레지스터 해석할 명령어를 저장 (방금 메모리에서 읽어 들인 명령어) >> 제어장치가 해석
3 메모리 주소 레지스터 메모리의 주소 저장 >> CPU가 읽어 들이고자 하는 주소를 주소버스로 보낼때 거치는 레지스터
4 메모리 버퍼 레지스터 메모리와 주고 받을 값을 저장(데이터와 명령어) >> CPU가 정보를 데이터 버스로 주고 받을떄 거치는 레지스터
5 플래그 레지스터 연산 결과 또는 CPU 상태에 부가적인 정보를 저장
6 범용 레지스터 다양하고 일반적인 상황에서 자유롭게 사용(주소, 명령어, 데이터 등 다양하게 저장 가능)
7 스택 포인터 주소 지정에 사용 스택 주소 지정 방식: 스택과 스택 포인터를 이용한 주소 지정 방식
스택 포인터: 스택의 꼭대기를 가리키는 레지스터. (스택이 어디까지 차 있는지에 대한 표시 같은거.)
8 베이스 레지스터 주소 지정에 사용 번위 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소 얻기. 
상대 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 프로그램 카운터의 값을 더하여 우효 주소 얻기.
베이스 레지스터 주소 지정 방식: 오퍼랜드 필드의 값(변위)과 베이스 레지스터(기준 주소)의 값을 더하여 유효 주소 얻기.

명령어 사이클과 인터럽트 ★ ★ ★

명령어 사이클

- 명령어 사이클이란, 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데 이 주기를 말함.

인출 사이클 : 가장 먼저 CPU를 갖고 온다.
실행 사이클:  가지고 온 걸 실행한다.
인출 >> 실행 >> 인출 >> 실행... (반복). 
but, CPU로 명령어를 가지고 와도 바로 실행이 불가능한 경우도 있음.
이러한 메모리 접근이 더 필요한 경우엔 간접 사이클이 추가됨.
인출>> 간접 >> 실행 >> 인출 >>...(반복)

인터럽트가 발생했을 경우, 인터럽트 사이클 추가 됨.
인출 >> 간접 >> 실행 >> 인터럽트 >> 인출...(반복)
인터럽트
: 정해진 흐름대로 명령어를 처리하려는 CPU의 흐름을 끊어 버리는 행동을 함.

- 인터럽트(interrupt): 방해하다, 중단시키다.

- CPU가 꼭 주목해야 할 때이거나, CPU가 얼른 처리해야 할 다른 작업이 생겼을 때 발생.
ex>> 헤이헤이, 급해 급해!! 지금 하던 거 일단 멈추고 이것부터 실행해 줘!!
-인터럽트의 종류 :
1. 동기 인터럽트(예외) : CPU가 예기치 못한 상황을 접했을 때 발생.
 -동기 인터럽트의 종류 : 폴트, 트랩, 중단, 소프트웨어 인터럽트.
2. 비동기 인터럽트(하드웨어 인터럽트) : 주로 입출력장치에 의해 발생. 알림과 같은 역할(쿠쿠밥다됨 알림 같은 거)
하드웨어 인터럽트에 대해 더 자세하게 알아보자.
:  알림과 같은 인터럽트.

- 입출력 작업 도중에도 효율적으로 명령어를 처리하기 위해 하드웨어 인터럽트 사용.

- 입출력장치는 CPU에 비해 느리다.
  인터럽트가 없다면 CPU는 명령 완료 여부를 확인하기 위해 주기적으로 확인해야 됨.
>> 그렇기 때문에 인터럽트를 이용해 입출력 작업동안 CPU가 다른 일을 할 수 있게 함.
하드웨어 인터럽트의 처리 순서
:인터럽트의 종류와 상관없이 인터럽트 처리 순서는 비슷함.
  1. 입출력 장치는 CPU에 인터럽트 요청 신호를 보냄.(입출력 장치들이 "지금 껴들어가도 되나요?" 하는 요청신호)
  2. CPU는 실행 사이클이 끝나고 명령어를 인출하기 전에 항상 인터럽트 여부를 확인함.
  3. CPU는 인터럽트 요청을 확인하고 플래그 레지스터에 있는 인터럽트 플래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인. >> 하드웨어 인터럽트에는 모든 인터럽트를 인터럽트 플래그로 막을 수 있진 않아. 막을수 있는 인터럽트와 막을수 없는 인터럽트로 나뉨
  4. 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업(스택영역에 백업)함.
  5. CPU는 인터럽트 벡터*를 참조하여 인터럽트 서비스 루틴*을 실행함.
  6. 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개.

* 인터럽트 벡터 : 각각의 인터럽트를 구분하기 위한 정보.

* 인터럽트 서비스 루틴 :

인터럽트가 발생했 을 때 해당 인터럽트를 어떻게 처리하기 위한 프로그램. 프로그램이기에 메모리에 저장.

ex> 키보드가 인터럽트 요청을 보내면 이렇게 행동해야 함.

CPU가 인터럽트를 처리한 다라는 의미 >> 인터럽트 서비스 루틴을 실행하고, 본래 수행하던 작업으로 다시 되돌아온다.(+ 그리고 인터럽트의 시작 주소는 인터럽트 벡터를 통해 알 수 있다.)

728x90
ALU와 제어장치
  • ALU: 계산하는 장치
  • 제어장치 : 제어 신호를 발생시키고 명령어를 해석하는 장치

ALU, 제어장치가 내보내고 받아들이는 정보가 각각 무엇인지 알아보자.

ALU 가 받아들이는 정보와 내보내는 정보
-  ALU는 레지스터로부터 피연산자를 받아들이고, 제어장치로부터 제어 신호를 받아들인다.
레지스터에겐 피연산자를, 제어장치에겐 제어신호를 받아들이는데, 이것은 계산을 하기 위해 피연산자와 수행할 연산(제어신호)이 필요하기 때문이다. 이걸 통해서 연산값을 수행하고 결과값을 레지스터에 담는다.


- ALU는 위에서 말한 결과값(컴퓨터가 이해할 정보)의 정보를 레지스터에 담는다(메모리가 아닌 레지스터에 담는 이유는 cpu가 메모리에 접근하는 속도보다 레지스터에 접근하는 속도가 더 빠르기 때문).
- 플래그를 내보내기도 하는데, 연산결과에 대한 부가 정보 플래그라 하며 이 플래그를 내보내서 플래그 레지스터에 담는다.

 

플래그의 종류 
플래그 종류 의미 사용 예시
부호 플래그 연산한 결과의 부호를 나타낸다. 부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미.
제로 플래그 연산 결과가 0인지 여부를 나타낸다. 제로 플래그가 1일 경우 연산 결과는 0.
0일 경우 연산 결과는 0이 아님을 의미.
캐리 플래그 연산 결과 올림수나 빌림수가 발생하는 지를 나타낸다. 캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미
오버플로우 플래그 오버플로우가 발생했는지를 나타낸다. 오버플로우 플래그가 1일 경우 오버플로우가 발생했음을 의미, 0일 경우 발생하지 않았음을 의미.
인터럽트 플래그 인터럽트가 가능한지를 나타낸다. 인터럽트 플래그가 1일 경우 인터럽트가 가능함으 의미하고, 0일 경우 인터럽트가 불가능함을 의미.
슈퍼바이저 플래그 커널 모드로 실행 중인지, 사용자 모드로 실행중인지를 나타낸다. 슈퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미.

 

제어장치가 받아들이는 정보와 내보내는 정보
- 제어장치는 클럭신호를 받아들인다.
: 클럭은 컴퓨터의 모든 부품을 일사불란하게 움직일 수 있게 하는 시간 단위. 클럭신호의 단위에 맞춰 명령어들이 수행됨.
- 해석할 명령어를 받아들인다. 
: 명령어 레지스터에 저장되어 있는 해석할 명령어를 받아들인다.
- 플래그를 받아들인다.
: 명령어를 해석할때 이 명령어가 음수인지 양수인지 등을 알아야 되서 플래그 값도 받아 들임.
- 제어신호를 받아들인다.
: 외부로 부터 제어신호가 발생했다면 어떤 신호인지 제어장치가 받아들이게 됨.


- 제어장치가 내보내는 정보는 제어 신호를 내보낸다.
cpu 내부에 전달하는 제어 신호(레지스터,  ALU가 보내는)와 외부에 전달하는 제어신호(메모리, 입출력장치가 보내는)로 나뉨.

 

728x90

+ Recent posts