SW Jungle (17) 썸네일형 리스트형 project 02 User program(fork) 지금 부터는 구현 했던 syscall 함수 중에서 가장 어렵고 이해가 힘들었던 fork 관련 내용을 정리하려고 한다 . pid_t fork (const char *thread_name); 먼저 fork 함수의 기능에 대해 설명하자면 현재 프로세스 이름이 thread_name인 프로세스의 복제본을 만드는 새 프로세스를 생성해야 합니다. 호출자 보존 레지스터인 %RBX, %RSP, %RBP, and %R12 ~ %R15 의 값 이외에는 레지스터 값을 복제할 필요가 없습니다. 함수는 자식 프로세스의 pid를 반환해야 합니다. 그렇지 않으면 유효한 pid가 아니어야 합니다. 자식 프로세스에는 반환 값이 0이어야 합니다. 자식 프로세스는 파일 디스크립터와 가상 메모리 공간을 포함하여 복제된 리소스를 가져야 합니다.. project 02 User program(System_call) System call os에 의해 제공되는 프로그래밍 인터페이스 유저 모드의 프로그램이 kernel feature를 이용할 수 있게함 시스템 콜은 커널 모드에서 진행되며 return 할때 유저 모드로 돌아감 위에는 시스템 콜의 process를 나타내는 그림 먼저 유저가 write 함수를 통해 system call을 호출함 파라미터가 총 세개 들어가는 것을 볼 수 있음(arg0, arg1, arg2) int 0x30 -> 0x30은 인터럽트 번호를 의미함 syscall_nr.h에 시스템 콜의 번호가 적혀있음 Requirement for System Call Handler Implement system call handler 시스템 콜 번호를 이용해 핸들러가 시스템 콜을 호출하게 한다 파라미터 리스트의 포인.. project 02 User program(Argument passing) - 개발 계획 user 영역에서 입력 받은 argumet를 strtok_r 함수를 통해서 파일 이름과 인자들로 parsing 해서 선언한 argv에 저장한 후 이름과 인자들의 길이로 메모리 사이즈 측정 마찬가지로 선언한 size에 저장해준뒤 user_stak에 parsing한 인자의 끝부터 위에서 부터 저장해 나갑니다. 이때 주의 할점은 속도 향상을 위해 stack에 저장되는 데에터의 size는 8의 배수로 마쳐 줍니다. 8의 배수를 마쳐주기위해 알맞은 padding size로 채워 준뒤 파일 이름과 인자들이 전부 들어갔다는 것을 알리기 위해 8bite 크기를 가지는 null 값을 채워줍니다. 다음 부분은 위에서부터 쌓아온 인자들의 주소값을 가지는 데이터를 8bite로 채워줍니다. 이 모든 과정이 끝나는.. project 02 User program(background) - 노트 정리 process_excute()호출 -> thread_creat()으로 할당 해줌 지금은 유저 프로세스가 실행되고 나면 kernel이 꺼지는데, 이번 프로젝트의 목표는 유저 프로세스가 실행되면 유저프로세스가 끝날 때까지 커널이 기다리게끔 하는 것 echo x y z 라는 함수가 들어 왔을 때, echo라는 프로그램과 x, y, z 라는 인자로 구분해야함 그러기 위해서 argument를 파싱해서 유저 스택에 넣어야함 관련 Q1. process.c의 do_iret 함수를 통해서 intr_fram if_에 있던 데이터들이 레지스터에 저장되고 if_ -> rip인 e_entry가 레지스터의 rsp에 저장되는것으로 이해, 이후 실행되는 iretq함수를 실행되면 레지스터의 rsp에 저장된 주소로 이동,.. Pintos Project_1 Threads(Priority Scheduling) Pintos는 FIFO 스케줄링을 이용 Pintos 스케쥴러를 Roud Robin 에서 Priority scheduling으로 수정 ready list를 thread priority에 의해 정렬 wait list를 synchronization primitives(such as semaphore, condition variable and locks with the respect of the priority)에 의해 정렬 preemption 구현 preemption scheduling(선점 스케쥴링): 시분할 시스템에서 time slice가 소진 되었거나, interrpt가 시스템 호출 종료 시에 더 높은 우선 순위 프로세스가 발생되었음을 알았을때, 현 실행 프로세스로 부터 강제로 CPU를 회수 하는것 현 .. Pintos Project_1 Threads(Alarm Clock) 기능설계(노트필기) 수정 파일 : thread/thread.c, thread.h , divices/timer.c timer.c의 timer_sleep 함수에서 sleep 하는 함수를 while문 안에서 busy-wait형식으로 탐색 이 과정을 코드를 수정해서 바꿔야 함. 기능설계 기존의 방향과 다르게 timer_sleep 함수 호출시 재워야 하는 thread를 sleep_list를 추가로 만들어서 저장 sleep_li에 재운 thread를 넘겨줄때 (자기 시작한 지금시간) start + (잘 시간)thread_tick을 넘겨준다. sleep하는 함수를 추가적인 list에 저장하였으므로, timer_interrpt 함수를 통해서 깨울때에서 sleep_list에서 ready_lsit로 올려줘야하는 로직 추가.. Pintos Project_1 Threads(노트 정리) 노트 정리 Project 관련 단어 정리 Priority donation 우선순위 기부(Priority donation)는 다른 스레드나 프로세스가 현재 실행 중인 스레드의 작업을 방해하고 있을 때, 해당 스레드의 우선순위를 높여주는 방식입니다. 이를 통해 스레드의 빠른 처리를 돕고, 전반적인 시스템 성능을 향상시키는데 사용됩니다. round-robin 스케쥴러 라운드 로빈(Round-robin) 스케줄러는 컴퓨터 시스템에서 프로세스 스케줄링에 사용되는 알고리즘 중 하나입니다. 이 알고리즘은 시분할 시스템에서 CPU 시간을 할당하기 위해 사용됩니다. 기아현상 기아 현상(Starvation)이란, 운영 체제에서 프로세스나 스레드가 원하는 자원을 계속해서 기다리는 상황이 발생하여 자원을 제공받지 못하고 영원.. 다이나믹 프로그래밍 다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법입니다. 이이 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 합니다. 다이나믹 프로그래밍의 구현은 일반적으로 두 가지 방식(탑다운과 바텀업)으로 구성됩니다. 다이나믹 프로그래밍은 동적 계획법이라고도 부릅니다. 일반적인 프로그래밍 분야에서의 동적(Dynamic)이란 어떤 의미를 가질까요? 자료구조에서 동적 할당(Dynamic Allocation)은 '프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법'을 의미합니다. 반면에 다이나믹 프로그래밍에서 '다이나믹'은 별다른 의미 없이 사용된 단어입니다. 다이나믹 프로그래밍은 문제가 다음의 조건을 만족할 때 사용할 수 있습니다. .. 이전 1 2 3 다음