프로세스 동기화 프로세스(또는 스레드)는 동시에 그리고 병렬로 실행된다. CPU 코어는 각 프로세스를 빠르게 전환해 실행함으로써 프로세스는 동시에 실행된다. 또한 각 CPU 코어는 하나의 프로세스를 실행함으로써 프로세스는 병렬로 실행된다. 이 같은 동작 방식은 CPU 사용률을 높이지만 한 가지 문제가 있다. 두 개 이상의 프로세스가 공유 데이터에 동시 접근할경우 데이터의 일관성이 깨질 수 있다. 이와 같은 상황은 매우 빈번하게 발생한다. 아래는 예시 상황이다. 두 개 이상의 스레드가 힙 영역, 데이터 영역의 데이터에 동시 접근 두 개 이상의 프로세스가 파일, 메모리, 소켓, 외부 장치 등 컴퓨터 자원 또는 OS의 자원에 동시 접근 두 개 이상의 커널 모드 프로세스가 커널 자료구조(열린 파일 목록 리스트,..
CPU 스케줄링 멀티 프로그래밍, 멀티 태스킹의 목적은 여러 프로세스를 동시에 실행해 CPU의 유휴 시간을 최대한 줄이는 것이다. 다중 코어 시스템에서는 모든 CPU 코어의 사용량이 최대가 되도록 유지하는 것으로 확장된다. 멀티 프로그래밍 환경에서 핵심은 CPU 자원의 스케줄링이다. CPU 스케줄링은 CPU(또는 CPU 코어) 할당을 기다리는 여러 프로세스 중에서 어떤 프로세스에게 CPU를 할당할지 선택하는 것을 말한다. 그리고 CPU 스케줄링을 수행하는 모듈을 스케줄러라고 한다. 그러면 어떻게 CPU 스케줄링을 해야 효율적일까? 이번 장에서는 여러 CPU 스케줄링 알고리즘을 알아본다. CPU - I/O 버스트 사이클 프로세스의 실행은 CPU 버스트와 I/O 버스트의 사이클로 구성된다. CPU 버스트는 ..
스레드 예전의 프로세스는 단일 실행 스레드(single thread of execution)을 가졌다면 지금의 프로세스는 여러 개의 스레드를 가져 여러 개의 실행 흐름을 가지게 되었다. 예전에는 프로세스가 여러 개의 실행 흐름을 가지기 위해 새 프로세스를 생성했다. 하지만 프로세스를 생성하는 건 많은 시간과 자원이 요구되는 작업이며 같은 일을 하는 프로세스를 여러 개 두는건 매우 비효율적이다. 때문에 경량화된(light-weight) 프로세스인 스레드가 등장했다. 스레드는 원래 실타래, 프로그램 실행 흐름을 의미하는 용어였다. 멀티스레딩 시스템에서 CPU를 점유하는 단위는 프로세스가 아닌 스레드이다. 스레드는 경량화된 프로세스(Light-Weight Process, LWP)이다. 스레드는 스레드 ID, ..
IPC 프로세스는 독립적인 프로세스이거나 협력적인 프로세스이다. 독립적인 프로세스 : 다른 프로세스와 아무런 데이터도 공유하지 않는 프로세스 협력적인 프로세스 : 다른 프로세스에 영향을 주거나 받는 프로세스 또는 다른 프로세스와 데이터를 공유하는 프로세스 협력적인 프로세스들은 서로 간 데이터를 주고 받을 수 있는 프로세스 간 통신(interprocess communication, IPC) 기법이 필요하다. IPC에는 공유 메모리(shared-memory)와 메시지 전달(message-passing) 모델이 있다. 어떻게 하면 프로세스 간 데이터를 주고 받을 수 있을까? 프로세스가 다른 프로세스 메모리에 접근하는 것은 매우 위험하므로 OS에 의해 금지된다. 쉬운 방법은 프로세스들이 서로 접근할 수 있는 공..
프로세스 비공식적으로, 프로세스는 실행 중인 프로그램이다. 프로그램이 명령어 리스트를 저장한 파일(실행 파일)과 같은 수동적인 존재(passive entity)라면 프로세스는 프로그램 카운터 및 관련 자원을 가진 능동적인 존재(active entity)이다. 프로세스는 아래의 자원들을 가진다. 레지스터 (PC, IR 등) cpu time 메모리 파일 I/O 디바이스 메모리 배치 프로세스의 메모리 배치는 일반적으로 여러 섹션으로 구분되며 아래의 섹션을 포함한다. 텍스트 섹션 - 실행 코드 데이터 섹션 - 전역 변수 힙 섹션 - 프로그램 실행 중 동적으로 할당되는 메모리 스택 섹션 - 함수를 호출 시 임시 데이터 저장 장소(함수 매개변수, 복귀 주소, 지역 변수) 텍스트와 데이터 섹션은 크기가 고정되어 있으..
운영체제 컴퓨터 하드웨어를 관리하는 소프트웨어이며 유저, 응용 프로그램과 하드웨어간의 연결점(Intertace) 역할을 수행한다. 컴퓨터 시스템 구성 전통적인(classical) 컴퓨터 시스템은 하나 이상의 CPU와 다수의 디바이스 컨트롤러가 버스를 통해 연결되어 있다. 디바이스 컨트롤러는 특정 유형의 장치를 담당하며 로컬 버퍼 저장소와 특수 목적 레지스터 집합을 유지 관리한다. 장치 컨트롤러마다 장치 드라이버(device driver)가 있다. 이 장치 드라이버는 운영체제에게 장치에 대한 인터페이스를 제공한다. 인터럽트 CPU와 I/O 디바이스 간의 통신 방법 중 한가지로 하드웨어는 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다. CPU가 인터럽트되면 CPU는 하던 일을 중단하고 인터럽..
컴퓨터 컴퓨터는 정보(information)를 처리하는 기계라고 한다. 정보는 뭘까? 정보의 최소 단위는 두 가지 상태(0, 1)을 나타내는 bit이다. 이 bit가 모인 이진 데이터가 정보이다. 그렇다면 정보를 어떻게 처리할까? 정보를 처리는 비트의 상태 변환(0에서 1로, 1에서 0으로)과 같다. 정보를 처리하려면 비트의 상태 변환을 할 수 있는 물리적인 장치가 필요하고 이 장치가 논리 회로가 된다. 논리 회로 논리 게이트는 불 대수를(Boolean algebra) 구현한 물리적인 장치다. NOT, AND, OR, XOR, NAND, NOR 게이트가 있다. 불 대수는 수의 범위가 오직 0 또는 1인 수의 논리적 계산을 수학적으로 표현한 것이다. 현대 수학의 수가 실수와 허수로 이루어져 매우 복잡하다면..
프로그래머가 C,JAVA와 같은 high-level 언어로 프로그래밍 하면 컴퓨터가 이해 할 수 있도록 기계어로 번역해주어야 한다. 대표적인 방법으로 Compile와 Interpret가 있다. Compile을 하는 프로그램을 Compiler, Interpret을 하는 프로그램을 Interpreter라 하며 두 번역 방법이 명확하게 다르기 때문에 많은 프로그래밍 언어들은 둘 중 한가지 방식을 통해 기계어로 번역되도록 설계되었다. 하지만 요즘은 자바와 같이 두 가지 방법을 모두 사용하는 언어들이 많다. 원래의 코드를 원시 코드(Source Code), 컴파일 된 코드를 목적 코드(Object Code)라 한다. 컴파일 전체 코드를 Runtime 이전에 기계어로 번역하는 방식이다. 컴파일로 생성된 목적 코드는..