학교수업, CS/운영체제

버스, 버퍼, 캐시

빨대도둑 2023. 4. 12. 11:06

필수 자료구조

- : 대기 줄과 같은 큐는 먼저 들어온 큐는 먼저 들어온 자료구조가 먼저 처리되는 First in First Out의 자료구조이다. 큐의 구조는 파이프처럼 생겼으며, 한쪽 구멍으로 자료를 넣고 반대쪽 구멍으로 자료가 나오는 구조이다.

- 스택: 가장 나중에 들어온 자료가 가장 먼저 처리되는 자료구조이다. 스택인 밑이 막혀 있는 통 모양으로 뚫린 구멍으로 자료를 집어넣고 같은 구멍에서 자료를 빼낸다. 큐와 달리 스택에서는 한쪽으로만 입출력이 이루어진다.

- 배열: 형태가 같은 자료를 나열하여 메모리에 연속적으로 저장하는 것으로 배열로 테이블을 만들려면 배열의 크기를 먼저 선언해야 한다. 크기를 너무 많이 잡으면 낭비되는 공간이 생기고 너무 적게 잡으면 입력에 제한이 생긴다. 배열의 또 다른 문제는 데이터의 삽입과 삭제이다. 왜냐하면 순서대로 정렬하려면 이미 기록된 데이터를 뒤로 옮겨야 하기 때문이다. 이처럼 배열 방식은 간단히 구현할 수 있지만 공간의 삽입과 삭제 같은 관리가 어렵다는 것이 단점이다.

- 연결리스트: 배열의 단점을 해결한 것으로, 데이터를 포인터로 연결한다. 연결 리스트에서는 데이터를 중간에 삽입하는 것도 간단하다. 중간에 새로 삽입할 데이터가 있다면 메모리를 할당 받아 기존 리스트에 연결한다. 삭제할 데이터가 있다면 연결 리스트에서 빼낸 후 메모리를 반환한다.

=>배열 형태의 테이블은 크기가 어느정도 정해진 메모리나 파일 관리에 사용되고 연결 리스트는 데이터의 삽입과 삭제가 빈번한 테이블에서 주로 사용된다.

 

버스의 종류

=> CPU와 메모리, 주변장치 간에 데이터를 주고받을 때는 시스템 버스를 사용한다

- 제어버스: 다음에 어떤 작업을 할지 지시하는 제어 신호가 오고 간다. 메모리에서 데이터를 가져올지, 처리한 데이터를 옮겨 놓을지에 대한 지시 정보가 오고 가는데, 메모리에서 데이터를 가져올 때는 읽기 신호를 보내고 처리한 데이터를 메모리로 옮겨 놓을 때는 쓰기 신호를 사용한다.

- 주소버스: 메모리의 데이터를 읽거나 쓸 때 어느 위치에서 작업할 것인지를 알려주는 위치정보(주소)가 오고 간다. 주소 버스는 메모리 주소 레지스터와 연결되어 있으며 단방향이다. CPU에서 메모리나 주변 장치로 나가는 주소 정보는 있지만 주소 버스를 통해 CPU로 전달되는 정보는 없다.

- 데이터 버스: 메모리 버퍼 레지스터와 연결된 버스로, 데이터의 이동이 양방향으로 이루어진다. 제어버스가 다음에 어떤 작업을 할지 신호를 보내고, 주소 버스가 위치 정보를 전달하면 데이터는 데이터버스를 타고 목적지까지 이동한다.

 

버퍼란?

=> 두 장치 사이의 속도 차이를 완화하는 역할을 한다. 일정량의 데이터를 모아서 옮겨 속도 차이를 완화하는 장치이다.

스풀이란?

=> CPU와 입출력 장치가 독립적으로 동작하도록 고안된 소프트웨어 적인 버퍼

스풀러: 인쇄할 내용을 순차적으로 출력하는 소프트웨어로 출력 명령을 내린 프로그램과 독립적으로 작동한다.

버퍼와 스풀의 차이점: 버퍼를 공유하면 데이터가 버퍼에 다 차면 이동이 시작되지만, 스풀러는 1개의 인쇄가 끝날 때 까지 다른 인쇄물이 끼어들 수 없다.

 

캐시란

=> 메모리와 CPU간의 속도 차이를 완화하기 위해 메모리의 데이터를 미래 가져와 저장해두는 임시 저장소이다. 캐시는 필요한 데이터를 모아 한꺼번에 전달하는 버퍼의 일종으로 CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다 놓는다. 캐시는 빠른 속도로 작동하는 CPU와 느린 속도로 작동하는 메모리 사이에서 두 장치의 속도 차이를 완화해 준다

캐시히트: 캐시는 메모리의 내용 중 일부를 미리 가져오고 CPU는 메모리에 접근할 때 먼저 캐시를 방문하여 원하는 데이터가 있는지 찾아보는데, 캐시에서 원하는 데이터를 찾았을 때 캐시히트라고 하며 그 데이터를 바로 사용한다.

캐시 미스: 원하는 데이터가 캐시에 없으면 메모리로 가서 데이터를 찾는 것

 

hit rate를 높이는 방법

=> 컴퓨터의 성능을 높이려면 캐시 적중률이 높아야 한다.

- 첫 번째 방법: 캐시의 크기를 늘린다. 캐시의 크기가 커지면 더 많은 데이터를 미리 가져올 수 있어 캐시의 적중률이 올라간다.

- 두 번째 방법: 데이터를 가져오는 것이다. 이론적으로 현재 위치에 가까운 데이터가 멀리 있는 데이터보다 사용될 확률이 더 높다는 지역성 이론이 있다.

캐시에 있는 데이터가 변경되면 이를 반영해야 하는 문제도 있다. 캐시는 메모리에 있는 데이터를 임시로 가져온 것이기 때문에 캐시에 있는 데이터가 변경되면 메모리에 있는 원래 데이터를 변경해야 한다. 변경된 데이터를 반영하는 데에는 즉시쓰기와 지연쓰기 방식이 있다.

- 즉시 쓰기: 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식이다. 메모리와의 빈번한 전송으로 성능이 느려진다는 단점이 있지만, 항상 메모리의 최신 값이 유지된다.

- 지연 쓰기: 캐시에 있는 데이터가 변경되면 그 내용을 모아서 주기적으로 반영하는 방식으로 카피백이라고도 한다. 전송 횟수가 줄어들어 시스템 성능을 향상시킬 수 있지만, 메모리와 캐시 된 데이터 사이의 불일치가 발생할 수 있다.

 

저장장치의 계층구조

=> 저장장치의 계층 구조는 중복되는 데이터의 일관성을 유지하는 것이 문제이다. 내용을 즉시 반영하지 않고 일정기간 모았다가 한꺼번에 메모리에 반영하는 지연 쓰기의 경우에는 문제가 된다. 버퍼를 사용하는 하드디스크 같은 저장장치에서도 데이터의 일관성이 깨질 수 있다.

=> 속도가 빠르고 값이 비싼 저장장치를 CPU근처에 두고, 값이 싸고 용량이 큰 저장장치를 반대 쪽에 배치하여, 빠른 속도와 큰 용량을 동시에 사용한다.

 

폴링이란?

=>CPU가 직접 입출력장치에서 데이터를 가져오거나 내보내는 방식이다. 폴링 방식에서 CPU가 입출력 장치의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 데이터를 처리한다. 따라서 CPU가 명령어 해석과 실행이라는 본래 역할 외에 모든 입출력까지 관여해야 하므로 작업 효율이 떨어진다.

 

인터럽트란?

=>CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영함으로써 시스템의 효율을 높인다. 즉 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있다.

 

인터럽트의 동작과정

- CPU가 입출력 관리자에게 입출력 명령을 보낸다.

- 입출력 관리자는 명령받은 데이터를 메모리에 가져다 놓거나 메모리에 있는 데이터를 저장 장치로 옮긴다.

- 데이터 전송이 완료되면 입출력 관리자는 CPU에 완료 신호를 보낸다.

입출력 관리자가 CPU에 보내는 완료 신호를 인터럽트라고 한다. CPU는 입출력 관리자에게 작업 지시를 내리고 다른 일을 하다가 완료 신호를 받으면 하던 일을 중단하고 옮겨진 데이터를 처리한다. 또한 CPU는 입출력 관리자에게 여려 개의 입출력 작업을 동시에 시킬 수 있지만, 여러 작업이 동시에 완료되고 그 때마다 인터럽트를 여러 번 사용해야 하는데 매우 비효율적이라서 여러 개의 인터럽트를 하나의 배열로 만든 인터럽트 벡터를 사용한다.

 

직접 메모리 접근

=> 입출력이 필요할 때 CPU는 입출력 관리자에게 입출력 요청을 보내고 자신이 하던 일을 계속한다. 메모리는 CPU만 접근 권한을 가진 작업 공간이라 입출력 관리자는 접근이 불가능하다. 따라서 입출력 관리자에게는 CPU의 허락없이 메모리에 접근할 수 있는 권한이 필요한데, 이것을 직접 메모리 접근이라고 한다.  데이터 전송을 지시 받은 입출력 관리자는 직접 메모리 접근 권한이 있어야 CPU의 관여 없이 작업을 완료할 수 있다. 직접 메모리 접근은 인터럽트 방식의 시스템을 구성하는 필수 요소이다. 그러나 메모리가 복잡해진다. 메모리에 CPU가 사용하는 데이터와 입출력 장치가 사용하는 데이터가 섞여 있기 때문이다.

 

메모리 맵 입출력

=> CPU가 사용하는 메모리 공간과 직접 메모리 접근을 통해 들어오고 나가는 데이터를 위한 공간을 분리하는 것이다.

 

사이클 훔치기

=> CPU와 직접 메모리 접근이 동시에 메모리에 접근하려 한다면 누군가는 양보를 해야 하는데 보통은 CPU가 메모리 사용 권한을 양보한다. CPU의 작업 속도보다 입출력장치의 속도가 느리기 때문이다. CPU 입장에서는 직접 메모리 접근이 사이클(순서)를 훔쳐간 것이 되기 때문에 이러한 상황을 사이클 훔치기라고 한다.

 

단일프로세서 시스템

=> 프로세서 하나가 한 번에 하나의 작업을 처리할 수 있다. CPU의 클록을 높이거나 캐시의 크기를 늘려 시스템의 성능을 향상시킬 수 있다.

 

멀티프로세서

=> 컴퓨터의 성능을 높이기 위해서 프로세스를 여러 개 설치하여 사용하는 시스템이다. 프로세스마다 레지스터와 캐치를 가지며 모든 프로세서가 시스템 버스를 사용해서 메인 메모리를 공유한다. 많은 작업을 동시에 실행시킬 수 있다는 장점이 있다.

단일 프로세서를 멀티 프로세서 시스템으로 바꾸기 위해서는 하나의 칩에 CPU의 핵심이 되는 코어를 여러 개 만들어 여러 작업을 동시에 처리할 수 있는 멀티코어 시스템을 사용하면 된다.

 

CPU 멀티스레드

=>하나의 코어에서 여러 개의 명령어를 동시에 처리하는 것을 명령어 병렬처리라고 한다. 마치 하나의 주방에서 여러 개의 볶음밥을 조리하는 것과 같다. 여러 개의 스레드를 동시에 처리하는 방법을 CPU멀티 스레드라고 한다.

'학교수업, CS > 운영체제' 카테고리의 다른 글

교착상태  (0) 2023.04.12
프로세스 동기화  (0) 2023.04.12
스케줄링  (0) 2023.04.12
프로세스/스레드  (0) 2023.04.12
운영체제의 개요  (0) 2023.04.12