위 파이프라인이 적용된 데이터패스에서 lw 명령어의 경우를 살펴보자. 명령어가 실행되면(IF), IF/ID 레지스터는 명령어를 저장한다. 이때 프로세서는 아직 명령어가 무엇인지 모르기에 beq를 대비하여 PC+4를 저장한다. ID 단계에서는 이제 데이터패스는 명령어가 lw임을 알게 된다 ID/EX 레지스터에는 ID 단계에서 생성된 데이터 세트(두 개의 32비트 데이터, 부호 확장된 immediate value, PC+4)가 저장된다. EX 단계에서는 레지스터 1의 값과 부호 확장된 immediate value를 ID/EX 레지스터에서 읽어온다. 두 값은 ALU를 통해 대상 데이터 메모리 주소를 계산하고 EX/MEM 레지스터에 저장한다. MEM 단계에서는 EX/MEM 레지스터에서 메모리 주소를 읽어와 데이..
학교강의필기장
프로그램이 실행되기 위해서는 디스크에서 메모리로 가져와 프로세스 내에 배치돼야한다. 주 기억장치와 레지스터는 CPU가 직접 액세스 할 수 있는 유일한 저장 공간이다. 레지스터 액세스는 CPU클록 안에 이루어지며, 주 기억 장치는 여러 사이클을 소요할 수 있고, 이로 인해 지연이 발생할 수 있다. 캐시는 주 기억장치와 CPU 레지스터 사이에 위치하여 데이터 접근 속도를 향상시킨다. 메모리 장치는 주소의 읽기 요청 또는 주소의 데이터 및 쓰기 요청의 연속으로 작업한다. 메모리의 보호는 올바른 동작을 보장하기 위해 필요하다. Protection 프로세스의 주소 공간은 프로세스가 접근할 수 있는 주소 범위를 나타낸다. 운영체제는 프로세스가 할당받은 주소 공간 외의 영역에 접근하는 것을 방지해서 메모리 보호를 제..
앞서 다룬, 위의 Data Path 구현방식은 모든 명령을 처리할 수 있지만, 비효율적이기에 쓰이지 않는다. 그러면 어떤 방법을 사용해야할까? Pipelining 여러 가지 작업을 동시에 작동시킨다. pipelining의 각 단계를 stage라고 한다. stage란 명령어를 처리하는 동안 하드웨어 유닛에서 수행하는 활동이다. - 처리량(throught - 단위 시간 내 처리할 수 있는 작업 수) 향상시킴 - 응답시간(response time - 각각의 단일 작업 수행 시간) 은 같음 IF(Instruction fetch) : 메모리에서 명령을 가져옴 ID(Instruction decode/register file read) : 명령을 해독하면서 레지스터를 읽음 EX(Excute/address calcul..
시스템 모델 시스템은 리소스로 구성되며, 리소스 유형(CPU 사이클, 메모리 공간, 입출력 장치 등) R1, R2 ... Rm이 존재한다. 각 리소스 유형 Ri는 Wi개의 인스턴스를 갖는다. 각 프로세스는 리소스를 요청-사용-해제 로 사용한다. 데드락 in 멀티스레드 프로그램 데드락은 스레드 1이 first_mutex를 확보하고, 스레드가 2가 second_mutex를 확보할 때, 스레드 1이 second_mutex를 기다리고 동시에 스레드 2가 first_mutex를 기다릴 때 발생할 수 있다. 라이브락은 데드락처럼 스레드가 멈추진 않았지만 계속 시도해도 진행이 안되는 경우에 발생한다. 데드락은 네 가지 조건이 동시에 성립할 때 발생한다. (필요조건) 상호배제(Mutual exclusion): 한 번에..
Kernel Synchronization (Windows) 유니프로세서 시스템에서는 인터럽트 마스크를 사용해서 전역 자원에 대한 접근을 보호한다. 멀티프로세서 시스템에서는 스핀락을 사용한다. - 스핀락을 사용하는 스레드는 선점되지 않는다. (스핀락을 사용하는 스레드가 선점되면 데드락 발생) 사용자 레벨에서 동작하는 디스패처 객체를 제공한다. 이는 뮤텍스, 세마포어, 이벤트, 타이머로 작동된다. 타이머는 시간이 만료되면 하나 이상의 스레드에게 알린다. 이벤트는 조건변수와 유사하게 작동한다. - 어떤 조건을 만족하면 기다리던 스레드에게 notify() 디스패처 객체는 신호가 있는 상태(객체 사용 가능), 신호가 없는 상태(스레드가 차단됨)으로 나뉜다. 디스패처 객체마다 waiting queue가 있다. 오브..
while(test_and_set(&lock)); // CS lock = false; test_and_set : 인자로 들어온 값을 true로 변경하고, 변경 전 target의 값을 반환한다. 스핀락을 구현하기 위해, 인자로 lock이 들어간다고 할 때, 이미 누군가 임계구역에 들어가 있어서 lock이 사용중이라면 true를 반환하므로 true를 반환하는 동안에는 임계구역에 접근을 막는다. 만약 false를 반환했다면 임계구역에 들어가 있는 스레드가 없는 것이므로, 자신이 임계구역에 들어간다. 임계구역에서 벗어날 때는 lock을 false로 바꾼다. while(compare_and_swap(&lock, 0, 1) != 0); // CS lock = false; compare_and_swap : 첫 번째 ..
공유데이터에 대한 동시 액세스는 데이터 불일치를 초래할 수 있기에 협력하는 프로세스의 순서대로 실행되도록 보장하는 스레드 동기화가 필요하다. => 임계구역을 설정해야한다! 각 프로세스는 임계구역에 접근하기 전에 권한을 요청하고, 임계구역이 끝나면 권한을 놓아준다. 임계구역 문제를 해결하기 위해 3가지 조건이 필요하다. 상호배제(mutual exclusion) - 오류가 발생하지 않도록 한 스레드만 진입 가능 진행(progress) - 임계구역에 들어간 프로세스가 없을 때 들어가려는 여러 프로세스가 있을 때 어떤 프로세스가 들어갈지 결정해야함 유한대기(bounded waiting) - 한 번 임계구역에 들어간 프로세스는 그 다음에 다시 들어갈 때 제한을 둬야하고, 모든 스레드는 유한시간 내에 해당 임계구역..