170414_TIL

|

오늘 한 일 (회고)

  • 컴퓨터공학 입문수업에 참여했다. 자료구조와 알고리즘에 대해서 배웠는데 듣던대로 역시 어려웠다.
    • binary search (big O of binary search)
    • recursion (fibonacci, hanoi tower)
    • bubble sort
  • 복습 및 강의노트 정리
  • multi thread
  • virtual memory, virtual address space
  • memory segments

내일 할 일

  • 과제 : 바이너리 서치를 재귀적으로 리팩토링

강의노트 14-1. 가상 주소공간, 가상 메모리

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

가상주소공간, 가상메모리

  • 모든 프로세스는 각각 4G의 가상 주소 공간 (메모리공간X) 을 부여받는다.
  • 운영체제 약 2G, 나머지 약 2G 응용프로그램의 고유 영역
  • 가상주소공간 virtual address space ≠ virtual memory
  • 개발자는 이 가상주소공간 4G가 진짜 메모리인것 처럼 사용한다.
  • 내 컴퓨터 RAM은 12G 인데 그럼 내가 실행할 수 있는 프로그램은 3개일까? -> 아니다
  • 수업 자료- 가상주소공간&가상메모리

가상주소공간(virtual address space)

가상주소공간의 구조

  • code : 기계어 (코드를 컴파일하여 기계어로 만들고 디스어셈블을 하여 어셈블리어로 바꾸어 code 영역에 넣는다(instruction))
  • data : 전역변수, static 변수의 할당의 위해 존재하는 공간
  • heap : 프로그래머의 동적 할당을 위해 존재하는 공간
  • stack : 지역 변수가 저장되는 공간
views
가상주소공간
  • page : 가상주소공간 4G를 4096byte(4K) 단위로 나눈 하나의 메모리 블록을 page라고 한다.
  • 연산을 할 때는 값을 stack으로 부터 레지스터로 가져오고 ALU로 넘겨서 연산을 수행한다. 연산 결과 값은 레지스터에 먼저 저장하고, stack 영역에 재전달 한다.
  • 레지스터의 스택포인터(SP)는 stack 프레임을 위해서 미리 공간을 확보한다.
  • 참고자료 - 어셈블리코드 해석 예시

파이썬의 가상주소공간 활용

  • 파이썬은 모든 객체를 private heap 영역에 저장하며, data영역, stack영역은 사용하지 못한다.
  • 연산을 할 때는 값을 heap으로 부터 레지스터로 가져오고, ALU로 넘겨서 연산을 수행한다. 연산 결과 값은 stack에 먼저 저장하고(operand stack), stack-register-heap 순으로 재전달 한다.
  • java도 heap 영역만 사용하며, C는 stack, heap, data 영역을 모두 사용한다.

virtual machine

  • register based machine (연산결과를 레지스터에 저장)
  • virtual stack machine (연산결과를 stack에 저장하고 이를 다시 heap으로 반환)
  • 연산결과를 임시로 저장하는 공간을 operand stack이라고 부른다.
  • 인터프린터 언어는 heap에 데이터를 저장하고, 연산은 레지스터 ALU에서 실행 후 실행 결과를 stack에 저장 해당 값을 heap에 전달하려면 다시 레지스터를 거쳐야한다.
  • 수업자료

stack vs heap

  • 가상주소공간 중 stack은 빠르고 heap은 상대적으로 느리다.
  • stack은 그냥 데이터를 쌓지만 heap은 도중에 del등을 통해서 지울 수 있다. 빈공간이 생기면 그곳에 새로운 데이터가 추가된다. (spacial locality 보장이 어려움)
  • 또한, heap은 메타데이터 정보를 함께 저장한다. 따라서 더 많은 용량을 사용하며 할당시 매번 metadata에게 여분 공간이 있는지 묻기 때문에 상대적으로 느리다.
  • heap의 최대 장점
    • 할당시점과 지우는 시점을 마음대로 저장할 수 있다.
    • 프로세스 도중에 용량을 변경할 수 있다. (stack의 경우 프로세스 실행 전에만 변경 가능하다. 용량이 넘치는 경우 stack overflow가 발생한다.)

가상메모리 (virtual memory)

  • 가상메모리 : 물리적인 RAM + 하드디스크(pagefile.sys)
  • page frame : 가상메모리(물리메모리 = RAM + 페이징파일)를 4096byte(4K) 단위로 나눈 후, 그 한 단위를 페이지 프레임이라 한다.
  • 페이지 테이블 : 가상주소공간(virtual address space) 가상메모리(virtual memory, physical memory) 를 매핑한다. 프로세스 별로 각각 하나씩 존재한다.
  • RAM의 프레임이 모두 차있을 때, 추가 요청이 들어오면 RAM에서는 교체 알고리즘에 따라서 프레임 하나를 페이징파일로 내리고, 새롭게 요청된 페이지에 비워진 프레임을 할당한다.
  • 가상메모리 운영방식 : LRU (least, recently, uses - 최근최소사용) 필요한 것만 ram으로 가져오고 오래 안쓰는건 하드디스크에 내려놓는다.

참고

강의노트 13. compiler, interpreter

|

패스트캠퍼스 컴퓨터공학 입문 수업을 듣고 중요한 내용을 정리했습니다. 개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.

compiler / interpreter 차이

  • 컴파일언어와 인터프린터 언어의 가장 큰 차이점은 컴파일 시점 이다. (런타임 전에 컴파일을 하는지 안하는지)
  • Java는 런타임 이전 컴파일을 통해 기계어가 아닌 바이트어로 변경되지만 컴파일 시점 때문에 컴파일 언어라고 부른다.

컴파일 언어 (Compiled Language)

  • 예 : C, C++, Java
  • 컴파일 언어는 런타임 이전에 기계어 (혹은 Java의 경우 바이트코드) 로 변환되는 언어이다.
  • 어셈블리어는 cpu에 의존적이기 때문에, 컴파일된 코드들은 여러종류의 프로세서를 자유롭게 옮겨다니며 사용될 수 없다. (.exe, .dmg)
  • 컴파일 이전의 소스코드도 운영체제별 특징이 있어 각각의 라이브러리를 요구한다.

컴파일 예시 (C)

`C 코드` --(컴파일러)-->> `어셈블리어` --(어셈블러)-->> `기계어` --(링커)-->> `실행파일` -->> `런타임` 시작
  • 컴파일러와 어셈블러를 함쳐서 컴파일이라고 부르며, 코드가 기계어로 변환되는 과정을 컴파일 타임이라고 부른다.
  • 어셈블리어와 기계어는 1:1 매칭이다.
  • 기계어에서 어셈블리어로 변환시키는 것을 disassemble이라고 한다.
  • 기계어 한줄 한줄을 instruction이라고 부른다. (instruction : 명령, 지시)
  • 레지스터 단위로 들어가 성능테스트를 할 때 어셈블리어가 유용하다.
  • 링커는 라이브러리를 가져다가 붙인다. os의존적이라 나오는 실행파일 extension가 다르다.
  • 인터프린터 언어는 런타임 중에 컴파일(해석)을 한다. 따라서 컴파일 언어에 비해서 비교적 느린 편이다.
  • 자바는 런타임 전에 기계어가 아닌 바이트코드로 컴파일 되며, 런타임중에 기계어로 바뀐다. 하지만 컴파일 시점이 런타임 이전이기 때문에 컴파일언어에 속한다.

인터프린터 언어 (Interpreted Language)

  • 런타임중에 프로그램 한줄한줄을 해석하며 실행한다.
  • 파이썬의 경우 런타임중의 컴파일 과정에 렉서(lexer), 파서(parser) 를 거쳐서 바이트 코드를 만들어낸다. (렉서 : 요소를 하나하나 쪼갠다. / 파서 : abstract syntax tree, 구문분석)
python 코드 --> 실행 & 런타임 시작 --> (컴파일) --> 바이트코드 --> VM --> 기계어
  • 어셈블리어는 cpu에 의존적이나, (예: 인텔 계열의 어셈블리어) 바이트코드는 그렇지 않다.
  • 바이트코드는 가상머신(virtual machine) 위에서 돌아가기 때문에 어떤 cpu 위에서도 돌아갈 수 있다.
  • 파이썬 초기 설치시 window용, mac용, linux용을 따로 받는 이유는 바이트코드에서 어떤 기계어로 바꿀지를 결정하기 위해서이다.
  • Java, python 모두 바이트코드를 사용하기 때문에 vm(virtual machine)이 필요하다.

    인터프리티드 언어는 특별한 플랫폼 의존성을 가질 필요가 없다. 실행중에 ‘interpreted’ 되므로, 적절한 interpreter만 있다면 어떤 기종에서도 잘 실행될 수 있는 것이다. 이런 이유로 인터프리티드 언어는 보다 더 크로스플랫폼적 성격을 갖게 된다.

170413_TIL

|

오늘 할 일

  • 함수 호출방식 복습
    • call-by-value
    • call-by-reference
    • call-by-assignment

오늘 한 일 (회고)

  • 컴퓨터공학 입문수업 참여했다.
    • compiler vs interpreter
    • instructions & register
    • memory segments
    • virtual memory
    • single-thread vs multi-thread
  • tryhelloworld 사이트를 통해서 Java 문법공부를 시작했다. 수업이 짧게 구성되어 있어서 주말까지 클래스와 예외처리까지 훑어볼 수 있었으면 좋겠다.

내일 할 일

  • 컴퓨터공학 입문수업 참여 및 복습
  • 스쿨 동기분들과 치킨모임 (!)

170412_TIL

|

오늘 한 일 (회고)

  • 패스트캠퍼스 프로그래밍 스쿨 설명회에 다녀왔다. 나는 iOS개발과 백엔드개발에 관심이 있는데, 앞으로 둘 중에 어느 쪽을 깊게 공부할지 고민이다. 패스트캠퍼스에서는 백엔드스쿨에서 python과 django를 사용하는데, 시간이 있으니 미리 경험해볼겸 지난 2월부터 혼자서 공부하고 있다. 파이썬 언어는 예전에 공부했던 자바스크립트보다 더 간단명료하다는 인상을 받았고 특히 알고리즘 문제를 풀때 list comprehension이 정말 편리해서 마음에 드는 언어이다. django 같은 경우는 MVT 패턴이 어려웠는데 CRUD 기능만 3번정도 반복해서 만들어 보니 이제는 조금 익숙해진 느낌이다. 컴퓨터공학 입문 수업에서 파이썬 언어와 oop에 대해서 좀 더 자세하게 다루다보니 django를 이해하는데도 도움이 되는 것 같다. 설명회에서 iOS 과정과 백엔드 과정에 대해서 자세한 설명을 들을 수 있었는데, 백엔드 졸업자 분들이 정작 Django를 사용하는 회사에 들어가는 경우는 적다고 해서 조금 놀랐다. 한창 django가 마음에 들려고 하는 중이었는데 역시 백엔드라면 java를 해야하나 하는 생각이 들었다. 요즘 종종 내가 좀 더 일찍 프로그래밍을 시작했다면 다양한 분야를 충분히 경험하고 가장 재미있는걸 선택할 수 있을텐데 하는 아쉬운 마음이 생긴다.

내일 할 일

  • 컴퓨터공학 입문수업 참여 및 복습
  • 스쿨 동기분들과 치킨모임 (!)