분류 전체보기

    고루틴(goroutine)은 무조건 빠를까?

    goroutine 고루틴은 go에서 제공하는 기능으로 go 키워드를 이용해 쉽게 병렬 처리를 가능하게 하는 기법이다. 나는 고루틴을 쓰면 쓰지 않은 것보다 항상 빠를 것이라고 생각했다. 결론적으론 고루틴을 사용한 코드가 사용하지 않은 코드보다 더 느렸는데, 더 느린 이유가 궁금해서 검색하다가 다음 글을 찾았다. https://appliedgo.net/concurrencyslower/ Slow down your code with goroutines - Applied Go Concurrent code can be slower than its serial counterpart due to CPU cache synchronization appliedgo.net 내가 했던 방식처럼 하나의 슬라이스를 여러 CPU ..

    외박 신청 어플 API 리팩토링

    좀 더 나은 성능으로 이전에 고루틴을 활용해 외박 신청에 실패한 글을 작성하였다. 그래서 사실 API 코드를 리팩토링 하는 것은 포기하고 있었으나 문득 그런 생각이 들었다. 다른 부분에서 고루틴을 활용(파싱이라던가)하면 되지 않을까? 만약 안되면 고루틴이 아니더라도 Go가 js보다 빠르지 않을까? 따라서 리팩토링을 진행해보기로 했다. 결과는 잘 완료돼서 현재 Lambda에 배포하였다. https://github.com/AUTO-Overnight/Auto_Overnight_API GitHub - AUTO-Overnight/Auto_Overnight_API: 학교 외박신청 자동화 App이 사용하는 API 학교 외박신청 자동화 App이 사용하는 API. Contribute to AUTO-Overnight/Au..

    고루틴을 이용해서 외박 신청 해보기

    고루틴을 이용해서 외박 신청 해보기

    문득 든 생각 https://smgthings.tistory.com/10?category=965902 학교 외박 신청 어플 제작 후기 : serverless를 이용한 aws lambda backend 우리 학교 외박 신청은 절차도 복잡하고 인터페이스도 사용자 친화적이지 않아서 학생들의 원성이 높다. (물론 나를 포함) 그래서 가끔 이런 외박 신청을 쉽게 해주는 어플이 만들어지기를 기대 smgthings.tistory.com 나는 학교 외박 신청 어플의 API를 만들어서 운영하고 있다. 사실 조금 아쉬운 점이 존재했는데 바로 한 달 외박 신청이 조금 느리다는 것이다. 느린 이유는 28개의 외박 신청을 하나하나 http requests 보내기 때문이다. 바로 이 부분인데, xml을 만들고 axios post..

    퀵 정렬 (Quick Sort)

    퀵 정렬 (Quick Sort)

    기준이 되는 요소(pivot)을 하나 정해서 그 요소를 기준으로 작은 것은 왼쪽으로, 큰 것은 오른쪽으로 몰아넣고 그것들을 다시 반복해서 정렬하여 합치는 알고리즘이다.(divide and conquer) 시간 복잡도 Best - O(NlogN) Average - O(NlogN) Worst - O(N^2) 설명 pivot을 하나 정한다. 그 후에 시작과 끝의 인덱스를 각각 left와 right로 정한다. left는 pivot보다 큰 요소를 찾을 때까지 증가시킨다. right는 pivot보다 작은 요소를 찾을 때까지 감소시킨다. 만약 left가 pivot보다 큰 요소를 찾았고 right가 pivot보다 작은 요소를 찾았다면 서로 자리를 바꿔준다. 그런데 만약 이 때 left와 right가 서로 교차하여 le..

    삽입 정렬 (Insertion Sort)

    삽입 정렬 (Insertion Sort)

    배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 방법이다. 시간 복잡도 Best - O(N) Average - O(N^2) Worst - O(N^2) 설명 삽입 정렬은 길이가 n인 배열에서 인덱스가 1번인 요소(두 번째 요소)부터 시작한다. 배열에서 요소를 선택해서 이전 인덱스의 요소들과 비교하여 적절한 위치에 삽입한다. 이를 n - 1번 반복하면 오름차순 또는 내림차순으로 정렬을 완성할 수 있다. 구현(파이썬) arr = [6, 5, 3, 1, 8, 7, 2, 4] for i in range(1, len(arr)): for j in range(i, 0, -1): # 오름차순 기준, 내림차순은 부호를 반대로 if arr[j - 1..

    선택 정렬 (Selection Sort)

    선택 정렬 (Selection Sort)

    선택된 값과 나머지 데이터들을 전부 비교하여 알맞은 자리를 찾는 방법이다. 시간 복잡도 Best - O(N^2) Average - O(N^2) Worst - O(N^2) 설명 길이가 n인 배열에서 인덱스가 0번인 자리를 선택하고, 해당 인덱스를 최솟값을 가지는 인덱스로 둔다. 그 후에 배열의 끝까지 탐색하며 최솟값을 가지는 인덱스를 찾는다. 탐색이 완료되면, 선택한 인덱스 0번의 요소와 최솟값을 맞바꾼다. 이후 인덱스가 1번인 자리를 선택하고 그 이후의 요소들을 가지고(이전 인덱스는 이미 정렬했기 때문에 탐색하지 않는다.) 최솟값을 탐색한 다음 다시 최솟값을 맞바꾼다. 이를 n - 1번 반복하면 오름차순 정렬이 완료된다. 구현(파이썬) arr = [29, 10, 14, 37, 20, 25, 44, 15]..

    10. 파일 시스템

    10. 파일 시스템

    파일 파일은 관련된 정보들을 이름을 통해서 묶어 놓은 것이다. 파일은 이름을 통해서 구분되고 접근한다. 일반적으로 비휘발성 보조기억장치에 저장한다. 파일은 생성, 삭제, 읽기, 쓰기 등의 작업을 할 수 있다. 운영체제에서는 저장 장치도 파일로 인식하여 볼 수 있게 해준다. 파일에는 파일 metadata(혹은 file attribute)가 존재한다. 메타데이터는 파일 자체의 내용이 아니라 파일을 관리하기 위한 각종 정보들이 포함된 데이터로 파일 이름, 유형, 저장된 위치, 파일 사이즈, 접근 권한, 시간, 소유자 등이 존재한다. 운영체제에서 이런 파일들을 관리하는 부분을 파일 시스템이라고 하며, 파일 및 파일의 메타데이터와 디렉토리 정보등을 관리한다. 디렉터리 디렉터리는 폴더와 같은 뜻으로, 파일의 메타데..

    버블 정렬 (Bubble Sort)

    버블 정렬 (Bubble Sort)

    버블 정렬은 아주 기본적인 정렬 알고리즘이지만 시간 복잡도때문에 실제로는 잘 사용하지 않는 알고리즘이다. 시간 복잡도 Best - O(N^2) Average - O(N^2) Worst - O(N^2) 설명 버블정렬은 인접한 두 요소를 비교하여 큰 요소를 오른쪽으로 보내는 정렬 방법이다. 이렇게 배열을 한 바퀴 돌면 맨 끝에 제일 큰 요소가 하나 고정된다. 이를 길이가 n인 배열에서 고정된 요소들을 제외하고 n - 1 번 반복하면 최종적으로 모든 요소가 오름차순으로 정렬된다. 구현(파이썬) arr = [5, 1, 4, 2, 8] for i in range(len(arr) - 1, 0, -1): for j in range(i): # 오름차순 기준, 내림차순은 부호를 반대로 if arr[j] > arr[j +..

    9. 가상 메모리

    9. 가상 메모리

    Demand paging 프로세스가 실제로 페이지를 필요로 할 때 메모리에 올리는 것을 demand paging이라고 한다. 이런 행위의 장점은 다음과 같다. - I/O 양의감소 - 메모리 사용량 감소 - 빠른 응답시간 - 더 많은 수용자 수용 page fault 페이지 테이블에는 vaild-invalid bit가 존재한다. invalid는 프로세스에서 사용되지 않는 주소 영역인 경우&페이지가 물리적 메모리에 없는 경우(디스크에 스왑된 경우) 세팅된다. 만약 주소 변환시에 엔트리에 invalid bit가 세팅되어있다면, 이것을 page fault라고 부른다. invalid bit가 세팅된 페이지를 접근하면 먼저 mmu가 trap을 발생시킨다. 그 뒤에 OS가 cpu를 잡고 커널 모드로 전환해서 다음과 같..

    8. 메모리 관리

    8. 메모리 관리

    메모리의 주소 메모리 주소는 논리적 주소(가상 주소)와 물리적 주소로 구분된다. 논리적 주소 - 프로세스마다 독립적으로 가지는 주소 공간 - 각 프로세스마다 0번지부터 시작한다. - cpu가 실제로 보고 있는 주소다. 물리적 주소 - 메모리에 실제 올라가는 위치를 말한다. 어떤 코드를 컴파일하여 프로그램을 만들면 그 때 명령어들과 변수들의 논리적 주소가 결정된다. 이것이 실제로 동작하려면 메모리에 프로세스를 올려야한다. 이 때 논리적 주소가 실제 물리적 주소로 변환되어야 한다. 주소 바인딩 논리적 주소를 물리적 주소로 변환하는 과정을 주소 바인딩이라고 하는데, 물리적 주소가 언제 결정되느냐에 따라 3가지로 구분된다. compile time binding - 컴파일시에 물리적 메모리 주소가 결정된다. - ..