. '분류 전체보기' 카테고리의 글 목록 (5 Page)
본문 바로가기

분류 전체보기111

[PintOS, Project3] Virtual Memory - Paging System Non-continuous allocation - 사용자 프로그램을 여러 개의 block을 분할 - 실행 시, 필요한 block들만 메모리에 적재 -> 나머지 block들은 swap device에 적재 - 기법들 ㆍPaging System ㆍSegmentation System ㆍHybrid Paging / Segmentation System Continuous allocation - Relative address (상대주소) ㆍ프로그램의 시작 주소를 0으로 가정한 주소 - Relocation (재배치) ㆍ메모리 할당 후, 할당된 주소(allcation address)에 따라 상대 주소들을 조정하는 작업 Address Mapping Non-continuous allocation - Virtual addre.. 2021. 2. 18.
[PintOS, Project2] System Call 0. System Call이란? 시스템 콜은 사용자가 커널 영역에 접근하고 싶을 때, 원하는 목적을 대신해서 작업하는 프로그래밍 인터페이스이다. 그렇기 때문에 시스템 콜은 커널 모드에서 실행되고, 작업 후 사용자 모드로 복귀한다. PintOS에서는 이를 시스템 콜 핸들러를 통해 시스템 콜 (halt, exit, create, remove)를 호출한다. 시스템 콜을 호출할 때, 원하는 기능에 해당하는 시스템 콜 번호를 rax에 담는다. 그리고 시스템 콜 핸들러는 rax의 숫자로 시스템 콜을 호출하고, 해당 콜의 반환값을 다시 rax에 담아서 intr frame(인터럽트 프레임)에 저장한다. 1. Syscall Handler @/userprog/syscall.c /* The main system call i.. 2021. 2. 17.
[PintOS, Project2] 명령어 실행 기능 구현 1. Process_Exec() 수정 유저 프로그램이 실행하기 전에, 커널은 레지스터에 맨 처음 function의 argument를 저장해야한다. Process_Exec()은 유저가 입력한 명령어를 수행할 수 있도록, 프로그램을 메모리에 적재하고 실행하는 함수이다. 해당 프로그램은 f_name에 문자열로 이름이 저장되어있으나, 문제는 파일 이름 뿐만 아니라 옵션 (예를 들어서 rm -rf *을 명령어로 입력한다면, 실행 프로그램 파일은 rm이 되지만, 현재 f_name은 rm 뿐 아니라 -rf, * 도 함께 들어가있다.) 이 있기 때문에 이를 분리해줘야한다. 우선 원본은 아래와 같다. @/userprog/process.c /* Switch the current execution context to the.. 2021. 2. 17.
[PintOS, Project 2] User Programs Introduction - 만약 추과 과제의 테스트케이스를 도전하고 싶으면 userprog/Make.vars를 수정하라. - TODO가 없는 코드는 수정할 필요가 없다. We allow more than one process to run at a time. Each process has one thread (multithreaded processes are not supported). - 다중 프로세스로 구성되어 있다. User programs are written under the illusion that they have the entire machine. - UP는 전체 장치들이 있다는 가정하에 작성한다. From now on, we will test your operating system by running user p.. 2021. 2. 5.
[PintOS, Project1] Priority Inversion Problem Priority Inverstion Problem은 thread가 두 개 이상의 lock보유가능할 때, 높은 priority의 thread가 낮은 priority의 thread보다 늦게 실행될 수 있는 문제점을 말한다. 아래 예시를 보자. 그림 1의 상황은 이렇다. 현재 Priority 31의 thread가 running 중이다. (A)는 lock A의 소유권을 가지고 있다는 뜻이다. Read List와 Blocked List가 모두 비어있다. 이제 여기에 lock A를 원하는 높은 priority의 thread가 들어온다고 해보자. 그렇다면 priority가 높은 thread가 running thread가 될 것이다. 39은 running_thread가 되었으나 lock A를 보유하고 있지 않기 때문에.. 2021. 2. 4.
[PintOS, Project1] Priority_Scheduling and Synchronization (semaphore 관련) 지금까지 작업한 pintos에서 thread가 semaphore를 가져가는 순서는 FIFO순으로 되어있다. 이것은 priority가 높은 순으로 semaphore를 가져갈 수 있도록 할 것이다. @/include/threads/synch.h /* A counting semaphore. */ struct semaphore { unsigned value; /* Current value. */ struct list waiters; /* List of waiting threads. */ }; struct semaphore는 semaphore를 관리하기 위한 구조체로서 semaphore의 현재 상태인 value와 이 semaphore를 기다리는 waiters(list 구조체) 가 있다. semaphore와 관련된.. 2021. 2. 4.
[PintOS, Project1] Condition Variable을 이용한 Monitor System Monitor System은 Mutex와 Busy Waiting을 동시에 관리해주는 시스템이다. 어떤 CA(임계영역)의 Mutex를 보장하기 위해서, CA에 관련되어있는 thread는 모두 재우고(Busy waiting 관리, 재운다는 정확한 의미는 차후 서술하겠다.) 오직 하나의 thread만 CA에서 작업하도록 한다(Mutex). 그리고 그 CA에서 작업이 끝나면 자고 있는 thread 중에 한 thread에 signal을 보내서, CA에서 작업하도록 한다. 즉, 어떤 thread가 한 임계영역에 대해 작업하고 있는데, 이 임계영역과 관계가 있는 thread들은 조건이 만족되기 전에는 활동하지 않는다. 이 '조건'을 이용하여 thread를 관리하는 시스템을 Condition Variable을 이용한 .. 2021. 2. 4.
[PintOS, Project1] Priority_Scheduling 과제 목표는 우선순위 스케줄링을 사용하는 것이다. 만약 CPU에 있는 스레드보다 높은 우선순위의 스레드가 들어오면 새로운 스레드가 CPU를 차지한다. 스레드 구조체에 PRI가 들어갈 것 같다. 그리고 스레드의 우선순위를 바꾸는 함수와 우선순위를 반환하는 함수가 들어간다. thread_create() : 스레드를 생성할 때, 우선순위도 지정하도록 바꾼다. unblock과 yield할 때 수정한다는 것은, ready_list에 변화가 있을 때 우선순위별로 정렬하라는 것이다. 이는 list_insert_ordered() 로 정렬한다. 우선 구현할 함수를 선언한다. @/include/threads/thread.h /*-------------------------- project.1-Alarm_Clock ----.. 2021. 2. 3.
[PintOS, Project 1] Alarm Clock 구현 2021/01/31 - [Pintos Project/Project 1] - [PintOS, Project 1] 1/30 : 공부 노트 - 각종 관련 함수들 1. Thread 자료 구조 수정 @/include/threads/thread.h struct thread { /* Owned by thread.c. */ tid_t tid; /* Thread identifier. */ enum thread_status status; /* Thread state. */ char name[16]; /* Name (for debugging purposes). */ int priority; /* Priority. */ /* Shared between thread.c and synch.c. */ struct list_elem.. 2021. 2. 1.
[C언어, 웹서버] Echo 클라이언트 (작성 중) Echo 클라이언트는 서버와의 연결을 수립한 이후에 클라이언트는 표준 입력에서 텍스트 줄을 반복해서 읽는 루프에 진입하고, 서버에 텍스트 줄을 전송, 서버에서 echo 줄을 읽어서 그 결과를 표준 출력으로 인쇄한다. Echo의 메인 함수는 아래와 같다. #include "csapp.h" int main(int argc, char **argv) { int clientfd; char *host, *port, buf[MAXLINE]; rio_t rio; if (argc != 3) { fprintf(stderr, "usage: %s \n", argv[0]); exit(0); } host = argv[1]; port = argv[2]; clientfd = Open_clientfd(host, port); Rio_r.. 2021. 2. 1.
11.4 소켓 인터페이스 (작성 중) 소켓 인터페이스는 네트워크 응용프로그램을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합이다. 그림 1은 전형적인 소켓 인터페이스의 개요를 보여준다. ※ 이 글에서 [TCP-IP/공부]주소정보의 표현 : 네이버 블로그 (naver.com) 를 참고했다. 아직 고등학생인데 나랑 같이 이거를 하다니. 한국 IT의 미래가 밝다. 11.4.1 소켓 주소 구조체 리눅스 커널의 관점에서 보면 소켓은 통신을 위한 끝점이고, Unix 프로그램의 관점에서 보면 해당 식별자를 가지는 열린 파일이다. /* IP socket address structure */ struct sockaddr_in { uint16_t sin_family; /* Protocol family (always AF_INET) */ u.. 2021. 2. 1.
[PintOS, Project 1] 1/30 : 공부 노트 - 각종 관련 함수들 timer_sleep() /* Suspends execution for approximately TICKS timer ticks. */ void timer_sleep (int64_t ticks) { int64_t start = timer_ticks (); ASSERT (intr_get_level () == INTR_ON); while (timer_elapsed (start) < ticks) thread_yield (); } 목적 : (기동 중인 어떤 스레드에 대해서) 기동한 지, 일정 시간이 지나면 thread_yield를 실행한다. - assert : 지정한 조건식이 False 이면 프로그램을 중단하고, True이면 프로그램을 계속 실행한다. - timer_elapsed(start) 가 ticks 보다.. 2021. 1. 31.
[PintOS, Appendix ] Threads Thread struct thread { /* Owned by thread.c. */ tid_t tid; /* Thread identifier. */ enum thread_status status; /* Thread state. */ char name[16]; /* Name (for debugging purposes). */ int priority; /* Priority. */ /* Shared between thread.c and synch.c. */ struct list_elem elem; /* List element. */ #ifdef USERPROG /* Owned by userprog/process.c. */ uint64_t *pml4; /* Page map level 4 */ #endif #i.. 2021. 1. 30.
Lecture 5 : Process Scheduling 다중 프로그래밍 - 여러 개의 프로세스가 시스템 내 존재 - 자원을 할당 할 프로세스를 선택해야 함 : Scheduling - 자원관리 ㆍ시간 분할 (Time sharing) 관리 -> 하나의 자원을 여러 스레드들이 번갈아 가며 사용 -> 예) 프로세서 -> 프로세스 스케줄링 (Process Scheduling) : 프로세서 사용시간을 프로세스들에게 분배 ㆍ공간 분할 (Space Sharing) 관리 -> 하나의 자원을 분할하여 동시에 사용 -> 예) 메모리 스케줄링의 목적 - 시스템의 성능 향상 - 대표적 시스템 성능 지표 (index) ㆍ응답시간 : 작업 요청으로부터 응답을 받을 때까지의 시간 ㆍ작업 처리량 : 단위 시간동안 완료된 작업의 수 ㆍ자원 활용도 : 주어진 시간동안 자원이 활용된 시간 (U.. 2021. 1. 30.