Lecture 4. Threads & Concurrency들어가며Thread를 공부하면서 단순히 "프로세스보다 가볍다"는 말을 외우기보다, 왜 Thread가 등장했는지, 프로세스와 무엇이 같고 무엇이 다른지를 이해하는 데 집중했다. 이 글은 그 과정을 정리한 기록이다.1. Thread가 왜 필요한가?웹 서버로 이해하는 문제 상황웹 서버는 동시에 수많은 클라이언트의 요청을 처리해야 한다. 클라이언트가 http://www.naver.com/index.html을 요청하면, 서버는 네트워크에서 요청을 받아 CPU로 처리하고 디스크에서 파일을 읽어 응답한다.문제는 이 과정에서 디스크 I/O가 발생한다는 것이다. I/O 작업 중에는 서버가 blocked 상태가 되어 다른 클라이언트의 요청을 처리할 수 없다.프로세스..
들어가며Process를 공부하면서 단순히 "실행 중인 프로그램"이라는 정의를 외우기보다, 프로그램이 어떻게 프로세스가 되는지, OS가 프로세스를 어떻게 메모리에 프로세스 자원을 할당하고 관리하는지, 그리고 프로세스들이 어떻게 협력하는지를 이해하는 데 집중했다. 이 글은 그 과정을 정리한 기록입니다.1. 프로세스란 무엇인가?프로그램 vs 프로세스프로그램은 디스크에 저장된 정적인 파일이다. 실행 코드가 담긴 실행 파일(binary)일 뿐이며, 그 자체로는 아무 일도 하지 않는다.프로세스는 실행 중인 프로그램(program in execution)이다. 프로그램이 메모리에 적재되어 CPU가 실제로 명령어를 실행하기 시작하면 프로세스가 된다. 즉 같은 프로그램을 두 번 실행하면 프로세스가 두 개 생긴다.프로세스..
들어가며이번 글에서는 OS가 어떤 서비스를 제공하는지, 프로그램이 OS에게 어떻게 서비스를 요청하는지, 그리고 OS 내부가 어떤 구조로 설계되어 있는지를 다루어 보겠습니다. 1. OS가 제공하는 서비스OS는 크게 두 가지 관점의 서비스를 제공한다. 하나는 사용자와 프로그램을 위한 서비스이고, 다른 하나는 시스템 자체의 효율적인 운영을 위한 서비스다.사용자를 위한 서비스User Interface는 사용자가 OS와 상호작용하는 방법이다. CLI(Command Line Interface)와 GUI(Graphic User Interface) 두 가지가 있다.Program Execution은 프로그램을 메모리에 적재하고 실행하며 종료하는 역할이다.I/O Operations는 키보드·마우스 입력과 모니터·프린터 출..
들어가며이번 글에서는 OS 공룡책을 바탕으로 OS가 무엇인지, 컴퓨터 시스템이 어떻게 동작하는지, 그리고 OS가 어떤 구성 요소로 이루어져 있는지를 전반적으로 다루어 보겠습니다. 이후 각 파트를 자세히 다룰 예정입니다. 1. OS의 정의 (Operating System Definition)컴퓨터 시스템의 4계층 구조컴퓨터 시스템은 Hardware, Operating System, Applications, Users 네 가지 구성 요소로 이루어진다. Hardware는 CPU, 메모리, I/O 장치를 포함하는 물리적 자원이고, OS는 그 위에서 애플리케이션과 하드웨어를 연결하는 중개자 역할을 한다.OS란 무엇인가?OS는 애플리케이션과 하드웨어 사이의 중개자(intermediary)다. OS의 역할은 보는 관..
우리가 매일 사용하는 뱅킹 시스템, 항공 관제 소프트웨어, 의료 기기 등은 단 한 번의 오류로도 막대한 경제적 손실이나 인명 피해를 초래할 수 있습니다. 이러한 시스템에서 가장 중요한 속성은 바로 의존성(Dependability)입니다.이번 포스팅에서는 시스템 의존성의 핵심 요소와 이를 달성하기 위한 전략인 중복성, 다양성, 그리고 프로세스적 접근법에 대해 정리해 봅니다.1. 시스템 의존성 (System Dependability)의 이해의존성(Dependability)은 사용자가 시스템을 얼마나 신뢰(Trust)할 수 있는지를 나타내는 척도입니다. 단순히 기능이 작동하는 것을 넘어, 시스템이 '실패'하지 않을 것이라는 확신을 주는 것이 핵심입니다.1) 의존성의 5대 핵심 속성의존성은 다음의 5가지 상호 ..
소프트웨어 개발이 끝났다고 프로젝트가 끝난 것이 아닙니다. 오히려 배포 후(Post-delivery)가 진정한 시작입니다. 비즈니스 환경은 끊임없이 변하고, 그에 맞춰 소프트웨어도 계속 진화해야 하기 때문입니다.이번 포스팅에서는 소프트웨어 진화의 중요성, 레거시 시스템 관리 전략, 그리고 코드 품질을 위한 리팩터링에 대해 다루어 보겠습니다.1. 소프트웨어 진화의 중요성 (Importance of Evolution)1) 변화는 피할 수 없다 (Inevitable)소프트웨어는 한번 만들어지면 끝이 아니라, 계속해서 변해야 합니다.새로운 요구사항이 생겨나고, 비즈니스 환경이 변하며, 에러를 수정해야 하고, 장비가 업그레이드되기 때문입니다.2) 시스템의 분류 (Lehman's Law)S-타입 시스템 (Stati..
개발자가 코드를 다 짰다고 끝난 게 아닙니다. 사실 진짜 싸움은 지금부터죠. 바로 '테스팅(Testing)'입니다. 이번 포스팅에서는 소프트웨어 테스팅의 목적과 단계, 그리고 요즘 개발자들의 필수 덕목인 TDD(테스트 주도 개발)까지 확실하게 정리해 드립니다.1. 프로그램 테스팅이란?테스팅은 프로그램이 의도한 대로 동작하는지 확인하고, 사용하기 전에 결함을 발견하기 위해 수행하는 활동입니다.1) 테스팅의 핵심목적: 단순히 "잘 돌아간다"를 보여주는 것뿐만 아니라, "어디가 고장 났는지" 찾아내기 위함입니다.한계: 테스팅은 에러가 존재함(Presence)을 증명할 수는 있지만, 에러가 없음(Absence)을 증명할 수는 없습니다. (아무리 테스트해도 우리가 못 찾은 버그는 있을 수 있다는 뜻!)V&V 프로..
아키텍처가 건물의 뼈대라면, 설계 및 구현은 실제 배관, 전기 배선, 인테리어를 하고 벽돌을 쌓는 과정입니다. 이번 포스팅에서는 객체지향 설계 프로세스, 디자인 패턴, 그리고 구현 단계의 주요 이슈들을 정리합니다.1. 설계와 구현의 관계정의: 소프트웨어 설계와 구현은 실행 가능한 소프트웨어 시스템을 개발하는 단계입니다.상호작용: 설계(Design)와 구현(Implementation)은 칼로 자르듯 나뉘지 않고, 서로 맞물려(Inter-leaved) 진행됩니다.설계: "쇼핑몰의 장바구니 기능은 어떤 데이터가 필요하고, 결제 시스템과는 어떻게 연결될까?"를 고민하는 창의적 활동.구현: 설계를 바탕으로 실제 Java나 Python 코드를 작성하는 과정.1) 직접 개발 vs 구매 (Build or buy)현대 ..