운영체제
메모리 낭비 방지 - 동적적재, 동적연결, 스와핑
1. 동적 적재(Dynamic Loading) 적재란 실행 파일을 메모리에 올리는 것을 말한다.(O/S를 메모리에 올리는 것은 부팅) 동적 적재란 프로그램 실행에 반드시 필요한 루틴/데이터만 적재하는 것을 말한다. 동적 적재를 사용하는 이유 - 모든 루틴(routine)이 전부 사용되는 것은 아니다. (예: 오류처리, 오류가 발생할 때만 메모리로 올린다.) - 모든 데이터(data)가 전부 사용되는 것은 아니다. (예: 배열, char[] buffer = new char[1000]) - 자바 : 모든 클래스가 전부 사용되는 것은 아니다. => 실행 시 필요하면 그때 해당 부분을 메모리에 올린다. 2. 동적 연결(Dynamic Linking) 여러 프로그램에서 공통으로 사용되는 라이브러리를 공통 라이브러리..
주기억장치관리 - MMU
주기억장치관리의 핵심은 '메인 메모리를 어떻게 잘 관리할 수 있을까'에 있다. 1. 프로그램을 메모리에 올리기 실행파일을 메모리에 올릴 때 몇가지 해결해야할 이슈들이 있다. - 메모리 몇 번지에 올릴 것인가? - 만약 다중 프로그래밍 환경에서는? 1) MMU의 역할 a. 주소변환 메인메모리 안에서 매번 다른 address로 실행파일이 올라가더라도 MMU 덕분에 CPU는 정상적으로 data를 읽을 수 있다. 이것을 주소 변환(address translation)이라고 한다. 이를 이해하기 위해서는 CPU가 메인메모리로부터 데이터를 읽는 과정을 이해할 필요가 있다. 위 그림과 같이 CPU에서는 메모리에 접근하기 위해서 address를 보낸다. 주소를 보낸다는 것은 내가 몇번지를 읽겠다는 의미이다.그럼 그 주..
주기억장치관리 개요 (Main Memory Management)
1. 메모리의 역사 1) 메모리 역사 - Core memory - 진공관 메모리 - 트랜지스터 메모리 - 집적회로 메모리 : SRAM, DRAM 2) 메모리 용량 - 1970년대 : 8-bit PC 64KB - 1980년대 : 16-bit IBM-PC 640KB > 1MB > 4MB - 1990년대 : 수MB > 수십MB - 2000년대 : 수백MB > 수GB 2. 언제나 부족한 메모리 메모리 용량이 기하급수적으로 늘어났기에 현대에는 메모리관리가 필요하지 않다고 생각할 수 있다. 그러나 메모리는 언제나 부족하다. 메모리 용량의 증가하면서 프로그램의 크기도 증가했기 때문이다. 1) 프로그램 변천 - 기계어/어셈블리어 작성 - C언어 작성 - 자바, 객체지향형 언어 작성 - 숫자처리 > 문자처리 > 멀티미디..
프로세스 동기화 도구 - 모니터(Monitor)
1. 모니터(Monitor) 모니터란 세마포 이후의 프로세스 동기화 도구이다. 세마포보다 한단계 높은 고수준 개념이다. 1) 모니터의 구조 모니터는 공유자원 + 공유자원 접근함수로 이루어져 있다. 모니터에는 2개의 큐가 존재한다. 하나는 배타동기를, 또하나는 조건동기를 처리한다. 공유자원 접근함수에는 최대 1개의 쓰레드만 진입 가능하다. 진입한 쓰레드가 조건동기로 블록되면 새 쓰레드가 진입할 수 있다.새 쓰레드는 조건동기로 블록된 쓰레드를 깨울 수 있다.(notify())깨워진 쓰레드는 현재 쓰레드가 나가면 재진입할 수 있다. 2. 자바 모니터 자바의 모든 객체는 모니터가 될 수 있다. - 배타동기 : synchronized 사용하여 지정 - 조건동기 : wait(), notify(), notifyAll..
교착상태 처리
교착상태를 처리하는 방법에는 4가지가 있다. 1. 교착상태 방지(Deadlock Prevention) 2. 교착상태 회피(Deadlock Avoidance) 3. 교착상태 검출 및 복구(Deadlock Detection ) 4. 교착 상태 무시 (Don't Care) 1. 교착상태 방지 교착상태의 4가지 필요조건 중 한 가지 이상 불만족하게 만들어 교착상태를 방지한다. 1) 상호배타조건을 불만족 프로세스끼리 자원을 공유가능하도록 만든다. 그러나 이 방법은 원천적으로 불가능할 수도 있다. 2) 보유 및 대기 조건을 불만족 자원을 가지고 있으면서 다른 자원을 기다리지 않게 만든다. 예를 들어 자원이 없는 상태에선 모든 자원을 대기하게 만들 수 있다. 그래서 일부 자원만 접근가능하다면 프로세스가 보유하고 있는..
전통적 동기화 예제 (3) 식사하는 철학자 문제
1. Dining Philosopher Problem 1) 식사하는 철학자 문제 5명의 철학자와 5개의 젓가락이 있다고 가정해보자. 철학자는 생각 → 식사 → 생각 → 식사 과정을 반복한다. 철학자는 자신의 왼쪽 젓가락을 집고, 오른쪽 젓가락을 집어야만 식사가 가능하다. 젓가락을 세마포로 구현하면 프로그램으로 구현할 수 있다. (# of permit = 1) 젓가락은 왼쪽 젓가락을 먼저 사용하고, 오른쪽 젓가락을 나중에 사용해서 철학자가 식사할 수 있도록 구현한다. 2) 잘못된 결과 도출 : starvation 실제로 이를 프로그램으로 구현하면 모든 철학자가 식사를 하지 못해 굵어죽는 상황이 발생한다. 즉, 도중에 프로그램이 멈추는 현상이 계속해서 발생하게 된다. 이러한 현상이 발생하는 이유는 교착상태(..
전통적 동기화 예제 (2) 공유 데이터베이스 접근
Readers - Writers Problem 1) 공통 데이터베이스 - Readers : read data, never modify it - Writers : read data and modify it - 상호배타 : 한 번에 한개의 프로세스만 접근가능하도록 => 공유 데이터베이스에서 비효율적 2) 효율성 제고 공유 데이터에 대한 읽기, 쓰기는 임계구역 내에서 발생한다. Writer 간에는 상호배타를 보장해야 한다. 즉, 한 번에 한 Writer만 공유 데이터에 접근가능하도록 만든다. Reader 간에는 상호배타를 적용하지 않는다. 그래서 다수의 Reader 가 동시에 공유데이터를 읽을 수 있도록 한다. 물론, Writer가 공유 데이터에 접근할 때 Reader는 접근할 수 없고, Reader가 접근할..
전통적 동기화 예제 (1) 생산자 - 소비자 문제
1. 전통적 동기화 예제 1) 생산자 소비자 문제 (Producer - Consumer Problem) - 생산자 - 소비자 문제 - 유한 버퍼 문제 (Bounded Buffer Problem) 2) 공유 데이터베이스 접근 (Readers-Writers Problem) 3) 식사하는 철학자 문제 (Dining Philosopher Problem) 2. 생산자 소비자 문제 (Producer - Consumer Problem) 생산자가 데이터를 생산하면 소비자는 생산된 데이터를 소비한다. 예) 컴파일러 > 어셈블러, 파일 서버 > 클라이언트, 웹서버 > 웹클라이언트 컴파일러가 생산한 코드를 어셈블러가 소비해서 실행가능한 오브젝트 코드로 만든다고 볼 수 있다. 1) Bounded Buffer 생산된 데이터는 ..