[크래프톤 정글 3기] 12/9(토) TIL 🤒

ClassBinu·2023년 12월 9일
0

크래프톤 정글 3기 TIL

목록 보기
56/120

컨디션이 좀 회복되었음..
09:45 착석


알고리즘 복습

Insertion Sort

한 번에 하나의 원소를 선택해서, 직전에 정렬이 완료된 배열 중에 적절한 위치에 삽입한다.
새로운 원소가 생기면 이미 정렬이 완료된 배열을 하나씩 밀면서
새로운 원소가 들어갈 자리를 만들어가다가, 자리가 생기면 들어가는 방식

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let currentVal = arr[i];
    let j;
    for (j = i - 1; j >= 0 && arr[j] > currentVal; j--) {
      arr[j+1] = arr[j];
    }
    arr[j+1] = currentVal;
  }
  return arr;
}

let arr = [2, 1, 4, 7, 34, 3];

insertionSort(arr);

console.log(arr);

Merge Sort

합병과 정렬

분할 정복 알고리즘에 따라 배열을 잘게 쪼갠 후 정렬 후 합친다.


Pintos

팀원이 fd로 파일 가져오는 함수 만들어서 기존 코드 완성했는데
일부 테스트 미통과

int read (int fd, void *buffer, unsigned length) {
	check_address(buffer);

	unsigned int bytesRead = 0;

	if (fd == 0) { 
		for (unsigned int i = 0; i < length; i++) {
			char c = input_getc();
			((char *)buffer)[i] = c;
			bytesRead++;

			if (c == '\n') break;
		}
	} else {
		struct file *f = get_file_from_fd_table(fd);
		if (f == NULL) {
			return -1; 
		}

		bytesRead = file_read(f, buffer, length);
	}

	return bytesRead;
}

파일을 아예 못 읽는 거 같은데..
stdout은 구현한 적이 없는데 테스트에 있네..


stdout 이렇게 쉽게?

 else if (fd == 1) {
		return -1;

그냥 이렇게 썼는데 테스트 통과함. 오..?


read-nomal 해결하기

구현 자체가 안 된 듯..

FAIL
run: size of sample.txt (0) differs from expected (373): FAILED

파일과 버퍼과 길이를 넘기면 읽어와야 될 것 같은데..


bytesRead = file_read(f, buffer, length);


off_t
file_read (struct file *file, void *buffer, off_t size) {
	off_t bytes_read = inode_read_at (file->inode, buffer, size, file->pos);
	file->pos += bytes_read;
	return bytes_read;
}

fd(파일 디스크립터)의 실체

간단한 거였다!! 하지만 후련하다!!

int add_file_to_fd_table (struct file *file) {
	struct thread *t = thread_current();
	struct file **fdt = t->fd_table;
	int fd = t->fd_idx;

	while (t->fd_table[fd] != NULL) {
		fd++;
	}

	t->fd_idx = fd;
	fdt[fd] = file;
	return fd;
}

fd 테이블 배열을 순회하면서 비어있으면 거기다가 파일 구조체 포인터 넣고 인덱스 반환하는 거였음!


write() 구현하기

gitbook 설명

"열린 파일 fd에 buffer에서 size 바이트를 씁니다. 실제로 쓰여진 바이트 수, 즉 쓰여지지 않은 일부 바이트를 제외한 수를 반환합니다. 파일의 끝을 넘어서 쓰기는 일반적으로 파일을 확장하지만, 기본 파일 시스템에 의해 파일 확장은 구현되지 않았습니다. 예상되는 동작은 파일의 끝까지 가능한 많은 바이트를 쓰고 실제로 쓰여진 바이트 수를 반환하거나, 아무 바이트도 쓰여지지 않았다면 0을 반환하는 것입니다. fd 1은 콘솔에 씁니다. 콘솔에 쓰기 위한 코드는 buffer의 모든 내용을 한 번의 putbuf() 호출로 써야 합니다. 이는 size가 몇백 바이트를 넘지 않는 한 합리적입니다(더 큰 버퍼는 나누어 쓰는 것이 타당합니다). 그렇지 않으면, 다른 프로세스에 의해 출력된 텍스트 라인이 콘솔에서 서로 섞여서 인간 독자와 평가 스크립트 모두에게 혼란을 줄 수 있습니다."

  1. 열린 파일이 표준 출력이면 모니터로 출력하는데, 그때 사용하는 함수가 putbuf인가 봄.
  2. 그럼 그외의 경우에는 fd로 파일 구조체를 가져오고,
    버퍼의 내용을 파일 구조체로 넘기면 되는 것 같음.

우선 file_write가 있음.

off_t
file_write (struct file *file, const void *buffer, off_t size) {
	off_t bytes_written = inode_write_at (file->inode, buffer, size, file->pos);
	file->pos += bytes_written;
	return bytes_written;
}

1차로 대충 구현해 봄

syscall.c

int write (int fd, const void *buffer, unsigned length) {
	check_address(buffer);

	int bytesRead = 0;

	if (fd == 1) {
		putbuf(buffer, length);
		return length;
	} else {
		struct file *f = get_file_from_fd_table(fd);
		if (f == NULL) {
			return -1;
		}

		bytesRead = file_write(f, buffer, length);
	}
	return 0; // 나중에 발겸함. 여기 왜 0으로 반환하지? bytesRead 반환해야 함.
}

stdin은 아까처럼하면 되지 않을까?
표준 입력은 에러처리 하면 될듯

if (fd == 0) {
		return -1;
	}

맞음.

read와 write 모두 핵심 코드가 틀린 것 같다..

return 0; // 나중에 발겸함. 여기 왜 0으로 반환하지? bytesRead 반환해야 함.

어? 이거 고치니까 write 통과함!

0개의 댓글