├── AI ├── README.md ├── cv.md ├── dl.md ├── ml.md ├── mlops.md ├── mlops │ ├── 1. mlops_pipeline.md │ ├── 2. mlopsVSaiops.md │ ├── 3. mlopsVSds.md │ ├── 4. mlopsVSdevops.md │ ├── 5. mlopsVSdataops.md │ └── 6. dsriskovercomemlops.md ├── nlp.md ├── recsys.md ├── recsys │ └── 1. distance.md └── stats-math.md ├── Computer Science ├── Algorithm.md ├── Algorithm │ ├── 1. Big notation.md │ └── 2. sorting algorithm.md ├── DB.md ├── DS.md ├── DataStructure │ └── 1. Array VS Linked List.md ├── Database │ ├── 1. Why use database.md │ ├── 10. cap.md │ ├── 11. Redis.md │ ├── 12. Broker.md │ ├── 2. Database performance.md │ ├── 3. Data model.md │ ├── 4. Index.md │ ├── 5. Index Structure.md │ ├── 6. Normalization.md │ ├── 7. Transaction.md │ ├── 8. Transaction Level.md │ └── 9. NoSQL.md ├── Network.md ├── OS.md ├── Operating System │ ├── 1. What is OS.md │ ├── 10. Mutex and Semaphore.md │ ├── 11. Scheduler.md │ ├── 12. Scheduling.md │ ├── 13. sync.md │ ├── 14. memory.md │ ├── 15. virtual memory.md │ ├── 16. deadlock.md │ ├── 2. Process VS Thread.md │ ├── 3. Multi thread.md │ ├── 4. User VS Kernel Thread.md │ ├── 5. Process Address.md │ ├── 6. Thread Safe.md │ ├── 7. Interrupt.md │ ├── 8. System Call.md │ └── 9. Cache Locality.md ├── Python.md ├── Python │ └── 1. GIL.md ├── README.md ├── SE.md └── img │ ├── commit1.png │ ├── commit2.png │ ├── rollback1.png │ ├── rollback2.png │ └── transaction1.png └── README.md /AI/README.md: -------------------------------------------------------------------------------- 1 | # AI Interview 2 | 3 | ## 목록 4 | 5 | - [Statistics / Math](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/stats-math.md) 6 | - [Machine Learning](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/ml.md) 7 | - [Deep Learning](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/dl.md) 8 | - [Recommender System](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/recsys.md) 9 | - [Computer Vision (CV)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/cv.md) 10 | - [Natural Language Process (NLP)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/nlp.md) 11 | - [MLOps](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/mlops.md) 12 | 13 | ## 레퍼런스 14 | 15 | - [데이터 사이언스 인터뷰 질문 모음집](https://zzsza.github.io/data/2018/02/17/datascience-interivew-questions/) 16 | - [NAVER boostcamp AITech 2nd interview question](https://github.com/sw6820/NAVER_boostcamp_AITech_2nd_interview_question) 17 | - [AI tech interview](https://github.com/boostcamp-ai-tech-4/ai-tech-interview) 18 | - [Interview Question for Beginner](https://github.com/JaeYeopHan/Interview_Question_for_Beginner) 19 | - [CES Summary](https://github.com/Prev/CSE-Summary) 20 | -------------------------------------------------------------------------------- /AI/cv.md: -------------------------------------------------------------------------------- 1 | # AI Interview - Computer Vision 2 | 3 | - OpenCV 라이브러리만을 사용해서 이미지 뷰어(Crop, 흑백화, Zoom 등의 기능 포함)를 만들어주세요 4 | - 딥러닝 발달 이전에 사물을 Detect할 때 자주 사용하던 방법은 무엇인가요? 5 | - Fatser R-CNN의 장점과 단점은 무엇인가요? 6 | - dlib은 무엇인가요? 7 | - YOLO의 장점과 단점은 무엇인가요? 8 | - 제일 좋아하는 Object Detection 알고리즘에 대해 설명하고 그 알고리즘의 장단점에 대해 알려주세요 9 | - 그 이후에 나온 더 좋은 알고리즘은 무엇인가요? 10 | - Average Pooling과 Max Pooling의 차이점은? 11 | - Deep한 네트워크가 좋은 것일까요? 언제까지 좋을까요? 12 | - Residual Network는 왜 잘될까요? Ensemble과 관련되어 있을까요? 13 | - CAM(Class Activation Map)은 무엇인가요? 14 | - Localization은 무엇일까요? 15 | - 자율주행 자동차의 원리는 무엇일까요? 16 | - Semantic Segmentation은 무엇인가요? 17 | - Visual Q&A는 무엇인가요? 18 | - Image Captioning은 무엇인가요? 19 | - Fully Connected Layer의 기능은 무엇인가요? 20 | - Neural Style은 어떻게 진행될까요? 21 | - CNN에 대해서 아는대로 얘기하라 22 | - CNN이 MLP보다 좋은 이유는? 23 | - 어떤 CNN의 파라미터 개수를 계산해 본다면? 24 | - 주어진 CNN과 똑같은 MLP를 만들 수 있나? 25 | - 풀링시에 만약 Max를 사용한다면 그 이유는? 26 | - 시퀀스 데이터에 CNN을 적용하는 것이 가능할까? 27 | - 이미지 처리에서 KNN을 사용하는 것이 가능한가? 28 | - K-means vs KNN 29 | - SVM 알고리즘에서 Kernel Trick? 30 | - OOB error는 무엇이고 어떻게 발생하나? -------------------------------------------------------------------------------- /AI/dl.md: -------------------------------------------------------------------------------- 1 | # AI Interview - Deep Learning 2 | 3 | - 딥러닝은 무엇인가요? 인공지능과 딥러닝과 머신러닝의 차이는? 4 | - Cost Function과 Activation Function은 무엇인가요? 5 | - Tensorflow, PyTorch 특징과 차이가 뭘까요? 6 | - Data Normalization은 무엇이고 왜 필요한가요? 7 | - 알고있는 Activation Function에 대해 알려주세요. (Sigmoid, ReLU, LeakyReLU, Tanh 등) 8 | - 오버피팅일 경우 어떻게 대처해야 할까요? 9 | - 하이퍼 파라미터는 무엇인가요? 10 | - Weight Initialization 방법에 대해 말해주세요. 그리고 무엇을 많이 사용하나요? 11 | - 볼츠만 머신은 무엇인가요? 12 | - TF, PyTorch 등을 사용할 때 디버깅 노하우는? 13 | - 뉴럴넷의 가장 큰 단점은 무엇인가? 이를 위해 나온 One-Shot Learning은 무엇인가? 14 | - 요즘 Sigmoid 보다 ReLU를 많이 쓰는데 그 이유는? 15 | - Non-Linearity라는 말의 의미와 그 필요성은? 16 | - ReLU로 어떻게 곡선 함수를 근사하나? 17 | - ReLU의 문제점은? 18 | - Bias는 왜 있는걸까? 19 | - Bias vs Variance 20 | - Bias - Variance tradeoff는 무엇인가 21 | - Gradient Descent에 대해서 쉽게 설명한다면? 22 | - 왜 꼭 Gradient를 써야 할까? 그 그래프에서 가로축과 세로축 각각은 무엇인가? 실제 상황에서는 그 그래프가 어떻게 그려질까? 23 | - GD 중에 때때로 Loss가 증가하는 이유는? 24 | - Back Propagation에 대해서 쉽게 설명 한다면? 25 | - Local Minima 문제에도 불구하고 딥러닝이 잘 되는 이유는? 26 | - GD가 Local Minima 문제를 피하는 방법은? 27 | - 찾은 해가 Global Minimum인지 아닌지 알 수 있는 방법은? 28 | - Training 세트와 Test 세트를 분리하는 이유는? 29 | - Validation 세트가 따로 있는 이유는? 30 | - Test 세트가 오염되었다는 말의 뜻은? 31 | - Regularization이란 무엇인가? 32 | - ML 에서 언제 쓰나 33 | - Regularization vs Normalisation vs Standardization 34 | - Batch Normalization의 효과는? 35 | - Dropout의 효과는? 36 | - BN 적용해서 학습 이후 실제 사용시에 주의할 점은? 코드로는? 37 | - GAN에서 Generator 쪽에도 BN을 적용해도 될까? 38 | - SGD, RMSprop, Adam에 대해서 아는대로 설명한다면? 39 | - SGD에서 Stochastic의 의미는? 40 | - 미니배치를 작게 할때의 장단점은? 41 | - 모멘텀의 수식을 적어 본다면? 42 | - 간단한 MNIST 분류기를 MLP+CPU 버전으로 numpy로 만든다면 몇줄일까? 43 | - 어느 정도 돌아가는 녀석을 작성하기까지 몇시간 정도 걸릴까? 44 | - Back Propagation은 몇줄인가? 45 | - CNN으로 바꾼다면 얼마나 추가될까? 46 | - 간단한 MNIST 분류기를 TF, PyTorch 등으로 작성하는데 몇시간이 필요한가? 47 | - CNN이 아닌 MLP로 해도 잘 될까? 48 | - 마지막 레이어 부분에 대해서 설명 한다면? 49 | - 학습은 BCE loss로 하되 상황을 MSE loss로 보고 싶다면? 50 | - 딥러닝할 때 GPU를 쓰면 좋은 이유는? 51 | - GPU를 두개 다 쓰고 싶다. 방법은? 52 | - 학습시 필요한 GPU 메모리는 어떻게 계산하는가? -------------------------------------------------------------------------------- /AI/ml.md: -------------------------------------------------------------------------------- 1 | # AI Interview - Machine Learning 2 | 3 | - 알고 있는 metric에 대해 설명해주세요. (ex. RMSE, MAE, recall, precision ...) 4 | - Precision 5 | - Recall 6 | - F1 score 7 | - 정규화를 왜 해야할까요? 정규화의 방법은 무엇이 있나요? 8 | - Local Minima와 Global Minima에 대해 설명해주세요. 9 | - 차원의 저주에 대해 설명해주세요. 10 | - dimension reduction기법으로 보통 어떤 것들이 있나요? 11 | - PCA는 차원 축소 기법이면서, 데이터 압축 기법이기도 하고, 노이즈 제거기법이기도 합니다. 왜 그런지 설명해주실 수 있나요? 12 | - PCA에서 components의 회전이 중요한 이유 13 | - LSA, LDA, SVD 등의 약자들이 어떤 뜻이고 서로 어떤 관계를 가지는지 설명할 수 있나요? 14 | - Markov Chain을 고등학생에게 설명하려면 어떤 방식이 제일 좋을까요? 15 | - 텍스트 더미에서 주제를 추출해야 합니다. 어떤 방식으로 접근해 나가시겠나요? 16 | - SVM은 왜 반대로 차원을 확장시키는 방식으로 동작할까요? SVM은 왜 좋을까요? 17 | - 다른 좋은 머신 러닝 대비, 오래된 기법인 나이브 베이즈(naive bayes)의 장점을 옹호해보세요. 18 | - 회귀 / 분류시 알맞은 metric은 무엇일까? 19 | - Association Rule의 Support, Confidence, Lift에 대해 설명해주세요. 20 | - 최적화 기법중 Newton’s Method와 Gradient Descent 방법에 대해 알고 있나요? 21 | - 머신러닝(machine)적 접근방법과 통계(statistics)적 접근방법의 둘간에 차이에 대한 견해가 있나요? 22 | - 인공신경망(deep learning이전의 전통적인)이 가지는 일반적인 문제점은 무엇일까요? 23 | - 지금 나오고 있는 deep learning 계열의 혁신의 근간은 무엇이라고 생각하시나요? 24 | - ROC 커브에 대해 설명해주실 수 있으신가요? 25 | - 여러분이 서버를 100대 가지고 있습니다. 이때 인공신경망보다 Random Forest를 써야하는 이유는 뭘까요? 26 | - K-means의 대표적 의미론적 단점은 무엇인가요? (계산량 많다는것 말고) 27 | - L1, L2 정규화에 대해 설명해주세요. 28 | - Cross Validation은 무엇이고 어떻게 해야하나요? 29 | - XGBoost을 아시나요? 왜 이 모델이 캐글에서 유명할까요? 30 | - 앙상블 방법엔 어떤 것들이 있나요? 31 | - feature vector란 무엇일까요?tj 32 | - 좋은 모델의 정의는 무엇일까요? 33 | - 50개의 작은 의사결정 나무는 큰 의사결정 나무보다 괜찮을까요? 왜 그렇게 생각하나요? 34 | - 스팸 필터에 로지스틱 리그레션을 많이 사용하는 이유는 무엇일까요? 35 | - OLS(ordinary least squre) regression의 공식은 무엇인가요? 36 | - ML 도입 이유 37 | - 지도학습 vs 비지도학습 vs 강화학습 38 | - 지도학습 39 | - 비지도학습 40 | - 강화학습 41 | - Bayes'Theorem? 42 | - Naive bayes? 43 | - Naive bayes 에서 Naive는? 44 | - PCA를 쓰는 경우 45 | - SVM 알고리즘 자세히 설명하시오 46 | - SVM에서 support vectors가 무엇인가 47 | - Cross-Validataion 이 무엇인가? 48 | - ML에서 Bias는 무엇인가? 49 | - Classification vs Regression 50 | - F1 score가 뭔가? 어떻게 쓰나? 51 | - Precision & Recall 정의 52 | - Overfitting & Underfitting 대처법 53 | - 인공 신경망이 무엇인가 54 | - Loss Function & Cost function 정의, 차이점 55 | - Ensemble Learning이 무엇인가? 56 | - 어느 ML 알고리즘을 사용할지 어떻게 확신하나 57 | - Outlier? 58 | - Outlier Values를 어떻게 다루나 59 | - Random Forest 정의, 작동 방식 60 | - K-means Clustering에서 K를 어떻게 고르나 61 | - dataset의 Normality를 확인하는 방법 62 | - Logistic Regression을 2가지 이상의 클래스에 사용 가능한가? 63 | - Correlation vs Covariance vs Casuality 64 | - Parametric & Non-Parametric 모델 설명 65 | - 강화학습이 뭔가? 66 | - Sigmoid vs Softmax 67 | - time series는 무엇인가요? 68 | - box-cow transformation? 69 | - random forest vs gradient boosting 70 | - confusion matrix? 왜 71 | - marginalization? 72 | - marginalization 의 process 73 | - data의 outliers를 다루는 방법 74 | - 유명한 cross validation 기술들? 75 | - Fixed Basis Function의 한계 76 | - EDA technique 77 | - boosting vs bagging 78 | - ROC Curve 79 | - Water Trapping Problem 80 | - Decision tree 에서 hyper-parameter는? 81 | - Cross-Validation의 역할? 82 | - Pandas Profiling 83 | - KNN에서 사용되는 거리 metric? 84 | - pipeline이 무엇인가 85 | - pruning의 이점 86 | - the degree of freedom? 87 | - Type I and Type II error 88 | - utilities fraud detection에 관한 dataset이 있을때, 분류모델을 만들었고 그 모델 성능이 98.5%를 달성했을 때, 좋은 모델인가? 그렇다면 정당화하고, 아니라면 무엇을 할 수 있을까? 89 | - 주어진 dataset에서 missing value나 corrupted value를 다루는 방법? 90 | - How do you select important variables while working on a data set? 91 | - dataset이 주어졌을 때 사용할 ML 알고리즘을 고르는 방법? 92 | - Hardware에 ML을 적용하는 방법 93 | - A data set is given to you and it has missing values which spread along 1 standard deviation from the mean. How much of the data would remain untouched? 94 | - Stochastic Gradient Descent(SGD) vs Gradient Descent(GD)? 95 | - 역전파 사용시 exploding gradient problem은? 96 | - decision tree의 장단점 -------------------------------------------------------------------------------- /AI/mlops.md: -------------------------------------------------------------------------------- 1 | # AI Interview - MLOps 2 | 3 | - MLOps pipeline 4 | - What is the difference between MLOps, ModelOps & AIOps 5 | - Define MLOps and how is it different from Data Science? 6 | - What is the difference between MLOps and DevOps? 7 | - What is the difference between MLOps and DataOps? 8 | - What are the risks associated with Data Science & how MLOps can overcome the same? 9 | - Is model deployment end of ML lifecycle? 10 | - What is MLOps? 11 | - What are the benefits of MLOps? 12 | - How do you create infrastructure for MLOps? 13 | - How to create CI/CD pipelines for machine learning? 14 | - Explain about model/concept drift. -------------------------------------------------------------------------------- /AI/mlops/1. mlops_pipeline.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/1. mlops_pipeline.md -------------------------------------------------------------------------------- /AI/mlops/2. mlopsVSaiops.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/2. mlopsVSaiops.md -------------------------------------------------------------------------------- /AI/mlops/3. mlopsVSds.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/3. mlopsVSds.md -------------------------------------------------------------------------------- /AI/mlops/4. mlopsVSdevops.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/4. mlopsVSdevops.md -------------------------------------------------------------------------------- /AI/mlops/5. mlopsVSdataops.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/5. mlopsVSdataops.md -------------------------------------------------------------------------------- /AI/mlops/6. dsriskovercomemlops.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/AI/mlops/6. dsriskovercomemlops.md -------------------------------------------------------------------------------- /AI/nlp.md: -------------------------------------------------------------------------------- 1 | # AI Interview - NLP 2 | 3 | 34 | 35 | - One Hot 인코딩에 대해 설명해주세요 36 | - one-hot encoding vs label encoding 37 | - 데이터셋의 차원에 어떻게 영향을 주나 38 | - POS 태깅은 무엇인가요? 가장 간단하게 POS tagger를 만드는 방법은 무엇일까요? 39 | - 문장에서 "Apple"이란 단어가 과일인지 회사인지 식별하는 모델을 어떻게 훈련시킬 수 있을까요? 40 | - 뉴스 기사에 인용된 텍스트의 모든 항목을 어떻게 찾을까요? 41 | - 음성 인식 시스템에서 생성된 텍스트를 자동으로 수정하는 시스템을 어떻게 구축할까요? 42 | - 잠재론적, 의미론적 색인은 무엇이고 어떻게 적용할 수 있을까요? 43 | - 영어 텍스트를 다른 언어로 번역할 시스템을 어떻게 구축해야 할까요? 44 | - 뉴스 기사를 주제별로 자동 분류하는 시스템을 어떻게 구축할까요? 45 | - Stop Words는 무엇일까요? 이것을 왜 제거해야 하나요? 46 | - 영화 리뷰가 긍정적인지 부정적인지 예측하기 위해 모델을 어떻게 설계하시겠나요? 47 | - TF-IDF 점수는 무엇이며 어떤 경우 유용한가요? 48 | - 한국어에서 많이 사용되는 사전은 무엇인가요? 49 | - Regular grammar는 무엇인가요? regular expression과 무슨 차이가 있나요? 50 | - RNN에 대해 설명해주세요 51 | - LSTM은 왜 유용한가요? 52 | - Translate 과정 Flow에 대해 설명해주세요 53 | - n-gram은 무엇일까요? 54 | - PageRank 알고리즘은 어떻게 작동하나요? 55 | - depedency parsing란 무엇인가요? 56 | - Word2Vec의 원리는? 57 | - 그 그림에서 왼쪽 파라메터들을 임베딩으로 쓰는 이유는? 58 | - 그 그림에서 오른쪽 파라메터들의 의미는 무엇일까? 59 | - 남자와 여자가 가까울까? 남자와 자동차가 가까울까? 60 | - 번역을 Unsupervised로 할 수 있을까? -------------------------------------------------------------------------------- /AI/recsys.md: -------------------------------------------------------------------------------- 1 | # AI Interview - Recommender System 2 | 3 | - [추천 시스템에서 사용할 수 있는 거리는 무엇이 있을까요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/AI/recsys/1.%20distance.md) 4 | - User 베이스 추천 시스템과 Item 베이스 추천 시스템 중 단기간에 빠른 효율을 낼 수 있는 것은 무엇일까요? 5 | - 성능 평가를 위해 어떤 지표를 사용할까요? 6 | - Explicit Feedback과 Implicit Feedback은 무엇일까요? Impicit Feedback을 어떻게 Explicit하게 바꿀 수 있을까요? 7 | - Matrix Factorization은 무엇인가요? 해당 알고리즘의 장점과 단점은? 8 | - SQL으로 조회 기반 Best, 구매 기반 Best, 카테고리별 Best를 구하는 쿼리를 작성해주세요 9 | - 추천 시스템에서 KNN 알고리즘을 활용할 수 있을까요? 10 | - 유저가 10만명, 아이템이 100만개 있습니다. 이 경우 추천 시스템을 어떻게 구성하시겠습니까? 11 | - 딥러닝을 활용한 추천 시스템의 사례를 알려주세요 12 | - 두 추천엔진간의 성능 비교는 어떤 지표와 방법으로 할 수 있을까요? 검색엔진에서 쓰던 방법을 그대로 쓰면 될까요? 안될까요? 13 | - Collaborative Filtering에 대해 설명한다면?#### Recommander System 14 | - 추천 시스템에서 사용할 수 있는 거리는 무엇이 있을까요? 15 | - User 베이스 추천 시스템과 Item 베이스 추천 시스템 중 단기간에 빠른 효율을 낼 수 있는 것은 무엇일까요? 16 | - 성능 평가를 위해 어떤 지표를 사용할까요? 17 | - Explicit Feedback과 Implicit Feedback은 무엇일까요? Impicit Feedback을 어떻게 Explicit하게 바꿀 수 있을까요? 18 | - Matrix Factorization은 무엇인가요? 해당 알고리즘의 장점과 단점은? 19 | - SQL으로 조회 기반 Best, 구매 기반 Best, 카테고리별 Best를 구하는 쿼리를 작성해주세요 20 | - 추천 시스템에서 KNN 알고리즘을 활용할 수 있을까요? 21 | - 유저가 10만명, 아이템이 100만개 있습니다. 이 경우 추천 시스템을 어떻게 구성하시겠습니까? 22 | - 딥러닝을 활용한 추천 시스템의 사례를 알려주세요 23 | - 두 추천엔진간의 성능 비교는 어떤 지표와 방법으로 할 수 있을까요? 검색엔진에서 쓰던 방법을 그대로 쓰면 될까요? 안될까요? 24 | - Collaborative Filtering에 대해 설명한다면? 25 | - Cold Start의 경우엔 어떻게 추천해줘야 할까요? 26 | - 고객사들은 기존 추천서비스에 대한 의문이 있습니다. 주로 매출이 실제 오르는가 하는 것인데, 이를 검증하기 위한 방법에는 어떤 것이 있을까요? 위 관점에서 우리 서비스의 성능을 고객에게 명확하게 인지시키기 위한 방법을 생각해봅시다. 27 | - What are Recommendation Systems? 28 | - What is the difference between Collaborative and Content based Recommender Systems? 29 | - What is a Model-Based Collaborative approach? 30 | - What are some Domain-Specific Challenges in Recommender Systems? 31 | - What are the basic components of a Content-Based System? 32 | - How are Knowledge-based Recommender Systems different from Collaborative and Content-based Recommender Systems? 33 | - What are some applications of Recommender Systems? 34 | - What are some advantages of using Neighborhood-based approaches for Recommender Systems? 35 | - What are some applications of Recommender Systems? 36 | - What are some advantages of using Neighborhood-based approaches for Recommender Systems? 37 | - Cold Start의 경우엔 어떻게 추천해줘야 할까요? 38 | - 고객사들은 기존 추천서비스에 대한 의문이 있습니다. 주로 매출이 실제 오르는가 하는 것인데, 이를 검증하기 위한 방법에는 어떤 것이 있을까요? 위 관점에서 우리 서비스의 성능을 고객에게 명확하게 인지시키기 위한 방법을 생각해봅시다. 39 | - What are Recommendation Systems? 40 | - What is the difference between Collaborative and Content based Recommender Systems? 41 | - What is a Model-Based Collaborative approach? 42 | - What are some Domain-Specific Challenges in Recommender Systems? 43 | - What are the basic components of a Content-Based System? 44 | - How are Knowledge-based Recommender Systems different from Collaborative and Content-based Recommender Systems? 45 | - What are some applications of Recommender Systems? 46 | - What are some advantages of using Neighborhood-based approaches for Recommender Systems? 47 | - What are some applications of Recommender Systems? 48 | - What are some advantages of using Neighborhood-based approaches for Recommender Systems? -------------------------------------------------------------------------------- /AI/recsys/1. distance.md: -------------------------------------------------------------------------------- 1 | # Distance 2 | 3 | ## 추천 시스템에서 사용할 수 있는 거리는 무엇이 있을까요? 4 | 5 | - 추천 시스템은 아이템, 사용자 간의 유사도 거리를 기준으로 추천 목록을 구성 6 | - 자주 사용되는 거리는 크게 4가지 정도 존재 7 | 8 | > Mean Squared Difference Similarity 9 | 10 | $$ 11 | \text{MSD}(u, v) = \frac{1}{\mid I_{uv} \mid} \sum_{i\in I_{uv}} (r_{ui} - r_{vi})^2 , \quad \text{MSD}_{\text{sim}(u,v)} = \frac{1}{\text{MSD}(u, v) + 1} 12 | $$ 13 | 14 | - mean squared 특징을 갖는 거리 15 | - 유클리드 거리에 반비례하는 특성 = 거리가 멀수록 유사도가 떨어짐 16 | - `두 벡터의 크기가 유사도에 영향`을 준다는 문제가 발생 17 | 18 | > Cosine Similarity 19 | 20 | $$ 21 | \cos(X, Y) = \frac{X \cdot Y}{\mid X \mid \mid Y \mid} = \frac{\Sigma_{i=1}^{N} X_i Y_i }{\sqrt{\Sigma_{i=1}^{N} X_{i}^2} \sqrt{\Sigma_{i=1}^{N} Y_{i}^2}} 22 | $$ 23 | 24 | - cosine은 단순 각도의 값만을 가지므로 크기가 크게 영향을 주지 않음 25 | - 두 `벡터의 내적` 원리를 활용 26 | - 두 벡터의 방향이 같을수록 1에, 다를수록 -1에 가까움 27 | - 가장 많이 사용되는 유사도 지표 28 | 29 | > Pearson Similarity (Pearson Correlation) 30 | 31 | $$ 32 | \text{Pearson}(X, Y) = \frac{\Sigma_{i=1}^{N} (X_{i} - \bar{X})(Y_{i} - \bar{Y})}{\sqrt{\Sigma_{i=1}^{N} (X_{i} - \bar{X})^2}\sqrt{\Sigma_{i=1}^{N} (Y_{i} - \bar{Y})^2}} 33 | $$ 34 | 35 | - 각 벡터를 표본평균으로 정규화하고 코사인 유사도를 구한 것 36 | - 정규화 과정을 통해 유저의 평가기준이 다를 수 있다는 문제점을 해결할 수 있음 37 | - 예를 들어 어떤 유저는 평균적으로 1~3에 위치하는 박한 점수를 주고 어떤 유저는 3~5로 점수를 후하게 주는 경우 `같은 3에 대한 의미가 다를 수 있음` 38 | - 정규화를 하면 vector rating의 크기차를 고려할 수 있음 39 | 40 | > Jacard Similarity 41 | 42 | $$ 43 | J(A, B) = \frac{\mid A \cap B \mid}{\mid A \cup B \mid} = \frac{\mid A \cap B \mid}{\mid A \mid + \mid B \mid - \mid A \cap B \mid} 44 | $$ 45 | 46 | - 다른 유사도와 다르게 `집합 `에 대한 유사도 연산 47 | - 집합 유사도의 특징상 다른 차원에 대해 이론적인 유사도 계산이 가능 48 | - `두 집합의 아이템 공유 정도를 의미` 49 | -------------------------------------------------------------------------------- /AI/stats-math.md: -------------------------------------------------------------------------------- 1 | # AI Interview - Statistics/Math 2 | 3 | - 고유값(eigen value)와 고유벡터(eigen vector)에 대해 설명해주세요. 그리고 왜 중요할까요? 4 | - 샘플링(Sampling)과 리샘플링(Resampling)에 대해 설명해주세요. 리샘플링은 무슨 장점이 있을까요? 5 | - 확률 모형과 확률 변수는 무엇일까요? 6 | - 누적 분포 함수와 확률 밀도 함수는 무엇일까요? 수식과 함께 표현해주세요. 7 | - 조건부 확률은 무엇일까요? 8 | - 공분산과 상관계수는 무엇일까요? 수식과 함께 표현해주세요. 9 | - 데이터의 분산이 높으면 좋을까요 나쁠까요? 10 | - 신뢰 구간의 정의는 무엇인가요? 11 | - p-value를 모르는 사람에게 설명한다면 어떻게 설명하실 건가요? 12 | - R square의 의미는 무엇인가요? 13 | - 평균(mean)과 중앙값(median)중에 어떤 케이스에서 뭐를 써야할까요? 14 | - 중심극한정리는 왜 유용한걸까요? 15 | - 엔트로피(entropy)에 대해 설명해주세요. 가능하면 Information Gain도요. 16 | - 어떨 때 모수적 방법론을 쓸 수 있고, 어떨 때 비모수적 방법론을 쓸 수 있나요? 17 | - “likelihood”와 “probability”의 차이는 무엇일까요? 18 | - 통계에서 사용되는 bootstrap의 의미는 무엇인가요. 19 | - 모수가 매우 적은 (수십개 이하) 케이스의 경우 어떤 방식으로 예측 모델을 수립할 수 있을까요? 20 | - 베이지안과 프리퀀티스트 간의 입장차이를 설명해주실 수 있나요? 21 | - 검정력(statistical power)은 무엇일까요? 22 | - missing value가 있을 경우 채워야 할까요? 그 이유는 무엇인가요? 23 | - 아웃라이어의 판단하는 기준은 무엇인가요? 24 | - 필요한 표본의 크기를 어떻게 계산합니까? 25 | - Bias를 통제하는 방법은 무엇입니까? 26 | - 로그 함수는 어떤 경우 유용합니까? 사례를 들어 설명해주세요. 27 | - 베르누이 분포 / 이항 분포 / 카테고리 분포 / 다항 분포 / 가우시안 정규 분포 / t 분포 / 카이제곱 분포 / F 분포 / 베타 분포 / 감마 분포에 대해 설명해주세요. 그리고 분포 간의 연관성도 설명해주세요. 28 | - 출장을 위해 비행기를 타려고 합니다. 당신은 우산을 가져가야 하는지 알고 싶어 출장지에 사는 친구 3명에게 무작위로 전화를 하고 비가 오는 경우를 독립적으로 질문해주세요. 각 친구는 2/3로 진실을 말하고 1/3으로 거짓을 말합니다. 3명의 친구가 모두 “그렇습니다. 비가 내리고 있습니다”라고 말했습니다. 실제로 비가 내릴 확률은 얼마입니까? 29 | - Linear regression? 30 | - Eigenvector 31 | - Eigenvalue 32 | - multicollinearity를 다루는 법? 33 | - chi-square test? 34 | - 표준편차와 분산의 관계 35 | - 데이터의 분산이 클 때 다루는 방법? 36 | - Fourier transform? 37 | - Associative Rule Mining(ARM)의 의미? 38 | - List the most popular distribution curves along with scenarios where you will use them in an algorithm. -------------------------------------------------------------------------------- /Computer Science/Algorithm.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Algorithm 2 | 3 | - [점근 표기법에 대해 간단하게 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Algorithm/1.%20Big%20notation.md) 4 | - [정렬 알고리즘](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Algorithm/2.%20sorting%20algorithm.md) 5 | - Bubble sort 6 | - Selection sort 7 | - Insertion sort 8 | - Heap sort 9 | - Merge sort 10 | - Quick sort 11 | - 현실에서 quick 소트를 merge보다 많이 쓰는 이유 12 | - Counting sort 13 | - Radix sort 14 | - Divide and Conquer 15 | - Dynamic Programming 16 | - Greedy Algorithm 17 | - Binary Heap 18 | - Shortest Path 19 | - Dijkstra 20 | - Floyd-Warshall 21 | - Bellman-Ford 22 | - A* 23 | - Minimum Spanning Tree 24 | - Prim 25 | - Kruskal 26 | - Union-find 27 | - Topological sort 28 | - 비트마스크(BitMask) 29 | - 최장증가수열(LIS) 30 | - 최소공통조상(LCA) 31 | - Fibonacci에서의 세 가지(Recursion, Dynamic Programming, 반복) 방식에 대한 시간복잡도와 공간복잡도 차이 32 | - Factorial for loop vs recursive vs 쪼개서 계산 vs multicore 에서의 작동 -------------------------------------------------------------------------------- /Computer Science/Algorithm/1. Big notation.md: -------------------------------------------------------------------------------- 1 | # Big Notation 2 | 3 | ## 점근 표기법에 대해 간단하게 설명해주세요. 4 | 5 | > Big-O 표기법 6 | 7 | - 빅오 표기법은 알고리즘의 `상한(upper bound)`을 의미 8 | - 일반적으로 표기는 f(n) = O(g(n)) 9 | - 수식적으로 나타내면 f(n) <= cg(n) + d 10 | - Small(little)-O 11 | - 빅오는 상한인 동시에 동일선까지 포함 12 | - small-o는 미만값만을 인정함 13 | - f(n) < cg(n) + d -> f(n) = o(g(n)) 14 | 15 | > Big-Ω 표기법 16 | 17 | - 빅오메가 표기법은 알고리즘의 `하한(lower bound)`를 의미 18 | - 일반적으로 표기는 f(n) = Ω(g(n)) 19 | - 수식적으로 나타내면 f(n) >= cg(n) + d 20 | - Small(littel)-Ω 21 | - 빅세타는 하한인 동시에 동일선까지 포함 22 | - small-ω는 초과값만을 인정 23 | - f(n) > cg(n) + d -> f(n) = ω(g(n)) 24 | 25 | > Big-Θ 표기법 26 | 27 | - 빅세타 표기법은 알고리즘의 `평균치(tight bound)`를 의미 28 | - 일반적으로 표기는 f(n) = Θ(g(n)) 29 | - 수식적으로 나타내면 ag(n) + d <= f(n) <= cg(n) + d 30 | -------------------------------------------------------------------------------- /Computer Science/Algorithm/2. sorting algorithm.md: -------------------------------------------------------------------------------- 1 | # Sorting Algorithm 2 | 3 | ## 정렬 알고리즘 4 | 5 | > Bubble sort 6 | 7 | ```cpp 8 | vector bubbleSort(vector arr) { 9 | // 오름차순 10 | int tmp = 0; 11 | 12 | for (int i = 0; i < arr.size(); i++) { 13 | for (int j = 1; j < arr.size()-i; j++) { 14 | if (arr[j-1] > arr[j]) { 15 | tmp = arr[j-1]; 16 | arr[j-1] = arr[j]; 17 | arr[j] = tmp; 18 | } 19 | } 20 | } 21 | 22 | return arr; 23 | } 24 | ``` 25 | 26 | - 인접한 2개의 데이터를 비교하여 정렬기준에 맞지 않으면 두 데이터를 교환하는 방법 27 | - 1회전에서 arr[1]부터 arr[n]까지를 비교 28 | - k회전에서는 arr[1]부터 arr[n-k+1]까지 비교 29 | - 시간복잡도 : O(n2) 30 | - 장점 31 | - 구현이 간단하여 코드가 직관적 32 | - 추가적인 메모리 공간이 필요하지 않은 in-place 알고리즘 33 | - 두 데이터의 정렬 기준이 다른 경우에만 변경하므로 stable-sort 34 | - 단점 35 | - 여러 경우에서 항상 최악수행시간을 가짐 36 | - 교환자체가 너무 자주 일어난다는 문제가 있음 37 | 38 | > Selection sort 39 | 40 | ```cpp 41 | vector selectionSort(vector arr) { 42 | // 오름차순 stable 43 | int idx, tmp; 44 | 45 | for (int i = 0; i < arr.size()-1; i++) { 46 | idx = i; 47 | for (int j = i+1; j < arr.size(); j++) { 48 | if (arr[j] <>= arr[idx]) idx = j; 49 | } 50 | tmp = arr[idx]; 51 | arr[idx] = arr[i]; 52 | arr[i] = tmp; 53 | } 54 | 55 | return arr; 56 | } 57 | ``` 58 | 59 | - 데이터가 들어갈 위치는 정해져 있고 어떤 데이터를 넣을지 찾는 정렬방법 60 | - 1회전시 arr[1]부터 arr[n]까지 데이터 확인 61 | - k회전시 arr[k]부터 arr[n]까지 데이터 확인 62 | - 시간복잡도 : O(n2) 63 | - 장점 64 | - 알고리즘이 단순하고 구현이 어렵지 않음 65 | - 비교연산은 버블소트와 크게 다를 것은 없지만 교환 횟수에서는 적으므로 비교적 효율적 66 | - 추가적인 메모리 공간이 필요하지 않은 in-place 알고리즘 67 | - 단점 68 | - 여러 경우에서 항상 최악수행시간을 가짐 69 | - 구현방식에 따라 stable, unstable이 나눠짐 70 | 71 | > Insertion sort 72 | 73 | ```cpp 74 | vector insertionSort(vector arr) { 75 | for (int i = 1; i < arr.size(); i++) { 76 | int tmp = arr[i]; 77 | int prev = i-1; 78 | 79 | while (prev >= 0 && arr[prev] > tmp) { 80 | arr[prev+1] = arr[prev]; 81 | prev--; 82 | } 83 | 84 | arr[prev+1] = tmp; 85 | } 86 | 87 | return arr; 88 | } 89 | ``` 90 | 91 | - 2번째 인덱스부터 데이터를 탐색하며 자신이 있을 곳에 삽입되며 정렬 92 | - k번째 데이터는 arr[1]부터 arr[k-1]까지 확인 93 | - 시간복잡도 : O(n2) (worst), O(n) (최선) 94 | - 장점 95 | - 단순한 알고리즘 96 | - 이미 정렬된 상태인 경우 효율적인 알고리즘 97 | - 추가적인 메모리 공간이 필요하지 않은 in-place 알고리즘 98 | - stable sort 99 | - 역으로 정렬된 최악 경우빼곤 O(n2) 알고리즘보다 효율적 100 | - 단점 101 | - 평균과 최악은 여전히 O(n2) 102 | - 배열 길이가 길수록 비효율적 103 | 104 | > Heap sort 105 | 106 | - 완전 이진 트리 구조인 힙(heap) 구조를 활용한 정렬방법 107 | - 힙에서 오름차순 정렬기준, min heap을 만들고 pop하면서 정렬 108 | - 시간복잡도 : O(nlogn) (worst) 109 | - 특징 110 | - 추가적인 메모리 공간이 필요하지 않은 in-place 알고리즘 111 | - 구현과정 112 | - heap 구성 -> downHeap, upHeap 필요 113 | - heap을 pop하면서 저장 114 | 115 | > Merge sort 116 | 117 | ```cpp 118 | vector merge(vector vec1, vector vec2) { 119 | vector vec; 120 | 121 | int i = 0; 122 | int j = 0; 123 | 124 | while (i < vec1.size() && j < vec2.size()) { 125 | if (vec1[i] <= vec2[j]) { 126 | vec.push_back(vec1[i]); 127 | i++; 128 | }else { 129 | vec.push_back(vec2[j]); 130 | j++; 131 | } 132 | } 133 | 134 | while (i < vec1.size()) { 135 | vec.push_back(vec1[i]); 136 | i++; 137 | } 138 | 139 | while (j < vec2.size()) { 140 | vec.push_back(vec2[j]); 141 | j++; 142 | } 143 | 144 | return vec; 145 | } 146 | 147 | vector mergeSort(vector arr) { 148 | if (arr.size() == 1) return arr; 149 | 150 | int mid = (arr.size()-1)/2; 151 | vector vec1; 152 | vector vec2; 153 | 154 | for (int i = 0; i < arr.size(); i++) { 155 | if (i <= mid) vec1.push_back(arr[i]); 156 | else vec2.push_back(arr[i]); 157 | } 158 | 159 | vec1 = mergeSort(vec1); 160 | vec2 = mergeSort(vec2); 161 | 162 | vector vec = merge(vec1, vec2); 163 | 164 | return vec; 165 | } 166 | ``` 167 | 168 | - 분할정복을 활용한 대표적인 정렬방법 169 | - 원소크기가 1이 될 때까지 분할하고 2개 값을 비교하여 정렬 값을 기준으로 정렬 170 | - 시간복잡도 : O(nlogn) (worst) 171 | - 특징 172 | - O(n)의 공간을 추가로 요구하므로 in-place 알고리즘이 아님 173 | 174 | > Quick sort 175 | 176 | - pivot을 지정하고 양 끝에서 2개의 포인터가 움직이며 pivot보다 작은건 왼쪽, 큰건 오른쪽으로 옮기고 pivot을 제외한 두 배열을 재귀적으로 정렬 177 | - 구현방법 178 | - `low`, `high` 포인터 활용 179 | - `low`는 오른쪽으로 이동하며 pivot보다 큰 요소를 찾으면 이동을 멈추고 `high`는 왼쪽으로 이동하며 pivot보다 작은 요소를 찾으면 멈춘다 180 | - 두 포인터가 모두 멈추면 두 값을 교환하고 두 포인터가 엇갈릴때까지 이동 181 | - 시간복잡도 : O(nlogn) (average), O(n2) (worst) 182 | - 특징 183 | - 추가적인 메모리 공간이 필요하지 않은 in-place 알고리즘 184 | - pivot을 임의 선택하는 경우 randomized quick-sort라고 하며, 이때 O(nlogn)을 기대할 수 있음 185 | 186 | > 현실에서 quick sort를 merge sort보다 많이 쓰는 이유 187 | 188 | - 알고리즘 자체의 이유보다는 컴퓨터 메모리 구조적인 이유가 큼 189 | - 컴퓨터는 `locality 특성`으로 인해 자주 접근하는 영역은 캐시에 기록해두고 연산속도를 높으려고 함 190 | - 이는 다른 말로 얘기하면 근방에 있는 데이터를 접근할 확률이 높다고 생각하는 것 191 | - merge sort는 정렬방식의 특성상 양쪽 끝을 왔다 갔다하므로 locality의 특징을 살리기 어려움 192 | - 반면에 quick sort는 pivot 기준 작은쪽을 정렬 -> 큰 쪽을 정렬하므로 `locality를 활용하므로 캐시의 도움`을 받음 193 | - 따라서 quick sort가 merge sort보다 빠름 194 | 195 | > Counting sort 196 | 197 | ```cpp 198 | vector countingSort(vector arr) { 199 | vector vec(arr.size()+10, 0); 200 | vector ret(arr.size()); 201 | 202 | for (int i = 0; i < arr.size(); i++) { 203 | vec[arr[i]]++; 204 | } 205 | 206 | for (int i = 1; i < vec.size(); i++) { 207 | vec[i] += vec[i-1]; 208 | } 209 | 210 | for (int i = arr.size()-1; i >= 0; i--) { 211 | vec[arr[i]]--; 212 | ret[vec[arr[i]]] = arr[i]; 213 | } 214 | 215 | return ret; 216 | } 217 | ``` 218 | 219 | - 정렬과정에서 아무리 줄여도 트리 방식을 쓰면 결국 `nlogn`의 시간이 걸릴 수 밖에 없음 -> comparison 220 | - comparison을 하지 않으면 시간을 더 줄일 수 있음 221 | - 미리 숫자의 등장횟수를 기록 222 | - 시간복잡도 : O(n + k) 223 | - 구현 방법 224 | - counting 배열을 반드시 등장 값 중 최대 값만큼으로 선언 225 | - counting 배열을 배열 값 등장때마다 증가해주기 226 | - counting 배열을 누적합으로 구현 227 | - 실제 배열의 뒤부터 값을 보면서 해당 숫자의 counting 배열의 인덱스 위치에 값을 삽입 228 | 229 | > Radix sort 230 | 231 | - counting sort처럼 comparison을 최소화하는 방법 232 | - 입력 데이터 최댓값에 따라 counting sort보다 radix sort가 효율적이기도 함 233 | - 데이터 특징만큼 bucket이 필요함 234 | - 시간복잡도 : O(d * (n + b)) 235 | - d : 정렬할 데이터 수 236 | - b : 데이터의 특징 (숫자는 0-9, 알파벳은 a-z) 237 | - 특징 238 | - 낮은 자리수(LSD)부터 bucket 기준으로 정렬을 진행 239 | - 장점 240 | - 문자열, 정수의 정렬에 용이 241 | - 단점 242 | - 자릿수가 없는 수는 정렬 불가 (부동소수점) 243 | 244 | - 왜? 낮은 자리수부터 정렬을 시도하는가? 245 | - MSD로 구현하는 경우 중간부분에서 정렬이 끝날 수 있다는 장점이 있지만 추가작업(정렬 상태 확인)이 필요함 246 | - MSD는 결국 모든 데이터에 일괄적인 과정을 처리하는게 어려울 수 있다는 문제가 존재 247 | - LSD의 경우 가장 낮은 자리수에서 큰자리수까지 비교해야하지만 코드 구현적인 부분에서 간결함 248 | 249 | -------------------------------------------------------------------------------- /Computer Science/DB.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Database 2 | 3 | - [데이터베이스를 사용하는 이유가 뭔가요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/1.%20Why%20use%20database.md) 4 | - [데이터베이스의 성능이란 무엇인가요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/2.%20Database%20performance.md) 5 | - [데이터 모델에 대해서 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/3.%20Data%20model.md) 6 | - [Index](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/4.%20Index.md) 7 | - Index 란 무엇인가 8 | - Primary index vs Secondary index 9 | - Index 의 성능과 고려해야할 사항 10 | - 인덱스 Scan 방식은 무엇이 있나요? 11 | - 인덱스 설계시 NULL값은 고려되야 할까요? 12 | - [Index 의 자료구조는 크게 Hash 인덱스와 B+Tree 인덱스가 있습니다. 이것은 무엇일까요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/5.%20Index%20Structure.md) 13 | - [정규화](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/6.%20Normalization.md) 14 | - 정규화란 무엇인가 15 | - 정규화의 종류 16 | - 정규화의 장단점 17 | - [트랜잭션(Transaction)이란 무엇인가?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/7.%20Transaction.md) 18 | - 트랜잭션의 특성 19 | - 트랜잭션과 Lock 20 | - 트랜잭션의 상태 21 | - DBMS 는 어떻게 트랜잭션을 관리할까? 22 | - [트랜잭션 격리 수준(Transaction Isolation Level)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/8.%20Transaction%20Level.md) 23 | - 트랜잭션을 사용할 때 주의할 점 24 | - [NoSQL](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/9.%20NoSQL.md) 25 | - NoSQL vs RDBMS 26 | - 저장방식에 따른 분류 27 | - Key-Value Model 28 | - Document Model 29 | - Column Model 30 | - Graph Model 31 | - 대표적으로 MongoDB가 있는데, 다른 NoSQL과 다른 점이 뭘까요? 32 | - [CAP 이론](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/10.%20cap.md) 33 | - 일관성 34 | - 가용성 35 | - 네트워크 분할 허용성 36 | - [Redis](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/11.%20Redis.md) 37 | - Redis에 장애가 발생할 경우 데이터 복구 방법 38 | - [Redis와 비슷한 기술](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Database/12.%20Broker.md) 39 | - Kafka 40 | - RabbitMQ 41 | - 효과적인 쿼리 저장 42 | - 옵티마이저(Optimizer)란 43 | - Replication 44 | - 파티셔닝(Partitioning) 45 | - 샤딩(Sharding) 46 | - Key 종류 47 | - CRUD 48 | - SQL Join 49 | - SQL injection 50 | - Anomaly 51 | - 종류 52 | - 설명 53 | - 발생 예시 54 | - Statement와 PrepareStatement 55 | - 객체 관계 매핑(Object-relational mapping, ORM)이란 56 | - java JDBC 57 | - PostgreSQL의 장점은 무엇일까요? 58 | - postgreSQL vs Elastic Search 59 | - Nested Loop 조인은 무엇일까요? 60 | - Windows 함수는 무엇이고 어떻게 작성할까요? 61 | - KNN 알고리즘을 쿼리로 구현할 수 있을까요? 62 | - MySQL에서 대량의 데이터(500만개 이상)를 Insert해야하는 경우엔 어떻게 해야할까요? 63 | - RDB의 char와 varchar의 차이는 무엇일까요? 64 | - 구글의 BigQuery, AWS의 Redshift는 기존 RDB와 무슨 차이가 있을까요? 왜 빠를까요? 65 | - 쿼리의 성능을 확인하기 위해 어떤 쿼리문을 작성해야 할까요? 66 | - MySQL이 요새 느리다는 신고가 들어왔습니다. 첫번째로 무엇을 확인하시고 조정하시겠나요? 67 | - 동작하는 MySQL에 Alter table을 하면 안되는 이유를 설명해주세요. 그리고 대안을 설명해주세요 68 | - 빡세게 동작하고 있는 MySQL을 백업뜨기 위해서는 어떤 방법이 필요할까요? -------------------------------------------------------------------------------- /Computer Science/DS.md: -------------------------------------------------------------------------------- 1 | # CS Interview - DataStructure 2 | 3 | - [Array와 Linked List의 특징과 차이점](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/DataStructure/1.%20Array%20VS%20Linked%20List.md) 4 | - hash table(해시함수, 충돌해결(오픈어드레싱, 세퍼레이트 체이닝), resize) 5 | - hash function 6 | - collision 7 | - open addresing 8 | - linear probing 9 | - quadratic probing 10 | - separate chaining 11 | - double hashing 12 | - resize 13 | - stack 14 | - queue 15 | - circular queue 16 | - dequeue 17 | - Graph vs Tree 18 | - Graph 19 | - directed 20 | - undirected 21 | - adjacency matrix 22 | - adjacency list 23 | - Graph Traversal: BFS, DFS 24 | - Tree 25 | - binary tree 26 | - full binary tree 27 | - complete binary tree 28 | - bst(binary search tree) 29 | - heap(binary heap) 30 | - min heap 31 | - max heap 32 | - red-black tree(정의, 특징, 삽입, 삭제) 33 | - b+ tree & b- tree 34 | - Trie 35 | -------------------------------------------------------------------------------- /Computer Science/DataStructure/1. Array VS Linked List.md: -------------------------------------------------------------------------------- 1 | # Array VS Linked List 2 | 3 | ## Array와 Linked List의 특징과 차이점 4 | 5 | > Array (배열) 6 | - 배열의 가장 큰 특징은 특정 인덱스로의 접근은 `O(1)`의 시간이 걸림 7 | - 즉, `random access`가 가능함 8 | - 배열은 `연속적인 형태로 데이터를 저장` 9 | - 특정 원소를 제거할 경우 연속적인 형태가 깨질 수 있으므로 `해당 인덱스보다 큰 인덱스는 왼쪽으로 shift`를 해야 하므로 `O(n)`의 시간이 소모됨 10 | - 이러한 것은 특정 인덱스에 데이터를 삽입할 때도 유사한 연산이 일어남 11 | 12 | > Linked List (연결 리스트) 13 | - 연결 리스트의 가장 큰 특징은 `각 원소들은 다음 원소의 위치를 가리키고 있다`는 것 14 | - 이런 이유로 특정 원소에 접근하기 위해서는 `O(n)`의 시간이 소모 15 | - 하지만 순수하게 `삽입/삭제에서는 O(1)`의 시간이 소모되므로 배열의 단점을 극복할 수 있음 16 | - 문제는 특정 원소를 제거하려면 해당 위치로 접근해야하므로 결국에는 O(n)시간이 소모 17 | - Linked List는 Tree/Graph 구조에서는 유용성이 나타나므로 필요한 자료구조임 -------------------------------------------------------------------------------- /Computer Science/Database/1. Why use database.md: -------------------------------------------------------------------------------- 1 | # Why use database? 2 | 3 | ## 데이터베이스를 사용하는 이유가 뭔가요? 4 | 5 | > 데이터베이스 존재 이전 6 | - 데이터베이스를 사용하기 이전에는 File System으로 데이터를 관리하였음 7 | - File System의 단점 8 | - 데이터의 중복이 발생하거나 application마다 동일한 데이터가 다름 (`중복최소화 위반`) 9 | - 여러 application에 data가 얽혀 있어서 새로운 data 작성에 영향을 줌 (`독립성 위반`) 10 | - 데이터가 일관적으로 유지되지 못함 (`일관성 위반`) 11 | - Atomicty하게 데이터를 업데이트하지 않으므로 data 수정과정에서 inconsistency 문제가 발생할 수 있음 (`무결성 위반`) 12 | - 여러명이 동시에 DB에 접근하는 경우 inconsistency 문제가 발생할 수 있음 13 | 14 | > 데이터베이스를 사용하는 이유 15 | - File System의 문제를 해결하기 위함 16 | - 데이터베이스의 특징 17 | - 독립성 18 | - 물리적 독립성 : 데이터베이스의 사이즈를 변경해도 application을 수정할 필요가 없음 19 | - 논리적 독립성 : 데이터베이스는 논리적 구조로 다양한 application의 논리적 요구를 만족할 수 있음 20 | - 무결성 21 | - 데이터를 처리하는 과정에서 문제가 발생하는 것을 `데이터 유효성 검사를 통해` 데이터 무결성을 구현해야 함 22 | - 보안성 23 | - 허용된 사용자에 한해서 데이터베이스에 접근을 할 수 있게하므로 데이터의 보안을 관리할 수 있음 24 | - 일관성 25 | - 연관된 정보들을 논리적으로 관리하므로 `데이터가 변경할 때, 데이터의 불일치성이 발생할 위험을 줄일 수 있음` 26 | - 중복의 최소화 27 | - 데이터를 통합 관리하므로 `파일시스템의 가장 큰 단점인 데이터의 중복성 문제를 해결함` -------------------------------------------------------------------------------- /Computer Science/Database/10. cap.md: -------------------------------------------------------------------------------- 1 | # CAP 2 | 3 | ## CAP 이론 4 | 5 | - 분산형 구조가 갖는 3가지 특징을 줄여서 CAP이라 함 6 | - 이 중 CAP이론은 2가지만 만족할 수 있다는 이론으로 NoSQL은 대부분 CAP이론을 따름 7 | - 보통 분산 허용은 고정하고 나머지 중 하나를 특징으로 가짐 8 | - `C`onsistency (일관성) 9 | - `A`vailability (가용성) 10 | - `P`artitioning Tolerance (분산 허용) 11 | - 시간이 지남에 따라 문제점이 등장했고 이를 보완하고자 PACELC 이론이 등장 12 | 13 | > Consistency 14 | 15 | - 분산된 노드 중 어느 노드로 접근하더라도 데이터 값이 같아야 함 16 | - 데이터 복제 중에 쿼리가 되는, 일관성을 제공하지 않는 시스템의 경우 다른 데이터 값이 쿼리될 수 있음 17 | - NoSQL은 일관성이 느슨하게 처리되어 동일하지 않을 수 있지만 `시간이 흐름에 따라 여러 노드에 전파되어 최종적으로 일관성이 유지됨` 18 | - 분산 노드 간의 데이터 동기화 방법 19 | - 동기식 방법 : 데이터 저장 결과를 클라이언트 응답 전에 모든 노드에 전파 20 | - 비동기식 방법 : 메모리나 임시 파일에 기록하고 클라이언트에 우선 응답 후 노드로 데이터 동기화 21 | 22 | > Availability 23 | 24 | - 클러스터링된 노드 중 하나 이상의 노드가 실패라도 정상적으로 요청을 처리할 수 있는 기능 25 | - 몇 개의 노드가 망가지더라도 정상적이 서비스가 가능함 26 | - 가용성을 보장하고자 `데이터 복제(Replication)`를 사용 27 | - Master-Slave 복제 방법 : 동일 데이터를 가진 저장소를 더 생성 28 | - Peer-to-Peer 복제 : 데이터 단위로 중복 저장 29 | - 동일 데이터를 다중 노드에 중복 저장하여 데이터가 유실되는 것을 방지함 30 | 31 | > Partitioning Tolerance 32 | 33 | - 클러스터링 노드 간에 통신하는 `네트워크가 장애가 나더라도` 정상적으로 서비스를 수행함 34 | - 노드 간 물리적으로 전혀 다른 네트워크 공간에 위치 가능 35 | 36 | ## Reference 37 | 38 | - [빨간색 코딩 - NoSQL](https://sjh836.tistory.com/97) 39 | - [어제도 그랬어 - NoSQL, CAP 이론과 PACELC 이론](https://osy0907.tistory.com/95) -------------------------------------------------------------------------------- /Computer Science/Database/11. Redis.md: -------------------------------------------------------------------------------- 1 | # Redis 2 | 3 | ## Redis란? 4 | 5 | > Redis 6 | 7 | - `Re`mote `di`ctionary `s`erver 8 | - Redis는 NoSQL인 동시에 Memcached같은 인 메모리 솔루션 9 | - **데이터베이스**, 캐시 및 **메시지 브로커**로 자주 사용됨 10 | - Key-value 쌍으로 데이터를 저장하는 딕셔너리 구조의 데이터베이스 11 | 12 | > In-memory Database 13 | 14 | - Redis는 데이터를 RAM에 저장하는 방식인 in-memory 방식을 사용 15 | - (+) RDB들과 다르게 디스크보다 빠른 속도를 갖는 메모리에 저장하므로 매우 빠른 성능을 보여줌 16 | - (-) 서버 장애가 발생하는 경우 **데이터 유실**이 발생할 수 있음 17 | - 서버 메모리 초과시 서버에 부하가 발생하는 것과 더불어 RAM에 저장된 데이터가 휘발될 수 있음 18 | - 따라서 유실되어도 상대적으로 안전한 데이터를 관리하는 것이 좋음 19 | 20 | > Pub/Sub 메시지 브로커 21 | 22 | - 서버에서 메시지를 받아 **비동기적**으로 클라이언트에게 전달하는 미들웨어 역할 23 | - 기존의 메시지 큐(Message queue)와의 차이점 24 | - 메시지 큐와 다르게 저장하지 않고 클라이언트에게 메시지 전달 후 삭제 25 | - 전달받은 메시지를 저장해서 관리해야 할 경우 적합하지 않을 수 있음 26 | 27 | ## Redis 장애 발생 시 복구 방법 28 | 29 | - Redis의 데이터 백업 및 복구 방법은 RDB와 AOF로 구분 30 | 31 | > RDB (Redis Database) 32 | 33 | - Snapshot(특정 시점)의 메모리에 있는 데이터 전체는 바이너리 파일로 저장 34 | - AOF 파일보다 사이즈가 작고 따라서 로딩 속도가 AOF보다 빠름 35 | - 저장 시점은 `redis.conf`의 save 파라미터로 설정 36 | - 간단하게 말하면 특정 지점을 설정하고 디스크에 백업 37 | 38 | > AOF (Append Only File) 39 | 40 | - `appendonly.aof` 파일에 기록 41 | - 입력/수정/삭제 명령 수행마다 기록, 조회 명령은 제외 42 | - AOF는 계속 추가되면서 기록하지만 특정 시점에 데이터 전체를 다시 쓰는 기능이 있음 43 | - text 파일이기에 수정이 가능한데 실수로 `FLUSHALL`을 하여 메모리의 데이터를 모두 날렸을 경우, 즉시 Redis 서버를 shutdown하고 appendonly.aof 파일에서 FLUSHALL 명령어를 제거한 후 레디스를 시작하면 복구할 수 있음 44 | 45 | > 장애 대응용 세팅 46 | 47 | - AOF를 기본으로 하고, RDB를 옵션으로 설정 48 | - AOF 시간은 everysec, AOF rewrite 사용 49 | 50 | ## Reference 51 | 52 | - [tilsong.log - Redis의 주요 기능 - (1) 인 메모리 데이터베이스](https://velog.io/@tilsong/Redis의-주요-기능-1-인-메모리-데이터베이스) 53 | - [Ant Developer - [Redis] AOF vs RDB - Redis 메모리 관리 방식 비교](https://hoooon-s.tistory.com/25) -------------------------------------------------------------------------------- /Computer Science/Database/12. Broker.md: -------------------------------------------------------------------------------- 1 | # Broker 2 | 3 | ## 메시지 브로커 VS 이벤트 브로커 4 | 5 | > 메시지 브로커 6 | 7 | - 대규모 메시지 기반 **미들웨어** 아키텍처에서 사용되는 기술 8 | - 메시지를 받아서 적절히 처리 후 메시지가 삭제됨 9 | - 일반적으로 캐시 서버 역할로 사용할 때 많이 사용함 10 | - **이벤트 브로커 역할을 할 수 없음** 11 | - (-) 데이터 손실 위험이 있음 12 | - 대표적인 예 13 | - Redis 14 | - RabbitMQ 15 | 16 | > 이벤트 브로커 17 | 18 | - 이벤트 또는 메시지라고 불리는 정보를 **하나만 보관**하고 **인덱스를 통해 개별 엑세스를 관리** 19 | - 업무상 필요한 시간동안 이벤트 관리 20 | - 메시지 브로커와 다르게 **이벤트를 삭제하지 않음** 21 | - 서비스에서 발생하는 이벤트를 **이벤트 브로커 큐에 저장** 22 | - (+) 딱 한번 일어난 이벤트 데이터를 브로커에 저장함으로써 모든 데이터 요소를 한 곳에서 제어 또는 편집하도록 조직하는 관례(**단일 진실 공급원**)에 맞게 동작 23 | - (+) 장애 발생시 장애 지점부터 재처리 가능 24 | - (+) 많은 양의 실시간 스트림 데이터를 효과적으로 관리 가능 25 | - 대표적인 예 26 | - Kafka 27 | 28 | ## Redis와 비슷한 기술 29 | 30 | > RabbitMQ 31 | 32 | - 서비스 확장이 없다면, 소비자 중심 설계이므로 RabbitMQ가 적합함 33 | - 장점 34 | - (+) 구성이 쉬움 35 | - (+) 복잡한 라우팅 지원 36 | - (+) 오래되었고, 안정성이 높음 37 | - (+) 20K/sec 정도의 속도를 보임 38 | - (+) 소비자 중심의 설계 39 | - 단점 40 | - (-) 데이터 손실의 위험성 41 | - (-) 성능 문제가 있음 42 | 43 | > Kafka 44 | 45 | - 대규모 트래픽이 예상되고, 확장이 예상되면 Kafka가 적합 46 | - 장점 47 | - (+) 구독 방식의 비동기식 구성 48 | - (+) 분산처리에 효과적 49 | - (+) 생산자 중심의 설계 50 | - (+) 이벤트 기반 MSA로 발전하는데 도움이 됨 51 | - (+) 100K/sec의 속도 52 | -------------------------------------------------------------------------------- /Computer Science/Database/2. Database performance.md: -------------------------------------------------------------------------------- 1 | # Database Performance 2 | 3 | ## 데이터베이스의 성능이란 무엇인가요? 4 | 5 | > 데이터베이스의 성능 6 | - 데이터베이스의 성능 = Disk I/O를 줄이는 것 7 | - Disk I/O란 디스크 드라이브의 플래터를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더로 이동한 후 데이터를 읽는 것 8 | - Disk I/O를 줄이기 위해서는 디스크 헤더의 이동을 줄이는 것이 좋기 때문에 `순차 I/O 방식이 더 효율적`이지만 대부분의 I/O는 랜덤 I/O이므로 이 과정에서 `데이터베이스 쿼리 튜닝`이 필요함 -------------------------------------------------------------------------------- /Computer Science/Database/3. Data model.md: -------------------------------------------------------------------------------- 1 | # Data Model 2 | 3 | ## 데이터 모델에 대해서 설명해주세요. 4 | 5 | > 데이터 모델 6 | - 프로그래머, 데이터 분석가에게 제공되는 것 7 | 8 | > 데이터 모델의 종류 9 | - 물리적 데이터 모델 (Physical level) 10 | - 데이터가 실제로 어떻게 저장되는지를 명시하는 방식 11 | - 일반적으로 데이터베이스의 물리적 구조를 설계하는 단계 12 | - 실질적인 데이터 저장방식과 밀접한 하위 수준의 모델 13 | - ex) 레코드의 형식, 순서, 접근 경로 등의 정보 제공 14 | - 개념적 데이터 모델 (Logical level) 15 | - 데이터베이스에 저장된 데이터들의 관계를 표현 16 | - 데이터를 개념적으로 표현하는 방식 17 | - 일반 사용자 단계에 밀접한 데이터 모델 18 | - ex) Entity-Relational model 19 | - 표현(구현) 데이터 모델 (View level) 20 | - 실제 데이터를 보는 단계 21 | - 일반 사용자 영역의 단계 22 | - 대부분의 DBMS에서 채택 23 | - ex) relational model, network model, hierarchical model -------------------------------------------------------------------------------- /Computer Science/Database/4. Index.md: -------------------------------------------------------------------------------- 1 | # Index 2 | 3 | ## Index가 무엇인가요? 4 | 5 | > 인덱스 (Index) 6 | 7 | - `데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조` 8 | - 테이블의 특정 컬럼에 인덱스를 생성하면, `해당 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장` 9 | - 컬럼의 값과 물리적 주소를 (Key, Value) 쌍으로 저장 10 | - index file은 (search-key, pointer)로 저장함 11 | - 인덱스의 종류로는 `Primary Index`와 `Secondary Index`가 있음 12 | 13 | > Primary Index VS Secondary Index 14 | 15 | - Primary Index (Clustering Index) 16 | - file들이 search key에 따라 `연속적으로` 저장 17 | - 일반적으로 search key가 primary key 18 | - Secondary Index (Non-clustering Index) 19 | - file의 순차적인 순서와 별개로 search key가 구성되는 index 20 | - 연속적으로 파일을 저장하지 않으므로 dense index 21 | 22 | ## 인덱스의 성능과 고려 사항 23 | 24 | > Index의 성능과 고려해야 할 사항 25 | 26 | - 인덱스를 사용하면 좋은 경우 27 | - 규모가 큰 테이블 28 | - 삽입, 삭제, 수정이 자주 발생하지 않는 컬럼 $\rightarrow$ 주로 조회 작업이 자주 일어나는 경우 29 | - (+) 테이블 검색 속도, 성능의 향상 30 | - 특히 WHERE과 같은 조건 처리에서 유리 31 | - (-) 인덱스 관리를 위한 추가 작업 필요 32 | - (-) 추가 저장 공간이 필요 33 | - (-) 잘못 사용하면 오히려 검색 성능 저하 34 | 35 | > Index 생성시 Null을 고려해야 할까요? 36 | 37 | - 그렇다. NULL도 공간을 차지하므로 만약 NULL이 많다면 인덱스의 공간낭비가 심할 것 38 | - 이를 방지하고자 Primary key에는 NULL을 불가능하게 하는 방식으로 DBMS들이 처리함 39 | 40 | > 만약 모든 컬럼에 인덱스를 건다면 어떻게 될까요? 41 | 42 | - 모든 컬럼에 인덱스를 건다면, 데이터가 추가될 때마다 인덱스를 추가해줘야 하는 문제가 발생 43 | - 이런 경우 본체인 DB보다 인덱스가 더 커지는 현상이 나타날 수 있음 44 | - 이렇게 될 경우 오히려 검색속도 향상을 하고자 사용한 인덱스가 `검색성능 저하`를 일으킬 수 있음 45 | 46 | ## 인덱스 스캔 47 | 48 | > Index Scan 방식 49 | 50 | - Index Range Scan 51 | - B-tree 인덱스의 일반적이고 정상적인 액세스 방식 52 | - 인덱스 루트에서 리프 블록까지 수직적 탐색 후 필요 범위만큼 수평적 탐색 진행 53 | - Index Full Scan 54 | - 수직적 탐색없이 인덱스 리프 블록을 처음부터 수평적으로 탐색하는 방식 55 | - 인덱스 컬럼이 조건절에 없는 경우 56 | - 최적의 인덱스가 없는 경우 차선책으로 선택 57 | - Index Unique Scan 58 | - 수직적 탐색으로만 데이터를 찾는 스캔방식 59 | - unique 인덱스를 `=` 조건으로 탐색하는 경우 60 | - unique 인덱스를 범위 조건으로 조회하는 경우 Index Range Scan을 사용 61 | 62 | ## Reference 63 | 64 | - [Rebro의 코딩 일기장 : 인덱스(Index)](https://rebro.kr/167) 65 | - [널널한 개발자 : DB에서 인덱싱을 하는 이유와 원리](https://www.youtube.com/watch?v=VO9bqmJ0Ns8) 66 | - [인덱스 스캔 방식 종류 및 특징](https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=gglee0127&logNo=221336088285) -------------------------------------------------------------------------------- /Computer Science/Database/5. Index Structure.md: -------------------------------------------------------------------------------- 1 | # Index Structure 2 | 3 | ## B-Tree 4 | 5 | > B-Tree 6 | 7 | - `탐색 성능을 높이기 위해 균형있게 높이를 유지하는` balanced tree 8 | - 모든 리프 노드가 같은 level로 유지되도록 자동 조정 9 | - B-Tree의 조건 10 | - node의 key수가 k개라면, 자식 node의 수는 k+1개 11 | - node의 key는 반드시 정렬되어야 함 12 | - 자식 node들의 key는 반드시 현재 node의 key를 기준으로 크기 순으로 나뉨 13 | - 루트 노드는 항상 2개 이상의 자식 노드를 가짐 14 | - M차 트리일 때, 루트 노드와 리프 노드를 제외한 모든 노드는 최소 $\lceil \frac{M}{2} \rceil$, 최대 M개의 서브트리를 가짐 15 | - 모든 리프 노드는 같은 level을 갖는다 16 | - search key가 어떤 level에서든 중복되지 않음 17 | - non-leaf node에도 file pointer가 존재해야 함 18 | - (+) B+Tree보다 적은 노드를 탐색하므로 더 빨리 탐색하기도 함 19 | - (-) update시 많은 부하가 발생 20 | - (-) 구현이 어려움 21 | 22 | ## 인덱스 자료구조에는 Hash table과 B+Tree가 있는데, 이 둘을 설명해주세요. 23 | 24 | > B+Tree 25 | 26 | - 기존 B-Tree와 노드의 구성과 일부 조건들은 동일한 트리 27 | - Balanced Tree 28 | - Node의 key가 정렬된 트리 29 | - B-Tree의 단점인 모든 데이터 순환시 트리의 모든 노드를 방문해야 하는 비효율성을 보완한 트리 30 | - 라고 일반적으로 알고 있으나 현실에서 update 속도나, 자료를 하나라도 지우게 되는 경우 B-Tree보다 불리해짐 31 | - 많은 File System은 B-Tree로 설계되어 있음 32 | - B+Tree는 B-Tree와 다르게 리프 노드에만 데이터 포인터를 연결함 33 | - Non-leaf에는 자식 노드 포인터만 존재 34 | - 이런 특징때문에 key값의 중복이 존재 가능 35 | - 리프 노드 상의 record 크기가 pointer 크기보다 크므로 리프 노드에 부하가 걸림 36 | - 리프 노드의 공간 효율성을 고려할 필요가 있음 37 | - (+) index file update 비용이 매우 적게 소모됨 38 | - (-) 추가 insertion, deletion 오버헤드와 space 오버헤드가 발생함 39 | 40 | > Hash table 41 | 42 | - Key-value 쌍으로 데이터를 저장하는 자료구조 43 | - 해시 충돌이라는 문제가 있지만 기본적으로 O(1)의 시간복잡도를 갖는 자료구조 44 | - `= (등호)`연산에 특화된 자료구조이므로 해시 테이블내의 데이터는 정렬되어 있지 않기 때문에 부등호 연산에는 불리함 $\rightarrow$ 인덱스로는 잘 사용되지 않음 45 | - Static Hashing 46 | - 고정된 공간상에서 hash function을 통해 접근 47 | - bucket을 사용해서 관리하므로 bucket overflow를 신경써야 함 48 | - Dynamic Hashing 49 | - Periodic rehashing : 주기적으로 hash table 크기를 변경 50 | - Linear Hashing : hash의 크기를 선형적으로 증가 51 | - Extendable Hashing : bucket 내부의 데이터 양을 고려해서 bucket을 병합하거나 분배함 52 | 53 | ## Reference 54 | 55 | - [Rebro의 코딩 일기장 : 인덱스(Index)](https://rebro.kr/167) 56 | - [널널한 개발자 : DB에서 인덱싱을 하는 이유와 원리](https://www.youtube.com/watch?v=VO9bqmJ0Ns8) -------------------------------------------------------------------------------- /Computer Science/Database/6. Normalization.md: -------------------------------------------------------------------------------- 1 | # Normalization 2 | 3 | ## 정규화 4 | 5 | > 정규화란 무엇인가요? 6 | 7 | - 좋지 않은 형태(이상현상)의 릴레이션을 좋은 형태의 릴레이션으로 분해하는 것 8 | - 정보 중복이 적고, NULL value가 없고, data consistency가 유지되는 형태로 분해 9 | 10 | > 정규화의 종류 11 | 12 | - 1NF, 2NF, 3NF, BCNF가 대표적인 정규화 13 | - 그 이상으로 6NF까지 있는데.... BCNF까지 일반적으로 함 14 | - `제 1 정규형 (1NF)` : 일반적인 테이블 설계 15 | - 각 컬럼은 하나의 속성만을 가져야 함 16 | - 하나의 컬럼은 같은 종류나 타입을 가져야 함 17 | - 각 컬럼은 유일한 이름을 가져야 함 18 | - 컬럼의 순서는 상관이 없어야 함 19 | - `제 2 정규형 (2NF)` 20 | - 제 1 정규형을 만족함 21 | - 모든 컬럼이 부분적 종속(Partial dependency)이 없어야 함 22 | - Partial dependecy 어떤 컬럼이 특정 컬럼에만 종속되는 것 23 | - `제 3 정규형 (3NF)` 24 | - 제 2 정규형을 만족함 25 | - 기본키를 제외한 속성들간의 이행 종속성 (transitive dependency)이 없어야 함 26 | - 이행 종속성 : A -> B, B -> C면 A -> C 27 | - (-) 정보의 중복이 발생 가능 28 | - (-) NULL Value가 있을 수 있음 29 | - `BCNF (Boyce-Codd Normal Form)` 30 | - 제 3 정규형을 만족 31 | - 모든 결정자가 후보키 집합에 속해야 함 32 | 33 | > 정규화의 장단점 34 | 35 | - (+) 장점 36 | - 데이터베이스 변경시 이상 현상을 제거할 수 있다 37 | - 정규화된 데이터베이스에서는 확장시, 구조를 변경하지 않아도 되거나 일부만 변경해도 된다 38 | - 데이터베이스와 연동된 프로그램에 영향을 적게 미침 39 | - (-) 단점 40 | - 릴레이션을 분해하므로 Join 연산량이 증가함 41 | - 쿼리에 대한 응답시간이 느려질 수도 있음 42 | - 데이터 처리시 속도가 빨라질 수도, 느려질 수도 있음 43 | 44 | ## Reference 45 | 46 | - [코드 연구소 : 정규화란?](https://code-lab1.tistory.com/48) -------------------------------------------------------------------------------- /Computer Science/Database/7. Transaction.md: -------------------------------------------------------------------------------- 1 | # Transaction 2 | 3 | ## 트랜잭션(Transaction)이란? 4 | 5 | > Transaction 6 | 7 | - 트랜잭션이란 질의를 모두 수행하거나 수행하지 않는 `작업수행의 논리적 단위` 8 | - 트랜잭션은 일반적으로 script로 작성되어 절차적으로 수행 9 | - 이 script의 시작~끝까지를 `하나의 단위화`한 것 10 | - 하나의 절차라도 실패시 DB는 스스로 `Rollback`을 수행 11 | - 모든 절차가 성공적으로 종료되면 DB는 `Commit`을 수행 12 | - DBMS의 성능은 초당 트랜잭션 실행 수 (`TPS` : Transaction Per Second)로 측정 13 | 14 | > 트랜잭션을 사용하는 이유 15 | 16 | - DB 서버는 하나의 클라이언트가 접근하는 것이 아닌 `동시`에 `여러 클라이언트`가 접근을 시도 17 | - 이때, DB 작업을 처리하는 과정에서 문제가 발생하는 경우 `데이터 부정합`이 일어나는 것을 방지하기 위해서 18 | 19 | ## 트랜잭션의 특성 20 | 21 | - 트랜잭션의 특성은 4가지로 `ACID`라고 함 22 | - `원자성 (Atomicity)` 23 | - 트랜잭션 작업이 부분적으로 실행되거나 중단하지 않는 것을 보장함 24 | - All Or Nothing의 개념으로 모든 작업은 부분적인 단위로 수행하는 것이 아님을 의미 25 | - `일관성 (Consistency)` 26 | - 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것 27 | - 트랜잭션의 대표 예제인 송금문제에서 트랜잭션 완료 후 정수형인 금액이 갑자기 문자열로 변경되거나 하지 않는다는 것을 의미 28 | - `격리성 (Isolation)` 29 | - 트랜잭션 수행시 다른 트랜잭션이 끼어들지 못하게 하는 것 30 | - `지속성 (Durability)` 31 | - 성공적으로 수행한 트랜잭션은 영원히 반영되는 것 32 | - Commit을 하면 현재 상태는 영원히 보장됨 33 | 34 | > Rollback과 Commit 35 | 36 | ![](../img/transaction1.png) 37 | 38 | - DB를 변화하는 transaction 수행시 Disk의 파일에서 해당 부분을 메모리로 복제 39 | - 메모리 상의 데이터들만 transaction에 있는 변화를 수행함 40 | - 아래 설명하는 방법들은 DBMS에 따라 다를 수 있음 41 | 42 | 1. Rollback 43 | 44 | ![](../img/rollback1.png) 45 | 46 | - 만약 트랜잭션 수행 중 특성 작업에서 문제가 발생해서 트랜잭션 수행 실패시 작업을 중단 47 | 48 | ![](../img/rollback2.png) 49 | 50 | - 이후 메모리로 복제한 데이터를 날려버리는 방법으로 Rollback을 수행하여 원본 데이터베이스를 유지함 51 | 52 | 2. Commit 53 | 54 | ![](../img/commit1.png) 55 | 56 | - 모든 작업이 정상적으로 완료되면, 정상 종료를 의미하는 Commit을 수행 57 | 58 | ![](../img/commit2.png) 59 | 60 | - Commit을 수행하면 메모리의 변화한 데이터를 disk의 원본 데이터로 write 61 | 62 | ## Reference 63 | 64 | - [victolee - 트랜잭션과 ACID 특성을 보장하는 방법](https://victorydntmd.tistory.com/129) 65 | - [널널한 개발자 - DB 트랜잭션에 대해서 말해보세요.](https://www.youtube.com/watch?v=7yuGlqPo8XQ) 66 | -------------------------------------------------------------------------------- /Computer Science/Database/8. Transaction Level.md: -------------------------------------------------------------------------------- 1 | # Transaction Level 2 | 3 | ## 트랜잭션 격리 수준 (Transaction Isolation Level) 4 | 5 | > 트랜잭션 격리 수준 6 | 7 | - 동시에 여러 트랜잭션이 수행될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것 8 | - 격리 수준 9 | - READ UNCOMMITTED 10 | - READ COMMITTED 11 | - REPEATABLE READ 12 | - SERIALIZABLE 13 | 14 | > READ UNCOMMITTED 15 | 16 | - 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관없이 다른 트랜잭션에서 값을 읽을 수 있음 17 | - Consistency에 영향을 주는 격리 수준이므로 사용하지 않는 것을 권장 18 | - (-) `Dirty Read` 현상 발생 19 | - 트랜잭션이 완료되지 않은 상태에서 다른 트랜잭션을 보는 현상 20 | - UPDATE가 Commit되지 않은 상태에서 다른 트랜잭션이 SELECT를 할 수 있음 21 | 22 | > READ COMMITTED 23 | 24 | - 대부분의 RDB에서 기본적으로 사용되는 격리수준 25 | - Dirty Read 현상이 발생하지 않음 26 | - 실제 테이블 값이 아닌 UNDO 영역에 백업된 레코드를 가져옴 27 | - (-) 트랜잭션이 다른 트랜잭션의 COMMIT 이전, 이후에 걸쳐 SELECT가 있다면 두 SELECT의 값이 다를 수 있는 Consistency 문제 발생 28 | - 일반적으로 금전적인 입,출금에서 발생할 수 있는 문제 29 | 30 | > REPEATABLE READ 31 | 32 | - MySQL은 트랜잭션마다 트랜잭션 ID를 부여하고, 해당 트랜잭션 ID보다 작은 트랜잭션 번호에서 변경한 것만 읽음 33 | - Undo 공간에 백업해두고 실제 레코드 값을 변경 34 | - 백업 데이터는 불필요하다고 판단되는 시점마다 주기적으로 삭제 35 | - Undo에 백업 레코드가 많아지면 처리 성능이 떨어질 수 있음 36 | - 이런 방식을 `MVCC (Multi Version Concurrency Control)`이라 함 37 | - 즉, 내가 조회한 자료 값을 내가 바꾸지 않는 이상 트랜잭션 내에서는 항상 동일 값을 제공함 38 | - (-) `Phantom Read` 현상 발생 39 | - 다른 트랜잭션의 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상 40 | - 이를 막기위해 `쓰기 잠금`을 걸어야 함 41 | - 간단히 말하면, 이름 그대로 내가 새로 만들거나 지운게 아닌데 없던 놈이 보이고 있던 놈이 안보이는 것 42 | - 예를 들어 다른 트랜잭션의 COMMIT 이전에 `COUNT(*)` 쿼리 수행시 2였는데, 다른 트랜잭션의 COMMIT이 이뤄짐과 동시에 3으로 변경됨 $\rightarrow$ 난 조회만 했는데 다른 트랜잭션에 의해 귀신처럼 값이 변경됨 43 | 44 | > SERIALIZABLE (직렬화) 45 | 46 | - 가장 단순한 격리 수준이지만 가장 엄격한 수준 47 | - 트랜잭션이 완료될 때까지 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능 48 | - 예를 들어, Repeatable Read의 경우 조건을 만족하는 데이터가 INSERT는 가능하지만 이 Level에서는 INSERT 작업도 허용하지 않음 49 | - 성능 측면에서는 동시 처리성능이 가장 낮음 50 | - `Phantom Read`가 발생하지 않지만... 잘 사용되지는 않음 51 | 52 | ## 트랜잭션을 사용할 때 주의할 점 53 | 54 | - 격리 수준을 설정함에 따라 데이터가 엉키는 문제가 발생할 수 있음 55 | - 이를 해결하는 과정에서 deadlock과 같은 논리적 오류가 발생할 위험이 있음 56 | 57 | > MySQL의 InnoDB 스토리지 엔진에 따른 장애 58 | 59 | - 전체 데이터를 스캔하는 쿼리를 질의하는 경우 서비스에 영향을 미치는 문제가 있을 수 있음 60 | - InnoDB는 기본 isolation level이 REPEATABLE-READ이기 때문에 발생함 61 | - REPEATABLE-READ는 현재 SELECT 버전을 보장하고자 SNAPSHOT을 이룔하는데, 이 경우 데이터에 관해 암묵적으로 LOCK과 같은 효과가 나타남 62 | 63 | > 해결방법 64 | 65 | - `INSERT INTO SELECT`, `CREATE TABLE AS SELECT`의 경우 격리 수준은 READ-COMMITTED나 READ-UNCOMMITTED로 변경하여 해결 가능 66 | 67 | ## Reference 68 | 69 | - [Nesoy Blog - 트랜잭션의 격리 수준(isolation level)이란?](https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation) 70 | - [gywndi's database - MySQL 트랜잭션 Isolation level로 인한 장애 사전 예방법](https://gywn.net/2012/05/mysql-transaction-isolation-level/) 71 | - [Postgresql.kr - 트랜잭션 격리 이야기에서 팬텀 현상](https://www.postgresql.kr/blog/pg_phantom_read.html) -------------------------------------------------------------------------------- /Computer Science/Database/9. NoSQL.md: -------------------------------------------------------------------------------- 1 | # NoSQL 2 | 3 | ## NoSQL VS RDBMS 4 | 5 | > RDBMS 6 | 7 | - RDBMS란 관계형 데이터베이스 관리 시스템으로 SQL에 의해 저장되고 스키마에 따라 저장해야 함 8 | - RDB를 저장하고자 관계형 데이터 모델을 기초로 두고 모든 데이터를 `2차원 테이블 형태`로 표현함 9 | - `다른 테이블과의 관계`를 표현하고자 `외래키(foreign key)`를 사용함 10 | - (+) 장점 11 | - 명확한 데이터 구조를 보장 12 | - 관계로 각 데이터를 중복없이 저장 가능 13 | - (-) 단점 14 | - 시스템이 커질 경우 JOIN문이 많은 복잡한 쿼리 15 | - 성능 향상을 위해서는 서버 성능을 향상하는 방향밖에 없으므로 비용이 증가 16 | - 데이터가 유연하지 못함 17 | 18 | > NoSQL 19 | 20 | - NoSQL은 Not Only SQL의 약자로 RDB 형태의 관계형 데이터베이스가 아닌 다른 형태의 데이터 저장 기술을 의미 21 | - RDBMS와 `다르게 테이블간의 관계를 정하지 않음` 22 | - 데이터의 변동성이 있을 수 있으므로 데이터 일관성이 보장되지 않지만 빅데이터 처리를 위한 분산처리에 유리한 Scale-out 때문에 최근 관심도가 높아짐 23 | - (+) 장점 24 | - 스키마가 없기 때문에 유연하고 자유로운 데이터 구조 25 | - 데이터 분산에 유리하고 성능 향상시 scale-up, scale-out이 모두 가능 26 | - (-) 단점 27 | - 데이터 중복이 발생할 수 있고 중복 데이터를 변경할 경우 모든 컬렉션을 수정해야 함 28 | - 명확한 데이터 구조가 보장되지 않으며 구조 결정이 어려움 29 | 30 | ## 저장방식에 따른 NoSQL 종류 31 | 32 | > Key-Value Database 33 | 34 | - Key-Value 데이터베이스는 데이터가 (Key, Value) 쌍으로 저장 35 | - Key는 Value에 접근하기 위한 용도로 사용 36 | - Value는 어떤 종류의 데이터도 저장할 수 있음 37 | - (+) 간단한 API를 사용하므로 질의 속도가 굉장히 빠른 편 38 | - 대표적인 NoSQL 39 | - Redis 40 | - Riak 41 | - Amazon Dynamo DB 42 | 43 | > Documnet Database 44 | 45 | - Document 데이터베이스는 데이터가 (Key, Document)의 형태로 저장 46 | - Key-Value와의 차이라면 Value와 다르게 document는 `계층적 형태`를 가짐 47 | - 객체지향의 객체와 유사하다고 생각하면 편하고 여러 테이블에 객체를 나눠서 저장할 필요가 없음 48 | - (+) Key-Value와 유사한 저장방식이므로 검색에 최적화된 데이터베이스 49 | - (-) 사용이 번거롭고 쿼리가 SQL과 다르다는 단점이 존재 50 | - 질의 결과가 JSON이나 xml형태로 출력되므로 사용방법이 다름 51 | - 대표적인 NoSQL 52 | - MongoDB 53 | - CouthDB 54 | 55 | > Wide Column Database 56 | 57 | - Column Family 모델 기반의 데이터베이스는 `Key에서 필드를 결정` 58 | - Key는 Row(키 값)와 Column-family, Column-name을 가짐 59 | - 연관된 데이터들은 같은 column-family에 속하며 각자의 column-name을 가짐 60 | - RDB로 설명해보면 attribute가 계층 구조를 갖는 것 61 | - 질의는 Row, Column-family, Column-name을 통해 수행 62 | - 대표적인 NoSQL 63 | - Apache Cassandra (Dynamo와 Big-table을 섞음) 64 | - HBase 65 | - Hypertable 66 | 67 | > Graph Database 68 | 69 | - Graph 데이터베이스는 데이터를 Node와 Edge, Property와 함께 그래프 구조를 사용하여 저장 70 | - 개체와 관계를 그래프 형태로 표현한 것이므로 관계형 모델이라고 볼 수 있음 71 | - 데이터 간의 관계가 탐색의 키일 경우 적합 72 | - SNS의 질의, 추천엔지, 패턴 인식 데이터베이스에 적합 73 | - 대표적인 NoSQL 74 | - Neo4J 75 | 76 | ## Reference 77 | 78 | - [히진쓰의 서버사이드 기술 블로그 - RDBMS와 NoSQL의 차이점](https://khj93.tistory.com/entry/Database-RDBMS와-NOSQL-차이점) -------------------------------------------------------------------------------- /Computer Science/Network.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Network 2 | 3 | - OSI 7계층을 설명해주세요. 4 | - 추가적으로 TCP/IP의 각 계층을 설명해주세요. 5 | - OSI 7계층과 TCP/IP계층의 차이를 설명해주세요. 6 | - TCP와 UDP의 차이를 설명해주세요. 7 | - TCP와 UDP의 헤더를 비교해주세요. 8 | - TCP의 3-way-handshake와 4-way-handshake를 비교 설명해주세요. 9 | - Q. TCP의 연결 설정 과정(3단계)과 연결 종료 과정(4단계)이 단계가 차이나는 이유? 10 | - Q. 만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까? 11 | - Q. 초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유? 12 | - TCP의 연결 설정 과정(3단계)과 연결 종료 과정(4단계)이 단계가 차이나는 이유가 무엇인가요? 13 | - TCP/IP 흐름제어 & 혼잡제어 14 | - Frame, Packet, Segment, Datagram을 비교해주세요. 15 | - 대칭키 & 공개키 16 | - 만약 Server에서 FIN 플래그를 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생하면 어떻게 될까요? 17 | - 초기 Sequence Number인 ISN을 0부터 시작하지 않고 난수를 생성해서 설정하는 이유가 무엇인가요? 18 | - HTTP와 HTTPS에 대해서 설명하고 차이점에 대해 설명해주세요. 19 | - HTTP와 HTTPS 동작 과정을 비교해주세요. 20 | - HTTP 문제점 21 | - HTTP 요청/응답 헤더의 구조를 설명해주세요. 22 | - HTTP GET과 POST 메서드를 비교/설명해주세요. 23 | - CORS가 무엇인가요? 24 | - 쿠키(Cookie)와 세션(Session)을 설명해주세요. 25 | - DNS가 무엇인가요? 26 | - DNS round robin 방식 27 | - 웹 통신 큰 흐름 28 | - TLS/SSL handshake 29 | - 로드 밸런싱(Load Balancing) 30 | - Blocking,Non-blocking I/O & Synchronous,Asynchronous 31 | - REST와 RESTful의 개념을 설명하고 차이를 말해주세요. 32 | - 소켓(Socket)이 무엇인가요? 자신 있는 언어로 간단히 소켓 생성 예시를 보여주세요. 33 | - Socket.io와 WebSocket의 차이를 설명해주세요. 34 | - IPv4와 IPv6 차이를 설명해주세요. 35 | - MAC Address가 무엇인가요? 36 | - 라우터와 스위치, 허브의 차이를 설명해주세요. 37 | - SMTP가 무엇인가요? 38 | - 노트북으로 www.google.com에 접속을 했습니다. 요청을 보내고 받기까지의 과정을 자세히 설명해주세요. 39 | - 여러 네트워크 topology에 대해 간단히 소개해주세요. 40 | - subnet mask에 대해서 설명해주세요. 41 | - data encapsulation이 무엇인가요? 42 | - DHCP를 설명해주세요. 43 | - routing protocol을 몇 가지 설명해주세요. (ex. link state, distance vector) 44 | - 이더넷(ethernet)이 무엇인가요? 45 | - client와 server의 차이점을 설명해주세요. 46 | - delay, timing(jitter), throughput 차이를 설명해주세요. -------------------------------------------------------------------------------- /Computer Science/OS.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Operating System 2 | 3 | - [운영체제란 무엇인가요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/1.%20What%20is%20OS.md) 4 | - [프로세스와 쓰레드의 차이를 알려주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/2.%20Process%20VS%20Thread.md) 5 | - [멀티 프로세스 대신 멀티 쓰레드를 사용하는 이유를 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/3.%20Multi%20thread.md) 6 | - [사용자 수준 스레드와 커널 수준 스레드의 차이를 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/4.%20User%20VS%20Kernel%20Thread.md) 7 | - [프로세스 주소공간이란 무엇인가요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/5.%20Process%20Address.md) 8 | - [Thread-safe에 대해 설명해주세요. (hint: critical section)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/6.%20Thread%20Safe.md) 9 | - [인터럽트(Interrupt)에 대해 설명하세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/7.%20Interrupt.md) 10 | - [시스템콜(System call)이란 무엇인가요?](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/8.%20System%20Call.md) 11 | - 파일 시스템이란 무엇인가요? 12 | - [캐시의 지역성에 대해 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/9.%20Cache%20Locality.md) 13 | - 동기화 객체의 종류에 대해 얘기해주세요. 14 | - [뮤텍스와 세마포어의 차이를 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/10.%20Mutex%20and%20Semaphore.md) 15 | - [스케줄러가 무엇이고, 단기/중기/장기로 나누는 기준에 대해 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/11.%20Scheduler.md) 16 | - [CPU 스케줄러인 FCFS, SJF, SRTF, Priority Scheduling, RR에 대해 간략히 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/12.%20Scheduling.md) 17 | - [동기와 비동기의 차이를 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/13.%20Sync.md) 18 | - [메모리 관리 전략에는 무엇이 있는지 간략히 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/14.%20memory.md) 19 | - 페이징 & 세그멘테이션(PDF)에 대해 설명해주세요. 20 | - 페이지 교체 알고리즘의 종류에는 무엇이 있나요? 21 | - 페이지 폴트란 무엇인가요? 22 | - [가상 메모리에 대해 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/15.%20virtual%20memory.md) 23 | - 배경 24 | - 가상메모리 하는 일 25 | - Demanding Paging(요구 페이징) 26 | - [교착상태(데드락, Deadlock)의 개념과 조건을 설명해주세요.](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Operating%20System/16.%20deadlock.md) 27 | - Race Condition이란 무엇인가요? 28 | - 외부 단편화와 내부 단편화에 대해 설명해주세요. 29 | - PCB에 대해 설명해주세요. 30 | - Context Switching이 무엇인지 설명하고 과정을 나열해주세요. 31 | - Swapping에 대해 설명해주세요. 32 | - IPC(Inter Process Communication)란 무엇인가요? 33 | -------------------------------------------------------------------------------- /Computer Science/Operating System/1. What is OS.md: -------------------------------------------------------------------------------- 1 | # What is OS? 2 | 3 | ## 운영체제란 무엇인가요? 4 | 5 | - 공통적인 정의가 있지는 않음 6 | - 핵심적인 역할은 ① `하드웨어 관리` ② `프로그램 실행하고 관리` 7 | - 응용프로그램과 컴퓨터 하드웨어 사이에 존재하며 보안상의 이유로 하드웨어는 `반드시 OS를 통해 system call을 해야만 접근 가능` 8 | > OS is resource allocator 9 | - 일반적으로 CPU와 device는 memory cycle을 차지하고자 경쟁 10 | - 충돌하는 요청들에 대해 `모든 resource들(CPU, Memory, FS, I/O device)을 관리함` 11 | > OS is control program 12 | - 프로그램의 실행을 제어 13 | - 에러, computer system의 부적절한 사용방지 14 | > OS is kernel 15 | - OS의 핵심적인 부분 16 | - 커널은 `하드웨어 관리와 program control 기능을 하는 부분` 17 | -------------------------------------------------------------------------------- /Computer Science/Operating System/10. Mutex and Semaphore.md: -------------------------------------------------------------------------------- 1 | # Mutex VS Semaphore 2 | 3 | ## 뮤텍스와 세마포어의 차이를 설명해주세요. 4 | 5 | > Mutex 6 | 7 | - `Mut`ual `Ex`clusion 기법을 말함 8 | - `lock`, `unlock`의 2가지 연산만 지원 9 | - 일반적으로 binary semaphore를 mutex라고도 함 $\rightarrow$ 1개의 프로세스 허용 10 | - `임계 영역에 한 프로세스만 존재하게 하는 것` 11 | 12 | 1. 임계 영역 진입 전 다른 프로세스의 존재 여부 확인 13 | 2. 프로세스가 없다면 임계 영역 진입을 허용하고, 있다면 대기시킴 (lock) 14 | 3. 수행이 끝나면 임계 영역 진입 가능을 알림 (unlock) 15 | 16 | > Semaphore 17 | 18 | - 여러개의 프로세스가 mutual exclusion을 할 수 있게 하는 방법 19 | - `임계 영역에 접근 가능한 프로세스 수를 지정하고 관리하는 방법` 20 | - 일반적으로 `음이 아닌 정수 S`를 활용 21 | - `wait(S)`와 `signal(S)`를 활용해서 관리 22 | 23 | 1. 변수 S를 초기화 24 | 2. `wait`를 통해 S가 0보다 큰지 확인 25 | 1. 0보다 크다면 wait 내부에서 S를 감소하고 임계 영역에 진입 26 | 2. 0보다 작으면 프로세스를 ready queue에 넣고 대기 27 | 3. 임계 영역에서 나오는 경우 ready queue를 확인하고 다음 프로세스를 수행 (wake up) 28 | -------------------------------------------------------------------------------- /Computer Science/Operating System/11. Scheduler.md: -------------------------------------------------------------------------------- 1 | # Scheduler 2 | 3 | ## 스케줄러가 무엇이고, 단기/중기/장기로 나누는 기준에 대해 설명해주세요. 4 | 5 | > Scheduler 6 | 7 | - 자원을 할당할 프로세스를 선택해주는 역할을 하는 것 8 | - 시스템 내에는 크게 3개의 스케줄러가 존재 9 | - `얼마나 스케줄러가 자주 호출되냐?`로 구분함 10 | - Long-term 11 | - Short-term 12 | - Medium-term 13 | 14 | > Long-term Scheduler 15 | 16 | - `메모리를 어떻게 할당할 지`를 결정 17 | - `어떤 프로세스를 ready queue로 넣을 지 결정` 18 | - 시스템 내의 프로세스 수가 증가하면 stability가 떨어지므로 이를 관리 19 | - 현재 UNIX와 Windows는 long-term scheduler가 없음 20 | - 대부분의 현대 OS는 사용자의 모든 요청을 수행해주려 함 21 | - 단, 프로세스가 많아지면 stability가 떨어져서 느려짐 22 | - 이때, I/O-bounded와 CPU-bounded 프로세스를 잘 섞어서 선택해야 함 23 | 24 | > Short-term Scheduler 25 | 26 | - CPU Scheduler이며 일반적으로 말하는 Scheduler 27 | - `Ready queue에서 다음에 수행하거나 CPU에 할당할 Process를 결정` 28 | - 매우 자주 수행되고 빠른 context-switching 발생 29 | 30 | > Medium-term Scheduler 31 | 32 | - Swapping을 결정하는 스케줄러 33 | - 누구를 swap-out할 지를 일반적으로 결정 34 | -------------------------------------------------------------------------------- /Computer Science/Operating System/12. Scheduling.md: -------------------------------------------------------------------------------- 1 | # Scheduling 2 | 3 | ## CPU 스케줄러인 FCFS, SJF, SRTF, Priority Scheduling, RR에 대해 간략히 설명해주세요. 4 | 5 | > Scheduling Criteria 6 | 7 | - 일반적으로 평균 waiting time을 최소화하는 것을 기준으로 함 8 | - 스케줄링 정책에 따라 `선점/비선점`으로 구분 9 | - 비선점 (Non-preemptive) 10 | - 할당된 자원을 스스로 반납할 때까지 사용 11 | - (+) context-switching 로드가 적음 12 | - (-) 우선순위가 높은 프로세스가 들어올 경우 평균 응답시간을 증가시킴 13 | - 선점 (Preemptive) 14 | - 우선순위가 높은 프로세스가 들어올 경우 할당 자원을 뺏김 15 | - (+) 응답성이 높음 16 | - (-) context-switching이 자주 일어나서 로드가 큼 17 | 18 | > FCFS 19 | 20 | - `First-Come, First-Served Algorithm` 21 | - Non-Preemptive Scheduling 22 | - Ready queue에 먼저 온 process가 먼저 자원을 할당받는 스케줄링 방법 23 | - 동일 작업에 대해 순서에 따라 평균 waiting time에 차이가 발생함 24 | - (-) `Convoy effect`: 긴 프로세스가 앞쪽에 존재해서 짧은 프로세스가 뒤에서 대기하는 현상 25 | - Average waiting time이 증가함 26 | 27 | > SJF 28 | 29 | - `Shortest-Job-First Algorithm` 30 | - Preemptive, Non-preemptive Scheduling 모두 가능 31 | - 짧은 task가 우선순위를 갖는 스케줄링 방법 32 | - CPU burst time을 기준으로 우선수위를 부여함 33 | - SJF는 반드시 `미래의 수행시간을 예측해야 함` 34 | - Exponential averaging 방식 활용 35 | - $\tau_{n+1} = \alpha t_{n} + (1-\alpha) \tau_{n}$ 36 | - history와 recent를 모두 활용 (최근 기록에 가중치를 높임) 37 | - $\alpha$는 0 ~ 1 값이어야 함 38 | - (+) SJF는 minimum average waiting time에 있어서 `가장 최적` 39 | - (-) Starvation 발생 가능 40 | - 계속 우선순위가 높은 프로세스 처리로 인해 우선순위 낮은 프로세스 수행이 뒤로 밀려짐 41 | 42 | > SRTF 43 | 44 | - `Shorted Remaining Time First Algorithm` 45 | - Preemptive Scheduling 46 | - SJF의 우선순위가 `잔여 실행 시간을 기준으로 설정`하는 경우 47 | - 잔여 실행시간을 계산한다는 점에서 비현실적인 알고리즘 48 | 49 | > Priority Scheduling 50 | 51 | - Ready queue에서 무조건적으로 높은 우선순위를 실행 52 | - SJF는 CPU burst time이 우선순위인 priority scheduling 53 | - (-) Starvatuin 54 | - 우선순위 스케줄링에서 기본적으로 나타나는 문제점 55 | - Agining을 통해 해결가능 (오랜 시간 수행되지 않은 task의 우선순위를 높여줌) 56 | - Static Priority 57 | - priority가 고정 58 | - Dynamic Priority 59 | - Priority가 변경가능 (Aginig) 60 | 61 | > RR 62 | 63 | - `Round Robin Algorithm` 64 | - Preemptive Scheduling 65 | - 정해진 time quantum만큼 작업을 수행하고 반드시 ready queue의 끝으로 보내는 번갈아 수행하는 방법 66 | - 자동적으로 preemption이 수행됨 (ready queue 도달 순서) 67 | - time quantum 길이에 따라 특징이 달라짐 68 | - short time quantum: context-switching 증가 69 | - long time quantum: Fairness 감소 70 | - (+) Fairness가 가장 큰 장점 (항상 동일한 길이 수행) 71 | - (+) response time이 우수함 -------------------------------------------------------------------------------- /Computer Science/Operating System/13. sync.md: -------------------------------------------------------------------------------- 1 | # Sync 2 | 3 | ## 동기와 비동기의 차이를 설명해주세요. 4 | 5 | > 동기 (Sync) 6 | 7 | - 동기는 요청에 대한 결과를 받은 후에야 다음 요청을 진행하는 방식 8 | - 결과를 받을 때까지 대기해야 함 9 | - 직관적이지만 비효율적임 10 | 11 | > 비동기 (Async) 12 | 13 | - 비동기는 요청 결과에 상관없이 바로 다음 요청을 수행하고, 결과는 콜백 함수를 통해 받음 14 | - 설계가 복잡하지만 효율적임 15 | -------------------------------------------------------------------------------- /Computer Science/Operating System/14. memory.md: -------------------------------------------------------------------------------- 1 | # Memory 2 | 3 | ## 메모리 관리 전략에는 무엇이 있는지 간략히 설명해주세요. 4 | 5 | > 스왑 (Swap) 6 | 7 | - 기존에 메모리에 올라가 있는 프로세스를 보조 기억장치로 보내는 것을 swap-out이라 함 8 | - 보조 기억장치에 있는 프로세스를 메모리에 올리는 것을 swap-in이라 함 9 | - 어떤 프로세스를 swap-out할지 고르는 방법으로 round-robin이 있음 10 | 11 | > 압축 12 | 13 | - 메모리에 프로세스를 할당하다보면 빈 공간이 발생하는데, 이 공간을 fragmentation(단편화)이라고 함 14 | - 프로세스와 단편화의 상태를 파악하고 연속적인 메모리 할당이 되도록 단편화를 없애는 방법 15 | - 비효율적이라 좋은 방법은 아님 16 | 17 | > 페이징 (Paging) 18 | 19 | - 메모리를 연속적으로 할당하는 것이 아닌 물리적인 페이지 단위로 나눠서 올리는 방법 20 | - 프로세스가 페이지보다 크다면 여러 페이지를 사용함 21 | - 프로세스가 페이지 크기보다 작다면 fragmentation이 발생하여 내부적으로 공간이 남을 수 있음 22 | 23 | > 세그멘테이션 (Segmentation) 24 | 25 | - 세그멘테이션 테이블을 활용해서 시작주소인 `base`와 최대 크기인 `limit`을 지정한 논리적인 단위로 메모리를 나눠서 관리 26 | - 세그먼트 간에 할당되지 않는 공간이 있는 외부 단편화가 발생할 수 있음 -------------------------------------------------------------------------------- /Computer Science/Operating System/15. virtual memory.md: -------------------------------------------------------------------------------- 1 | # Virtual Memory 2 | 3 | ## 가상 메모리에 대해 설명해주세요. 4 | 5 | > 가상 메모리 6 | 7 | - 프로세스에 필요한 부분만 메모리에 올려서 실행 가능하게 동작하는 방법 8 | - 페이지를 주로 활용하는 demand paging 방법을 사용 9 | 10 | > Demand Paging 11 | 12 | - 프로세스에서 현재 필요한 페이지만 메모리에 올리는 방법 13 | - 이를 위해 페이지 테이블은 기존 테이블에 valid와 modified가 추가적으로 필요 14 | - valid는 해당 페이지가 메모리에서 사용되는지를 확인 15 | - 메모리에 없는 경우 page fault 발생 16 | 17 | 1. 해당 페이지의 valid bit 확인 18 | 2. valid가 0이면 CPU 인터럽트, 해당 ISR로 이동 19 | 3. ISR에서 backing store를 탐색하여 해당 프로세스의 페이지 찾음 20 | 4. 해당 페이지를 빈 프레임에 할당 21 | 5. 페이지 테이블 갱신 (valid 1로 변경) 22 | 6. 다시 프로세스 실행 23 | -------------------------------------------------------------------------------- /Computer Science/Operating System/16. deadlock.md: -------------------------------------------------------------------------------- 1 | # Deadlock 2 | 3 | ## 교착상태(데드락, Deadlock)의 개념과 조건을 설명해주세요. 4 | 5 | > 데드락 6 | 7 | - 데드락이란 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태 8 | 9 | > 데드락 조건 10 | 11 | - 상호배제 (Mutual Exclusion) : 프로세스들이 필요로 하는 자워에 대해 베타적 통제권을 요구 12 | - 점유대기 (Hold and wati) : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림 13 | - 비선점 (Non preemption) : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없음 14 | - 순환대기 (Circular wait) : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있음 15 | 16 | > 교착상태 방지 17 | 18 | - 현세대의 OS는 데드락을 완전히 막는 것이 불가능하다고 판단 19 | - 예방, 회피, 무시, 발견, 회복 등으로 방지를 함 20 | - 예방 21 | - 데드락 조건 중 하나를 제거 22 | - 회피 23 | - 부가적인 데드락 회피 알고리즘 사용 24 | - 회복 25 | - 데드락에 걸린 프로세스를 하나씩 종료 26 | -------------------------------------------------------------------------------- /Computer Science/Operating System/2. Process VS Thread.md: -------------------------------------------------------------------------------- 1 | # Process VS Thread 2 | 3 | ## 프로세스와 쓰레드의 차이를 알려주세요. 4 | 5 | > 정의 6 | - 프로세스(process) : 메인 메모리에 올라가 수행중인 프로그램(program) 7 | - 쓰레드(Thread) : Program을 수행하기 위한 실행 단위 = 프로세스 수행단위 8 | 9 | > 프로세스 추가 설명 10 | - 프로세스당 `최소 1개의 쓰레드를 갖고 있음` 11 | - process에는 process address space가 반드시 존재 12 | - process address space란 virtual space로 process가 주소를 어떻게 차지하는지 알려줌 13 | - text / data / stack / heap 형태로 프로세스는 메모리 주소에 저장됨 14 | - PCB (Process Control Block) 15 | - process에 대한 정보를 담고 있는 datastructure 16 | - process state, program counter, 17 | - CPU register 18 | - CPU scheduling information 19 | - Memory-management information 20 | - Accounting Information 21 | - I/O status information 22 | - process state가 변함에따라 Program Counter, Stack Pointer, register 정보(context)가 PCB에 저장되어서 후에 이어서 수행가능함 23 | - 프로세스끼리 자원 접근을 하려면 IPC를 통해 접근해야 함 24 | 25 | > 쓰레드 추가 설명 26 | - 프로세스의 수행 단위이므로 프로세스 내부에서 동작함 27 | - 프로세스 내에 여러개가 존재할 수 있음 28 | - 쓰레드끼리는 `stack과 register같은 별도의 실행 개체를 제외한 code, data, heap 영역은 서로 공유함` 29 | 30 | 31 | > Process 와 Thread의 결정적인 차이 32 | - Process는 `자신만의 공간과 자원을 할당받고 다른 process에 자유로운 접근이 불가능함` 33 | - Thread는 `특정 영역을 제외하고 대부분의 영역을 공유함` 34 | - Keyword 35 | - 영역의 공유여부 -------------------------------------------------------------------------------- /Computer Science/Operating System/3. Multi thread.md: -------------------------------------------------------------------------------- 1 | # Why use multi-thread 2 | 3 | ## 멀티 프로세스 대신 멀티 쓰레드를 사용하는 이유를 설명해주세요. 4 | 5 | > 정의 6 | - Multi Process : 하나의 응용프로그램에 `여러 프로세스(CPU)를 구성`하여 각각의 프로세스가 하나의 작업을 처리하는 것 7 | - Multi Thread : 하나의 응용프로그램에 `여러 쓰레드를 구성`하여 각각의 쓰레드가 하나의 작업을 처리하는 것 8 | 9 | > Multi Process 10 | - 장점 11 | - Reliability 증가 : 프로세스는 독립적인 영역에 할당되어 서로를 침범하지 않기 때문에 `다른 프로세스(CPU)에 문제가 발생해도 나머지 프로세스가 작업을 처리`할 수 있음 12 | - 처리율/경제성 증가 : 동시에 여러 CPU가 동시에 접근하므로 처리 효율이 높아짐 13 | - 단점 14 | - 프로세스(CPU)의 수에 비례하여 성능이 증가하지 않음 15 | - `Context Switching에 따른 overhead가 발생함` 16 | - 프로세스 간의 독립 영역을 침범할 수 없기 때문에 자원 공유가 효율적인 상황에선 공유할 수 없음 17 | 18 | > Multi Thread 19 | - 장점 20 | - stack이나 register를 제외한 메모리 영역을 공유하므로 자원을 효율적으로 쓸 수 있음 21 | - 쓰레드 간의 context switching은 프로세스 간의 switching보다 부하가 적고 속도가 빠름 22 | - 단점 23 | - `하나의 쓰레드가 동작에 이상이 발생할 경우 다른 쓰레드에게 영향을 미치므로 치명적일 수 있음` 24 | - race condition : 서로 메모리 공간을 공유하므로 `동기화 문제를 항상 신경써야함` 25 | - race condition에 따라 critical section 문제가 발생할 수 있음 26 | 27 | > 안정성이 떨어짐에도 왜 많은 OS가 멀티 쓰레드를 기본으로 할까요? 28 | - 프로세스 간의 context switching에는 overhead가 발생 29 | - 멀티 쓰레드로 변경할 경우 `프로세스 생성 후 자원을 할당하는 system call을 줄이므로` 효율적인 관리가 가능 30 | - 쓰레드는 stack을 제외한 메모리 영역을 공유하므로 쓰레드간의 통신 비용이 줄어들고 전환속도가 빠르기 때문에 응답시간이 빠름 31 | -------------------------------------------------------------------------------- /Computer Science/Operating System/4. User VS Kernel Thread.md: -------------------------------------------------------------------------------- 1 | # User Thread VS Kernel Thread 2 | 3 | ## 사용자 수준 쓰레드와 커널 수준 쓰레드의 차이를 설명해주세요. 4 | 5 | > User thread 6 | 7 | - 유저 쓰레드, 사용자 쓰레드라고 함 8 | - 사용자가 thread library를 통해 create, destroy 되는 쓰레드 9 | - kernel involve 없이 생성됨 10 | - scheduler는 유저 쓰레드의 존재는 모르고 `커널 쓰레드에 대해서만 스케줄링을 진행함` 11 | - 유저 쓰레드는 커널 쓰레드로 매핑이 되고 스케줄러는 커널 쓰레드에 CPU를 할당함 12 | - 유저 쓰레드에서 발생하는 모든 동작은 커널 쓰레드에서 발생한 것으로 생각함 13 | - 유저-커널 관계는 3가지 $\rightarrow$ 자세한 설명은 아래에서... 14 | - Many-to-many 15 | - Many-to-one 16 | - One-to-one 17 | - 장점 (+) 18 | - 모드 전환과 context switching이 없어서 인터럽트 발생시 오버헤드가 적음 19 | - 단점 (-) 20 | - 스케줄링 우선순위를 지원하지 않으므로 어떤 쓰레드가 먼저 동작할 지 모름 21 | - 프로세스에 속한 쓰레드(연결된 커널 쓰레드) 중 system call에 의해 block이 걸리면 `모든 쓰레드가 block되는 문제가 있음` 22 | 23 | > Kernel thread 24 | 25 | - OS에 의해 커널 내부에서 create, destroy 되는 쓰레드 26 | - CPU 할당 단위 27 | - 실제로 scheduler는 커널 쓰레드 단위로 CPU를 할당함 28 | - 하나의 커널 쓰레드는 하나의 프로세서에 할당 29 | - thread library가 커널 쓰레드에 연결된 수행할 유저 쓰레드를 결정함 30 | - 장점 (+) 31 | - 멀티프로세서 환경에서 매우 빠르게 동작함 32 | - 다른 쓰레드에서 system call에 의해 blocking 되어도 다른 쓰레드가 처리 가능 33 | 34 | > Multi-Threading Model 35 | 36 | - Many-to-Many 37 | - 유저 쓰레드와 커널 쓰레드가 m:n 비율로 연결되는 것 (m = n이면 one-to-one) 38 | - 일반적으로 하이브리드 모델 방식으로 사용 39 | - `Multiplexing` : 유저 쓰레드를 커널 쓰레드에 매핑하는 것 40 | - (+) LWP(Light Weight Process)에서 유저 쓰레드를 유동적으로 배정해줘서 blocking 문제를 해결해줌 41 | - (-) Multiplexing을 사용하면 복잡해지는 문제가 있음 42 | - Many-to-one 43 | - 1개의 커널 쓰레드에 여러개의 유저 쓰레드가 연결되는 것 44 | - (+) 속도가 빠르고 오버헤드가 적음 45 | - (-) 하나의 쓰레드가 block system call 호출을 하면 다른 쓰레드도 동작을 멈춤 46 | - (-) Multi-processor를 활용할 수 없음 47 | - One-to-one 48 | - 1개의 커널 쓰레드에 유저 쓰레드 1개를 연결하고 대부분 사용하는 model 49 | - (+) 쓰레드에 blocking system call이 호출되어도 다른 쓰레드는 정상동작 50 | - (+) CPU를 최대한 사용할 수 있음 51 | - (-) 새로운 유저 쓰레드가 생성되면 새로운 커널 쓰레드에 연결해야하는 resource-intensive 특성 52 | 53 | -------------------------------------------------------------------------------- /Computer Science/Operating System/5. Process Address.md: -------------------------------------------------------------------------------- 1 | # Process Address 2 | 3 | ## 프로세스 주소공간이란 무엇인가요? 4 | 5 | > Process Address Space 6 | 7 | - 프로그램이 실행되면 프로세스가 생성되고 `프로세스 주소공간`이 할당됨 8 | - virtual space로 구성 9 | - 구조 10 | - text: code 11 | - data: program data 12 | - heap: 동적 할당 메모리 13 | - stack: local 변수, 함수 인자, temporary 변수의 저장 위치 14 | 15 | > 구역이 나눠진 이유 16 | 17 | - 최대한 데이터를 공유하며 메모리를 사용하기 위해 18 | - code 영역은 프로그램 자체에서 모두 동일 내용이므로 따로 관리하여 공유 19 | - 함수와 지역 변수는 stack 영역에 의해 관리됨 20 | - 메모리의 효율성을 위해 전역변수를 따로 지정해주면 좋음 -------------------------------------------------------------------------------- /Computer Science/Operating System/6. Thread Safe.md: -------------------------------------------------------------------------------- 1 | # Thread Safe 2 | 3 | ## Thread-safe에 대해 설명해주세요. (hint: critical section) 4 | 5 | > Thread-safe? 6 | 7 | - 멀티 쓰레드 프로그래밍을 할 때, 여러 쓰레드가 동시에 공유 변수에 접근해도 프로그램 동작에 문제가 없는 것 8 | - 이때, 공유 변수 영역을 `critical section(임계영역)`이라 함 9 | - 임계영역 문제를 해결하기 위해서는 ciritical section 접근 전후로 lock과 unlock을 하는 atomic operation으로 코드를 작성해야 함 10 | 11 | > Race condition을 없애는 3가지 조건 12 | 13 | - Mutual Exclusion 14 | - 임계영역에는 반드시 1개의 프로세스만 진입해야 함 15 | - Prgress 16 | - 임계영역이 비어있다면 접근을 희망하는 프로세스가 접근할 수 있어야 함 17 | - 진입하지 못하는 경우 entry section 오류 18 | - Bounded Waiting 19 | - 대기시간에는 bound가 존재해야 함 20 | - 언젠가는 임계영역에 들어가도록 `순서대로` 프로세스를 진입 시켜야 함 21 | -------------------------------------------------------------------------------- /Computer Science/Operating System/7. Interrupt.md: -------------------------------------------------------------------------------- 1 | # Interrupt 2 | 3 | ## Interrupt에 대해 설명해주세요. 4 | 5 | > Interrupt 6 | 7 | - 프로그램 실행 중 예기치 않은 상황이 발생한 경우 현재 실행 중인 작업을 즉시 중단하고 발생된 상황에 대한 우선 처리를 CPU에 알리는 것 8 | - I/O의 종료를 CPU에 알리는 메커니즘 9 | - DMA(Direct Memory Access)에 의해 발생 10 | - DMA: CPU 개입없이 I/O transaction을 하는 것 11 | 12 | > Interrupt 종류 13 | 14 | - H/W Interrupt 15 | - 일반적으로 `interrupt`라고 할 때, 말하는 것 16 | - 외부 device에서 발생하는 interrupt 17 | - ex) Ctrl+C 18 | - S/W Interrupt 19 | - 일반적으로 `Trap`이라 함 20 | - OS 내부에서 발생하는 interrupt 21 | - System call이나 Exception 발생과 같은 경우 22 | 23 | > Interrup 처리과정 24 | 25 | - Interrupt 발생시 Interrup vector를 통해 해당 ISR 주소를 찾고 실행함 26 | - Interrupt Vector: ISR 주소 저장 테이블 27 | - Interrupt 발생시 `무조건 interrup에 해당하는 ISR로 분기` 28 | - Interrupt 후 기존에 수행하던 주소로 돌아오고자 interrupted instruction의 주소를 저장함 29 | 30 | -------------------------------------------------------------------------------- /Computer Science/Operating System/8. System Call.md: -------------------------------------------------------------------------------- 1 | # System Call 2 | 3 | ## System call이란 무엇인가요? 4 | 5 | > System Call 6 | 7 | - 응용프로그램이 OS에 서비스를 요청할 때 수행하는 메커니즘 8 | - Policy와 Mechanism으로 구성 9 | - Policy $\rightarrow$ Mechanism의 방식으로 수행 10 | - ex) OS service 요청 Mechanism = System Call 11 | - interrupt나 trap이 발생하면 kernel mode로 진입 12 | - API를 통해 호출 -------------------------------------------------------------------------------- /Computer Science/Operating System/9. Cache Locality.md: -------------------------------------------------------------------------------- 1 | # Cache Locality 2 | 3 | ## 캐시의 지역성에 대해 설명해주세요. 4 | 5 | > Cache memory 6 | 7 | - CPU의 처리 속도와 메모리의 속도차로 인한 병목현상 완화를 위해 사용되는 고속 버퍼 메모리 8 | - 메인 메모리 접근 시간은 생각보다 오랜 시간이 걸리는데, 이 시간을 줄이고자 `메모리와 CPU사이에 캐시 메모리를 둠` 9 | - 좀 더 추가적인 이유로는 다음이 있음 10 | - 하드 디스크같은 large memory는 접근 시간이 오래 걸리는 문제가 있음 11 | - SRAM 같은 fast memory는 용량이 작고 비싸다는 문제가 있음 12 | - 이 2가지의 장점을 갖는 중간 메모리를 위해 캐시가 존재 13 | 14 | > Locality of Cache memory 15 | 16 | - CPU가 요구하는 데이터를 최대한 캐시 메모리가 갖고 있고자(`hit ratio 극대화`) `locality` 원리를 활용 17 | - 캐시 메모리에 CPU가 요구하는 데이터가 없으면 메인 메모리에서 가져와야 하는 load가 발생 18 | - Locality는 기본적으로 프로그램이 모든 코드와 데이터를 균일하게 접근하지 않는다는 특성을 사용함 19 | - 즉, 프로그램은 특정 코드나 데이터 근처의 코드와 데이터를 주로 활용한다는 개념 20 | - `Temporal Locality` 21 | - CPU가 한 번 참조한 데이터는 다시 참조될 가능성이 높다 22 | - 반복문으로 참조한 데이터는 다시 참조되는 경우가 많음 23 | - `Spatial Locality` 24 | - CPU가 참조한 데이터와 인접한 데이터는 참조될 가능성이 높다 25 | - `Sequential Locality` 26 | - 분기가 발생하지 않는 한 명령어는 메모리에 저장된 순서대로 인출/실행된다 27 | 28 | -------------------------------------------------------------------------------- /Computer Science/Python.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Python 2 | 3 | - 파이썬의 주요 특징에 대해 설명해주세요. 4 | - 리스트와 튜플의 차이점은 무엇인가요? 5 | - 파이썬의 삼항 연산자에 대해 설명해주세요. 6 | - 리스트에 음수 인덱스를 사용하면 어떻게 되나요? 7 | - 변수나 함수 같은 식별자 길이의 제한이 있나요? 8 | - `pass`와 `continue`의 차이를 설명해주세요. 9 | - 파이썬에게 어떤 약점이 있나요? 10 | - 파이썬에서 현재 작업중인 디렉토리를 확인하는 방법이 무엇인가요? 11 | - 파이선 빌트인 함수에 대해 아는대로 말해보세요. 12 | - 리스트에서 중복값을 제거하려면 어떻게 해야 하나요? 13 | - 오퍼레이터 중 `//`, `%`, `**`에 대해 설명하세요. 14 | - 컴파일 언어와 인터프리터 언어의 차이점에 대해 설명해주세요. 15 | - 파이썬에는 `.pyc` 파일이 있습니다. `.py`와 차이를 말해주세요. 16 | - GIL에 대해 아시나요? 17 | - `multiprocessing`과 `multithread`의 차이를 아시나요? 18 | - 파이썬은 객체지향입니까? 왜 그렇습니까? 19 | - try...except...else 구문에서 else는 언제 수행되나요? 20 | - list append와 list extend의 차이점을 설명해주세요. 21 | - 파이썬은 `open()`을 통해 파일을 열 때, 파일 처리 모드를 사용합니다. 어떤 모드가 있나요? 22 | - 파이썬에서 `map()` 함수는 어떤 역할을 하나요? 23 | - try...raise...finally 구문이 어떻게 동작하는지 설명해주세요. 24 | - 파이썬에서 언더스코어(_)는 언제 사용하나요? 25 | - 파이썬에서 switch...case 구문을 구현해 보았나요? 어떻게 하셨나요? 26 | -------------------------------------------------------------------------------- /Computer Science/Python/1. GIL.md: -------------------------------------------------------------------------------- 1 | # GIL 2 | 3 | ## 파이썬의 GIL을 아시나요? 4 | 5 | > GIL (Global Interpreter Lock) 6 | 7 | - 파이썬 인터프리터가 한 쓰레드만 하나의 바이트코드를 실행시킬 수 있도록 해주는 lock 8 | - 하나의 쓰레드에 모든 자원을 허락하고 그 후에는 lock을 걸어 다른 쓰레드는 사용하지 못하게 막아버린다. 9 | - 멀티 쓰레드의 경우 GIL에 의해 thread context switch 비용이 증가하여 오히려 싱글 쓰레드보다 시간이 오래 걸리는 문제가 있음 10 | 11 | > GIL을 사용하는 이유는? 12 | 13 | - 파이썬은 기본적으로 garbage collection과 reference counting을 통해 메모리를 관리 14 | - reference count는 각 객체에 참조된 변수의 수를 관리하는데 멀티 쓰레드를 사용하면 여러 쓰레드가 하나의 객체를 사용하는 경우 reference count를 관리하고자 모든 객체에 lock이 필요해지는 문제가 있음 15 | - GIL이라는 하나의 lock을 사용해서 모든 객체에 대한 reference count의 동기화 문제를 해결함 16 | -------------------------------------------------------------------------------- /Computer Science/README.md: -------------------------------------------------------------------------------- 1 | # Computer Science Interview 2 | 3 | ## 목록 4 | 5 | - [Operating System (운영체제)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/OS.md) 6 | - [Database (데이터베이스)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/DB.md) 7 | - [Network (네트워크)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Network.md) 8 | - [DataStructure (자료구조)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/DS.md) 9 | - [Algorithm (알고리즘)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/Algorithm.md) 10 | - [Software Engineering (소프트웨어 공학)](https://github.com/cow-coding/Keep-going-tech-interview/blob/main/Computer%20Science/SE.md) 11 | 12 | ## 레퍼런스 13 | 14 | - [Tech interview for developer](https://github.com/gyoogle/tech-interview-for-developer) 15 | - [Interview Question for Beginner](https://github.com/JaeYeopHan/Interview_Question_for_Beginner) 16 | - [NAVER boostcamp AITech 2nd interview question](https://github.com/sw6820/NAVER_boostcamp_AITech_2nd_interview_question) 17 | - [CES Summary](https://github.com/Prev/CSE-Summary) 18 | - [AI tech interview](https://github.com/boostcamp-ai-tech-4/ai-tech-interview) 19 | - [상위 29개 데이터 엔지니어 인터뷰 질문 및 답변](https://ko.myservername.com/top-29-data-engineer-interview-questions) 20 | -------------------------------------------------------------------------------- /Computer Science/SE.md: -------------------------------------------------------------------------------- 1 | # CS Interview - Software Engineering 2 | 3 | - 클린코드 & 리팩토링 & 시큐어코딩 4 | - TDD (Test Driven Development) 5 | - Agile 방법론 6 | - 객체 지향 프로그래밍 7 | - 함수형 프로그래밍 8 | - DevOps 9 | - 서드파티란? 10 | - 마이크로서비스 아키텍쳐 (MSA) -------------------------------------------------------------------------------- /Computer Science/img/commit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/Computer Science/img/commit1.png -------------------------------------------------------------------------------- /Computer Science/img/commit2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/Computer Science/img/commit2.png -------------------------------------------------------------------------------- /Computer Science/img/rollback1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/Computer Science/img/rollback1.png -------------------------------------------------------------------------------- /Computer Science/img/rollback2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/Computer Science/img/rollback2.png -------------------------------------------------------------------------------- /Computer Science/img/transaction1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cow-coding/Keep-going-tech-interview/63b9b10d5ae465702f399987a21816678bfafb56/Computer Science/img/transaction1.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Keep-going-tech-interview 2 | 3 | **면접 질문과 개인적인 답변 내용들은 꾸준히 업데이트 됩니다.** 4 | 5 | ## 개인적인 작성 Rule 6 | 7 | - 매일 각 분야별 질문 최소 2개씩 선정해서 답변달기 8 | - CS / AI 분야 번갈아가면서 답변달기 9 | - 답변은 answer 폴더의 각 카테고리 문서에 작성 10 | - 질문 리스트 문서는 answer에 있는 답변 문서로 링크 걸기 11 | 12 | ## Tech Interview 13 | 14 | - [Computer Science Interview](https://github.com/cow-coding/Keep-going-tech-interview/tree/main/Computer%20Science) 15 | - [AI Interview](https://github.com/cow-coding/Keep-going-tech-interview/tree/main/AI) 16 | --------------------------------------------------------------------------------