본문 바로가기

반응형

전체 글

(38)
페이지폴트 프로세스가 모든 코드나 데이터를 다 메모리에 올려두지 않고 필요하거나 쓰는것만 올려두게 된다. 그러다보니 필요할 때 메모리를 올리는 기술이 필요한데 그것이 페이지 폴트이다. 다시 말해서, 어떤 페이지가 실제 메모리에 없을 때, 일어나는 인터럽트 CPU가 요청한 가상주소 Page Table에 해당 내용이 invalid 되어 있으면 page fault 인터럽트를 발생하고 하드에서 페이지를 찾아서 update 시켜준 뒤, 다시 cpu가 가상주소를 MMU를 요청하는 순서로 실행하게 된다. OS에서는 페이지 폴트가 인터럽트이기 때문에 이전에서 배운것처럼 커널모드로 변경 후 IDT에서 커널함수를 호출하여 실행한다. 이처럼 페이지폴트가 자주 일어나게 되면 실행속도가 느려지게 된다. 예전 컴퓨터에 여러 개의 프로그램을..
다중페이징시스템 다중페이지시스템이란 ? 프로세스마다 페이지를 나누어서 메모리에 할당하게 되면 많은 공간이 낭비하게 된다 가령 실제 프로그램은 10KB 밖에 안되는데 4GB를 다 4KB로 나눌 필요가 없다. 고로 필요한 부분만 페이지를 나눠서 할당하게 되면 공간의 활용을 높일 수 있다. 이를 통해 페이지를 단계별로 나누어 페이지 디렉토리 개념을 써서 필요한 부분만 쓰는 방법 요약 : 모든 부분을 페이지로 나눌 필요 없이 단계적으로 나누어서 필요한 부분만 페이지로 나누어서 페이지 테이블에 두고 이것을 페이지 디렉터리에 저장해둔다. 기존 페이지는 32bit(4KB) 0~11bit : 변위 , 12~31bit : 페이지 번호로 썼지만, 0~11bit : 변위, 12~21bit : 페이지 번호, 22~31bit : 페이지 디렉터..
가상메모리의 이해 - 페이징 기법 virtual Memory 4GB를 physical Address 로 바꾸기 위해서 가장 흔히 쓰는 페이징 기법에 대해 소개한다. 페이징의 공간은 4KB, 128MB, 1GB 다양하게 쓰지만 리눅스에서는 고정적인 4KB를 사용한다 가상 메모리에 4KB 마다 각각의 페이지 번호를 두고 해당 페이지가 사용되면 실제 메모리에 할당되어 쓰인다 만약, 2KB 만 남게되도 나머지를 공란처리하고 고정적인 4KB로 맞춘다 페이징 테이블은 가상메모리 페이징의 번호에 따라 페이징 가상주소, 물리주소가 담겨있는데 이것은 프로세스 PCB에 있다.(프로세스 PCB에 있으니 실질적으로는 메모리에 있다는 말이다) 페이지번호 가상주소 물리주소 page1 000000h 0000h page2 000005h 0005h page3 0000..
가상메모리 프로세스는 4GB의 공간을 가지게 된다. 하지만 여러개의 프로세스가 있으면 4GB x 개수 만큼되므로 실질적으로 이 공간을 다 메모리에 할당하는 건 불가능하다. 그렇기 때문에 나온 방식이 가상메모리이다. 프로세스를 실행하면 가상메모리의 모든 공간을 다 쓰는것이 아니다 부분적으로만 쓰다보니 여러개의 프로세스는 실제 메모리에 사용하는 영역만 할당하여 쓰게 되면된다 이 기법은 여러가지 기법이 있는데 차후 포스팅에 참고하면 되겠다. CPU와 RAM 사이의 가상메모리, 실제메모리 주소를 빠르게 변환시켜주기위해 MMU의 하드웨어 장치가 있다.
교착상태와 기아상태 교착상태 (DeadLock) : 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태 임계 자원 A와 B가 있다고 가정해보면, Thread A에서 lock.Acquire(B)를 실행하기 위해 대기하는 상태이고 Thread B에서 lock.Acquire(A)를 실행하기 위해 대기하는 상태라고 하면 서로 자원을 쓰기 위해 계속 대기하게 된다 이렇게 무한정으로 대기하는 상태를 교착상태라고 한다 // Thread A lock.Acquire(A) A 실행 lock.Acquire(B) B 실행 lock.Release(B) lcok.Release(A) // Thread B lock.Acquire(B) B 실행 lock.Acquire(A) A 실행 lock.R..
세마포어 38장 세마포어 다중 스레드는 공유된 데이터를 같이 접근할 수 있다록 보니 작업들 사이에 실행 시기를 맞추는 동기화 작업이 필요로 한데 이것을 처리하는 방법이 다른 스레드가 접근하지 못하도록 Mutual exclusion(상호 배제)가 필요하고 공유 변수에 대해서는 Exclusive Access가 필요한다 파이썬에서는 lock.acquire() / lock.release() 이런 형태로 구현 lock.acquire() ... lock.release() 이렇게 소스가 있으면 A,B,C,D 스레드가 있다고 할 때 A 스레드가 acquire()를 실행하고 임계영역에 접근한 뒤 release가 될때까지 다른 스레드는 acquire()문에서 대기한다 lock.acquire() ~ lock.release() 사이의..
C++ 언어의 특징 1. 소멸자 : 소멸자의 경우 객체의 수명이 끝났을 때 자동으로 컴파일러가 소멸자 함수를 호출 delete -> ~소멸함수() 실행 2. 상속 #include #include using namespace std; class Person { private: string name; public: Person(string name): name(name) { } string getName() { return name; } void showName() { cout
스택 (Stack) 배열을 활용한 스택 #include #include #define MAX 1000 #define INF 99999 int stack[MAX]; int top = -1; void Push(int data) { if (top == MAX - 1) { printf("스택 오버 플로우 발생\n"); return; } stack[++top] = data; } int Pop() { if (top == -1) { printf("스택 언더 플로우 발생\n"); return -INF; } return stack[top--]; } void Show() { for (int i=top; i > -1; i--) { printf("%d ", stack[i]); } } 링크리스트를 활용한 스택 * 배열의 비해 장점은 공간활용도가 ..

반응형