Computer Science(21)
-
[Pintos-KAIST] Project 4 :: 디스크의 파일 데이터 할당 방법
Pintos Project4에서는 FAT 방식으로 파일 데이터를 할당한다. FAT 방식은 파일이 할당된 블록의 위치 정보를 chain 형태로 관리하는 Linked Allocation 방식에 해당한다. 이외에도 파일 데이터를 할당하는 방식은 여러가지가 있다. Contiguous Allocation Linked Allocation Indexed Allocation 1. Contiguous Allocation 연속 할당 방식은 각 파일을 디스크의 연속적으로 이어지는 공간에 할당한다. 이 상황에서 중간에 있는 길이가 5인 주황색 파일이 삭제되어 공간이 비었을 때, 길이가 6인 노랑색 파일을 저장하려고 한다면, 실제 디스크의 공간이 6 이상 비어있음에도 불구하고, 연속된 공간이 아니기 때문에 할당할 수 없어 4 ..
2023.05.30 -
[Pintos-KAIST] Project 3 :: Memory Mapped Files
Memory-mapped page Memory-mapped page는 Anonymous page와 달리 파일을 기반으로 매핑하는 페이지이다. 즉, 이 페이지에 담기는 내용은 실제 디스크에 존재하는 파일의 데이터가 담긴다. 🤔 왜 매핑을 해야 하지? 파일과 메모리를 매핑하면, 파일을 메모리처럼 접근할 수 있게 되어서 파일 입출력의 효율성을 향상할 수 있다. 이렇게 파일과 매핑된 메모리 영역은 가상 주소 공간에서 접근 가능하며, 해당 영역에 대한 읽기/쓰기 작업이 가능해진다. 쓰기 작업으로 인해 파일의 내용이 변경되면 매핑이 해제(unmap)될 때 디스크의 실제 파일에 해당 변경 사항이 반영된다. Mapping 파일과 메모리 매핑은 System call인 mmap()을 통해 이루어진다. Pintos에서는 v..
2023.05.22 -
[Pintos-KAIST] Project 3 :: Anonymous Page (Lazy Loading으로 메모리 효율성 높이기)
💡 이번 파트에서는 Anonymous page라고 불리는 non-disk based image를 구현한다. Anonymous Page란? 파일을 기반으로 하는 file-backed page와 달리, 이름이 지정된 파일 소스가 없기 때문에 anonymous라고 불리며, 스택과 힙 영역에서 사용된다. Lazy Loading을 이용한 페이지 초기화 Lazy loading은 메모리 로딩을 필요한 시점까지 미루는 디자인 패턴이다. Lazy Loading을 구현하기 위해서는 페이지를 할당할 때 해당 페이지에 대응하는 page 구조체만 만들고, 물리 frame 할당 ❌ 실제 내용도 ❌ (아직은 로딩하지 않는다!) 그럼 내용은 언제 로드하지 ?! 👉🏻 실제로 내용이 로드되는 시점은 page fault가 발생하는 시점이..
2023.05.19 -
[Pintos-KAIST] Project 3 :: Memory Management
Pintos Project 3의 첫번째 과제인 Memory Management에서는 supplemental page table을 먼저 다루고, Physical Memory와의 매핑하는 함수를 구현한다. Implement Supplemental Page Table 현재 상태에서 Pintos는 가상 및 물리적 메모리 매핑을 관리하기 위한 페이지 테이블(pml4)을 가지고 있다. pml4 이외에 추가로, page fault 및 리소스 관리를 처리하기 위해 supplementary page table이 필요하다. 💡 Implement supplemental page table management functions in vm/vm.c. 0) supplemental page table hash table을 이용해서..
2023.05.16 -
[Pintos-KAIST] Project 2 :: System Calls - 3 (File System), User Memory
Pintos Project 2 관련 포스팅 목록 Argument Passing (User 프로그램 인자 설정하기) System Calls - 1 (System Calls이 호출되는 과정) System Calls - 2 (exec, wait, fork) & Deny Write on Executables System Calls - 3 (File System) & User Memory User Memory Access system call의 일환으로, 커널은 종종 사용자 프로그램이 제공한 포인터를 통해 메모리에 접근해야 합니다. 그러나 사용자는 1) null 포인터, 2) 매핑되지 않은 가상 메모리를 가리키는 포인터 또는 3) 커널 가상 주소 공간(KERN_BASE 이상)을 전달할 수 있으므로, 커널은 이를 ..
2023.05.16 -
[Pintos-KAIST] Project 2 :: Argument Passing (User 프로그램 인자 설정하기)
Pintos Project 2 관련 포스팅 목록 Argument Passing (User 프로그램 인자 설정하기) System Calls - 1 (System Calls이 호출되는 과정) System Calls - 2 (exec, wait, fork) & Deny Write on Executables System Calls - 3 (File System) & User Memory Argument passing user 프로그램이 실행되기 전에 프로그램에 대한 인자를 설정해야 한다. 👇🏻 인자를 어떻게 처리해야 하는지 예시를 통해 먼저 알아보자! 예시) "/bin/ls -l foo bar"의 인자 처리하기 명령어를 단어로 분할한다: /bin/ls, -l, foo, bar 각 문자열과 널 포인터를 스택에 오..
2023.05.16 -
[Pintos-KAIST] Project 3 :: Stack Growth (Pintos의 스택 확장 메커니즘)
Stack Growth Project 2까지 사용하던 스택은 USER_STACK을 시작으로 하는 단일 페이지였으며, 프로그램의 실행은 이 크기로 제한되어 있었다. Stack Growth를 구현하면 스택이 현재 크기를 초과하면 추가 페이지를 할당한다. 즉, 접근한 가상 주소에 매핑된 frame이 없어서 page fault가 발생한 경우 중에서 접근한 가상 주소가 Stack 영역 내에 존재할 경우에는 추가 페이지를 할당해 page fault를 해결해보자! 우선 접근한 주소가 Stack 영역 내에 존재하는지 판별해야 한다. 접근한 주소가 Stack 영역 내에 존재하는지 판별하기 page fault가 발생했을 때 접근한 주소가 stack 안에 있는지 판별하고, stack에 접근한 경우에는 stack growth..
2023.05.16 -
[Pintos-KAIST] Project 2 :: System Calls - 1 (System Calls이 호출되는 과정)
Pintos Project 2 관련 포스팅 목록 Argument Passing (User 프로그램 인자 설정하기) System Calls - 1 (System Calls이 호출되는 과정) System Calls - 2 (exec, wait, fork) & Deny Write on Executables System Calls - 3 (File System) & User Memory Pintos 프로젝트 2 과제로 시스템콜을 구현했다. 1.5주동안 열씸히 구현한💦 유저 프로그램을 실행시키고 시스템콜을 호출하는 그 과정이 어떻게 이루어지는지 알아보자! system call을 호출하는 open-normal 테스트 파일이 실행되는 데까지 어떤 과정을 거치게 될까?? open-normal 👇🏻 System call..
2023.05.09 -
[Pintos-KAIST] Project 2 :: System Calls - 2 (exec, wait, fork), Deny Write on Executables
Pintos Project 2 관련 포스팅 목록 Argument Passing (User 프로그램 인자 설정하기) System Calls - 1 (System Calls이 호출되는 과정) System Calls - 2 (exec, wait, fork) & Deny Write on Executables System Calls - 3 (File System) & User Memory 1. exec 1-1. exec 요구사항 현재 프로세스를 cmd_line에 주어진 실행 파일로 변경하고, 필요한 인수를 전달합니다. 이 함수는 성공한 경우 반환하지 않습니다. 프로그램이 로드되거나 실행될 수 없는 경우 종료 상태 -1로 프로세스가 종료됩니다. 이 함수는 exec를 호출한 스레드의 이름을 변경하지 않습니다. 파일 ..
2023.05.05 -
[Pintos-KAIST] Project 1 :: Priority Donation
Donation Donation 구현사항 lock을 보유하고 있는 스레드가 낮은 우선순위를 가진 스레드일 경우, 대기하고 있는 스레드의 우선순위를 보유한 스레드에게 기부한다. 이 때, 재귀적으로 기부가 이루어질 수 있다. 🤔 Donation을 하는 이유 :: Priority Inversion 높은 우선순위 스레드가 낮은 우선순위 스레드가 가진 공유 자원(lock)을 사용하기 위해 대기할 때 Priority Inversion이 발생한다. 높은 우선순위 스레드는 블록되어 CPU 시간을 할당받지 못하고, 대기 상태에서 머물러 있게 된다. 이럴 경우 중간 우선순위의 스레드가 ready_list에 존재한다면, 높은 우선순위 스레드는 우선순위가 더 높음에도 불구하고 CPU 시간을 할당받지 못하고 대기 상태에 머물러..
2023.04.26 -
[Pintos-KAIST] Project 1 :: Priority Scheduling
Priority Scheduling 💡 우선순위가 높은 스레드가 먼저 CPU를 점유할 수 있도록 Priority Scheduling을 구현한다. Priority Scheduling 구현사항 스레드들은 각 우선순위에 따라 ready list에 추가된다. 현재 실행 중인 스레드의 우선순위보다 높은 우선순위의 스레드가 ready list에 추가되면, 현재 실행 중인 스레드는 바로 CPU를 양도한다. 스레드는 언제든지 자신의 우선순위를 변경할 수 있다. 우선순위를 낮추어 더이상 가장 높은 우선순위가 아니게 된다면, 즉시 CPU를 양도한다. lock, semaphore, condition variable을 사용하여 대기하고 있는 스레드가 여러 개인 경우, 우선순위가 가장 높은 스레드가 먼저 깨어나야 한다. 구현하..
2023.04.25 -
[Pintos-KAIST] Project 1 :: Alarm Clock (Sleep-Awake 방식의 Alarm Clock 구현하기)
Alarm Clock 💡 스레드를 잠시 재웠다가 일정 시간이 지나면 깨우는 기능인 Alarm Clock을 Busy-waiting 방식에서 Sleep-Awake 방식으로 변경하자! 1) Busy-waiting과 Sleep-Awake의 차이 Busy waiting은 특정 조건이 매우 빠르게 충족될 것으로 예상될 때 사용되는 것이 적합하며, Alarm clock은 일정 시간 이후에 수행해야 하는 작업이 있을 때 사용된다. Busy waiting 프로그램이 다른 작업을 수행하며 기다리는 대신, 특정 조건이 충족될 때까지 반복적으로 체크를 하면서 기다리는 것을 말한다. 이러한 방식은 CPU 자원을 낭비하고, 다른 스레드가 실행되는 기회를 줄여 성능 저하를 야기할 수 있다. Alarm Clock 프로그램이 일정 시..
2023.04.25 -
Why Is Code Review Necessary?
1. Google이 일하는 방식 1) Test Driven Development 테스트가 기본이다. 구현해야 할 요구사항과 구현체를 분리해서 구현하기 전에 테스트를 먼저 작성한다. 엣지 케이스, 코너 케이스 등을 생각해서 테스트를 작성한다. 테스트를 먼저 작성하는 이유: 코딩을 먼저 하면 내 코드에 맞는 테스트만 떠올리게 되기 때문에, 테스트를 먼저 작성하고 코딩을 한다. 테스트는 실행 가능한 문서라고 하는데, comment는 테스트해볼 수도 없고 내 코드와 맞는지 확인할 수 없는 반면, 테스트는 코드와 동기화가 될 수 밖에 없기 때문이다. 구글은 테스트가 없으면 커밋조차 할 수 없다. 2) Short iterations 자잘하게 빨리 빨리 많이 커밋을 해놔야 문제가 생겼을 때 파악하기 쉽다. 3) Pa..
2023.04.04 -
[CS:APP] 1-7) 운영체제의 역할
이전의 hello 프로그램을 쉘 프로그램이 로드하고 실행했을 때나 hello 프로그램이 메시지를 출력할 때, 이 프로그램이 키보드나 디스플레이, 디스크나 메인 메모리를 직접 액세스하지 않는다. 💡 운영체제가 제공하는 서비스를 활용한다. 0. 운영체제 운영체제는 하드웨어와 소프트웨어 사이에 위치한 소프트웨어 계층이다. 응용프로그램이 하드웨어를 제어하려면 언제나 운영체제를 통해서 해야 한다. 운영체제의 두 가지 주요 목적 1) 제멋대로 동작하는 응용프로그램들이 하드웨어를 잘못 사용하는 것을 막는다. 2) 응용프로그램들이 단순하고 균일한 메커니즘을 사용하여 복잡하고 매우 다른 저수준 하드웨어 장치들을 조작할 수 있도록 한다. (응용프로그램이 하드웨어를 직접 조작하려면 복잡하다. 운영체제가 중간다리 역할을 해서..
2023.03.11 -
[CS:APP] 1-5~1-6) 캐시 메모리, 저장장치의 계층구조
캐시가 중요하다! 1-4) 프로세서의 작동 원리에서 봤듯이, 시스템이 정보를 한 곳에서 다른 곳으로 이동시키는 일에 많은 시간을 보낸다. 기계어 인스트럭션들과 데이터 스트링들의 복사 과정을 간략하게 다시 정리해보면, 데이터의 복사 과정 1) 기계어 인스트럭션들 처음에는 하드디스크에 저장되어 있다. 프로그램이 로딩될 때 메인 메모리로 복사된다. 프로세서가 프로그램을 실행할 때 프로세서로 복사된다. 2) "hello, world\n" 데이터 스트링 처음에는 디스크에 저장되어 있다. 메인 메모리로 복사된다. 디스플레이 장치로 복사된다. 더 큰 저장장치들은 보다 작은 저장장치들보다 느리다. 그리고, 더 빠른 장치들은 더 느린 장치들보다 만드는 데 비용이 많이 든다. 1) 디스크 드라이브 vs 메인 메모리 구분 ..
2023.03.10 -
[CS:APP] 1-4) 프로세서의 작동 원리
프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다 [1-2) 컴파일 시스템]에 의해 실행가능한 목적파일로 번역되어 디스크에 저장된 hello 실행파일을 유닉스 시스템에서 실행하는 과정을 알아보자! 쉘 hello 실행파일을 유닉스 시스템에서 실행하기 위해서 쉘이라는 응용프로그램에 그 이름을 입력한다. linux> ./hello hello, world linux> 1) 쉘은 커맨드라인 인터프리터로, 프롬프트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행한다. 2) 명령어 라인이 내장 쉘 명령어가 아니면, 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행해준다. 👉🏻 위 경우, 쉘은 hello 프로그램을 로딩하고, 실행한 뒤에 종료를 기다린다. 3) hello 프로그램은 메시지를 화면에 출력..
2023.03.06 -
[CS:APP] 1-2~1-3) 컴파일 시스템
프로그램은 다른 프로그램에 의해 다른 형태로 번역된다 아래의 hello.c 프로그램이 시스템에서 실행되는 과정을 알아보자! 그 중에서 소스 파일이 번역되는 과정을 알아보자! hello.c #include int main() { printf("hello, world\n"); return 0; } 뭘 번역한다는 거야? hello.c를 시스템에서 실행시키려면, 각 C 문장들은 다른 프로그램들에 의해 저급 기계어 인스트럭션들로 번역되어야 한다. 이 인스트럭션들은 실행 가능 목적 프로그램( = 실행가능 목적 파일) 이라는 형태로 합쳐져서 바이너리 디스크 파일로 저장된다. 컴파일러 드라이버는 유닉스 시스템에서 아래와 같이 소스파일에서 오브젝트 파일로 번역한다. 👇🏻 GCC 컴파일러 드라이버는 소스파일 hello.c..
2023.03.06 -
[CS:APP] 1-1) 비트와 컨텍스트
정보는 비트와 컨텍스트로 이루어진다. 아래의 hello 프로그램이 실행되는 과정을 알아보자! hello.c #include int main() { printf("hello, world\n"); return 0; } 이 hello 프로그램은 프로그래머가 에디터로 작성한 소스 프로그램(= 소스파일)로 생명을 시작하며, hello.c라는 텍스트 파일로 저장된다. 소스 프로그램 ( = 소스파일 ) hello.c 프로그램은 연속된 바이트들로 파일에 저장된다! 소스 프로그램은 0 또는 1로 표시되는 비트들의 연속이며, 바이트라는 8비트 단위로 구성된다. 각 바이트는 프로그램의 텍스트 문자를 나타낸다. 대부분의 컴퓨터 시스템은 텍스트 문자를 아스키(ASCII) 표준을 사용하여 표시한다. 아스키(ASCII) 표준 아스..
2023.03.06 -
메모리 누수: Garbage Collection, 전역 변수, 브라우저에서 메모리 확인하기
메모리 누수 Garbage Collection 변수를 만들면 변수를 브라우저 메모리에 저장하고, 만든 변수들 중 필요 없는 것들은 모아뒀다가 한번에 지운다. 👉🏻 GC(Garbage Collector)가 Garbage Collection을 하는 것이다. JS나 Java 같은 대부분의 언어는 메모리를 자동으로 할당해주는데, C언어 등의 일부 언어는 메모리를 직접 할당하고 데이터를 저장해야 한다. JavaScript는 GC가 해주니까 따로 메모리 관리를 할 필요는 없지만, 잘못 알게되면 문제가 생길 수 있다. 컴퓨터가 똑똑하긴 하지만 신은 아니니까! 컴퓨터가 오해를 하게 코딩을 하게되면, Garbage Collection을 해도 깔끔하게 지워지지 않을 수 있다. 아래는 잘 지워지고 있는 상태이다. Garba..
2023.02.15 -
OSI 7계층, TCP/IP 4계층
OSI 7계층 OSI 7계층을 이해하면 와이어 샤크를 통해서 어느 계층의 통신을 이용하고 있는지 확인할 수 있다. 확인해야 하는 이유는? 라이브러리 등을 쓸 때 내가 보내는 통신이 어떤 통신인지 확인하려고 (확인해서 불필요한 통신을 이용하고 있다면 계층을 낮춰서 더 빠르게 통신하는 방법을 생각해 볼 수 있겠지?!) 네트워크 pending 됐을 때! API 요청을 보냈는데 멈췄을 때 방화벽 문제인지 API가 오래 걸리는 건지 상태를 확인할 수 있다. 보안에서도 이용된다. (패킷 안에 이진 코드로 프로그램을 심어서 패킷 단위를 조작해서 보낼 수 있음) tcp/ip 4계층 옛날에는 7계층으로 나누었지만, 요즘에는 TCP/IP 4계층으로 나누기도 한다. 계층이 올라갈수록 SW에 가깝다. OSI 7계층을 기준으로..
2023.02.15 -
비트와 바이트, ArrayBuffer로 성능 향상하기
CS 지식은 왜 배워도 배워도 까먹을까..? 보통 배우는 cs 지식은 시험을 보기 위해서 외우게 되고, 시험을 보고나면 쓰이는 용도를 잘 몰라 까먹는 일이 빈번하다. 👉🏻 CS를 굳이 알아야 하나? CS 지식 필요성에 대한 의문이 생김🙁 까먹는 이유는, CS 지식을 알아도 쓰이는 곳을 모르니까.. 잊혀지기 마련이다! 실무에서 사용하면서 알게되면 자동으로 몸에 체득 되어서 익혀질텐데..ㅠㅠ 그러므로! CS 실무와 이론이 연결되는 부분부터 공부해보자!!! 레쓰기릿 1. 비트와 바이트 비트와 바이트를 알아야 하는 이유가 무엇일까? 1) 나는 모르고 싶지만, 이걸 사용하는 사람들이 있다. 😞 이걸 쓰는 사람들이랑 같이 프로젝트를 하면 그 사람들이 사용한 코드가 들어있으므로 이에 대해 알아야 유지보수가 가능해서 ..
2023.02.15