컴퓨터 시스템의 동작 원리 (1/3)에서 이어진다.
5. 입출력 구조
입출력(I/O)란 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것을 말한다.
- 동기식 입출력(Synchronous I/O)
- 어떤 프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 것을 말한다. 예를 들어 디스크에서 어떤 것을 읽어오라는 요청을 받으면 그 디스크 입출력이 완료될 때까지 그 프로그램의 다음 명령을 수행하지 않고 기다린다. 그러다가 입출력이 완료되어 인터럽트가 발생되면 그제서야 cpu 제어권이 그 프로그램에게 넘어가서 다음 명령을 수행할 수 있게 된다. 따라서 I/O가 끝날 때까지 CPU를 낭비시키며 매 시점 하나의 I/O만 일어날 수 있게 된다. 이것이 동기식 입출력의 구현 방식 1이다.
- 또 다른 구현 방법으로는 CPU를 다른 프로그램에게 넘겨주는 것이다. 어차피 CPU 갖고있어봤자 놀릴건데 굳이 I/O작업이 완료되길 기다리고 있는 프로그램에게 줄 필요 없이 CPU를 필요로 하는 다른 프로그램에게 준다는 방식이다. 그럼 I/O 요청을 한 프로그램은 I/O 처리를 기다리는 줄에 세우고 이 프로그램의 상태를 blocked state로 바꾼다. 왜 상태를 바꾸어야 하냐면 입출력 요청의 동기화를 위해 (동기성: Synchronization) 장치별로 큐(queue)를 두어 요청한 순서대로 처리할 수 있도록 한다. 만약에 A 프로그램이 디스크의 1을 3으로 바꾸는 입출력 연산을 요청했는데 B가 우연히 그 1을 +1하는 연산을 수행한다고 해보자. 그러면 매 시점 2개 이상의 입출력 연산을 수행할 수 있다고 했을 때, 컨트롤러는 순서를 바꾸어서 수행할 위험이 있다. 따라서 1 - 3 - 4로 증가하는 것이 아니라 1 - 2 - 3 이 될 수 있다는 말이다. 큐에 대한 내용은 프로세스 상태를 다루는 포스트에서 자세히 다루도록 하겠다.
- 비동기식 입출력(Asynchronous I/O)
- 비동기식 입출력은 어떤 프로그램이 입출력 요청을 했을 때 연산이 끝나기를 기다리거나 혹은 다른 프로그램에게 CPU가 넘어가는 것이 아니라 그 프로그램의 바로 다른 instruction을 수행한다. 그러니까 CPU 제어권이 입출력 연산을 호출한 그 프로그램에게 곧바로 부여된다는 말이다. 그래서 그 앞으로 읽어올 (지금 읽고 있는) 데이터가 필요하지 않은 작업을 먼저 수행하고 데이터가 필요한 명령들은 데이터가 다 들어온 뒤 수행하게 된다.
동기식 입출력과 비동기식 입출력을 구체적인 예를 통해서 이해해보자.
프로그램 A가 디스크 I/O를 만나면 I/O 명령은 특권 명령이므로 CPU에게 I/O 요청을 한다. (system call) 그러면 CPU는 수행하던 일(A 프로그램)을 멈추고 인터럽트 벡터에서 해당하는 인터럽트 처리 루틴을 찾고 해당 인터럽트 처리 루틴으로 이동한다. 이동한 뒤 CPU는 device controller에게 I/O 요청을 하고 disk controller는 local buffer에 데이터를 받아온다. 한편 프로그램 A는 받아오는 동안 CPU를 할당받지 못한다. 운영체제는 프로그램 A가 입출력 연산을 요청했으므로 CPU를 할당해도 명령을 수행하지 못한다는 사실을 blocked state로 표시한다. 그리고 운영체제는 프로그램 B에게 CPU를 할당해서 CPU를 계속 일할 수 있게 만든다. 원하는 데이터를 전부 받아오면 disk controller는 CPU의 interrupt line에 interrupt를 남기고 CPU는 하던 일의 정보(수행 지점 및 상태 등)를 프로그램 B의 PCB에 저장한 뒤 인터럽트를 처리하게 된다. 인터럽트 처리 루틴은 데이터를 local buffer에서 A의 memory 영역으로 읽어오고 A의 blocked state를 해제시켜 A에게 CPU를 할당해도 좋다는 것을 표시한다. 그러면 이제 A가 바로 CPU를 받는 것이 아니라 CPU 할당을 기다리는 줄에 줄을 서게 된다. 그래서 자기 차례가 되면 그 입출력 연산 이후의 작업을 수행하게 된다.
6. DMA(Direct Memory Access)
원래는 I/O가 완료되면 디바이스 컨트롤러는 인터럽트 라인을 세팅하고(인터럽트를 발생시키고) CPU는 인터럽트 라인에서 인터럽트의 존재를 확인하고 현재 CPU에 올라와있는 프로그램을 PCB에 저장한 뒤 인터럽트를 처리해서 I/O device의 local buffer에 있는 데이터를 메모리로 옮긴다. cpu는 로컬버퍼와 메모리 둘 다 접근 가능하다. 메모리는 원칙적으로는 cpu만 접근 가능한데, 그렇게 되다 보니까 cpu가 인터럽트를 너무 많이 받게 되어 cpu 사용의 효율성이 떨어지게 되는거다. 따라서 cpu 이외의 메모리 접근이 가능한 장치를 하나 더 두게 되는데 이것이 바로 DMA(Direct Memory Access)이다.
DMA는 빠른 입출력 장치로 일종의 컨트롤러인데, 메모리의 속도와 가까운 속도로 처리할 수 있다. (하드웨어 장치임) DMA는 CPU가 I/O devie들의 메모리 접근 요청에 의해 자주 인터럽트를 당하는 것을 막아준다. I/O device의 device controller가 local buffer에 메모리를 저장하고, 다 완료(수행)했으면 cpu에 인터럽트를 걸던 것에서, I/O device의 device controller가 local buffer에 메모리를 저장하고 DMA는 local buffer에서 메모리로 데이터를 읽어오는 작업을 하고,(이 때 byte 단위가 아니라 block 이라는 큰 단위로 정보를 읽어옴), CPU 에게 DMA가 인터럽트를 걸어 해당 작업의 완료를 알려주는 것이다. DMA의 존재는 인터럽트의 빈도를 줄여주어 CPU를 효율적으로 관리하고 입출력 연산을 빠르게 수행할 수 있게 된다.
7. 저장장치의 구조
컴퓨터 시스템을 구성하는 저장장치는 주기억장치와 보조기억장치로 나뉜다. 주기억장치는 메모리라고 부르며 전원이 나가면 모두 사라져버리는 휘발성(voltatile)의 RAM을 매체로 사용하는 경우가 대부분이다. 반면 보조기억장치는 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성(nonvoltatile)의 마그네틱 디스크를 주로 사용한다. 플래시 메모리, CD, 마그네틱 테이프 등이 사용되기도 한다.
보조 기억장치의 용도는 크게 두 가지이다.
1. 파일 시스템(file system): 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장하게 된다. 일전에 말했듯 메모리는 휘발성 매체이므로 비휘발성 매체인 디스크를 파일 시스템 용으로 사용한다.
2. 메모리의 연장 공간인 swap area (스왑 영역)용: 메모리는 크기가 한정되고, 가격이 상대적으로 비싼 데다가 용량이 적어 다수의 프로그램이 메모리에 올라가 동시에 수행되는 현대의 컴퓨터 환경에서는 메모리 공간이 부족한 경우가 많다. 따라서 운영체제는 당장 프로그램 수행에 필요한 부분만 메모리에 올리고 나머지 부분은 디스크의 스왑 영역에 내려놓게 되는데 이 내려놓는 일을 swap out(스왑아웃)이라고 한다. 이 때 필요하면 다시 메모리로 올릴 수 있다. 이러한 행위를 할 때 하드디스크를 swap area로 사용하게 되는데 프로그램이 실행될 때 내용을 저장했다가 프로그램이 종료될 때 삭제하는 메모리의 연장 공간으로서 역할이므로 파일시스템의 비휘발성이 아닌 휘발성 성격을 지닌다.
하드디스크에는 여러 개의 마그네틱 원판들이 있고 암(arm)이 이동하며 원판에 저장된 데이터를 읽고 쓰는 방식으로 동작한다. 디스크 원판의 표면은 트랙(track)으로 나뉘고, 각 트랙은 섹터(sector)로 나뉜다. 섹터에 최소한의 단위 정보가 저장된다. 자세한 내용은 disk management & scheduling 포스팅에서 다루도록 하겠다.
8. 저장장치의 계층 구조
컴퓨터 시스템을 구성하는 저장장치는 빠른 저장장치부터 느린 저장장치로 단계적인 계층 구조로 이루어진다. 빠른 저장장치는 단위 공간 당 가격이 높기 때문에 적은 용량을 사용하며 느린 저장장치는 가격이 저렴에 대용량을 사용하지만 접근 속도가 느리다. 따라서 당장 필요한 정보는 빠른 저장장치에 넣어두어 수행 속도를 높이고 당장 필요 없는 것들은 느린 저장장치에 넣어두고 필요할 때마다 꺼내 쓰는 것이 합리적이다. 저장장치 계층은 최상위의 CPU 내부에 존재하는 레지스터(register)부터 캐시 메모리(cache memory), 메인 메모리(main memory)등의 휘발성 저장장치로 구성되는 부분이 상위에 존재하며 이 부분에 저장되는 정보는 전원이 나가면 사라지는 휘발성의 성격을 가진다. 그러나 메인메모리보다 아랫부분을 구성하는 저장장치 계층은 전원이 나가도 지워지지 않는 비휘발성 메모리이다. 캐시 메모리는 메인 메모리보다 용량이 적고 빠르지만 캐싱 기법을 사용하면 메인 메모리와 같은 용량을 가진 것 처럼 효율적으로 동작하게끔 관리할 수 있다. 이때 캐싱 기법이란 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적인 기법을 말한다. 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 자주 사용되는 정보를 빠른 저장장치에 선별적으로 저장하여 두 저장장치 사이의 속도를 완충시킨다. 이와 같이 캐싱 기법을 컴퓨터 시스템 내의 다양한 저장장치 계층에서 활용함으로써 적은 용량의 상위 저장장치만으로도 대부분의 경우 빠른 수행 속도의 성능을 얻어낼 수 있다. 참고로 메인 메모리까지는 cpu가 직접 접근하지만 그 밑의 하위계층은 cpu가 직접 접근하지 않는다.
'CS > operating system' 카테고리의 다른 글
Program Execution: 프로그램의 실행(메모리 로드) 2/2 (0) | 2021.02.08 |
---|---|
Program Execution: 프로그램의 실행(메모리 로드) (1/2) (0) | 2021.02.04 |
System Structure: 컴퓨터 시스템의 동작 원리 (3/3) (0) | 2021.02.03 |
System Structure: 컴퓨터 시스템의 동작 원리(1/3) (0) | 2021.02.02 |
운영체제 개요 (0) | 2021.02.01 |