일반적으로 segment 개수가 훨씬 적기 때문에 테이블이 차지하는 용량이 비교적 매우 적다 shared segment: code, private segment: data segment로 나눈후 각 segment를 다시 page로 나누는 기법 -> 물리 메모리에는 page 단위로 올라감(hole 없음) 공유와 보안은 segment 차원에서 처리하여 두 방법의 장점을 모두 가지고 있다 지금까지 배운 주소변환 과정에서 운영체제의 역할은 없었다 (모두 하드웨어의 도움) CPU가 주소변환을 통해 메모리에 접근할 때마다 OS에 넘어갔다가 다시 사용자 프로세스에 넘어오지 않는다 I/O 접근을 할 때 역할이 있다 출처: https://core.ewha.ac.kr/publicview/C010102014050914293..
다단계 페이지 테이블을 사용해도 TLB 사용 비율이 높다면 오버헤드가 그렇게 크지 않다 page table은 주소 공간의 전체 용량만큼의 엔트리가 생성되므로, 페이지 개수가 부족한 프로세스도 있다 각 페이지가 code, data, stack 중 일부를 가지고 있는데, 어떤 연산 권한을 가지고 있는지 알려준다 예: code부분은 바뀌면 안되기 때문에 read-only, data/stack은 읽고 쓰기 다 가능 해당 프로세스의 논리 주소가 page table의 몇번째 엔트리에 있는지 확인 후 물리 메모리에도 같은 인덱스로 접근 공간 효율을 높이기 위한 방법이지만 시간 오버헤드가 매우 크다 associative register: 순차적인 탐색이 아닌 동시에 모든 엔트리 탐색 예: 동일한 워드 프로그램 3개 실..
프로세스마다 page table을 가지고 있다 인덱스로 접근하면 물리 주소를 바로 알 수 있다 (table = array) 32 bit로 2^32 byte의 주소 공간을 처리할 수 있고, 이는 4kb 크기의 page를 1M개 담고 있다 메모리는 byte 단위로 주소가 매겨진다 4kb의 page들은 각각 4byte의 엔트리를 1k개 보유하고 있다 사용되지 않는 주소 공간이 많아 만들어지지 않는 inner page table이 많으므로 공간을 더 효율적으로 사용 1계층 테이블은 모든 페이지에 대한 정보가 모두 들어가고 물리 메모리에 저장되므로 비효율적 d: 4kb = 2^12byte = 12bit p2: 1kb = 2^10byte = 10bit p1: 32bit - (12bit + 10bit) = 10bit..
프로세스 최초 실행 시 논리 주소 생성되고 필요한 부분만 실제 물리 주소에 올라가서 실행된다 물리 메모리의 어떤 주소에 올라갈지 결정하는 주소 바인딩 과정이 필요하다 프로그래머 입장에서는 심볼로 된 주소를 사용하고 컴파일되면 숫자 주소로 바뀐다 실행파일의 인스트럭션이 가리키는 주소는 논리 주소이기 때문에 CPU도 논리 주소를 참조한다 따라서 CPU가 요청하는 논리 주소에 대응되는 물리 메모리의 주소를 매번 제공받아야 한다(주소 변환) relocation register(base register): 물리 메모리 주소의 시작지점 저장 -> 요청받은 논리 주소에 이 값을 더해 변환 limit register: 해당 프로세스의 최대 주소 번지 저장 -> 악성 프로세스 필터링(다른 프로그램 침범 방지) 현대의 메..
P0가 A를 하나만 요청해도(어떤 요청을 해도) 받아들이지 않고, P1이 필요자원 내에 어떤 요청을 해도 받아들임 즉, 항상 safe 상태를 지향하는 매우 보수적인 알고리즘이다 deadlock은 매우 드문 현상이므로 위 알고리즘은 매우 비효율적(할당되지 않는 자원이 많다) deadlock을 일단 허용하기 때문에 최대 필요 자원을 조사하지 않음 그래프에서는 사이클이 있는지 확인 테이블에서는 낙관적으로 요청 자원이 없는 프로세스는 사용중인 자원을 반납할 것이라는 예상을 기반으로 한다 만약 P2가 자원 C를 하나 요청한 상황이라면 deadlock 상태 출처: https://core.ewha.ac.kr/publicview/C0101020140415131030840772?vmode=f
request edge: 해당 프로세서가 가리킨 자원을 요청한다는 의미 (할당 전) assignment edge: 해당 자원이 가리킨 프로세서에 할당되어 있다는 의미 왼쪽 예제부터 deadlock (X), deadlock (O), deadlock (X) 현대에는 대부분 OS가 deadlock을 책임지지 않고 사용자에게 맡긴다 deadlock이 그렇게 자주 발생하지 않기 때문에 이를 미연에 방지하기 위해 하는 작업의 오버헤드 때문 두번째 그래프에서 자원2를 프로세스2에 할당하면 생길 위험한 상황을 미리 방지하고자 프로세스2에 할당 X 현재 available 자원으로 need 자원이 충족되는 프로세스를 우선으로 할당해준다 이후 자원을 다 활용하고 반납하여 available 자원이 늘어나면 또 그에 맞는 프로..
= concurrency control 모니터는 공유 데이터와 그 데이터에 접근할 수 있게 하는 코드를 한 곳에 넣고 한번에 한 프로세스만 코드 수행하도록 하여 프로그래머의 부담을 덜어준다 active한 프로세스가 코드 수행을 마치거나, 특정 조건을 불만족하여 잠들게 되어야 다른 프로세스가 모니터로 들어와 active해질 수 있다 empty: 빈 버퍼를 기다리는 프로세서 줄 full: 자원을 기다리는 프로세서 줄 lock 관련 변수가 불필요함 semaphore 변수는 값을 가지고 프로세서가 코드를 수행하면서 그 값이 바뀐다 출처: https://core.ewha.ac.kr/publicview/C0101020140411143154161543?vmode=f
buffer: 임시 저장 공간, buffer 조작은 포인터 이동(빈 버퍼 혹은 찬 버퍼 가리킴) 여러 생산자가 동시에 빈 버퍼에 접근, 혹은 여러 소비자가 동시에 공유 데이터에 접근 시 문제 발생 -> lock/unlock 버퍼가 모두 찼을때 생산자가 오거나 버퍼가 모두 비어있을때 소비자가 왔을때 문제 발생 -> counting writer 접근 시, 다른 writer와 모든 reader 접근 불가 reader 접근 시, 모든 writer 접근 불가 읽는 작업도 배타적으로하면 매우 비효율적 여러 reader가 동시에 도착하면 공유변수 readcount이 중복계산될 수 있으므로 lock/unlock 최초 reader는 DB에 writer 접근 못하게 막고, 최후 reader는 DB에 writer 접근 허용..
Semaphores 프로그래머가 이렇게 lock/unlock 관련한 코드를 고민하기 어려우므로 앞의 방식들을 추상화한다 Semaphore S integer variable (자원의 수) (이전의 알고리즘들은 S=1인 경우라고 생각할 수 있다) 아래 두가지 atomic 연산에 의해서만 접근 가능 critical section을 수행중인 다른 프로세스를 CPU ready queue가 아닌 semaphore에 대한 wait queue에서 대기 이 연산에서 S 변수는 S가 양수면 기다리는 프로세스가 없다는 것, 음수면 기다리고 있다는 의미 (위에서와 다름) critical section의 길이가 긴 경우 block/wakeup이 좋음 critical section의 길이가 매우 짧은 경우 block/wakeup..
데이터 공유 상황에서 누가 언제 어떤 데이터를 읽고 연산했는지에 따라 원하지 않는 결과가 나올 수 있기 때문에 그에 맞는 처리 필요 커널모드에서 1까지 수행하다가 인터럽트가 걸린다면 count가 감소한 작업은 인터럽트 처리 이후, 이전에 불러온 count값을 연산한 값으로 덮어씌워지므로 증가한 결과값만 남게 된다 해결: 중요한 변수를 다루는 동안에는 인터럽트가 걸려도 그 작업을 마칠때까지 인터럽트 처리 보류 real time 시스템의 엄밀한 상황이 아닌 time sharing 시스템이므로 이렇게 쉽게 해결하고 가는 것이 좋다 효율: CPU lock/unlock Test_and_set() 출처: https://core.ewha.ac.kr/publicview/C0101020140401134252676046?..