글 전체보기
-
bloc 디자인 패턴FW, Lib 공부/Flutter 2023. 6. 27. 22:10
bloc | Dart Package A predictable state management library that helps implement the BLoC (Business Logic Component) design pattern. pub.dev bloc을 사용하는 이유 내 경우에는 프로젝트의 크기가 커질수록 bloc 패턴을 사용해야 할 필요성이 절실해졌는데, 아래와 같은 상황에서 필요했다. 예시를 위해 아래와 같은 위젯 트리가 형성되어 있다고 생각해보자. 1. 깊은 위젯간 의존 관계 Flutter는 기본적으로 위젯 객체를 인자로 넘겨주는 식으로 구조를 형성하게 된다. 이런식으로 위젯을 쌓다보면 위젯 트리가 깊어지게 되는데, 여기서 문제가 발생한다. 최 상단의 Arkhive 위젯의 멤버 변수의 값을 ..
-
[계획] 230618 - 여름방학 개발 계획활동/Arkhive 2023. 6. 18. 20:12
Updater 제거 실시간 업데이트 기능을 삭제하는 방향으로 바꿨습니다. (엄밀히 말하면 기능 롤백) 해당 기능을 제거하는 이유는 다음과 같습니다. 1. 데이터 관리의 편의성 게임의 데이터는 아래의 소스를 사용합니다. GitHub - Kengxxiao/ArknightsGameData: 《明日方舟》游戏数据 《明日方舟》游戏数据. Contribute to Kengxxiao/ArknightsGameData development by creating an account on GitHub. github.com 기존의 개발방법은 위 데이터에서 일부 json파일을 다운로드하여, Arkhive앱과 Firebase 사양에 맞도록 데이터를 일부 가공하여 사용하고 있었습니다. 하지만, 이렇게 사용할 경우 /level 카테고리..
-
Virtual Memory대학/컴퓨터구조 2023. 6. 13. 22:23
Disk를 Virtual Memory로 사용하기 위해 메인 메모리를 캐시로 사용한다. Virtual address는 page table을 통해 Physical address로 변환되는데 이 과정을 살펴보자. 디스크는 데이터를 페이지 단위로 관리하기 때문에, 가상 메모리 역시 페이지 단위로 관리된다. 그 페이지 내부에서 특정 데이터를 찾기 위해 offset를 지정하게 되고, 나머지 부분은 페이지의 인덱스를 나타내게 된다. Valid가 0이면 해당 주소에 해당하는 데이터가 속한 페이지는 디스크상에 존재하는 것이고, 1이라면 메인 메모리에 캐싱된 상태이다. 하지만, CPU입장에서는... 페이지 테이블에 접근 페이지 테이블에서 얻은 실제 메모리에 접근 이 두 과정을 거치는 것 또한 느리다. 그렇기에 페이지 테이..
-
Memory hierarchy대학/컴퓨터구조 2023. 6. 13. 21:23
데이터를 모두 하드디스크에서 처리한다면 어떨까? 적은 가격에 많은 공간을 사용할 수 있겠지만, 속도가 매우 느릴 것이다. 반대로 모두 캐시에서 처리한다면? 매우 빠르겠지만, 비싸고 적은 공간만 사용할 수 있을 것이다. 그렇기에 메모리는 계층구조를 이루어 데이터가 이동하며 저장 및 사용되는데, 이때 사용되는 용어가 캐싱이다. 캐시메모리 - DRAM - Disk의 계층 구조에서 장치간 동작 속도의 차이가 큰데, 이 속도차이를 극복하기 위해 디스크부터 캐시로 데이터를 미리 로드하는 행위를 캐싱이라 하는데, 캐싱이 가능한 이유는 메모리의 Locality 특성 때문이다. Locality란, 같은 메모리 영역을 자주 접근하려는 경향, 그리고 접근한 메모리 근처의 메모리영역을 접근하려는 영향을 의미한다. 즉, 캐싱을..
-
ILP - Instruction Level Parallelism대학/컴퓨터구조 2023. 6. 12. 22:26
여러 명령어를 동시에 처리하는 기술이다. 이를 달성하기 위해서는 pipeline을 더 세부적으로 쪼개거나, pipeline stage에 동시에 여러 명령어를 수행하는 방법으로 달성할 수 있다. 이번 포스트에서는 pipeline stage에 여러 명령어를 동시에 수행하는 방법에 대해 알아보자. 64-bit 공간에 32-bit 명령어 2개를 넣어 두 개의 명령어를 동시에 처리하는 것이다. 하지만, 이 방법을 사용할 때는 반드시 지켜줘야 하는 규칙이 있는데, 명령어의 종류가 ALU/branch인 명령어와 Load/Store인 명령어만 동시에 처리할 수 있다는 것이다. ALU, ALU 또는 ALU, branch 와 같이 성격이 비슷한 명령어를 동시에 처리할 수는 없다. 왜 그럴까? 회로를 살펴보면 알 수 있다...
-
Hazard대학/컴퓨터구조 2023. 6. 12. 20:37
Data Hazard 아래와 같이 연속으로 같은 레지스터에 값을 쓰고 읽는 경우 data hazard가 발생한다. WB에서 레지스터에 값을 저장해야 ID에서 저장된 값을 읽어올 수 있기에, 2 cycle 동안 명령어를 정지시키고 실행한다. 참고로 3 cycle을 멈춰야 하는게 아닌가 할 수 있는데, flip-flop이라 하더라도, 전자가 채워지는 시간을 고려하면 2 cycle에도 가능하다고 한다... 하지만 이렇게 명령어를 정지하게되면(nop) 성능상에 문제가 생길 수 밖에 없다. 따라서 회로상으로 명령어의 연산 결과를 바로 가져다 쓰도록 구현한 forwarding 기법이 등장했다. 하지만, 데이터 로드를 수행하는 명령어를 수행한 경우에는? ID에서 가져오고자 하는 레지스터의 값은 MEM단계가 끝난 뒤에..
-
CPU circuit - Pipeline대학/컴퓨터구조 2023. 6. 11. 21:55
명령어를 아래 5단계로 나눠 각 단계를 각 회로에 할당시켜서 여러 명령어를 동시에 처리하는 기법이다. IF: 명령어를 메모리에서 가져옴 ID: 명령어를 decode하고 레지스터에서 값을 읽어옴 EX: 명령어 관련 레지스터나 값을 연산함 MEM: 메모리에 접근함 WB: 연산이나 메모리의 결과를 레지스터에 저장함 파이프라인 기법을 사용하면 한 명령어를 처리하는데 시간이 약간 늘어날 수 있다. 왜냐하면 레지스터 접근 단계(ID, WB)에서는 시간이 적게 걸리는데, 파이프라인 기법을 쓰기 위해서는 모든 단계의 시간을 가장 오래 걸리는 단계의 시간으로 맞춰줄 필요가 있기 때문이다. 하지만, 명령어를 병렬 처리하기 때문에 전체 시간으론 매우 단축된다. 즉, CPU설계에 있어, 명령어 stage당 소요되는 시간이 밸..
-
CPU circuit - Basic대학/컴퓨터구조 2023. 6. 11. 21:08
CPU 내부 회로 구성과 데이터, 컨트롤 시그널이 어떻게 이동하는지 알아보자. 너무 복잡하기 때문에 이번엔 스탭별로 기능을 확장해가며 명령어별로 회로가 어떻게 동작하는지, 컨트롤 시그널이 어떻게 나오는지 알아보고, 다음에 파이프라인 기법이 적용된 회로를 살펴보자. 담백하게 기능을 간략화환 회로의 그림은 다음과 같다. 위 그림에서 PC, Instruction memory, Registers, Data memory 모두 레지스터이다. 레지스터는 Filp-flop 회로로 구현이 되어있기 때문에 CPU clock에 동기화되어 데이터를 내보낸다. 따라서 80000 주소의 명령어를 실행할 때 PC값은 80004로 업데이트되지만, clock이 들어오기 전까진 80000 주소값을 내보내는 것이다. 모든 레지스터는 cl..