페이지 교체 알고리즘에 따라, 효율적으로 페이지를 교체하거나 비효율적으로 페이지가 교체 될 수 있다. 이에 페이지를 교체하는 알고리즘을 알아보고자 한다. FIFO Algorithm 공간이 부족할 경우 가장 먼저 할당된 페이지를 할당 해제 하는 방식이다. 가장 간단한 방식으로 초기화 과정의 코드는 더 이상 불필요할 것이라는 아이디어로 설계되었다. 하지만 대체로 효율적이지 않다. 그림 1과 같이 FIFO 방식으로 페이지를 관리하게 되면, 페이지 공간이 부족할 경우 가장 먼저 추가된 값 부터 삭제 되는 것을 알 수 있다. FIFO 방식으로 입력되는 값에 대한 page fault 발생 횟수는 15이다. 단순히 삽입된 순서에 따라 page-out을 하게 되므로, 지속적으로 사용하는 페이지에 대해서 빈번하게 pag..
부족한 메모리를 대신하여, 상대적으로 사용할 수 있는 공간이 큰 보조 저장장치(HDD, SSD)를 사용하는 것이 가상 메모리이다. 한번에 프로그램의 모든 부분을 적재하는 것이 아닌, 현재 작업 처리에 필요한 부분만 적재하는 것과 마찬가지로 메모리가 부족할 경우 사용중이지 않은 부분을 보조 저장장치로 보내어 공간을 확보한다. Demanding Paging Demanding Paging은 그림 2와 같이 페이지 테이블의 valid/invalid를 통해 판단되어 page in을 할지 결정된다. 예를 들어, 페이지 테이블의 valid인 경우 메모리에 접근하고자 하는 정보가 할당된 상태여서 page in을 할 필요가 없다. 이와 달리 메모리에 접근하고자 하는 정보가 존재하지 않으면, page in을 통해 데이터를..
페이징의 경우 프로세스를 일정한 크기로 나누어 메모리에 할당한다. 이와 달리 세그먼테이션은 프로세스를 일정한 크기로 나누는 것이 아닌 가변적으로 나누어 메모리를 할당한다. 따라서 가변적인 크기에 대한 정보를 유지하고 획득하기 위해 세그먼트 테이블을 유지하여야 한다. 그림 1과 같이 세그먼트 테이블은 페이지 테이블과 다르게 세그먼트 번호와 시작 주호(base), 세그먼트 크기(limit)를 엔트리로 갖는다. 보호 세그먼테이션은 페이징과 달리 code, data, stack 영역의 크기에 따라 가변적으로 분할할 수 있다. 이는 페이징 방식에 비해 장점이 된다. 예를 들어 중요한 code 영역 일부분이 잘려서 페이징 되는 것과 달리, code 영역에 따라 가변적으로 세그먼트를 만들게 된다면, 보호 측면에서 보..
연속 메모리 할당을 통해 메모리 단편화(외부 단편화)가 발생하며, 반복될 경우 메모리의 사용의 효율성을 저해한다. 따라서 프로세스를 연속적인 공간에 할당하지 않고 프로세스를 작은 크기로 나눠 여러 부분에 할당함으로써, 연속 메모리 할당의 문제를 해결하고자 하였다. 이를 페이징(Paging)이라고 한다. 주소 변환 (Address Translation) 프로세스가 실제 메모리에서는 분리된 공간에 할당되지만, CPU는 연속된 공간의 메모리를 할당하여 사용하는 것 처럼 관리한다. 이는 MMU를 통해 논리 주소와 물리 주소를 나누어두었기에 가능하다. 프로세스는 연속된 논리 주소(Logical Address)를 가지지만, 분리된 물리 주소(Physical Address)를 가지며 페이지 테이블(Page Table..
앞의 내용들은 프로세스 관리 중, CPU의 사용 여부를 스케줄링 하거나 관리하는 것에 대해 알아보았다. 프로세스는 보조 저장장치(HDD, SSD. etc.)에 저장된 프로그램을 메모리에 가져와 실행하는 것이다. 메모리는 보조 저장장치에 비해 상대적으로 크기가 작아, 프로세스 별로 효율적으로 메모리를 할당하는 것은 중요하다. 효율적인 메모리 적재 과거에 메모리의 크기는 16MB, 32MB와 같이 지금은 상상할 수도 없을 정도로 상당히 작았다. 이에 메모리를 효율적으로 사용할 수 있는 방법으로 상대적으로 저장공간이 큰 보조 저장장치를 활용하는 방법을 사용하였다. 동적 적재 (Dynamic Loading) 프로그램 중 적재 후 바로 실행되지 않는 부분도 메모리에 한번에 적재하게 되면 다음과 같은 문제에 직면할..
동기화 문제를 해결하기 위해 세마포어 외에 고수준인 모니터라는 방식이 있다. 운영체제에서는 mutex를 제공하지만 자바에서는 모니터를 활용하여 동기화에 대한 문제를 쉽게 해결할 수 있다. 모니터 방식은 synchronized를 통해 사용할 수 있다. 자바에서 세모포어 객체를 사용할 경우, 초기에 접근할 수 있는 쓰레드의 수를 적절히 지정해주고 이를 판단하여 acquire, release하여야 한다. 하지만 synchroronized를 사용하면 보다 간편하게 동기화를 처리할 수 있다. BankAccount Problem (USE synchronized) class BankAccount { int balance; boolean p_turn = true; synchronized void deposit(int ..
프로세스 동기화가 적절히 설계되지 않아, 식사하는 철학자 문제처럼 모든 프로세스가 더 이상 작업을 진행할 수 없는 deadlock(교착상태)에 빠질 수 있다. 단순한 프로그램이 아닌, 운영체제에서 교착상태가 발생하는 것은 다소 치명적이다. 교착상태 필요 조건 Mutual Exclusion : 한 프로세스가 자원을 사용 중이라면, 다른 프로세스는 사용할 수 없다. Hold and Wait : 한 프로세스가 특정 자원을 가진 상태에서 대기에 빠진다. No Preemption : 한 프로세스가 진행 중이라면, 다른 프로세스가 끼어들 수 없다. Circular Wait : 프로세스가 자원 획득을 위해 원형 방향을 이룬다. (식사하는 철학자) 교착 상태는 위의 4가지 조건이 있을 경우, 발생할 가능성이 커지게 된..
Producer - Consumer Problem 특정 프로세스는 데이터를 생산하고, 특정 프로세스는 생산된 데이터를 통해 처리하는 작업과 같이 생성자-소비자가 있는 프로그램에서 발생할 수 있는 문제이다. 만약 생산되지 않은 경우에 데이터를 사용하는 소비자가 데이터를 가져가게 된다면 원치 않는 데이터 (쓰레기 값)을 가져가게 될 가능성이 크다. 따라서 각각의 프로세스(쓰레드)로 부터 생성자 - 소비자가 존재한다면 생성, 소비 순으로 진행될 수 있도록 동기화가 필요하다. import java.util.concurrent.Semaphore; class Buffer { int[] buf; int size; int count; int in; int out; Semaphore mutex, full, empty; ..