System Software와 ISA
System Software
= Instruction Set Architecture(ISA)에 의존적인 소프트웨어
- machine에 의존적인 성격
↔ 대칭 개념 = “어플리케이션”
cpu와 상관없이 사용자가 필요로 하는 일을 처리
운영체제(OS)
= 컴퓨터 시스템의 자원 (HW와 SW)를 관리
[ ex ] MS windows, Linux
- 넓은 의미의 시스템 소프트웨어
- 운영체제 제작자는 그 운영체제가 사용될 ISA를 알고 있어야 한다.
- os 시스템 개발자라고 하더라도 ISA를 모두 알 필요는 없다. → 요즘은 씨언어를 통해 프로그래밍한다.
컴파일러 / 어셈블러
= 고급 언어로 작성한 프로그램을 ISA에 맞게 기계어로 변환
[ ex ] 씨언어로 작성 → 컴파일러를 통해 object code → 어셈블러를 통해 기계어
Instruction
= 0과 1의 조합
컴퓨터가 이해가능한 유일한 언어
ISA에 따라 다르게 정의됨
ISA
= Instruction Set Architecture = 기계어 집합 구조 = cpu(기계)가 해석할 수 있는 기계어 set
[ ex ] 0101 = 더하는 거로 약속
- “하드웨어와 시스템소프트웨어의 인터페이스 (규약)”
- CPU ⇒ 0과 1의 조합 → ISA에 정의된 기계어로 해석 → 연산 실행
- 컴파일러 ⇒ 프로그래머가 작성한 소스코드 → 주어진 ISA에 맞게 기계어로 변환
ISA는 HW와 SW간의 추상적인 인터페이스로 Machine Language Program을 작성하기 위해 필요한 모든 정보를 말하며 단순히 Instructions의 집합뿐만 아니라 register, memory, access 등을 포함한 모든 정보를 일컫는다.
[c와 자바의 차이]
씨언어는 ISA를 건들이는 경우가 있음
씨언어로 운영체제가 만들어짐
자바
맥 os, 윈도우 상관없이 코드를 짠다고 해도 상관없다. → java 가상 머신이 해당 os에 맞는
머신이 자바를 돌릴 수 있는 모듈이 있기 때문에 알아서 사용한다. 알아서 컴파일, 어셈블을 해준다.
더 상위레벨 프로그램이라고 할 수 있다.
— 여기서 부터 다시 정리 —
하드웨어와 시스템소프트웨어
규약을 먼저 만들었다. (ISA)
이러한 규약을 가지고 하드웨어를 설계하거나 시스템 소프트웨어를 만든다.
예시) cpu가 intel칩이든 AMD이든 상관없이 MS라는 시스템 소프트웨어가 같으면 ISA를 이용하여 미리 규약을 정했기 때문에 ,설계했기 때문에 돌아간다.
하드웨어 구조
CPU
- ALU = 산술논리 연산자
- Register
- 저장하는 역할 (일종의 메모리)
- control unit
- 다른 장치를 통제하거나 메모리를 관리함
ex) ALU의 명령어를 받아서 io device를 통제하거나 메모리를 통제 한다.
Memory
데이터를 저장할 뿐만 아니라 instruction(명령어)를 저장하는 공간도 있다.
IO device
데이터를 입력하는 부분과 출력하는 부분을 담당
하드디스크 = 일종의 저장하는 역할( = input의 역할) + 저장 장치에 output도 할 수 있음
instruction 정의시 포함되는 것
계산이나 논리 연산을 담당하는 것 = ALU에서 내리는 명령어
operator = 수행할 연산 자체가 무엇인지 나타냄
하나의 instruction이라고 하는 것은 수행한 연산(더하기, 빼기 등)은 무엇인가를 나타내는 부분
operand : 연산의 입력과 출력 위치 지정
(피연산자) 어떤 것을 연산해야할지, 어디에 저장해야 할지
이때, 연산한 것을 cpu안에 있는 레지스터에 저장할 수 있고 메모리에 저장할 수 있다. 이러한 것을 control unit을 통해 통제하게 된다.
하나의 instruction = 64비트 컴퓨터라고 한다면 64비트 내에서 처리하게 된다.
연산자 + 연산 결과 (연산의 결과, 결과 저장 위치 ) + operand1(피연산자) + operand2
ex) operand1와 operand2를 더하는 연산을 통해 이런 결과를 register혹은 메모리에 저장할 것임
*여기서 operand1은 실제 값일수도 있고 주소값일 수도 있음
ISA를 정의할 때 연산자와 결과를 register에 저장하느냐 memory에 저장하느냐를 결정한다.
CPU와 메모리에서 일어나는 과정
1 instruction을 메모리에서 CPU로 읽어간다.
instruction에서 연산자, 피연산자 등의 정보가 있는데 해당 정보를메모리에서 읽어온다.
2 메모리에서 읽어온 것에 대해 의미 해석한다.
어떤 부분까지 연산자, 결과 저장 , 피연산자들인가
3 이를 가지고 ALU에서 연산을 수행한다.
operator 1은 메모리에서, operator2은 레지스터에서 각각 가져올 수 있음
4 연산한 결과를 레지스터에 저장할지 메모리에 저장할지 결정
- 이러한 과정들은 ISA에 따라서 문법이 다른 것이다. 하지만 대부분이러한 형식이다.
- ex) 어떤 것은 피연산자가 1개인 경우도 있고 어떤 경우는 3개인 경우도 있음 → CPU에 따라서 기계어가 다르다
기계어 정의에 포함되어 있지 않은 것
(1) 프로세싱 방법
저장공간(레지스터, 메모리)는 정의되어 있지만 기계어를 어떻게 수행할 것인가에 대해서는 포함되어 있지 않다.
(하드웨어에 따라서 어떻게 수행하는지에 대해서는 다르다. → sequential하게 처리 or pipelining하게 처리 )
*sequential = 순서대로 처리 - 하나의 instruction을 가지고 1234순서대로 먼저 다 처리하고 다음 instruction을 수행
*pipelining = sequential한 방법은 3, 4번하고 있을 때 ALU는 놀고 있기 때문에 비효율적임 → 놀지 않게 하나의 instruction을 끝낸 후에 실행하는 것이 아니라 중간에 다른 instruction을 수행함
컴터 자원을 효과적으로 사용할 수 있음 , 대부분 사용
ex) 자동차 분업화
-cpu clock에 따라 순서가 실행된다.
(2) cache memory
cache memory
메모리 처리 속도와 cpu처리 속도는 다르다(cpu는 너무 빠름)
→ 메모리에서 cpu정보를 읽어오거나 저장할 때는 병목 현상(대기 시간 길어짐)이 생긴다.
이러한 것들을 효과적으로 처리하기 위해서 cache memory 사용
많은 처리되는 것(instruction 명령어 등)을 cache memory를 통해 사용 = 미리 cache 메모리에 저장
→ cpu에서 메모리까지 가기에 오래 걸리기 때문에 많이 사용하는 연산자들을 미리 cache메모리에 저장
-장치를 쓰는 경우도 있지만 대부분 가상의 공간임
-컴퓨터 하드웨어를 설계할 때 cache를 이용하면 효율적으로 사용할 수 있기 때문에 사용하는 것이지 instruction내에서 cache를 쓸지 말지에 대한 부분은 담당하지 않는다. = instruction 정의에서는 cache메모리가 빠져 있다.
IO device
컴퓨터 내부에서 이것은 키보드로 보내달라고 하지 않음
키보드로 보내달라는 것들은 응용프로그램에서 출력하는 것이다.
이는 기계어 자체에서는 사용하지 않기 때문에 instruction정의에는 사용하지 않는다.
pipelining이나 cache메모리를 사용하는 이유는 컴퓨터를 효과적으로 사용해서 속도를 향상시키기 위함이다. (단순히 속도나 효율성을 위한 것이지 결과에는 전혀 영향을 주지 않는다. 그래서 instruction정의에는 포함되지 않는다)
ISA는 CPU와 연관되어 있기 때문에 CPU가 누가 만들고 어떤 회사에서 만들었는지에 따라서 종류가 여러 가지가 있다.
요즘은 유닉스보다는 리눅스를 많이 쓴다.
유닉스와 리눅스는 명령어는 같지만 cpu가 다르다.
리눅스는 intel칩을 많이 사용
-레지스터리 구조도 예전에는 작은 공간에서 처리 가능했는데 요즘 메모리가 기가까지 커지는 바람에 instruction에서 사용되는 연산자 길이도 커져야한다.
ISA 분류
요즘에는 이렇게 분류하는 게 크게 상관없어짐
리스크라는 칩은 유닉스에서 많이 사용하고 씨스크라는 칩은 주로 피씨에서 많이 사용한다.
(1) CISC
복잡한 기계 명령어
왜 피씨에서 복잡한 기계 명령어를 사용했을까? = 다양한 기계어가 존재, 기계어 해석이 매우 복잡하다.
(2) RISC
일종의 칩이다.
고정 길이 , 길이가 훨씬 더 작음
처리할 수 있는 연산자가 1개밖에 없음
ex) 바로 더할 수 없고 load를 거쳐야 함
빨리 처리하기 위해 사용
load를 통해 올리고 더하기를 수행해야지 빠르게 수행할 수 있음
load와 add를 분리해서 처리하기 때문에 파이프라이닝을 할 수 있다는 장점이 있다. (CISC는 바로 ADD하기 때문에 sequential하게 할 수 밖에 없음)
멀티테스킹이 가능 = CPU가 내가 하나의 레지스트리를 쓰고 있으면 다음번 명령어가 레지스트리를 건들이기가 쉽지 않은데 이렇게 다 로드하고 더하라고 한다면 로드와 ADD를 동시에 할 수 있음
-워크스테이션은 window에서 만든 서버용 os, 유닉스 머신
'CS > 컴퓨터 시스템' 카테고리의 다른 글
Chap 5. 컴퓨터 시스템 구조 (0) | 2022.05.19 |
---|---|
Chap 4. 운영체제란? (0) | 2022.05.18 |
Chap 3 - 3. static 라이브러리와 shared 라이브러리 (0) | 2022.05.14 |
Chap 3 - 2. 부분 컴파일 (0) | 2022.05.13 |
Chap 3. 고급 언어의 기계어 변환 및 실행 (0) | 2022.05.12 |