

일단 procee_exec함수에서 file_name을 받아서 이를 띄어쓰기를 기준으로 잘라서
사용자 스택에 차곡차곡 쌓는 과제이다.
int process_exec(void *f_name)
{
char *file_name = f_name;
bool success;
/* We cannot use the intr_frame in the thread structure.
* This is because when current thread rescheduled,
* it stores the execution information to the member. */
struct intr_frame _if;
_if.ds = _if.es = _if.ss = SEL_UDSEG;
_if.cs = SEL_UCSEG;
_if.eflags = FLAG_IF | FLAG_MBS;
/* We first kill the current context */
process_cleanup();
// 1.Break the command
char *token;
char *save_ptr;
// file name에서 공백을 만나면 문자열 자르고 save_ptr에 다음 문자열 주소 저장
// 첫번째 호출
token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single
char *argv[99];
int argc = 0;
while (token != NULL)
{
argv[argc] = token; // 자른 문자열 저장
argc++;
token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single
}
/* And then load the binary */
success = load(file_name, &_if); // setup_stack 을 통해 rsp를 초기화 => argv 쌓기
// 2. Place the words at the top of Stack
char *argv[99]; // 문자열 저장될 배열
int argc = 0; // argv의 요소 개수
while (token != NULL)
{
argv[argc] = token;
argc++;
token = strtok_r(file_name, " ", &save_ptr); // args-single onearg 일경우 args-single
}
// 3. Push the address of each string + null pointer(\0)
// first push 전 8의 배수로 round 후 push => 더 좋은 성능보장 목적
// argv의 마지먁 idx부터 들어가야함.
char *str[99]; // 각 인자 문자열의 주소 담을 배열
for (int i = argc; i > 0; i--)
{
uint16_t length = strlen(argv[i]);
_if.rsp = _if.rsp - length; // str의 길이 만큼 stack top pointer 이동(높은 주소 -> 낮은 주소)
str[i] = _if.rsp; // TOS 주소 저장
memcpy(str[i], argv[i], length); // 주소에 argv 값 복사해서 저장(Stack에 push)
}
// 4. %rsi가 argv(argv[0]) 가리키고, %rdi가 argc 가리키도록(Point)
// 5. 가짜 return address push
/* If load failed, quit. */
palloc_free_page(file_name);
if (!success)
return -1;
/* Start switched process. */
do_iret(&_if);
NOT_REACHED();
}
GitBook 가이드에 따라 단계별 Step을 주석으로 쓰고 맞추어서 진행중이다..
무엇보다 argv[3]이 더 먼저 들어가야하기에 음수를 활용해서 반복문을 돌았다.
구할 것
문제 조건 : 꼭대기에서 바닥으로 이어지는 경로중 거쳐간 숫자의 합이 가장 큰 경우 그때의 최대 합
이동 가능 방향은 대각선 방향으로 왼쪽, 오른쪽으로만 이동 가능
나의 코드
function solution(triangle) {
var answer = 0;
// DP 배열 생성
let DP = triangle.map(row => Array(row.length).fill(0));
DP[0][0] = triangle[0][0]
// Bottom UP으로 저장
for(let i = 1; i < triangle.length; i++){
for(let j = 0; j < triangle[i].length; j++){
let candidate = [(DP[i -1][j] || 0), (DP[i - 1][j + 1] || 0)]
DP[i][j] += Math.max(...candidate);
}
}
console.log(DP)
return answer;
}
행 i-1: (j) (j+1)
B D
\ / \
\ / \
행 i: C E F
(j) (j+1)(j+2)
function solution(triangle) {
var answer = 0;
// DP 배열 생성
let DP = triangle.map(row => Array(row.length).fill(0));
DP[0][0] = triangle[0][0]
// Bottom UP으로 저장
for(let i = 1; i < triangle.length; i++){
for(let j = 0; j < triangle[i].length; j++){
let candidate = [(triangle[i -1][j - 1] || 0), (triangle[i - 1][j] || 0)]
triangle[i][j] += Math.max(...candidate);
}
}
console.log(triangle)
return Math.max(...triangle[triangle.length-1]);
}
triangle 배열 자체를 DP 저장소처럼 활용하는 것이다.
따라서 경로를 따라가서 가장 아래 레벨에서 가장 큰값이 바로 정답.
PintOS 어려워여...
GitBook에 Step 있었는데 그거 못보고 헤딩부터 한게 삽질...
GitBook에 Step이 있구나...