PIO(Programmed I/O)PIO는 주변장치들(I/O device) 사이 전송되는 모든 데이터가 CPU를 거쳐간다. 이때 CPU는 주변 장치들에 대한 지속적인 모니터링을 통해 주변 장치들이 준비가 됐는지 체크하기 때문에불필요하게 CPU 주기를 낭비하고 "Busy" 상태가 빈번하게 된다. 이러한 단점을 극복할 수 있는 방식이 Interrupt Initiated I/O 방식이다. Interrupt Initiated I/OPIO에서 CPU가 지속적으로 주변 장치들의 상태를 확인한 것과 다르게,Interrupt Initiated I/O 방식은 주변 장치들이 available 상태가 되면 interrupt를 발생시킨다. CPU는 interrupt가 발생하기 전까지 다른 작업을 수행하고,interrupt..
동시성(Concurrency)이란? 컴퓨터공학에서 동시성이란 여러 작업이 순서에 상관없이 동시에 진행되는 것을 뜻한다. 하지만 여기서 동시에 진행된다는 것은 실제로 여러 작업이 동시에 동작하고 있다는 뜻은 아니다. 여러 작업이 동시에 실행되고 있는 것처럼 보이는 것이다. CPU는 빠른 문맥 교환(context switch)을 통해 여러 작업이 동시에 실행되는 것처럼 보이게 할 수 있다. 실제로는 A라는 작업을 하다가 B작업을 하는 것이지만, 마치 A와 B가 같이 실행되는 것처럼 보이는 것이다. 이것을 동시성이라고 한다. 요리사가 어떤 요리를 한다고 하자. 이 때 재료도 썰고 냄비의 내용물이 타지 않게 저어주기도 한다고 하자. 요리사는 몸이 두 개가 아니기 때문에 실제로 동시에 재료를 썰면서 냄비의 내용물..
참조의 지역성(Locality of Reference) 주기억장치와 메모리는 속도 차이가 크다. 이러한 속도의 차이를 극복할 수 있는 게 캐시 메모리이다. 이 캐시 메모리는 주기억장치와 메모리 사이에 위치하며 속도 차이에 따른 병목현상을 줄여준다. 그런데 이 캐시 메모리의 효율을 높이려면 캐시 메모리에 어떤 정보가 들어있냐가 중요하다. 어떤 프로그램을 실행할 때 필요한 정보를 캐시 메모리에서 찾는 캐시 적중율(hit-rate)을 높일 수 있기 때문이다. 그런데 이러한 캐시 적중율을 높일 수 있는 원리가 있는데, 그것이 바로 참조의 지역성이다. 참조의 지역성은 캐시의 지역성이라고도 불리는데, 정확히는 참조의 지역성이 맞다. 참조의 지역성이란 컴퓨터 프로그램이 일정 기간 동안 특정한 메모리 위치 집합에 접근..
사용자 모드(User Mode)와 커널 모드(Kernel Mode) CPU는 사용자 모드와 커널 모드를 번갈아가면서 동작한다. 사용자 모드일때는 User Process를 실행시킨다. 이때는 하드디스크나 메모리, I/O 디바이스 등의 I/O 장치에 직접 접근할 수 없다. 또한 유저 모드 특권 레벨(privilege level)을 가지고 코드를 실행한다. I/O 명령을 실행하기 위해서는 System Call을 호출해 커널모드로 전환해야 한다. System Call이 호출되면 Mode bit를 1에서 0으로 전환하고 커널모드로 진입한다. 커널 모드에서는 I/O 장치에 접근하는 등 다양한 System Call을 실행할 수 있다. 즉, 커널 모드 특권 레벨(privilege level)을 가지고 코드를 실행할 수..
동기와 비동기, 블로킹과 논-블로킹 너무 헷갈려 운영체제를 공부하다 보면 동기(Syncronous)와 비동기(Asynchronous), 블로킹(Blocking), 논-블로킹(Non-blocking)에 대해 들어볼 수 있다. 이 개념들은 언뜻 보면 매우 헷갈리기 때문에 한 번 정리가 필요하다고 생각했다. 검색해 보니 좋은 글들이 많아 이해가 쉬웠다. 이를 종합해서 설명해 보겠다. [그림 1]은 IBM DeveloperWorks Library에 게재된 Boost application performance using asynchronous I/O라는 글에서 사용된 도표이다. 해당 게시글은 2006년에 Linux의 Asynchronous I/O(AIO)에 대해 설명하는 글이다. AIO는 쉽게 말해 프로세스가 여..
Memory Mapped I/O란? Memory Mapped I/O는 마이크로프로세서(CPU)가 입출력 장치를 접근할 때, 입출력과 메모리의 주소 공간을 분리하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식이다. -위키피디아- 즉, Memory Mapped I/O는 disk block을 메모리의 페이지에 매핑시켜준다. 따라서 CPU는 파일을 메모리에서 접근 가능하게 된다. 이를 통해 CPU는 read() 혹은 write()등의 System call을 사용하지 않고 메모리에 data를 읽고 쓰는 것처럼 사용 가능하다. Memory Mapped I/O의 특징은 다음과 같다. 1. 메모리의 일부 공간을 I/O 포트에 할당한다. 2. 많은 프로세스가 하나의 파일을 메모리에서 공유하는 것이 가능해진다. 3...
페이지 교체 알고리즘 (Page Replacement Algorithm) 이전 포스팅으로 요구 페이징(Demand Paging)에 대해 알아보았다. 필요한 페이지가 메모리에 없을 때 page-falut가 발생하고 Backing Store에서 해당 페이지를 찾아 빈 프레임에 로딩해야 하는데, 이때 빈 프레임이 없을 경우 희생 당할 프레임(victim frame)을 고르는 알고리즘이 페이지 교체 알고리즘이다. 페이지 교체 알고리즘은 page-fault 발생 비율을 줄이는 것을 목표로 한다. +요구 페이징에 대한 내용은 다음을 참고하자. [운영체제] 가상메모리(Virtual Memory)와 요구 페이징(Demand Paging), Valid-Invalid Bit, 페이지 부재(Page Faul 가상 메모리(V..
가상 메모리(Virtual Memory) 메인 메모리의 크기는 한정되어 있다. 따라서 물리적인 메모리 크기보다 크기가 큰 프로세스는 실행시킬 수 없게 된다. 예를 들어 메인 메모리의 크기가 100MB 일 때 300MB 크기의 프로세스는 실행시킬 수 없다. 크기가 큰 프로세스를 실행시키기 위해서는 메인 메모리를 크게 키우는 방법이 있겠지만, 이것은 매우 비효율적이다. 따라서 나온 방법이 바로 가상 메모리(Virtual Memory)이다. 가상 메모리는 메모리 관리 기법의 하나로, 기계에 실제로 이용 가능한 자원을 추상화하여 사용자들에게 매우 큰 메모리인 것처럼 보이게 만드는 것을 말한다. 즉, 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식이다. 가상적으로 주어진 주소를 가상 주소(vi..
Copy On Write (COW) 란? 1 2 3 4 5 6 std::string x("Hello"); std::string y = x; // x and y use the same buffer y += " World!"; // now y uses a different buffer // x still uses the same old buffer cs 위와 같은 코드가 있다고 하자. ( C++ 98에서의 동작이다. C++ 11 이상에서는 동작하지 않음 ) x라는 buffer에 "Hello" 라는 string을 넣고, y라는 복사본을 만든다고 하자. 이때 x와 y는 같은 buffer를 가리키게 된다. 하지만 이때 복사본인 y를 변경하면 아래와 같이 된다. 더이상 y는 같은 buffer를 가리키지 않고, 새로..
세그멘테이션(Segmentation)이란? 페이징은 프로세스를 물리적으로 일정한 크기로 나눠서 메모리에 할당하는 것을 의미한다. 반면, 세그멘테이션은 프로세스를 논리적 내용을 기반으로 나눠서 메모리에 배치하는 것을 의미한다. 세그멘테이션은 프로세스를 세그먼트(segment)의 집합으로 표현한다. 이때 세그먼트는 논리 단위로 아래와 같은 것들이 해당된다. main program procedure function method object stack local variable global variable etc... 프로세스를 code영역, data영역, stack영역 등으로 나누는 것 또한 세그멘테이션이라고 할 수 있다. 세그멘테이션도 페이징과 비슷하게 세그먼트 테이블을 가지고 있다. 페이징과 비슷하게 논리..