
Virtual Memory Management (가상 메모리 관리) 가상 메모리란 메모리 내에 완전히 존재하지 않는 프로세스를 실행하는 기술을 의미한다. 프로그램의 인스트럭션들은 실행되기 위해서 메모리에 로드되어야 하지만, 프로그램 전체가 필요한 것은 아니다. 만약 그렇다 하더라도, 동시에 프로그램 전체를 사용하지는 않는다. 즉, 프로그램이 CPU에 의해 실제로 사용되는 부분만 메모리로 로드하고, 사용되지 않는 부분은 디스크로 옮겨서 실제 메모리를 대체하도록 하는 것이다. 프로그램의 일부만 메모리로 로드하여 실행하는 것은 다음과 같은 장점이 있다. 물리 메모리의 크기에 제한받지 않는다. 더 많은 프로그램이 동시에 실행될 수 있다. (CPU utilization 증가) 페이지 테이블 전체를 읽을 필요가 없..

Fragmentation (단편화) External fragmentation (외부 단편화) 프로세스를 실행하기 위한 메모리 공간이 physical 메모리 내에 존재하지만, 연속적이지 않아서 할당할 수 없는 상황 Internal fragmentation (내부 단편화) 프로세스를 실행하기 위해 메모리가 할당됐지만, 프로세스가 필요한 양보다 더 많이 할당되어 프로세스에게 할당된 메모리가 낭비되는 상황 50-percent rule First-fit을 통계적으로 분석해보면, 만약 메모리 내에서 N개의 블록이 할당되었을 때, 0.5N개의 블록이 internal fragmentation으로 손실될 수 있다. 즉, 1.5N개의 블록 중 0.5N개가 손실되므로, 메모리의 1/3을 쓸 수 없게 될 수 있다는 것을 의미..

Memory Access 프로그램은 실행되기 위해서 반드시 메모리에 로드되어야 한다. CPU는 오로지 레지스터와 메인 메모리에만 접근할 수 있다. 메모리 유닛은 메모리 주소들의 흐름만 볼 수 있다. context oblivious 메모리 주소만 알고 메모리에 대한 어떤 것도 모른다. Memory Protection Mechanism Address Binding 현대의 운영체제는 프로세스가 물리 메모리의 어떤 부분에도 상주할 수 있도록 한다. 컴파일러는 symbolic address를 relocatable address(= relative address)로 bind 한다. 링커와 로더는 relocatable address를 absolute address로 bind 한다. Address Binding Tim..

Bounded-Buffer 문제 (유한버퍼 문제) 소비자와 생산자가 유한 개의 버퍼 자원을 공유하는 상황에서, 다음 문제를 해결하고자 한다. 소비자와 생산자가 버퍼에 상호 배타적으로 접근 소비자는 버퍼에 원소가 한 개라도 있으면 버퍼를 소비해야 하고, 생산자는 버퍼에 원소가 없으면 원소를 생산해야 한다. 위의 문제를 해결하기 위한 조건은 다음과 같다. 생산자가 먼저 실행된 적이 있어야 하고, 생산자의 실행 횟수가 소비자보다 많아야 한다. 위 문제를 해결하기 위해 사용하는 변수는 다음 세 가지이다. 세마포어 mutex(= 1): 생산자와 소비자의 상호배제를 위한 변수 세마포어 empty(= n): 비어있는 버퍼의 개수를 나타내는 변수 세마포어 full(= 0): 버퍼가 차있는 개수를 나타내는 변수 Read..

Bounded-Buffer 문제 (유한 버퍼 문제) 생산자(Producer)는 데이터를 생성하고, 소비자(Consumer)는 데이터를 소비한다. in과 out의 값으로는 버퍼에 있는 데이터의 양을 알 수가 없다. (위의 그림 참조) 따라서 counter 변수를 사용한다. 하지만 counter 변수는 생산자와 소비자가 동시에 접근하므로 Race condition이 발생한다. 따라서 동기화가 필요하다. Race condition 여러 프로세스(또는 스레드)가 공유자원에 동시에 접근할 때, 접근 순서에 따라 결과가 달라질 수 있는 상황 Synchronizaiton (동기화) Multi-threaded application 스레드는 프로세스 안에서 메모리를 공유한다. (스택은 별개로 가진다.) 데이터 손상을 막..

Deadlock 모든 프로세스가 다른 프로세스의 작업이 끝나기를 기다리고있는 상태 Deadlock(교착상태) 발생 필수 조건 4가지 Mutual exclusion (상호배제) 최소한 1개의 자원은 공유할 수 없어야 한다. Hold and wait (점유대기) 최소한 1개의 자원을 소유한 프로세스가 다른 프로세스가 소유하고 있는 자원을 얻기를 기다려야 한다. No preemption (비선점) Preemption이 없어야 한다. Circular wait (순환대기) 서로 다른 프로세스가 자원을 소유하고 요청하는 사이클이 존재해야 한다. Resource Allocation Graph Resource 종류마다 1개의 인스턴스만 있고, 사이클이 존재한다면 항상 데드락이 발생한다. Resuorce 종류마다 여러개..

Process Scheduling 실질적인 스케줄링 객체는 스레드이다. (리눅스는 스레드 단위로 스케줄링을 함) 왜 프로세스 스케줄링이 필요하지? CPU 활용을 최대한으로 하기 위해서 (CPU utilization) 실행시간을 공평하게 분배하기 위해 (Fairness) 프로세스의 빠른 응답을 위해 (Responsiveness) CPU Scheduler CPU가 비가동 상태일 때 CPU 스케줄러에 의해서 ready 큐로부터 한 개의 프로세스를 선택한다. 스케줄링 결정을 해야 할 때 프로세스가 running state에서 waiting state로 바뀔 때 (CPU가 I/O 상태로 바뀔 때) 프로세스가 running state에서 ready state로 바뀔 때 (프로세스가 running 큐에서 ready ..

Thread 실행의 가장 작은 단위 스레드마다 별도의 stack과 register set이 있다. Code영역과 data영역은 공유한다. 왜 스레드를 사용해야 하는가? 더 나은 병렬성(Parallelism)으로 성능이 향상된다. 프로세스보다 스레드를 생성하는 것의 오버헤드가 더 적다. 자원을 더 효율적으로 사용한다. 동일한 작업을 병렬적으로 실행할 때, 별개의 프로세스를 생성하는 것은 자원 낭비이다. 데이터 공유가 더 쉽다. IPC를 사용할 필요가 없다. Concurrency vs. Parallelism Parallelism (병렬성) 다중 작업을 동시에 수행할 수 있는 능력 Concurrency (동시성) Time sharing으로 인해 단위시간마다 다중작업을 빠르게 진행하여 동시에 수행하는 것처럼 보..

Process Memory Layout Normal function을 실행하면 stack영역을 사용한다. System call은 kernel stack에서 사용 후 결괏값을 stack 영역에 저장한다. System call을 호출할 때마다 프로세스 1개당 kernel stack 1개를 할당한다. Stack 영역 함수들이 호출될 때 아래로 차면서 데이터가 저장된다. Heap 영역 동적 메모리가 요청될 때 위로 차면서 데이터가 저장된다. Data segment 전역변수가 저장된다. Text segment 바이너리 프로그램 코드가 저장된다. 왜 프로세는 Physical memory의 같은 Kernel memory 영역을 공유하지? 물리적으로는 1대의 컴퓨터에 1개의 OS만 사용 가능하다. 하지만 1개의 프로세..
System call 프로그래머들은 API를 통해 간접적으로 system call을 사용한다. System call을 직접적으로 호출하지 않고 API를 사용하는 이유 매우 많은 종류의 파라미터가 있기 때문에, system call을 직접적으로 사용하기 어렵다. 이식성 (다른 컴퓨터를 쓰더라도 API를 통해 똑같이 실행할 수 있는 능력) Windows API가 Linux에서 작동하지 않는 이유 OS가 다르기 때문에 전혀 다른 system call을 사용하기 때문. System call types: Communications Message passing 메시지 교환에 기반함 Sender와 Receiver가 우선적으로 확인되어야 한다. Shared memory 프로세스가 system call을 통해 다른 프로..
- Total
- Today
- Yesterday