3장. 메모리와 디스크의 핵심 : 순차논리

이가을·2022년 10월 14일
0

출처들) 한권으로 읽는 컴퓨터 구조와 프로그래밍.
1. 깃헙에 그룹스터디로 책내용 정리하신 분들
2. velog에 책의 내용정리하신 분
3. 티스토리에 책내용 정리하신 분
4. 티스토리에 책내용 정리하신 다른분

2장에서 배운것은 조합논리.

조합논리는
	‘흐름을 따른다’. 즉 입력에 의해서만 출력이 결정됨.
	but 흐름의 일부분을 떼어내서 기억해 둘 수 없음.
입력의 현재상태만을 다룸

3장에서 배울것은 순차논리(sequential logic).
순차논리는
	순서(sequence)라는 말에서 비롯된 용어. ‘시간적으로 어떤 값 뒤에 오는 다른 값’
	입력의 현재상태와 과거상태를 함께 고려함.

순차논리를 알아보기 위해 여러가지기술을 과거로부터 현재까지 추적해볼것.

1. 시간 표현과 상태 기억

우리는 주기(periodic)함수를 사용해 시간을 측정할 수 있다.
	ex) 지구의 자전. 지구가 한바퀴를 다돌면 이를 하루라고 부름.

발진자

인버터(NOT을 수행하는 게이트)를 사용하는 트릭을 살펴보자.
	인버터는 논리회로에서 입력과 반대부호의 출력을 만드는 연산요소 혹은 회로라고 배웠다.
    
    

인버터의 출력을 입력에 연결하면

위의 사진처럼 보인다. 이런식의 연결을 되먹임(feedback)이라고 한다. 
	인버터의 출력은 다시 인버터의 입력으로 들어가며 이 입력은 다시 출력에 반영된다.
		0을 입력하면 인버터로인해 1로 뒤집히고, 입출력이 연결되어 있는 발진자에서
		1이 다시 입력이 되어 0으로 출력된다.
		이로인해 출력이 0과 1을 반복하고,이를 0과 1사이를 진동한다고 표현한다.
		이 값이 진동하는 속도는 전파지연에 따라 결정되며 온도에 따라 달라지는 경향이 있다.
		좀 더 안정적인 주파수로 진동하는 발진자가 있다면
			 더 정확히 시간을 측정할 수 있는 기준이 될 것이다.

	크리스털로 더 정확한 발진자를 만들 수 있다. 
		전극(즉, 전선)을 크리스털에 연결하고 크리스털을 압축하면 전기를 만들어낸다. 
		그리고 전극에 전기를 가하면 크리스털이 구부러진다. 
			이런현상을 피에조 전기(또는 압전)효과라고 부른다.

	크리스털 발진자는 
		전자적인 단극쌍투 스위치를 사용해 크리스털에 전기를 가해서 다시 전기를 얻어낸다.
		입력한 전기로부터 크리스털이 전기를 다시 만들어내는 시간은 예측이 가능하며
		매우 정확하다.

클록(clock) : 시간을 셀 수있게 해주는 신호

시간이 중요한 다른 저수준의 이유가 존재한다.
	cf) 컴퓨터에서 전자적/기계적 부품에 가까우면 더 저수준,
		 사용자나 프로그래머에 가까우면 더 고수준이라 한다.

2장에서 전파지연이 회로가 작업을 수행하는 속도에 미치는 영향을 배웠다.
	예를들어, 시간을 잴 수 있으면
		결과가 안정적이고 올바르다고 확신할 수 있는 시점이 될 때까지 
		최악의 경우를 가정해 가산기의 지연시간을 기다릴 수 있다.

발진자는 컴퓨터에 클록을 제공한다. 
	컴퓨터 클록은 밴드에서 드러머가 박자를 맞춰 드럼을 치는것과 같다. 
	클록은 회로의 페이스를 결정한다. 
	회로의 최대 클록속도나 가장빠른 템포는 회로의 전파지연시간에 의해 결정된다.

컴퓨터 컴포넌트 제작에는 여러가지 통계가 필요하다.
	컴포넌트를 이루는 부품들 사이에 편차가 크기 때문이다. 
	비닝(binning-바구니에 넣는다는 뜻)과정은 
		부품을 측정해서 그 특성에 따라 여러 다른 빈이나 무더기로 분류한다.
	지연시간이 짧아 빨리 반응가능한 부품은 가장 가격이 높은 빈에,
	더 느리고 더 싼 부품은 다른빈에 들어가며, 이런분류를 여러단계의 빈을 사용해 반복.
	더 작은 편차를 갖도록 부품을 빈에 나눠담는다.
	이런 이유로 부품의 전파지연시간을 표시할 때도 범위를 사용한다. 

일반적인 논리 회로 설계오류는 
	최댓값이나 최솟값을 사용하지 않고 전형적인 값을 사용하기 때문에 생긴다.
	오버클로킹 :
			통계적으로 빈의 중간정도에 위치하는 부품을 부품이 고장나지 않을 범위안에서		
            클록을 빠르게 공급하는 도박을 한다는 뜻.

(+10/17)

래치

[나의 부족한 설명을 보완해줄 다른분의 깔끔한 설명] 래치

시간을 표현하는 근원을 만들었으니 정보를 1비트 기억할 방법을 생각해볼 때다.

위 그림처럼 OR게이트의 출력을 입력에 묶는방식의 되먹임(feedback)을 사용하면
	정보를 기억할 수 있다.

이 회로는 값을 반전시키지 않기때문에 진동을 만들어내지는 않는다.
	ex) out이 0부터 시작한다고 가정하면
		in 이 1일때 out도 1이됨. 이제부터 out은 1로 유지됨.
		심지어 in이 0이 되어도 출력은 그대로 1로 유지됨.
		이 회를 자신의 과거상태를 기억한다. 

위의 회로의 out을 다시 0으로 만들기위해
	되먹임을 끊고 회로를 재설정(reset)할 방법이 필요하다.

위 그림에서 인버터의 출력을 reset위에 선을 그어 표현했다는 점에 유의.
	하드웨어 기호 위에 선을 그으면 반전을 뜻한다. 읽을때는 리셋 바라고 읽는다.		
    이말은 이값이 0일때 참, 1일때 거짓(우리의 상식과 반대)이며 액티브 로우라고 부른다.
	리셋바가 로우이면 리셋은 하이이므로 OR게이트의 출력은 OR게이트에 되먹임된다.
	리셋바가 하이가 되면 리셋은 로우가 되고 그에따라 되먹임이 깨지고 out은 0이된다.
    

위 그림은 S-R래치를 보여준다. set-reset
	이들은 보수출력(출력의 한쪽은 액티브하이 다른쪽은 액티브로우)을 제공한다. 
	set바와 reset바가 참(로우,0)인 경우는 두 출력이 모두 참이므로 이런입력은 사용하면 안됨
	두 입력이 모두 동시에 거짓(하이, 1)로 바뀌는 경우에는 
		전파지연시간에 따라 출력이 달라지기 때문에 결과를 예측할 수 없다.

S-R래치는 기본래치에 비해 설계가 대칭적이라는 좋은 특성이 있다. 
	회로가 대칭이기때문에 set과 reset신호의 지연시간이 거의 비슷하다는 뜻이다.

게이트가 있는 래치

S-R래치의 입력에 게이트를 한쌍 추가한 회로이다.
게이트바의 입력이 1이면 
	set바와 reset바가 어떤값이든 아무 관계없이 NAND회로에 1이 입력된다.

이 회로를 개선해 인버터를 추가한 게이트가 있는 D래치

이제 게이트바가 참(로우,0)일때 D가 1이면 Q출력이 1이된다.
set과 reset의 입력을 D하나로 묶은것. 따라서 D만입력하면, 각각의 OR게이트에 입력이 된다.
하지만 이 회로의 문제는 
	게이트바가 참(로우,0)인 상태에서는 D의 변화가 그대로 출력에 나타난다는 점

플리플롭

정말 잘 설명해주시는 플리플롭 설명

논리 수준이 특정 값에 머무는 동안 데이터를 잡아내는 것이 아닌,
한 수준에서 다른 수준으로 변화하는 중간에 데이터를 잡아내는 방법을 **에지**라고 부른다.
상승 에지, 하강 에지 중 하나를 선택하여 해당 변화가 일어날 때 D의 상태 변화를 감지한다.

논리 수준 사이의 전이는(0에서 1, 1에서 0) 정말 순식간에 일어난다.
이렇게 에지를 이용하여 변화하는 상태를 입력받아 비트를 저장하는 회로를
플립플롭이라고 부른다.

클록이 로우이거나 하이인 경우에는 D를 바꿔도 아무 일도 일어나지 않는다. 
클록의 신호가 0에서 1로 바뀌는 시점 혹은 1에서 0으로 바뀌는 시점에
	입력값(D)이 플립플롭에 저장된다. 
	플립플롭의 상태 변화 타이밍을 볼 때는 전파 지연외의 요소도 고려해야함.
		- 설정시간(셋업 타임) : 클록 에지가 발생((클록값이 0에서 1로 전이)하기 전에
        					  신호가 얼마나 안정적으로 유지되야 하는지를 나타내는 시간
        - 유지시간(홀드 타임) : 클록 에지가 발생한 이후에 신호가 얼마나 안정적으로 
        					  유지되어야 하는지를 나타내는 시간

D플리플롭의 스키매틱 기호

카운터

플립플롭을 응용한 회로 중에는 순서대로 수를 세는 카운터(counter)가 있다.
	예를 들어 디지털 시계를 만들고 싶다면 발진자에서 나온 시간을 세고, 
	그 값을 디코더에 공급해서 숫자를 표시하는 디스플레이를 제어하면 된다.

리플 카운터(ripple coutner) : 
	물에서 물결이 퍼져나가듯이 개수를 센 결과가 왼쪽에서 오른쪽으로 퍼져나가기 때문에 
	이렇게 부른다. 각 플립플롭의 D 입력이 자기 자신의 Q바 출력에 연결되어 있기 떄문에,
	 각 플립플롭은 자신의 CK 신호가 0에서 1로 전이될 때마다 상태가 바뀐다.


각 비트의 상태가 다른 비트의 상태 변화에 약간의 시차를 두고 바뀌기 때문에
	이 회로를 비동기 카운터(asynchronous counter)라고도 한다.
	상태 변화가 시차를 두고 일어나기 때문에 출력값이 나오는 시점을 예측하기 어려워, 
	원하는대로 동작하지 않는 경우가 생긴다.

왼쪽의 타이밍 다이어그램은 전파지연을 제대로 감안해 3비트 수를 세는 경우를 보여준다.
하지만 오른쪽은 전파지연이 허용하는 것보다 더 빠른속도로 입력을 변화시키는 경우이다.
	이때 출력이 틀리는 경우가 생긴다.

이러한 단점을 동기적카운터 synchronous counter)를 설계해서
리플 카운터의 타이밍 문제를 해결할 수 있다. (모든 플립플롭을 병렬로 연결)
리플 카운터와 달리 동기적 카운터는 상태 변경이 동시에 일어난다. 
	출력이 어느시점에 올바른지 알려면 전파지연을 여전히 고려해야 하지만,
	플립플롭을 연속적으로 연결해서 생기는 문제는 없어졌다.

카운터를 더 큰 회로를 만드는 기본 기능요소로 사용할 수 있다.
	따라서 카운터를 표현하는 별도의 스키매틱 기호가 있다.
	이 경우도 직사각형 박스로 카운터를 표현한다.

	이 그림에는 이전에 본적없는 새로운 입력이 몇가지 들어있다.
		카운터에 따라 이 입력 중 일부만 제공할 수도 있다.
		CLR입력 : 카운터를 0으로 되돌리는 입력. 
		EN입력 : 카운터를 활성화하는 EN입력.
				EN이 참이 아니면 카운터가 수를 세지 않음.
		U/D바 입력 : 1인경우 → 개수증가 / 0인경우 → 개수 감소
		LD신호 입력 : D(데이터 입력)와 카운터를 D입력에 지정한 값으로
        			설정카운터를 사용하면 시간을 셀 수 있다.

레지스터

D 플립플롭을 사용하면 더 많은 정보를 쉽게 기억할 수 있다.
값을 기억하기 위해 D 플립플롭을 사용하는 것은 아주 흔한 일이다.
레지스터 : 클록을 공유하는 여러 D 플립플롭을 한 패키지에 넣은 것

가산기 출력을 클록을 사용해 레지스터에 넣고 나면, 
	가산기의 입력을 바꿔도 결과는 바뀌지 않는다.
카운터에 있던 enable 입력 신호를 제공하는 경우도 자주 있다.

(+10/18)

2. 메모리 조직과 주소지정

비트를 하나 기억할 때  플립플롭이 유용하다는 사실을 봤고,
	레지스터를 사용하면 쉽게 여러비트를 저장할 수 있다는 사실도 배웠다.

하지만 훨씬 더 많은 정보를 저장해야 한다면 어떻게 해야할까?
	ex) 여러 덧셈결과를 저장해야하는 상황

일단은 레지스터를 많이 쌓아두는 것부터 시작할 수 있다.
	but 그럼 어떤 레지스터를 사용해야하는지 어떻게 지정하지?
	→  디코더를 기본요소로 사용해 
		각 레지스터에 번호를 부여한다. 이번호를 주소라고 한다.
		디코더의 출력을 레지스터의 입력을 활성화 하기위해 사용한다.

	다음으로는 지정한 주소에 해당하는 레지스터의 출력을 선택할 방법이 필요하다.
		→ 실렉터 사용
       
    시스템에서 여러 메모리 컴포넌트의 출력을 한 출력으로 연결해야 할 수도 있다.
		→ 트라이스테이트 출력이라는 또 다른 기본요소가 필요하다.

이 모든 요소를 한데 합하면 아래그립과 같은 메모리 컴포넌트가 만들어진다.

메모리 컴포넌트는 연결 지점이 아주 많다. 
	하지만 메모리를 동시에 읽고 쓸 필요가 있는 경우는 거의 없다는 사실을 활용해 연결을 줄였다.
	입력과 출력데이터 연결을 합치고 read/write바 제어 신호를 사용하면 연결을 줄였다.
	아래 그림은 단순화한 메모리의 스키매틱 기호를 보여준다.

	enable 제어신호는 메모리 전체를 켜거나 켜서 여러 메모리 칩을 함께 연결할 수 있게 해준다.
	그림에서 주소와 데이터에는 개별신호 대신 큰화살표를 사용한 것을 볼 수 있다.
		이런식으로 연관된 신호를 버스라고 부른다. 비트를 이동시키는 대량 교통수단이다.
		따라서 메모리 칩에는 주소버스와 데이터버스가 있다. 


메모리 칩을 패키지에 넣을 때 해결해야하는 다른문제는 메모리 크기가 늘어나면 
	주소로 연결해야할 비트 수도 많아진다는 점이다. 
	4GiB메모리 컴포넌트의 경우 32개의 주소연결이 필요하다.
	메모리칩은 격자로 관리되고 메모리칩 내부를 행(row)과 열(column)로 두덩어리로 나누어	
	이 둘을 조합해 주소를 지정한다.

물론 이 그림처럼 메모리가 16장소밖에 없다면 주소라인에 대해 고민할 필요가 없을 것이다.
하지만 훨씬 더 많은 메모리가 있다면 너무 많아지므로
행과 열 주소를 멀티플렉싱하여 주소라인의 수를 반으로 줄일 수 있다.
	이런식의 절약을 위해 추가로 필요한 것은 
	멀티플렉싱한 주소를 저장하기위한 레지스터 뿐이다.

		주소가 두 부분으로 나뉘어 들어오기 때문에, 한번에 한 부분씩만 변경할 수 있다면
		성능이 더 좋아질 수 있다. 
			예를 들어 행 주소를 먼저 지정하고, 열 주소만 변화시키면 좀 더 빨리 가능.
			오늘날 사용중인 대형 메모리 칩에서는 이런식으로 주소를 처리함.


	메모리칩은 깊이(depth) X 너비(width)로 크기를 표시한다.
		ex) 256X8칩은 너비(열의 수)rk 8, 깊이(행의 수)가 256개인 메모리 지점을 제공한다.

임의 접근 메모리(random access memory)

즉, RAM이라고 부른다. 
	RAM을 사용하면 메모리 위치 중 원하는곳은 어디든 원하는 순서로 쓰거나 읽을 수 있다.

	휘발성 메모리. 
		→ 전원이 끊어지면 데이터가 사라진다는 것.
	
    정적(static) RAM → SRAM
		비싸지만 아주 빠름. 각 비트에 트랜지스터가 6개들어감.
		트랜지스터가 공간을 차지하므로 많은 비트를 저장하기에 좋은 선택은 아님

	동적(dynamic) RAM → DRAM
		커패시터(capacitor)라는 아주 작은 버킷에 전자를 담고 트랜지스터 1개만 사용해 뚜껑을 닫음	
		문제는 버킷이 새기때문에 메모리를 갱신해야 한다는 점.
			즉, 버킷에 주기적으로 전자를 다시 채워넣어야 함.
			그래서 버킷에 전자를 채우는 시점과 버킷에 정보를 쓰는 시간이 겹치지않게 조심해야 함.
		집적도(밀도, 단위면적당 비트개수) 가 높기때문에 큰 메모리 칩에 사용됨.
			큰 메모리 칩이라는 말은 주소가 더 많다는 뜻이고 
				그에따라 주소 멀티플렉싱 방식을 사용해야한다는 뜻.

코어는 오래된 비휘발성 RAM으로, 비트를 토러스모양(도넛모양) 쇳조각에 저장한다.
	토러스가 한 방향으로 자화되면(자석이 아닌 물체가 자석의 성질을 갖는것) 0,
	반대방향으로 자화되면 1이다. 
	토러스는 도넛 바깥쪽의 전자기 간섭에 대한 저항력이 아주 크다는 멋진 물리적 특성이 있다.	
	코어에 담긴 정보를 읽는 유일한 방법은 코어의 자화상태를 바꾸려고 시도하고
	어떤 일이 벌어지는지 감지하는 방법뿐이므로 감지선이 필요. 

읽기 전용 메모리(read-only memory)

이름과 달리 한 번 쓰고(write-once) 나면 읽기전용이 되는 메모리 이다.
	전자레인지 같이 프로그램을 내장해야하는 장치에서 ROM이 유용.
	반찬 데울때마다 전자레인지를 다시 코딩하고 싶지는 않으니깐ㅋㅋㅋ

초기의 ROM

마스크 프로그래머블 ROM
	마스크는 집적회로 생산과정에서 사용하는 공판화를 뜻함.
	프로그램을 작성하고 비트패턴을 반도체 제조사에 보내면 
		마스크로 바꿔 칩을 만들어서 돌려줌.
		다른 마스크를 만들지 않고는 내용수정 불가하여 읽기전용 메모리.
	임의 접근이 가능(아무주소나 원하는대로 읽을 수 있음.

	단점 : 너무 비싸서 만들어야 하는 칩이 아주 많은 경우에만 사용가능
		
PROM(프로그래머블 읽기전용 메모리)
	직접 프로그래밍 할 수 있는 ROM. but 딱 한번만 프로그래밍 가능

EPROM(지울 수 있는 읽기전용 메모리)
	PROM과 비슷하지만 패키지 위쪽에 수정창이 있어
	자외선 빛 아래 EPROM넣어두면 저장된 내용 지울 수 있음

EEPROM(전기로 지울 수 이는 읽기전용 메모리)
	수정창도 없고 자외선도 필요없으나 지우는 과정이 느림.
	내부 데이터를 아무순서로나 읽고 쓸 수 있어 기술적으로는 RAM.
		but 데이터 쓰고 지우는데 오래걸리고 RAM보다 비싸서
		ROM을 대신하는 목적으로 사용됨.
        

(+10/19)

3. 블록 장치

디스크 또는 테이프 장치따위와 같이 한 순간에 하나의 블록을 단위로 하여
입출력 작업을 수행하는 장치.

대량 저장장치로 알려진 디스크 드라이브는 
많은 데이터를 저장하기 아주 좋은 장치다.
2021년 초 기준 8TB 3.5인치 디스크 드라이브 가격은 20만원 정도다.

디스크 드라이브는 
	중화요리집 식탁 중간에 있는 회전판과 비슷하게 생긴 자화된 판(platter)에 비트를 저장.
	식탁 회전판을 돌리다 원하는 음식이오면 손을 사용해 내 그릇에 옮겨담는것 처럼,
	디스크 드라이브에서는 디스크가 회전판 , 디스크 헤드가 손 역할을 한다.
	디스크의 영역을 자화시켜 데이터를 저장함.
	이로인해 디스크 드라이브는 코어메모리와 마찬가지로 비휘발성이다.

다른 유형의 메모리에 비해 상대적으로 느리다.
	방금 헤드를 지나간 데이터가 필요하면 한바퀴 돌때까지 기다려야 하기 때문.
	기록밀도와 속도를 맞바꿈. 
	속도는 느리지만 DRAM처럼 주소나 데이터 연결을 위한 공간은 필요가 없음.
기계부품이 시간이 지나면서 낡아지는 문제도 있음.
	회전축의 마찰을 줄여주는 베어링의 마모가 디스크 오류를 일으키는 주원인.

디스크의 내부모습.
	먼지가 들어가거나 표면이 오염되면 문제가 생기므로 봉인된 컨테이너 안에 들어있다.

자기 드럼: 이름 그대로 회전하는 원통에 헤드가 줄지어 있는 기억 장치(드럼통을 연상)
자기 테이프: 자화시킨 테이프를 감은 릴을 사용하는 또 다른 비휘발성 저장장치 기술
광학디스크: 데이터를 읽고 쓰기 위해 자성 대신 빛을 사용함. 
		   CD나 DVD가 광학 디스크에 속함(대량생산에 적합함!)
		   PROM처럼 한번만 쓸 수 있는 디스크도 있고(CD-R, DVD-R),
		   지우고 다시 쓸 수 있는 디스크도 있다. (CD-RW, DVD-RW)
	
    

광학 디스크의 일부를 확대한 모습.

profile
나는야 코린이

0개의 댓글