| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- 핀토스 프로젝트 3
- 황금 장미
- 일지 시작한 지 얼마나 됐다고
- 핀토스 프로젝트
- 끝
- 내일부터
- 파란 장미
- 자 이제 시작이야
- 셋업
- 노가다
- 핀토스 프로젝트 2
- 글루민
- multi-oom
- 핀토스 프로젝트 1
- 핀토스 프로젝트 4
- 바빠지나?
- 마일섬
- botw
- 글리치
- Project 1
- alarm clock
- 아직도 실험 중
- PINTOS
- Today
- Total
거북이의 쉼터
(2021.10.19) Mlfqs - fixed point 실수 연산 본문
1. 서론 및 필요 내용 설명
우선 fixed point 실수 연산 라이브러리 구현이 목적이기 때문에 개별 폴더에서 실험을 해서 구현을 하도록 하자. 또한 이번 프로젝트에서만 사용하기에 필수적인 요소만 구현하면 되고, 너무 많은 것을 구현할 필요는 없다는 것을 기억하자.
fixed point 실수(후술 fp)가 사용되는 식을 다시 살펴보면 다음의 연산들이 필요한 것을 확인할 수 있다.
- 필요한 분수를 fp로 환산 (59/60, 1/60)
- fp를 정수로 환산
- fp와 정수의 합/차
- fp와 fp의 곱
- fp와 정수의 곱
- fp를 fp로 나누기
- fp를 정수로 나누기
막상 나열하니 전부 구현해야 할 것 같다. 하지만
- 실제로 사용되는 분수는 59/60, 1/60 뿐이어서 미리 계산해서 fp로 바꿔놓자. (구현 필요 X)
- 구현 필요 O
- 정수를 fp 형태로 바꾸는 함수를 구현해서 활용한다. (구현 필요 △)
- 구현 필요 O
- 그냥 곱하면 된다. (구현 필요 X)
- 구현 필요 O
- 그냥 나누면 된다. (구현 필요 X)
실제로 필요한 함수는 4개이다. 그래도, 59/60, 1/60을 미리 계산하는 것도 번거로운 과정이니 첫 번째 함수까지 포함해서 5개 함수를 구현할 것이다. 이번 포스팅에서는 해당 함수들을 구현하는 것까지만 진행한다.
2. 구현해야 하는 것
- 분수를 fp로 변환
- fp를 정수로 환산
- 정수를 fp로 환산
- fp와 fp의 곱
- fp를 fp로 나누기
3. 구현 과정
일단 17.14 fixed point 실수를 사용하라고 매뉴얼에서 지시했으므로 사용할 f는 (1<<14)이다. f라고만 정의하면 혼동이 올 수 있으므로 fp_const로 정의해준다.
#define fp_const (1 << 14)
또한, fixed point 실수가 정수형태로 표현되어 있다고는 하나, type을 int로 표기하면 일반 정수와 계산할 때 헷갈리기 때문에 fp_t라는 type을 정의해 fixed point 실수일 경우 이 type으로 표기한다. 물론 내부적인 구현으로는 int와 똑같다.
typedef int fp_t;
우선 이전 포스팅에서 언급했다시피, 분수를 fp로 바꾸는 것은 다음의 함수를 통해 가능하다.
fp_t frac_to_fp (int a, int b) {
return a * fp_const / b;
}
다른 함수들은 매뉴얼에 나와있는 표를 참조하여 하나씩 구현한다.
fp_t n_to_fp (int n) {
return n * fp_const;
}
int fp_to_zero (fp_t x) {
return x / fp_const;
}
int fp_to_nearest (fp_t x) {
if (x >= 0) return (x + fp_const / 2) / fp_const;
return (x - fp_const / 2) / fp_const;
}
int mult_fp_fp (fp_t x, fp_t y) {
return ((int64_t) x) * y / fp_const;
}
int div_fp_fp (fp_t x, fp_t y) {
return ((int64_t) x) * fp_const / y;
}
간단한 코딩이었다. 이제 fixed-point.h 파일을 생성해 해당 함수들의 선언(Declaration)을 작성하고 해당 함수들은 thread.c에 넣어두자.
4. 디버깅
아직 실행할 수 없으므로 디버깅도 없다.
5. 후기
여기까진 간단했다. 이제 Mlfqs에 필요한 함수들을 위 연산을 기반으로 코딩할 것이다.
'코딩 삽질 > KAIST PINTOS (CS330)' 카테고리의 다른 글
| (2021.10.23) Mlfqs - 기타 구현 및 디버깅 (0) | 2021.10.23 |
|---|---|
| (2021.10.23) Mlfqs - Mlfqs 관련 함수 추가 (0) | 2021.10.23 |
| (2021.10.17) 고오급 스케줄러 (Mlfqs) 가이드라인 (2) | 2021.10.17 |
| (2021.10.16) Priority Scheduling - priority inversion (donation) (0) | 2021.10.16 |
| (2021.10.12) Priority Scheduling - preemption (0) | 2021.10.12 |