다중 작업 환경과 CPU 컨텍스트 스위칭

컴퓨터가 한 번에 여러 프로그램을 실행하는 것처럼 보이는 것을 다중 작업(Multitasking)이라고 합니다. 이는 두 가지 방식으로 나뉩니다.

  • 멀티프로세스(Multiprocess): 여러 독립적인 프로그램(예: 웹 브라우저, 워드 프로세서)이 동시에 실행되는 것입니다. 각각의 프로그램은 운영체제로부터 독립적인 메모리 공간을 할당받습니다.

  • 멀티스레드(Multithread): 하나의 프로그램(프로세스) 안에서 여러 작은 작업 단위(스레드)가 동시에 실행되는 것입니다. 스레드들은 프로세스의 메모리 공간을 공유해요.

과거에 CPU가 하나밖에 없을 때, CPU는 한 번에 하나의 작업만 처리할 수 있기 때문에 실제로 여러 프로세스가 동시에 완벽히 병렬로 실행되는 건 불가능했습니다.  하지만 운영체제(OS)가 '시분할(Time-sharing)'이라는 기술을 사용해서 마치 여러 프로그램이 동시에 실행되는 것처럼 보이게 만듭니다. 여기서 중요한 개념이 바로 컨텍스트 스위칭(Context Switching)입니다.

  • 컨텍스트 스위칭: CPU가 한 프로세스(또는 스레드)에서 다른 프로세스로 작업을 전환할 때, 현재 실행 중인 프로세스의 상태(어디까지 작업했는지, 어떤 값을 가지고 있었는지 등)를 잠시 저장하고, 다음에 실행할 프로세스의 상태를 불러와서 작업을 이어서 진행하는 과정이에요. 이 '프로세스의 문맥 개체'가 바로 그때 저장하고 불러오는 정보 묶음을 말합니다. 컨텍스트 스위칭은 매우 빠르게 일어나서 사용자 입장에서는 프로그램들이 동시에 실행되는 것처럼 느껴집니다.


모듈이란?

모듈(Module)은 프로그램을 구성하는 독립적인 '작은 부품 단위'입니다. 하나의 프로그램 코드를 기능별로 쪼개어 놓은 작은 파일이나 코드 묶음이라고 생각하면 이해하기 쉽습니다.

  1. 코드의 재사용성:
    • 특정 기능(예: 날짜를 특정 형식으로 변환하는 함수, 사용자 정보를 검증하는 함수)을 하나의 모듈로 만들면, 해당 기능을 여러 프로젝트나 프로그램의 여러 부분에서 필요할 때마다 가져다 쓸 수 있어요.
    • 똑같은 코드를 여러 번 작성할 필요 없이, 이미 검증된 모듈을 '재활용'하여 개발 시간을 단축시킵니다.
  2. 유지보수 용이성:
    • 프로그램이 커질수록 모든 코드를 하나의 거대한 파일에 넣는 것은 비효율적이에요. 모듈로 나누면 각 기능별로 코드가 분리되어 있어서, 특정 기능에 문제가 발생해도 해당 모듈만 집중적으로 수정하고 테스트할 수 있어요. 이는 전체 코드에 미치는 영향을 최소화하고 유지보수를 훨씬 쉽게 만듭니다.
  3. 코드의 조직화 및 가독성:
    • 관련 있는 코드들을 하나의 모듈 안에 묶어 놓으면, 프로그램의 논리적인 구조를 한눈에 파악하기 쉽고 코드의 가독성이 높아집니다.
    • 개발자가 특정 기능을 찾거나 이해하는 데 시간을 덜 들이게 됩니다.
  4. 네임스페이스 오염 방지:
    • 모듈을 사용하지 않고 모든 변수나 함수를 전역(Global) 공간에 선언하면, 다른 파일에서 같은 이름의 변수를 선언했을 때 서로 충돌하여 예기치 못한 오류가 발생할 수 있습니다.
    • 모듈은 자신만의 독립적인 스코프를 가집니다. 따라서 모듈 내부의 변수나 함수는 기본적으로 외부에서 접근할 수 없어요. 필요한 것만 명시적으로 **export(내보내기)**하고, 필요한 곳에서만 **import(가져오기)**하여 전역 스코프를 깨끗하게 유지할 수 있습니다.

자바스크립트에서의 모듈:

과거에는 여러 모듈 시스템(CommonJS, AMD 등)이 있었지만, 현재는 ES2015(ES6)에서 공식적으로 도입된 **ES 모듈(ES Modules, ESM)**이 표준으로 널리 사용됩니다.

  • export: 모듈 내부의 변수, 함수, 클래스 등을 외부에서 사용할 수 있도록 공개할 때 사용합니다.
  • import: 다른 모듈에서 export된 것들을 가져와서 현재 파일에서 사용합니다.
728x90