개발자로 전향중

[면접 기출] CS 기출 문제2 본문

CS

[면접 기출] CS 기출 문제2

hovinee 2022. 2. 5. 01:11

프로세스 생성 과정에 대해 설명 (OS Solution)

일반적인 프로세스 생성 과정

  1. PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 Text segment에 저장한다.
  2. 초기화된 전역 변수 및 static 변수를 data segment에 할당.
  3. HEAP과 Stack은 초기 메모리 주소만 초기화됨.
  4. PCB에 여러 정보가 기록되면 Ready Queue에서 CPU를 할당받기까지 대기한다.
프로세스라는 용어는 추상적이고 다양한 의미를 담고 있어 프로세스가 무엇인지를 다양한 관점으로 바라볼 수 있습니다.
프로세스란 무엇일까요? 간단히 말해서 프로세스(process)는 리눅스 시스템 메모리에서 실행 중인 프로그램을 말합니다. 스케줄링 대상인 태스크와 유사한 의미로도 쓰입니다. 다수의 프로세스를 실시간으로 사용하는 기법을 멀티프로세싱이라고 하며, 같은 시간에 여러 프로그램을 실행하는 방식을 멀티태스킹이라고 합니다.
우리가 쓰고 있는 스마트폰의 동작 방식을 잠깐 떠올려 봅시다. 전화를 하면서 메모를 남기고, 음악을 들으면서 웹 브라우저를 사용할 수 있습니다. 여러 애플리케이션이 동시에 실행됩니다. 이것은 멀티태스킹을 통해 프로그램을 시분할 방식으로 처리하기 때문에 가능합니다.
이번에는 리눅스 개발자 입장에서 프로세스가 무엇인지 생각해 봅시다. 프로세스는 리눅스 시스템 메모리에 적재되어 실행을 대기하거나 실행하는 실행 흐름을 의미합니다.

크롬 탭이 프로세스인가 쓰레드인가 (OS Solution)

프로세스는 실행되는 프로그램 자체와 프로그램이 실행되는 주변 환경을 포함하는 개념이다. 실행되는 주변 환경이란 사용중인 파일, 데이터, 메모리 영역 주소 공간등을 뜻한다.

쓰레드는 프로세스 내부에서 프로세스의 자원을 공유하거나 공유하지 않고 실행되는 작업의 단위이다.

 

크롬은 탭마다 PID를 가지고 있으니 Process이며 각 Tab마다 랜더링 정보나 기타 데이터를 따로 관리한다고 한다. 그로인해 메모리를 많이 잡아먹기도 하지만 하나의 Tab에 오류가 생겼다고 모든 Tab에 영향을 끼치진 않는다.

HTTPS란 (NetworkSolution)

HTTP Secure의 약자이며 HTTPS를 사용하여 전송되는 데이터는 TLS를 통해 보호된다.

TLS는 Certificate Authority(CA)라 불리는 서드 파티로부터 서버와 클라이언트 의 인증을 하는데 사용된다.

SSL(TLS) 동작방식

  1. 클라이언트가 서버에 접속하며 랜덤 데이터를 전송. (Client hello)
  2. 서버가 Client hello에 대한 응답으로 Server hello를 함 (이때 인증서와 랜덤데이터 제공)
  3. 클라이언트의 브라우저에서 서버가 건네준 인증서가 CA에서 발급된건지를 확인하고 공개키로 인증서를 복호화한다. (인증서가 믿을 수 있다고 판단함)
  4. 클라이언트와 서버의 각각의 랜덤 데이터를 가지고 클라이언트에서 pre master secret값을 만들어냄 (대칭키)
  5. pre master secret 값을 비대칭키 (클라이언트가 알고있는 공개키)를 이용하여 암호화하고 이를 서버에 보냄 이렇게 암호화 된 값을 master secret이라하고 이는 session key를 만들어냄
  6. 이 session key를 이용하여 서버와 클라이언트는 대칭키 방식으로 암호화 통신을 함
 

[HTTP] HTTPS란? 비전공자를 위한 HTTPS 개념 알아보기

HTTPS란 뭘까? 비전공자 수준으로 알아보도록 하자 HTTPS란 무엇일까요? SSL? HTTP? HTTPS? 비 전공자는 용어마저도 너무나 헷갈립니다. 이번 글에서는 HTTPS에 대해서 알아보도록 합니다. 단! 이번 글은

dololak.tistory.com

TCP와 UDP의 차이점은 (NetworkSolution)

TCP는 연결 동작을 통해 ACK와 Sequence Number를 주고받으며 신뢰성과 흐름제어를 제공하는 방면 UDP는 IP를 거의 그대로 사용하며 단순히 Checksum말고는 데이터의 훼손을 감지할 수 없다. 또한 ACK와 Sequence Number를 주고받지 않으므로 중간에 데이터가 유실되어도 이를 다시 요청하거나 할 수 있는 방법이 없다. 또한 TCP와 다르게 UDP는 혼잡을 제어할 수 있는 방법이 없다.

TCP란 무엇인가 (NetworkSolution)

데이터의 송수신을 위해 IP를 이용하는 프로토콜이며 통신간에 신뢰성을 보장해주기 위해 만든 것이다.

TCP는 3-way handshake라고 불리는 연결 동작과 4-way handshake라고 불리는 연결 종료를 통해 ACK와 Sequence Number를 주고 받아 데이터 흐름의 신뢰성을 구축한다.

브라우저에서 주소창에 url 입력시 어떤일이 일어나는가 (NetworkSolution)

  1. 브라우저의 주소창에 url 입력
  2. 브라우저 캐시에서 DNS 레코드를 확인하여 IP주소를 찾음 (없다면 DNS resolver를 통해 IP주소를 알아냄)
  3. 브라우저가 서버와 TCP 연결을 시작함
  4. 브라우저가 웹 서버에 HTTP 요청을 보냄
  5. 서버가 요청을 처리하고 응답을 되돌려보냄
  6. 브라우저는 서버가 보낸 HTML 내용을 표시

평소 state 관리는 어떻게? (front-end)

State는 관련 컴포넌트들과 최대한 가까이 배치 되는게 좋다. ( State Colocation will make your react app faster ) State가 관련 컴포넌트와 멀어질수록 상태와 컴포넌트 사이에 있는 관련 없는 컴포넌트의 리렌더까지 일으킬 위험이 크다. 또 State들은 관심사에 따라 잘 분리가 되야 후에 코드 수정시 사이드 이펙트를 최소화 할 수 있다. 서로 관련 없는 컴포넌트들의 상태가 한번에 관리되면 결합도가 높아지게 되고 후에 어플리케이션이 비대화 될수록 의도치 않은 영향을 줄 수 있는 가능성이 높아진다. 코드들은 격리되어 있지 않아 코드의 재사용성 또한 떨어진다. 

 

https://www.stevy.dev/react-state-management-guide

 

리액트 상태 관리 가이드

Stevy의 개발 블로그입니다

www.stevy.dev

 

Redux가 무엇인가요? (front-end)

React project가 커지다보면 state나 props등 데이터의 이동이 parent-child 구조로 넘기기가 복잡해집니다. 그래서 하나의 store를 두어 state와 props을 관리하게되며 data의 변경이 있을때 View에 통지하는 방식으로 데이터를 반영합니다.

Webpack 써보신 적 있나요? (front-end)

Webpack은 module bundler이며 bundling이란 javascript 모듈들을 의존성을 통해 하나 혹은 여러개의 파일로 묶는 것을 뜻한다. 번들링을 진행하는동안 uglify나 minified등을 해줄 수 있고 이는 config 파일을 설정하면 가능하다.

ES6에 들어서면서 모듈 관련 스펙이 들어갔지만 모든 브라우저가 이를 지원하는 것은 아니기때문에 webpack의 도움이 필요하다. 또한 모듈로 나눠진 js파일들을 하나 또는 여러개의 작은 js 파일로 번들링 함으로써 네트워크 통신 비용도 줄어들게 된다. html에 import해야하는 js파일이 줄어드는 것 또한 덤

 

Array vs LinkedList (자료구조)

 

저장 방식

  • Array 의 element 들은, 인접한 memory 위치에 저장됩니다.
  • LinkedList 의 element 들은, memory 어딘가에 저장됩니다.
    • 새로운 element 의 memory 위치 주소는, linked list 의 이전 node 에 저장됩니다.

종류

  • Array 는 single dimensional, two dimensional, multidimensional 가 있습니다.
  • Linked List 는 Linear(Singly), Doubly, Circular linked list 가 있습니다.

크기

  • Array 의 size는 반드시 array 선언 시점에 지정되어있어야 합니다.
  • LinkedList 의 size는 다양할 수 있습니다.
    • node 들이 추가될 때 runtime 시점에서 LinkedList size 는 커질 수 있기 때문입니다.

메모리 할당

  • Array 에서, Memory 는 Array 가 선언되자 마자 Compile time 에 할당되어집니다.
    • 이것을 Static Memory Allocation 이라고 부릅니다.
    • Stack section 에 memory 할당이 이루어집니다.
  • LinkedList 에서, Memory 는 새로운 node 가 추가될 때 runtime 에 할당되어집니다.
    • 이것을 Dynamic Memory Allocation 이라고 부릅니다.
    • Heap section 에 memory 할당이 이루어집니다.

요소 접근

  • Array 는 Random Access 를 지원합니다.
    • element 들을 index 를 통해 직접적으로 접근할 수 있습니다.
      • ex) arr[0], arr[1]
    • 따라서, 특정 element 에 접근하는 시간 복잡도는 O(1) 입니다.
  • LinkedList 는 Sequential Access 를 지원합니다.
    • 어떤 element 에 접근할 때, 처음 부터 순차적으로 접근하면서 찾아야 합니다.
    • 따라서, 특정 element 에 접근할 때의 시간 복잡도는 O(N) 입니다.

삽입 및 삭제

  • Array
    • 인덱스로 접근 후 삽입 및 삭제 O(1) + 전체 배열 요소를 1씩 Shift O(N)
  • LinkedList
    • 삽입하려는 위치 접근 후 삽입 및 삭제 O(N)
    • 만약, 맨 앞과 뒤에 삽입 및 삭제한다면 O(1)

결론

  • 데이터 접근이 주 업무일 경우 → Array
  • 데이터 수정이 주 업무일 경우 → Linked List
  • 전반적인 내용을 보면, Array 보다 Linked List 의 사용이 훨씬 좋아보이지만,
  • 일반적인 알고리즘 문제를 풀 때는 Linked List 보다 Array 가 훨씬 빠르고 편리합니다.
    • 대부분의 알고리즘 문제는 메모리 공간의 범위를 파악할 수 있도록, N 의 크기가 주어지기 때문입니다.
  • 따라서, 배열의 크기를 MAX 로 초반에 잡는다면, Array 가 훨씬 더 편리하고 빠릅니다.
    • Linked List는 요소를 삽입, 삭제할 때마다 메모리의 할당,해제가 일어납니다.
    • 이런 작업은 시간복잡도에 포함되지는 않지만, 시스템 콜(System Call)을 사용하는 구문은 시간 소요가 꽤 걸립니다.