Virtual Memory가상 메모리 관리가상 메모리 관리에서 가장 중요한 것은 얼마나 disk를 덜 방문하느냐disk에 데이터를 read, write를 하는 작업들은 느리기 때문임 페이징고정된 크기(page 단위)로 메모리 공간을 분할해 가상 메모리를 관리하는 기법필요성1. 메모리 공간이 고르게 분할되어 있기 떄문에 빈 공간이 작게 분할되어 유용하게 사용될 수 있어 외부 단편화 해결2. 필요한 메모리보다 조금 더 큰 크기의 메모리를 할당하여 내부 단편화가 발생하더라도 크게 문제되지 않음3. 물리 메모리보다 더 큰 주소 공간을 제공해 프로세스가 물리 메모리에 직접 접근하지 않고, 가상 주소를 통해 메모리 접근4. 필요한 페이지만 물리 메모리에 로드해 메모리 사용을 최적화5. 각 프로세스마다 독립적인 페이..
728x90
반응형
전체 글
fork 더보기모든 케이스를 통과한게 아니라 중간에 틀린 내용이 있을 것으로 예상..fork()자식 프로세스(쓰레드)를 생성하고 부모 프로세스(쓰레드)의 내용을 자식에게 복사함tid_t fork(const char *file_name, struct intr_frame *f){ return process_fork(file_name, f);}process_fork()커널의 인터럽트 프레임을 부모 구조체 내부의 parent_tf에 복사함(자식에게 복사해주기 위함)tid_t process_fork(const char *name, struct intr_frame *if_ UNUSED){ struct thread *parent = thread_current(); // 부모 쓰레드 memcpy(&parent->par..
System Call시스템콜 함수더보기추가적인 수정이 필요함..check_addr()받아온 주소의 유효성을 검사가상 메모리와 주소가 맵핑된 것이 없는 경우주소가 유저 스택의 최상단 주소보다 같거나 큰 경우(유저 영역이 아닌 경우)주소가 NULL인 경우void check_addr(void *addr){ // 가상메모리와 매핑된게 없거나 유저스택보다 같거나 크고 NULL이면 종료(exit) if (pml4_get_page(thread_current()->pml4, addr) == NULL || !is_user_vaddr(addr) || addr == NULL) { exit(-1); }}halt()power_off를 호출해서 PintOS를 종료시킴void halt(void){ power_off();}exit..
Argument Passing 프로세스 함수 load()명령어 라인(Command Line)으로 입력받은 파일명과 인자들을 USER STACK에 PUSH하고 레지스터에 argv, argc를 지정 uintptr_t phys_base = if_->rsp;// 기존에 만들었던 Stack을 사용(오른쪽 인자부터 유저스택에 넣기 위해서 사용)Stack stack;int lenArr[100] = {0};int idx = 0;int args_count = 1;int stack_size;char *addr_list[20];// 파일명 넣기push(&stack, file_name);// 인자 넣기for (token = strtok_r(NULL, " ", &saveptr); token; token = strtok_r(NU..
Pintos Part 2(User Program) Backgroundthread_create() 함수- 쓰레드 구조체를 만들고 초기화- 커널 스택을 할당받음- 함수를 등록해 실행(명령어 포인터 및 인자를 넣음)- ready_list에 추가로드(load) 함수- 디스크에서 바이너리 파일을 로드하고 메모리(스택, 데이터, BSS, TEXT 등) 초기화를 수행- 성공적으로 로드가 되면 실행하고 아니면 exit() 호출요구사항1. Argument passing(인자 전달)2. 레지스터에 agvc, argv 전달프로세스 실행 함수(process_exec)ELF 파일 로드- 2단계 페이지 테이블 생성- 파일을 열어서 ELF 헤더를 읽음- 파일을 파싱해서 데이터를 데이터 세그먼트로 로드- 유저 스택을 만들고 초기화함..
PintOS 궁금증세마포어의 wait_list와조건(Condition)의 wait_list의 차이- Semaphore는 critical section에 들어가기 위해 대기하는 스레드들이 있는 리스트입니다. Semaphore를 사용하는 스레드는 먼저 세마포어를 획득하기 위해 대기 리스트에 등록되고, 세마포어를 획득한 후에는 다른 스레드가 이용할 수 있도록 세마포어를 해제합니다.-조건(Condition)은 특정 조건이 충족되지 않아 대기하는 스레드들이 있는 리스트입니다. 조건(Condition)를 사용하는 스레드는 조건이 충족되지 않으면 대기 리스트에 등록되고, 조건이 충족되면 대기를 해제하여 작업을 수행하게 됩니다.**세마포어의 wait_list는 critical section에 들어가기 위해 대기하는 스..
1158. 요세푸스 문제import sysinput = sys.stdin.readlinelength, num = map(int, input().split())arr = [i for i in range(1, length+1)]temp = num - 1result = []while len(arr) > 0: temp %= len(arr) # 배열의 길이에서 숫자-1을 나눈 나머지를 담음 result.append(arr.pop(temp)) # 배열의 temp번째를 뽑아내서 result에 담음 temp += num - 1 # temp에 num-1을 더함print("")1874. 스택 수열import sysinput = sys.stdin.readlinen = int(input())num_list =..
728x90
반응형