목록SW JUNGLE 9기 (12)
seven05
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/DUV0d/btsKdEFJtQF/w00EVtLV09swwGdZrwBwSK/img.png)
기간: 2024.10.08~2024.10.14 이번 Pintos 4주차에는 저번주차에 마무리한 mmap의 다음과제인 Swap I/O 과 Copy-on-write 그리고 Project 4 File system의 첫과제인 Indexed and Extensible file 중 Indexed 까지만 진행할수있었다. 이전과 마찬가지로 Pintos WIL은 과제의 내용이나 개념보다는(검색하면 나보다 훨씬 정리를 잘하는사람이 많기때문) 나만의 경험에 대해서 써보려고 한다. 1. Project1의 코드가 Project3에 와서 발목을 붙잡았다.mmap을 다 구현했음에도 mmap-exit 테스트가 자꾸 실패하기에 테스트 코드를 보더라도 도저히 모르겠어서 swap구현을 먼저하러왔는데 swap을 전부 제대로 구현했음에도 s..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/0sFcq/btsJ6rrAGFp/o79HyyuhcF0KloucsLGeeK/img.png)
기간: 2024.10.08~2024.10.14 project2에서는 가장 기본적인 기능만 만들어져있는 가상메모리 시스템을 사용하다가 이번 프로젝트에 들어와서 가상메모리를 직접 만들게되었다. 일단 지금 mmap까지는 구현을 했고 munmap에서 문제가 생겨서 디버깅 중이였는데 WIL을 써야하는 시간이 되었기에 일단 멈추고 작성하게 되었다. 지금까지 진행하면서 겪은 문제와 나의 해결방법을 적어보려한다. 1. 페이지 폴트 핸들러가 참조해서 사용하는 spt를 만드는것이 과제의 시작이고 핸들러의 대부분의 함수들이 여기서 이 spt를 통해서 page를 찾아가야하는데 계속 spt를 통해서 va값이 일치하는 page를 찾아야 하는 부분에서 hash_find함수가 NULL을 뱉었다. 도저히 이유를 알수없었는데 범인은 v..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nL5OQ/btsJWPAMlVQ/lrbyzAFGjspUKDIBlUAMzK/img.png)
기간: 2024.10.01~2024.10.07 처음에 introduction에서 나오는 usrprog 쪽 코드들을 들여다보았을때는 alarm clock이나 thread와는 달리 진행 흐름이 전혀보이지 않았다. 우리가 하는 userprogram과제는 디스크에 저장되어있는 프로그램을 메모리로 가져와서 실행하고 그 유저프로그램이 하드웨어와 상호작용하는 행동을 하고싶으면 systemcall을 호출해서 커널이 대신 수행해주고 반환값을 주는 식으로 유저 영역과 커널영역을 구분해서 행동하도록 만들다보니 가상머신을 만들어서 동작해야하고 이러한 과정이 우리가 구현하는 부분에 전부 들어나있지않다보니 어디부터 만져야하는지 접근하기 힘들었다.권영진교수님의 pintos lab2 ppt를 통해 코드 흐름을 보면서 감을 익힐수있었..
기간: 2024.09.24~2024.09.30정글의 가장 큰 시련이자 과제인 핀토스 과제를 시작했다. 핀토스의 첫번째 과제인 Threads를 진행하였는데 한주동안 무엇을 배웠는지 어떻게 과제를 해쳐나갔는지 WIL을 정리해보고자한다. (주로 시행착오에 가까운 이야기들) 1. Alarm Clock이 과제에서 첫번째로 만났던 고난은 thread.h 에 선언되어있던 thread 구조체 안에 wake_time 이라는 변수를 넣고 sleep_list를 관리할 생각이였는데 sleep_list에 쓰레드를 list_push 하는 과정에서 자꾸 커널 패닉 에러를 일으켰던 순간이다. 처음에는 기본으로 되어있는 thead 구조체를 건드려서 thread의 magic_number를 건드려서 overflow를 일으키는줄 알았으나 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/byDfLC/btsJqFSX0Vg/B27v3WnUQ7TnehWes0n720/img.png)
(전과 마찬가지로 단원 전체를 볼수있으면 당연히 좋지만 시간이 모자라는 관계로 일단은 코치님이 강조하신 부분들만 볼수밖에없었다. 다음에 시간이 생기면 다시 추가로 공부해보자!) 프로세서는 실행하는 명령어에 대응되는 주소값을 PC에 가지고있는데 실행하는 명령어에 따라 PC의 값이 변해가는 흐름을 제어 흐름(Control Transfer)이라고 한다. 제어흐름의 양상은 크게 3종류인데메모리에 할당된 명령어를 순차적으로 처리 (대부분의 시간동안 이 제어 흐름을 따른다)프로그램 상태 변화에 반응하여 제어 흐름이 변하는 경우(jump, call, return 등의 명령어를 수행하는 경우)예외적인 제어 흐름(Exceptional Control Flow, ECF) (프로그램의 실행과 관련이 있거나 없거나) 시스템 변..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ecORr4/btsJr5bIDQI/jlskn56RdRHlzZeFXM7j11/img.png)
(7단원 전체를 볼수있으면 당연히 좋지만 시간이 모자라는 관계로 일단은 코치님이 강조하신 부분들만 볼수밖에없었다.다음에 시간이 생기면 다시 추가로 공부해보자!) 링킹이란?: 링킹(Linking)이란 프로그램 코드 및 데이터의 조각들을 결합하여 메모리에 로드되어 실행될 수 있는 하나의 실행 파일을 만드는 과정링커(Linker)는 링킹을 수행하는 프로그램, 각 모듈의 독립적인 컴파일을 가능하게 함 링킹을 공부해야하는이유?큰 규모의 프로그램을 개발하면서 링킹과 관련된 에러를 많이 만나기때문프로그래밍 언어의 스코프규칙이 어떻게 구현되는지 이해(지역변수와 전역변수의 차이 static의 의미)공유 라이브러리를 활용할줄 알아야하기때문링킹과 관련된 많은 시스템 개념들을 이해하기위해링킹 종류컴파일 타임에 이뤄지는 정적..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bQ33PW/btsJrDTT5l8/VTlFkpSFIw1KMngCfeUw4K/img.png)
프로시저: 함수를 어셈블리어에서 나타내는 말로 이해했다.스택은 단지 메모리의 한 부분일 뿐이지만 이 부분을 스택 자료구조처럼 다뤄서 스택이라고 부른다. 스택은 프로시저와 관련된 상태를 나타내기 위해 쓰이는데 왜그럴까? 생각해보면 함수가 호출되는 과정은 한국어로는 후입선출 영어로는 LIFO(Last-In-First-Out) 이기때문에 스택의 형태가 함수호출에 적합하다.왼쪽 그림에 보이는것처럼 스택은 높은 메모리 주소부터 아래로 증가한다. %rsp 레지스터는 스택의 가장 낮은 주소를 항상 저장하고있으며 스택에 원소가 추가될수로 %rsp가 감소한다. 근데 이부분에서 궁금한것이 생겼다. 무슨 궁금증이냐면 스택이 왜 높은 주소부터 할당될까? 였다. 그래서 찾아보았더니 프로세스 주소공간에서 동적으로 할당되는 힙과 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/pQb8K/btsJqaMiOPr/HpQUmarsW1vVWcdZVurpb0/img.png)
어셈블리어 부분을 공부하다가 이해하기 힘들었거나 중요하다고 생각됐던 부분들을 정리해 보려고한다 레지스터: 이름이 왜 rax, rbx, ... 하다가 갑자기 r8,r9,r10 일까? -> 원래 8개 쓰다가 16개가 되서 그럼 왜 32개로 늘리지않을까? -> 늘려도 10%의 퍼포먼스 향상밖에 없는데 레지스터 이름 더 표기하려면 비트하나더씀%rsp 만 스택포인터 레지스터로 특별한 역할이 남아있다.movq 명려어는 단순히 값을 복사함 단, 두개의 값이 모두 메모리 주소이면 안됨 (movq의 q는 quadword의 약자로 과거에서 발전하는 과정에서 붙혀짐) 앞에서 봤었지만 레지스터를 괄호로 감싸면 레지스터의 값을 메모리 주소로 인식하라는 뜻 (포인터 역참조)어셈블리어 연산자 중에 헷갈렸던 부분: 산술연산과 논리연..
출처: 1/sqrt(x)를 빠르게 구하는 알고리즘 _ Fast InvSqrt() : 네이버 블로그 (naver.com) 1/sqrt(x)를 빠르게 구하는 알고리즘 _ Fast InvSqrt()참고 : https://www.youtube.com/watch?v=p8u_k2LIZyo&list=LL&index=4 ht...blog.naver.com컴퓨터가 숫자를 어떻게 비트로 표현하는지 배우는 부분에서 부동소수점 부분을 배우게 되는데 IEEE754 표준을 공부하다가 왜 지수부에 bias를 더하는지 이유를 알고싶어서 검색를 하다가 컴퓨터가 수를 저장하는 원리를 사용하여 극한으로 계산을 최적화한 사례로 소개되어있길래 알게되었다. 바로 1/sqrt(x)를 구하는 연산인데 이게 필요한 이유는 벡터를 단위벡터로 만들 때..
https://www.acmicpc.net/problem/5904시행착오: 단순 재귀함수로 생각하고 접근했었음def moo(k): if k==0: return "moo" return moo(k-1) + "m" + "o"*(k+2) + moo(k-1)for i in range(int(N ** (1/2))): if len(moo(i)) > N: K = i break# print(len(moo(N)))# print(K)# print(moo(K))print(moo(K)[N-1]) 문제 핵심:S(k) = S(k-1) + "m" + "o" * (k+2) + S(k-1)얼핏보면 재귀함수로 문자열을 저장하면될것처럼 보이는 단순한 문제이지만 입력값 N의 범위가 10^..