
시작하게된 계기8월부터 jscode에서 진행하고 있는 운영체제 모의면접 스터디를 하게되었다.올해부터 취업준비를 해야하기도 하고 혼자 운영체제를 공부하기 보다는 스터디를 통해 공부를 한다면 강제성도 생기고 무엇보다 현업 개발자 멘토가 있다는 것이 마음에 들어 참가하게 되었다. 1주일에 1회 2시간에서 2시간 30분씩 진행되었고, 매주 준비해야할 면접 질문을 바탕으로 면접준비를 해오면 된다. 나같은 경우 면접 질문에 대한 답만 준비하는게 아닌 해당 면접 질문으로 더 나올 수 있는 꼬리 질문도 준비해 갔다. 이렇게 준비해가면 6명에서 조를 구성해 모의면접을 진행하게 된다. 2명은 면접관, 1명은 지원자, 1명원 타임키퍼, 1명은 관찰자의 역할로 서로 돌아가며 모의면접을 하게된다. 그리고 면접을 하다보면 중간..

1. 리팩터링할 코드 식별하기기반 코드를 리팩터링하지 않고서는 테스트 스위트를 크게 새선할 수 없다. 이 절에서는 리팩터링의 방향을 설명하고자 코드를 네 가지 유형으로 분류하는 방법을 소개한다.1.1 코드의 네 가지 유형모든 제품 코드는 2차원으로 분류할 수 있다.복잡도 또는 도메인 유의성협력자 수코드 복잡도는 코드 내 의사 결정(분기) 지정 수로 정의한다. 이 숫자가 클수록 복잡도는 더 높아진다. 도메인 유의성은 코드가 프로젝트의 문제 도메인에 대해 얼마나 의미 있는지를 나타낸다. 일반적으로 도메인 계층의 모든 코드는 최종 사용자의 목표와 직접적인 연관성이 있으므로 도메인 유의성이 높다. 반면에 유틸리티 코드는 그런 연관성이 없다. 복잡한 코드와 도메인 유의성을 갖는 코드가 단위 테스트에서 가장 이롭다..

도입저번시간에 작성한 성능 테스트 자동화 환경 구축기(1)에 대한 내용을 정리해 보면, 성능 테스트를 위해 여러 가지 요소들이 필요했다. 우선, 성능 테스트를 위한 대량의 요청을 생성해주는 nGrinder, 서버 상태를 모니터링할 수 있는 PinPoint, 그리고 성능 테스트 대상이 되는 API 서버를 AWS 상에 구축해야 했다. 이를 위해 우리는 Terraform을 활용하여 AWS 자원(EC2, VPC, RDS 등)을 코드로 관리할 수 있도록 설정하였다. 하지만 단순히 AWS 자원을 콘솔이 아닌 코드로 관리할 수 있게 되었다고 해서 성능 테스트 자동화 환경을 구축했다고 말할 수는 없다. 그렇다면, 진정한 의미에서 성능 테스트 자동화 환경을 구축했다고 말하려면 무엇이 더 필요할까?자동화의 필요성성능 테스..

1. 배경 메인 메모리는 현대 컴퓨터 시스템의 운영에 중심적인 역할을 한다. 메모리는 각각 주소가 할당된 일련의 바이트들로 구성된다. CPU는 PC(program counter)가 지시하는 대로 메모리로부터 다음 수행할 명령어를 가져오는데 그 명령어는 필요한 경우 추거적인 데이터를 더 가져올 수 있으며 반대로 데이터를 메모리로 내보낼 수도 있다. 메모리는 주소에 지시한 대로 읽기 쓰기만 할 뿐 이 주소들이 어떻게 생성되었는지 혹은 그 주소가 가리키는 내용이 무엇인지를 모른다. 따라서 주소가 프로그램에 의해서 어떻게 생성되었는지에 대한 세부 사항은 이 시점에서의 고려 대상이 아니다. 여기서는 프로그램에 의해서 생성되는 일련의 주소만 언급하기로 한다.1.1 기본 하드웨어메인 메모리와 각 처리 코어에 내장된..

배경서비스를 실제로 사용자에게 공개하기 전에 해야 할 중요한 작업 중 하나는, 내가 만든 서버가 어느 정도의 사용자 유입을 감당할 수 있는지를 파악하는 것이다. 이를 알아낸다면 예상되는 사용자 수를 기준으로 서버를 개선하고, 안정적인 서비스를 제공할 수 있다.나 역시 DND 프로젝트에서 snappy라는 서비스를 개발하면서, 사용자에게 서비스를 공개하기 전에 서버가 어디까지 버틸 수 있는지 확인하고 싶었다. 그래서 성능 테스트를 도입해보았고, 이번 테스트 과정에서 어떤 문제들이 있었는지, 그리고 그 문제들을 어떻게 해결해 나갔는지에 대해 작성해보려 한다.성능 테스트성능 테스트를 하려면 무엇이 필요할까? 우선 가장 먼저 생각나는 것은 내가 만든 서버이다. 서버는 이미 만들어 놓았기 때문에 이 부분은 문제없다..

1. 고전적인 동기화 문제들1.1 유한 버퍼 문제우리가 해결하려는 문제에서 소비자와 생산자는 다음과 같은 자료구조를 공유한다.int n;semaphore mutex = 1;semaphore empty = n;semaphore full = 0;우리는 n개의 버퍼로 구성된 풀이 있으며 각 버퍼는 한 항목(item)을 저장할 수 있다고 가정한다. mutex 이진 세마포는 버퍼 풀에 접근하기 위한 상호 배제 기능을 제공하며 1로 초기화된다. empty와 full 세마포들은 각각 비어 있는 버퍼의 수와 꽉 찬 버퍼의 수를 기록한다. 세마포 empty는 n값으로 초기화되고, 세마포 full은 0으로 초기화 된다. 다음은 생산자 코드이다.while(true) { wait(empty); //버퍼가 가득 찬 경우 bl..

협력적 프로세스는 시스템 내에서 실행 중인 다른 프로세스의 실행에 영향을 주거나 영향을 받는 프로세스이다. 협력적 프로세스는 논리 주소 공간(즉, 코드 및 데이터)을 직접 공유하거나 공유 메모리 또는 메시지 전달을 통해서만 데이터를 공유할 수있다.그러나 공유 데이터를 동시에 접근하면 데이터의 일관성을 망칠 수 있다. 데이터의 일관성을 유지하는 다양한 메커니즘을 알아보자1. 배경우리는 이미 프로세스가 병행하게 또는 병렬로 실행될 수 있다는 것을 알고 있다. CPU 스케줄러가 프로세스 사이에서 빠르게 오가며 각 프로세스를 실행하여 모든 프로세스를 병행 실행시킨다는 것을 배웠다. 이는 한 프로세스는 다른 프로세스가 스케줄되기 전에 일부분만 진행할 수 있다는 것을 의미한다. 사실 프로세스는 명령어가 실행될 때 ..

최신 운영체제에서는 실질적으로는 프로세스가 아니라 커널 수준 스레드를 스케줄 한다. 그러나 프로세스 스케줄링과 스레드 스케줄링 용어는 상호 교환적으로 사용된다. 1. 기본 개념 코어가 하나인 시스템에서는 한순간에 오직 하나의 프로세스만이 실행될 수 있다. 나머지 프로세스는 CPU의 코어가 가용 상태가 되어 다시 스케줄 될 수 있을 때까지 기다려야 한다. 1.1 CPU I/O Burst Cycle 프로세스 실행은 CPU 실행과 I/O 대기의 사이클로 구성된다. 프로세스들은 이 두 상태 사이를 교댜로 왔다 갔다 한다.프로세스 실행은 CPU burst로 시작된다 뒤이어 I/O burst가 발생하고, 그 뒤를 이어 또 다른 CPU burst가 발생하며 이어 또 다른 I/O burst 등등으로 진행된다. 결국..