리눅스 CPU 스케줄러는 MLFQ가 아니라 EEVDF다

CPU 스케줄링을 배우면 FIFO에서 시작해 SJF, 라운드 로빈을 거쳐 MLFQ에서 끝난다. 각 알고리즘이 앞 알고리즘의 단점을 하나씩 메우는 흐름이라 이야기가 깔끔하고, 마지막에 “오늘날 운영체제는 MLFQ를 쓴다”로 닫히면 정리가 된다 리눅스 CPU 스케줄러는 그 목록에 없다. 2.6.23부터 CFS(Completely Fair Scheduler)를 썼고,…

프로세스 생성 비용은 메모리가 아니라 페이지 테이블에서 나온다

리눅스의 fork는 부모 프로세스의 메모리를 복사하지 않는다. 코드 영역도 데이터 영역도 힙도 복사하지 않고, 부모와 자식이 같은 물리 페이지를 함께 가리키게 해 둔 다음 누군가 쓰기를 시도할 때 그 페이지만 복사한다. Copy-on-Write다 그렇다면 512MiB를 쥐고 있는 프로세스를 fork하는 비용과 아무것도…

운영체제 부팅 과정은 BIOS가 아니라 UEFI에서 시작한다

전원 버튼을 누르면 ROM에 저장된 BIOS가 실행되고, 하드웨어를 점검한 뒤 하드디스크 첫 섹터의 마스터 부트 레코드에서 부트로더를 읽어 메모리로 올린다. 나도 이 순서로 외웠고 면접에서도 이렇게 답했다. 그런데 지금 팔리는 PC에는 이 경로가 없다 Intel은 2020년까지 클라이언트와 데이터센터 플랫폼에서 레거시…

Bean Validation은 @NonNull을 검사하지 않는다

수강 신청 DTO의 두 필드에 @NotNull을 걸고, 애플리케이션 서비스에는 @Validated를 달아 두었다. 그런데 리뷰에서 나는 그 사이에 있어야 할 @Valid가 빠져 있는 것을 발견했다. 그 상태에서는 DTO에 제약을 몇 개 걸어 두어도 Bean Validation 검사가 시작되지 않는다 같은 자리에 함정이…

Hibernate NaturalId 판단 기준은 고유성이 아니라 불변성이다

어떤 프로퍼티 조합이 고유하고 그 값으로 엔티티 하나를 특정할 수 있으면 자연 키 후보로 본다. 회원의 이메일이 그랬고, 강의의 강사와 제목 조합도 그랬다. 그런데 두 경우에 서로 다른 결정이 나왔다. 이메일에는 @NaturalId를 붙였고, 강사와 제목에는 유니크 제약만 걸었다. Hibernate에서 @NaturalId를…

강의 도메인의 상태 전이는 애그리거트 안에서 강제한다

상태를 가진 도메인을 개발할 때 가장 흔한 구조는 엔티티에 status 컬럼을 두고, 서비스 코드에서 if (course.getStatus() == DRAFT) 같은 조건문으로 전이를 검사하는 방식이다. 처음에는 잘 동작한다. 문제는 그 강의를 다루는 코드가 두 곳, 세 곳으로 늘어날 때다. 어느 상태에서 어느…

SSL 인증서 자동 갱신 실패를 두 달 동안 아무도 몰랐다

금요일 낮 12시쯤에 카톡이 왔다. 기 개발사로부터 파일을 인계받아 이관한 고객사 사이트 두 곳에서 블로그·고객후기 등 전부 사라졌다는 신고였다. 화면은 그대로라고 했다 (혹시) DB가 날아간 걸 먼저 의심했다. 그게 아니었다. 원인은 25일 전에 만료된 SSL 인증서였고 데이터는 한 건도 유실되지…