[05.22 / week10]TIL

CHO WanGi·2025년 5월 22일

KRAFTON JUNGLE 8th

목록 보기
58/89

오늘 하루 요약

✏️ 오늘의 한 일

  • PintOS SYSCALL : OPEN 80% 완료
  • 프로그래머스 JS 최댓값과 최솟값

🌈오늘의 성장!

PintOS SYSCALL : OPEN

요구사항

열려고 하는 해당 파일을 포인터로 받음
파일 열기가 실패하면 -1을 반환하고 성공하면 file Descriptor 값을 반환한다.

int open(const char *file)

file Descriptor?

쉽게 파일을 구분할 수 있는 식별자라고 생각하면 된다.
이 식별자는 file Descriptor 라는 테이블에 담겨서 관리가 되는데,
하나의 배열이라고 생각하면 된다.
배열의 요소에는 파일이 들어가고, 그 요소의 인덱스가 바로 file Descriptor

사전 준비

  1. fdt를 그럼 어떻게 관리할까?
    OS는 프로세스마다 fd를 따로 관리하는데, 우리 PintOS에서는 프로세스가 단일 스레드로 담기기 때문에
    스레드 구조체에 fd 관리 테이블을 생성해준다.
//thread.h
#ifdef USERPROG
	int exit_status;			// exit() 또는 wait() 구현에 사용되는 변수
	struct file *fdt[64]; // 파일 디스크립터 테이블
  1. 이 배열에다가 바로 값을 할당해도 될까?
    지금 64칸 짜리 배열이 정의는 되었는데 초기화가 안된 상태이다.
    그래서 이 스레드가 시작 할때 우린 이 배열의 64칸을 NULL로 초기화해야한다.
static void
init_thread(struct thread *t, const char *name, int priority)
{
	ASSERT(t != NULL);
	ASSERT(PRI_MIN <= priority && priority <= PRI_MAX);
	ASSERT(name != NULL);

	memset(t, 0, sizeof *t);
	t->status = THREAD_BLOCKED;
	strlcpy(t->name, name, sizeof t->name);
	t->tf.rsp = (uint64_t)t + PGSIZE - sizeof(void *);
	t->priority = priority;
	t->magic = THREAD_MAGIC;
	t->origin_priority = priority;

	for (int i = 0; i < 64; i++)
	{
		t->fdt[i] = NULL;
	}

	list_init(&t->donations); // donation 리스트 시작
}

Open

  • Open Syscall 까지의 여정
  1. thread/init.c의 main 함수
  2. main() 의 run_actions
  3. run_actions의 run_task
  4. run_task의 USERPROG
  5. process_wait(process_create_initd) => open-normal 프로세스 생성(테스트 파일)
  6. Open_normal.c 의 open(sample_txt)
  7. syscall.c의 syscall1 매크로 -> 인자가 1개
  8. syscall.c의 syscall_handler로 syscall number 전달
  9. syscall_handler 받은 숫자 확인, switch문에 SYS_OPEN case로 이동
    10.open() 함수 실행
  • open()

    • 인자로 받은 파일, 파일 시스템에서 열기

    • 현재 스레드의 fdt 가져오기

    • fd를 2부터 돌면서 빈 fdt 자리에 집어넣기
      - 2부터 도는 것은 0과 1은 stdin, stdout이니까@

    • 만약 자리를 찾으면 스레드의 fdt에 넣고 그때의 idx를 반환.

int open(const char *file)
{
	check_address(file); // 주소 유효성 검사

	struct file *open_file = filesys_open(file); // 파일 시스템에서 파일 열기
	struct thread *curr = thread_current();

	if (open_file == NULL)
	{
		return -1;
	}
	else
	{
		for (int i = 2; i < 64; i++)
		{
			if (curr->fdt[i] == NULL)
			{
				curr->fdt[i] = open_file;
				return i;
			}
		}
	}
}
pass tests/userprog/create-bound
pass tests/userprog/open-normal
pass tests/userprog/open-missing
pass tests/userprog/open-boundary
pass tests/userprog/open-empty
pass tests/userprog/open-null
FAIL tests/userprog/open-bad-ptr

저기 나머지 하나는 pm14? 구조체 쓰는거라는데 아직 잘 모르겠다... 해야지...

프로그래머스 JS 최댓값과 최솟값

  • 구할 것 : 문제 조건 : str 에서 나타네는 최소값과 최대값을 찾아 “최소값 최대값” 형태로 리턴

알고리즘 설계

  1. 문자열 공백 기준으로 쪼개기(복사본 배열 활용)
  2. 숫자로 형변환 후 최댓값, 최솟값 도출
  3. 문자열로 변환
  4. 한 배열에 넣고 join으로 리턴

내 코드

function solution(s) {
    var answer = [];
    let str = s
    str = str.split(' ').map(Number);
    let max = Math.max(...str);
    let min = Math.min(...str);
    
    answer.push(min);
    answer.push(max);
    
    return answer.join(' ');
}

다른 풀이


function solution(s) {
    const arr = s.split(' ');

    return Math.min(...arr)+' '+Math.max(...arr);
}

진짜 이거 보고 어이가 없었다.
저 Math 모듈이 문자열도 형변환을 알아서 해서 최소, 최대를 찾아준다는게...
JS야 너 너무 Dynamic 해....

⛏ 오늘의 삽질

open 함수를 구현하는데 정신팔린 나머지 어제 TIL을 빼먹었다...
나의 48시간.... 헤헤...

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글