I/O 작업은 왜 오래 걸릴까

허준현·2022년 5월 17일
2

Oracle

목록 보기
1/11
post-thumbnail

현재 맡은 프로젝트에서 오라클 및 스프링을 활용한 백앤드를 구현중에 있어서 오라클을 사용해 본 적이 없어서 여가 시간에 오라클을 공부하고 있습니다.
그중에서 데이터베이스 블록을 공부하던 중

동일한 레코드의 수를 가진 테이블을 select 하게 되었을 때 수행시간을 비교 할 수 있는가?

에 대한 질문으로 하나의 DB IO는 보통적으로 하나의 블록 단위로 수행하며 테이블의 컬럼이 클수록 당연히 IO를 수행을 더 많이 하기 때문에 컬럼 수가 많은 테이블이 오래 걸린다.

먼저 오라클의 기본을 배우기 전에 대학생 운영체제 때 배운 IO interrupt 에 대해 정리하고자 한다.

Process 란?

간단하게 말해서 실행중인 프로그램을 의미한다. 프로그램과 프로세스의 차이를 말하자면 우리가 알고 있는 서든, 오버워치 , 롤 같은 실행파일이 하드 디스크에 있으면 프로그램을 의미하고 해당 프로그램이 메모리에 올라가 실행중인 프로그램이 프로세스 라고 한다.

이런 프로세는 아래의 그림과 같은 구조를 나타내고 있는데

DATA는 우리가 알고 있는 전역변수를 저장하는 공간, STACK은 지역함수를 담고 있으며
OS가 프로세스를 관리하기 위해 여러 정보를 저장하는 PCB(PROCESS CONTROL BLOCK)
로 이루어져 있다.

Process 가 실행되는 경우

앞에서 말한 것처럼 사용자가 실행파일을 실행하였을 때
혹은 사이트에 접속하여 해당 사이트에서 유저의 명령을 받기 위해 프로세스 생성
그리고 unix 프로그래밍을 하다 보면 자주 사용하는 명령어 fork를 사용하여 child-process 생성하는 경우 정도가 있다.

따라서 여러가지 Process 가 실행되는 환경속에서 OS는 프로세스를 관리하기 위한 정보가 필요하다. 앞서 말한 PCB에서 프로세스 상태를 가지고 있어 하나의 프로세스가 메모리를 독점하는 것을 막고 즉, starvation 하는 프로세스가 없게 하는 위함도 있다.

process 상태에 관하여

앞서 말한 것 처럼 os가 프로세스를 효율적으로 관리하기 위해 pcb에 대표적으로 저장하는 것이 프로세스 상태이다. 프로세스가 실행되는 것부터 종료되는 상태는 아래의 다음과 같다.

New : 프로세스가 생성된 상태
Exit : 프로세스가 종료된 상태
이 두가지는 생성시에 앞서 말한 stack이나 pcb같은 경우 즉시 할당 , 해제 되는 것이 아닌 초기화 및 자원의 분배로 인해 시간이 걸려 상태로 지정하고 있다.
Running : 말 그대로 메모리를 장악하여 실행중인 상태
Ready : 프로세스가 실행을 하기 위해 기다리는 상태이며 메모리에 공간이 남게 되면 바로 Running 을 할 수 있는 상태
Blocked : 현재 IO작업을 진행중인 상태여서 실행을 멈춘 상태이다.

우리가 중요시 봐야 할 것은 Blocked 상태이다. 만약 이 블록상태가 메모리를 점유하고 있는 상태에서 작업을 진행하고 있다면 readQueue 에서 기다리는 프로세스들이 억울할 것이다.

따라서 OS를 구현한 개발자들은 더 효율적으로 메모리를 관리하기 위해 다음과 같은 상태로 나누고 있다.

앞 서 설명한 그림과 달라진 점이 있다면 suspend 상태가 생긴 것인데 이 상태로 변하게 되면 해당 프로세스가 hardisk로 옮겨지게 된다. 따라서 blocked 상태는 해당 프로세스가 메모리에 있지만 IO작업이 끝나지 않은 경우 , blocked/suspend 는 io작업을 하고 있지만 하드디스크(hardDisk swapped area) 에 있는 경우로 생각 하면 쉽다.

앞서서 hardDisk swapped area에 프로세스를 메모리의 공간을 만들기 위해 위배지로 생각하기 쉬운데 그 외에도 현재 메모리에 공간이 있지만 다음에 실행될 프로세스가 남은 공간보다 클 경우 swapped area를 memory 처럼 사용하는 것처럼 사용해 프로세스를 실행하는 경우에도 사용된다.

결론 및 요약

우리는 왜 프로세스를 하드디스크에 옮겨 넣을 정도로 바쁘게 IO interrupt 를 하는지는 엄청 간단하다.
프로세서가 명령어를 읽는 속도가 harddisk에서 읽어오는 속도보다 월등히 빠르기 때문이다. 따라서 그동안 프로세서가 노는 것을 방지해 해당 프로세스를 blocked 혹은 blocked/suspend 를 하여 다른 프로세스도 메모리를 점유하도록 하게 하여 느릴 수 밖에 없는 것이다.

추가적으로 해당 프로세스가 하드디스크로 가거나 다른 프로세를 읽게 된다면 아래와 같은 프로세스
를 지니게 되는데 이는 프로세스가 전에 실행하다가 중단되었을 때 중단되 부분부터 실행을 해야 하기 떄문에 마지막에 저장된 Context(멈추었을때 CPU의 현황) 을 restore 해야하기 때문이다.

이 때 해당 명령어를 어디까지 읽었는지 , stack pointer가 어디 가르키고 있었는지 PC(다음에 읽을 명령어) 저장 같은 경우가 있다.

다음에는 왜 IO interrupt를 다루게 되었는지, 오라클의 기본을 다루고자 한다.

profile
best of best

0개의 댓글