List display
List display

Adjust list behavior and widths for this section. Select Global to follow the global settings.

List display

Width for lists, cards and tables.

Content width

Width for articles and detail pages.

Overrides are saved only for this section or data category.

1부 컴퓨터 안의 약속

3장 운영체제가 만드는 경계

같은 컴퓨터에서 음악을 재생하고 문서를 고치고 웹페이지를 연다. 각각의 프로그램은 자신이 사용할 메모리와 파일을 갖는 것처럼 행동한다. 운영체제는 이들이 서로의 공간을 함부로 침범하지 않도록 경계를 만들고, 한정된 자원을 나누며, 장치를 사용할 공통 방법을 제공한다. 하드웨어를 편하게 쓰게 하는 역할과 서로를 보호하는 역할이 함께 있다.

프로그램은 저장된 명령과 데이터이고 프로세스는 그것을 실행 중인 상태다. 같은 프로그램을 두 번 실행하면 별도의 프로세스가 생길 수 있다. 프로세스에는 식별자, 메모리 공간, 열린 파일, 권한, 실행 환경 등이 따른다. 파일이 디스크에 존재한다는 사실만으로 그 프로그램이 현재 실행 중이라는 뜻은 아니다. 서버에 설치되어 있다는 말과 서비스가 동작한다는 말도 구분해야 한다.

파일을 연다는 일

운영체제는 프로그램에 파일이나 소켓을 다루는 손잡이 같은 식별자를 제공한다. 유닉스 계열에서 파일 디스크립터라고 부르는 것이 대표적이다. 프로그램은 이 식별자를 통해 읽고 쓰고 닫는다. 동시에 너무 많은 자원을 열고 닫지 않으면 제한에 걸릴 수 있다. 메모리가 남아 있어도 새 연결이 실패하는 이유가 여기에 있을 수 있다.

파일 경로는 데이터를 찾는 이름이지 영구적인 신분증이 아니다. 파일을 지운 뒤에도 어떤 프로세스가 그것을 열고 있으면 공간이 즉시 반환되지 않는 경우가 있다. 반대로 같은 이름에 새 파일이 생겼는데 프로그램이 여전히 이전 파일을 보고 있을 수도 있다. 로그 파일을 교체하는 작업에서 이런 문제가 드러난다. 폴더에서 파일이 보이는지만 확인해서는 실행 중인 프로그램의 상태를 완전히 알 수 없다.

절대 경로와 상대 경로도 구별하자. 상대 경로는 현재 작업 위치에 따라 뜻이 달라진다. 터미널에서는 되는데 서비스로 실행하면 파일을 못 찾는 문제는 작업 디렉터리 차이에서 생길 수 있다. 실행 계정, 환경 변수, 권한, 경로를 함께 기록해야 재현이 가능하다. “같은 명령인데 왜 다르지?”라는 질문에는 실제로 같지 않은 환경이 숨어 있는 경우가 많다.

권한을 넓히기 전에

파일을 열지 못한다는 메시지를 보면 모든 사용자에게 권한을 주고 싶어진다. 하지만 권한 오류를 없애는 것과 올바른 권한을 정하는 것은 다른 일이다. 웹 서버가 읽어야 하는 자료, 업로드 디렉터리에 써야 하는 자료, 관리자만 바꿔야 하는 설정을 구별해야 한다. 필요 이상으로 권한을 넓히면 한 프로그램의 결함이 다른 데이터까지 번진다.

관리자 권한으로 실행했더니 문제가 사라졌다면 진단 단서는 얻은 셈이다. 그러나 운영 방법으로 그대로 굳히기 전에 어떤 자원이 부족했는지 찾아야 한다. 파일 접근 문제인지, 낮은 번호 포트 사용 문제인지, 특정 장치 접근 문제인지가 다르다. 최소 권한은 귀찮은 보안 구호가 아니라 사고의 영향 범위를 줄이는 설계다.

환경 변수에는 설정뿐 아니라 비밀이 들어갈 수도 있다. 따라서 문제를 설명하려고 환경 전체를 공개 게시판에 붙여 넣으면 안 된다. 비밀번호, 토큰, 내부 주소, 개인 정보가 섞여 있지 않은지 확인해야 한다. 필요 항목의 존재 여부와 마스킹한 값만 공유하는 편이 안전하다. 진단 자료에도 접근 권한과 보존 기한이 필요하다.

실행 상태와 서비스 상태

프로세스가 살아 있다는 사실은 사용자의 요청을 처리할 수 있다는 사실과 다르다. 내부 작업이 멈추었거나 데이터베이스 연결을 기다리며 모든 작업자가 묶여 있을 수 있다. 운영체제가 보는 상태와 서비스가 제공하는 상태를 따로 확인해야 한다. 프로세스 수, 열린 포트, 간단한 응답, 실제 업무 흐름은 각각 다른 깊이의 검사다.

서비스 관리자는 프로그램의 시작과 종료, 재시작, 실행 계정, 로그 연결 등을 관리한다. 리눅스의 systemd는 널리 쓰이는 예이지만 모든 환경에서 동일하지는 않다. 컨테이너나 다른 운영체제에서는 관리 방식이 다르다. 도구 이름을 외우기보다 누가 프로세스를 시작하며 실패했을 때 누가 다시 실행하는지 알아 두면 환경이 바뀌어도 구조를 이해할 수 있다.

종료 신호를 받은 프로그램이 곧바로 죽는지, 새 요청을 중단하고 진행 중인 요청을 마친 뒤 종료하는지도 중요하다. 배포 도중 연결이 갑자기 끊기는 현상은 네트워크 회선보다 종료 절차의 문제일 수 있다. 우아한 종료는 시간을 무한정 주는 것이 아니다. 정상 종료를 기다릴 한도와 끝내 처리하지 못한 작업을 회수할 방법을 정하는 것이다.

자신의 컴퓨터에서 작업 관리자를 열어 프로세스 이름과 CPU, 메모리, 디스크 사용을 함께 보자. 모르는 프로세스를 종료하지 말고 관찰만 한다. 브라우저 창 하나에 프로세스가 여러 개 있을 수 있다는 점, 창을 닫아도 일부 백그라운드 작업이 남을 수 있다는 점을 확인해 보자. 눈에 보이는 창과 운영체제의 실행 단위가 일대일이 아니라는 사실을 체감하면 서버의 동작도 한결 덜 추상적으로 느껴진다.

표준과 공식 참고 자료

관련 기술의 원문 표준과 제작자 문서입니다. 번역 인용문이 아닌 새로 작성한 해설과 실습을 수록했습니다. 자료 확인: 2026-09-05.