|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
이준혁
가입: 2018년 9월 6일 올린 글: 2
|
|
위로 |
|
|
김무환
가입: 2018년 9월 12일 올린 글: 9
|
올려짐: 2018년11월16일 14:47 주제: 질문 |
|
|
let new_m = List.filter (fun (l, _) -> List.mem l !reachable_locs) m in
if List.length new_m < mem_limit then
let _ = loc_id := !loc_id + 1 in
let new_l = (!loc_id, 0) in
(new_l, new_m)
else
raise GC_Failure
정확히, 이 부분을 수정해도 되는 것인가요? |
|
위로 |
|
|
배요한 Site Admin
가입: 2018년 3월 6일 올린 글: 107
|
올려짐: 2018년11월16일 15:28 주제: |
|
|
안녕하세요,
malloc_with_gc 뼈대코드를 들여다 보면,
인용: | (* TODO : Complete this function.
* Implement the GC algorithm introduced in class material.
*)
let malloc_with_gc s m e c k =
if List.length m < mem_limit then
let _ = loc_id := !loc_id + 1 in
((!loc_id, 0), m)
else
let _ = reachable_locs := [] in
(* TODO : Add the code that marks the reachable locations.
* let _ = ...
*)
let new_m = List.filter (fun (l, _) -> List.mem l !reachable_locs) m in
if List.length new_m < mem_limit then
let _ = loc_id := !loc_id + 1 in
let new_l = (!loc_id, 0) in
(new_l, new_m)
else
raise GC_Failure |
중에서
인용: | (* TODO : Add the code that marks the reachable locations.
* let _ = ...
*) | 이 구간에서만 새로운 내용을 추가 할 수 있지, 그 외의 부분
인용: | if List.length m < mem_limit then
let _ = loc_id := !loc_id + 1 in
((!loc_id, 0), m)
else
let _ = reachable_locs := [] in | 와
인용: | let new_m = List.filter (fun (l, _) -> List.mem l !reachable_locs) m in
if List.length new_m < mem_limit then
let _ = loc_id := !loc_id + 1 in
let new_l = (!loc_id, 0) in
(new_l, new_m)
else
raise GC_Failure |
는 그대로 유지하셔야 합니다. 그렇게 하지 않으면, 숙제에서 요구된 gc가 탑제된 sm5, 즉, reachable한 로케이션들만 있는 메모리를 가지는 sm5의 동작을 바꾸는 상황이 됩니다.
https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=6720의 2번질문에 대해 정확히 어떤 상황에서 바꾸려고 하는지 자세한 사항을 알 수 없어서, 숙제 스펙에 맞추라는 일반적인 답변밖에 드릴 수 없었습니다.
구현이 지저분해도 문제에서 요구하는 사항을 만족한다면 상관이 없습니다.
감사합니다.
TA 이동권
e-mail: dklee@ropas.snu.ac.kr
TA 배요한
e-mail: yhbae@ropas.snu.ac.kr |
|
위로 |
|
|
김무환
가입: 2018년 9월 12일 올린 글: 9
|
올려짐: 2018년11월16일 16:44 주제: 질문 |
|
|
그렇다면, 만약 (10, 0)은 접근하지 않을 예정이고 (10, 10)은 접근할 예정일 경우 두 곳 모두를 GC하지 말고 살려야 합니다. (조교님이 올려주신 테스트 케이스에 이런 것을 테스트하는 부분이 있었습니다)
그런데 만약 스켈레톤 코드를 그대로 두게 되면 reachable_locs에 (10, 0)과 (10, 10)을 모두 넣어야 하는데, (10, 0)은 접근하지 않을 예정이므로 부품들을 모두 순회해도 찾을 수 없습니다.
그렇다면 어떻게 해야 베이스가 같고 오프셋만 다른 경우를 정확히 처리할 수 있나요? 전혀 감이 오지 않아서 질문드립니다 ㅠㅠㅠ |
|
위로 |
|
|
김무환
가입: 2018년 9월 12일 올린 글: 9
|
올려짐: 2018년11월16일 16:46 주제: 질문 |
|
|
let new_m 이하를 적절히 수정하면 base가 같은지만 확인해서 new_m을 만들도록 처리하도록 할 수 있는데, 이렇게 해도 접근 가능한 메모리 주소만 갖고있게 한다는 숙제의 스펙을 만족하게 할 수 있는 것 같습니다. 이런 형태의 수정도 안되는 것인가요? |
|
위로 |
|
|
배요한 Site Admin
가입: 2018년 3월 6일 올린 글: 107
|
올려짐: 2018년11월16일 17:51 주제: |
|
|
둘다 conservative하게 reachable_loc에 넣으시면 됩니다. 즉, (10,0)은 접근하지 않을 예정이지만, (10,9)는 접근할 예정이라면, 둘 다 넣도록 구현하시면 됩니다.
인용: | base가 같은지만 확인해서 new_m을 만들도록 처리하도록 할 수 있는데...이런 형태의 수정도 안되는 것인가요? |
뼈대 코드를 바꾸면 안됩니다. 하지만, base만 같은 주소를 확인하고 모으는 보조 함수를 만들어서 콜하는 쪽으로 구현하면 뼈대 코드를 고칠 필요가 없습니다.
TA 이동권
e-mail: dklee@ropas.snu.ac.kr
TA 배요한
e-mail: yhbae@ropas.snu.ac.kr |
|
위로 |
|
|
김무환
가입: 2018년 9월 12일 올린 글: 9
|
올려짐: 2018년11월16일 20:09 주제: 질문 |
|
|
답변 감사합니다!
조교님, 이 내용에서 질문이 하나 더 있습니다.
만약 (1, 1)은 접근할 예정이고 (1, 2)는 접근하지 않을 예정이라면, 둘 모두 GC하지 않아야 한다고 하셨습니다.
그런데 만약 (1, 2)에 연결된 다른 접근하지 않을 예정인 location (2, 1)이 있다면, (2, 1)도 GC하지 않아야 하나요? |
|
위로 |
|
|
배요한 Site Admin
가입: 2018년 3월 6일 올린 글: 107
|
올려짐: 2018년11월17일 0:41 주제: |
|
|
음...reachability에 대해 헷갈리시는 거 같아서 설명해 드립니다.
gc에는 두 가지 방법이 있을 수 있습니다.
1)현재 메모리 상태에서 도달할 수 있는 모든 메모리 주소들을 보수적으로 모으는 것입니다
2)이후에 실행될 코드를 분석해서 도달하게 될 더 적은 개수의 메모리 주소를 공격적으로 알아내는 방법입니다.
인용: |
그런데 만약 (1, 2)에 연결된 다른 접근하지 않을 예정인 location (2, 1)이 있다면, (2, 1)도 GC하지 않아야 하나요? |
1)의 방법에서는 (2,1)에 대해 gc를 안 하는게 됩니다. 왜냐하면, 이후에 (2,1)에 접근할 예정인지 아닐지 고려하지 않기 때문입니다.
반면 2)의 방법에서는 분석이 성공적으로 됐다면 (2,1)에 대해 gc를 할 수 있게 됩니다.
물론 두 방법 모두 안전합니다. 숙제에서 요구되는 사항은 1입니다.
TA 이동권
e-mail: dklee@ropas.snu.ac.kr
TA 배요한
e-mail: yhbae@ropas.snu.ac.kr |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|