기술면접 질문 정리 - CS지식

yeeun lee·2020년 7월 23일
18

기술 면접 질문 중 내 마음대로 CS 관련 지식이라 정의해본 질문들! 컴퓨터 사이언스의 길은 멀고도 험하지만 재미있고 너무 깊어서 빠지면 헤어나올 수가 없다 🥺

질문 받은 내용

객체의 life cycle

파이썬 실행했을 때 메모리와 cpu에서 일어나는 일을 질문 받았지만, 우선 class를 기준으로 설명해놓은 블로그를 찾아서 해당 내용으로 정리한다. (참고 링크)

The life cycle of an object consists of three basic steps:

  1. creation: 클래스를 정의하고 인스턴스를 생성한다. 이 때 객체에 메모리가 할당되고, 객체가 조작될 준비를 마치게 된다. __init__
  2. handling
  3. destruction: 객체의 reference count가 0이 될 때, 더이상 참조하는 값이 없을 때 객체가 삭제된다. 객체가 필요 없어졌을 때 제거하는 것을 garbage collection이라고 한다. __del__

thread와 multiprocess의 차이

python은 thread보다 process를 통한 병렬처리를 더 선호한다고 한다. GIL 때문에 multiprocess로 작업하는 것이 더 빠르다.

multiprocessing을 thread 대신 사용해 multi core CPU의 장점을 사용할 수 있고, global interpreter lock 병목 현상을 피할 수 있다.

(참고 링크)

parameter와 argument의 차이

  • parameter: 함수를 정의할 때 사용
  • argument: 함수를 호출할 때 사용

Call by value, call by reference

Call by value(값에 의한 호출)는 인자로 받은 값을 복사하여 처리를 한다. Call by reference(참조에 의한 호출)는 인자로 받은 값의 주소를 참조하여 직접 값에 영향을 준다. 간단히 말해 값을 복사를 하여 처리를 하느냐, 아니면 직접 참조를 하느냐 차이인 것이다. (참고 링크)

  • Call by value(값에 의한 호출)
    장점 : 복사하여 처리하기 때문에 안전하다. 원래의 값이 보존이 된다.
    단점 : 복사를 하기 때문에 메모리가 사용량이 늘어난다.

  • Call by reference(참조에 의한 호출)
    장점 : 복사하지 않고 직접 참조를 하기에 빠르다.
    단점 : 직접 참조를 하기에 원래 값이 영향을 받는다.(리스크)

Python 은 명시적인 Call by Reference 혹은 Call by Value 라는 개념이 존재하지 않는다.

Python의 function에 argument 를 전달할 때, 이는 Manual 에 따르면 call by assignment 라는 방식으로 전달된다. 이는 Parameter로 전달받는 객체에 따라 객체의 참조방식이 결정된다는 의미로, 공식 문서에 따르면 Mutable Object 는 Call by reference의 형태로 참조형으로 변수를 다루며 Immutable Object는 Call by value 의 형태로 변수를 핸들링한다.

  • Mutable Object : list, dict, set 등의 객체

  • Immutable Object : str, int, tuple 등의 객체

출처: https://jins-dev.tistory.com/entry/Python-의-Call-by-assignment-의-개념 [Jins' Dev Inside]

Iterator & generator

iterable object

리스트, Set, Dictionary와 같은 컬렉션이나 문자열과 같은 문자 Sequence 등은 for 문을 써서 하나씩 데이타를 처리할 수 있는데, 이렇게 하나 하나 처리할 수 있는 컬렉션이나 Sequence 들을 Iterable 객체(Iterable Object)라 부른다.

iterator

이터레이터는 값 생성기이다. “다음"값을 요청할 때마다 내부 상태를 유지하고 있기 때문에 다음값을 계산하는 방법을 알고있다.

generator

Generator 함수(Generator function)는 함수 안에 yield 를 사용하여 데이타를 하나씩 리턴하는 함수이다. Generator 함수가 처음 호출되면, 그 함수 실행 중 처음으로 만나는 yield 에서 값을 리턴한다. Generator 함수가 다시 호출되면, 직전에 실행되었던 yield 문 다음부터 다음 yield 문을 만날 때까지 문장들을 실행하게 된다. (참고 링크)

너무 정리가 잘 되어있는 글: [번역] 이터레이터와 제너레이터

GIL(Global interpreter lock)

너무 잘 정리되어 있는 블로그 참고

전역 인터프리터 잠금은 컴퓨터 언어 인터프리터에서 스레드 실행을 동기화하여 한 번에 하나의 기본 스레드 만 실행할 수 있도록하는 메커니즘입니다. GIL을 사용하는 인터프리터는 멀티 코어 프로세서에서 실행 되더라도 항상 한 번에 하나의 스레드 만 실행할 수 있습니다.

파이썬에서 쓰레드을 여러 개 생성한다고 해서 여러 개의 쓰레드가 동시에 실행되는 것은 아니다. 정확히 말하자면 두 개의 쓰레드가 동시해 실행되는 것처럼 보일 뿐, 특정 시점에서는 여러 개의 쓰레드 중 하나의 쓰레드만 실행된다.

파이썬은 멀티 쓰레딩 환경에서 각 쓰레드가 특정 객체를 사용할 경우 처리가 어려워(복잡한 이유지만 변수 관리 방법과 연관이 있음), 이러한 걱정을 할 필요가 없도록 특정 시점에서 하나의 쓰레드만 실행되도록 락을 걸어 두었다.

Global Interpreter Lock 이라는 이름이 지칭하듯이, 파이썬 인터프리터 (Interpreter) 자체에서 락을 (Lock) 전역적으로 (Global) 설정해 둔 것이다. 이로 인해 여러 쓰레드가 동시에 사용하는 공유 자원 동기화 문제는 자연스럽게 해결된다. C Extension으로 래핑된 라이브러리를 사용할 때도 Thread Safety를 고려할 필요가 없다고도 한다.

sync & async

링크에 라이브러리(async.io)를 사용해 비동기처리 방식을 간단하게 정리해놓았다. 동기는 시간을 맞추는 것이다. A 함수를 호출하는데 걸리는 시간이 1초, B가 2초라 할 때 총 3초가 걸린다.

반면 비동기는 시간을 맞추지 않는 것으로, 동시에 호출되기 때문에 총 2초가 걸리게 된다.

Blocking

Blocking은 직접 제어할 수 없는 대상의 작업이 끝날 때까지 제어권을 넘겨주지 않는 것이다. 예를 들어 호출하는 함수가 IO를 요청했을 때 IO처리가 완료될 때까지 아무 일도 하지 못한 채 기다리는 것을 말한다.

Non-Blocking

Non-Blocking은 Blocking과 반대되는 개념이다. 직접 제어할 수 없는 대상의 작업 처리 여부와 상관이 없다. 예를 들어 호출하는 함수가 IO를 요청한 후 IO처리 완료 여부와 상관없이 바로 자신의 작업을 할 수 있다.

내가 추가

메모리

주기억장치(主記憶裝置) 또는 컴퓨터 메모리(computer memory)는 컴퓨터에서 수치·명령·자료 등을 기억하는 컴퓨터 하드웨어 장치를 가리킨다. 이 용어는 1차 기억 장치와 동의어이다.

메모리는 RAM(Random Access Memory) 또는 ROM(Read Only Memory)처럼 일시적으로 기억을 저장할 수 있는 모든 물리 장치를 말한다.

CPU

데코레이터

데코레이터 사용해봤는지
중첩해서 사용한다면 순서는 어떻게 되는지

유닛테스트

profile
이사간 블로그: yenilee.github.io

1개의 댓글

comment-user-thumbnail
2020년 12월 14일

와...어떻게 이 많은 내용을 머릿속에 집어넣죠? 대단하네요,, 난 아직 갈길이 멀었네 ㅠㅠ..

답글 달기