최근에 프로그램 성능 향상을 위해 병렬 처리를 하고자 했으며, 이 포스팅은 스레딩을 사용할 것이냐 멀티 프로세스를 사용할 것이냐, 무엇이 더 적합한가에 대해 알아보고 고민을 하며 정리한 글이다. 1. 프로세스 프로세스는 프로그램이 실행되는 하나의 instance로 컴퓨터에서 연속적으로 실행 중인 프로그램을 의미한다. 각 프로세스는 각각 메모리 공간을 가지며 데이터를 저장하기 때문에 여러개의 프로세스를 사용할 때 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않아 작업이 중단되지 않는다. 2. 스레드 스레드는 하나의 프로세스 내에서 실행되는 흐름의 단위로 프로세스의 component이다. 하나의 프로세스에 여러 쓰레드가 생성될 수 있으며 부모 프로세스의 메로리 공간을 공유하기 때문에 하나의 프로그..
- 교착 상태(deadlock)란? 교착 상태란 둘 이상의 프로세스가 서로 가진 한정된 자원을 요청하는 상태이다. 즉 두 개 이상의 작업이 서로의 작업이 끝나기를 기다리고 있어 결과적으로 아무것도 완료하지 못하는 상태를 말한다. 때문에 프로세스가 진전되지 못하고 모든 프로세스가 대기 상태가 된다. 교착 상태가 일어나려면 아래의 네 가지 필요 조건을 충족시켜야 한다. 1. 상호배제 : 프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다. 2. 점유대기 : 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다. 3. 비선점 : 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다. 4. 순환대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다. 이 ..
- CPU란? CPU는 중앙 처리 장치로 사용자로부터 입력받은 명령어를 해석하고 연산한 다음 결과를 출력하는 역할을 한다. CPU는 컴퓨터의 성능을 결정하는데 가장 결정적인 요소이기도 하다. 때문에 CPU는 컴퓨터의 두뇌를 담당한다고 하기도 한다. CPU는 연산-제어부와 레지스터(메모리)로 구성되어 있다. 연산-제어부는 명령을 처리하고 레지스터(메모리)는 처리할 명령을 전달하는 역할을 한다. CPU는 연산 속도가 빠르기 때문에 복잡한 명령을 처리하는 용도로 쓰인다. 다양한 환경에서 작업을 빠르게 수행하기 위해 ALU의 구조가 복잡하고 명령어 하나로 처리할 수 있는 기능도 많고 각종 제어 처리를 위한 부분도 많다. 최소한의 명령어로 복잡한 기능을 처리하고자 하기 때문에 명령어 자체가 복잡할 수 밖에 없다...
운영체제는 메모리 관리 기능을 담당하기도 한다. 성능을 극대화하기 위해 꼭 필요한 기능으로 실행되고 있는 작업들에 메모리를 적절히 분배하고 작업이 끝나면 할당했던 메모리를 회수한다. - 메모리 관리 기법 메모리 관리 기법은 다중 프로그래밍 시스템에서 다수의 프로세스를 수용하기 위해 주 기억장치를 동저긍로 분할하는 작업이다. 메모리 관리 기법에는 연속 메모리 관리와 불연속(분할) 메모리 관리가 있다. 1. 연속 메모리 관리 연속 메모리 관리는 프로그램 전체가 하나의 커다란 공간에 연속적으로 할당되어야만 한다. 연속 메모리 관리 기법에는 고정 분할 기법, 동적 분할 기법, 버디 시스템이 있다. 고정 분할 기법은 시스템 생성 시 주기억장치가 고정된 파티션들로 분할되는 기법이다. 프로세스는 같은 사이즈의 파티션..
https://iambeginnerdeveloper.tistory.com/155 OS | 컴파일러와 인터프리터 | Compiler, Interpreter - 컴파일러(compiler)란? 컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램으로, high-level programming language를 실행 프로그램으로 만들기 위 iambeginnerdeveloper.tistory.com 위의 글을 읽으면 좀 더 이해가 쉽습니다! Python과 C++은 기능과 동작이 다른 언어이다. 두 언어 모두 객체 지향 언어이지만 각각의 특징과 차이점이 있다. - Python의 특징 파이썬은 가독성과 신뢰성이 높은 객체 지향 프로그래밍 언어이다. 또, 구문이 명확해서..
- 컴파일러(compiler)란? 컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램으로, high-level programming language를 실행 프로그램으로 만들기 위한 lower level language(어셈블리 언어 등)로 바꾸는데 사용된다. 원래 문서를 소스코드 또는 원시코드라고 하며, 원시코드에서 출력된 문서인 목적 코드로 옮기는 과정을 컴파일이라고 한다. 소스코드를 컴파일 하는 이유는 이해하기 쉬운 형태의 high-level programming language로부터 실행 가능한 기계어 프로그램을 만들기 위해서이다. 컴파일러는 소스 프로그램을 읽어 바로 결과를 출력하는 인터프리터와 구분된다. 위의 그림은 일반적인 다중언어, 다중 대상..
- 프로세스(Process)란? 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 프로그램은 하드 디스크 등에 저장되어 있는 실행코드를 뜻하며, 프로세스는 프로그램을 구동해서 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 의미한다. 스케줄링의 대상이 되는 task(작업)이라는 용어와 같은 의미로 쓰이기도 한다. 여러 개의 프로세스를 사용하는 걸 '멀티 프로세싱'이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 '멀티 태스킹'이라고 한다 프로세서의 상태에는 생성, 실행, 준비, 대기, 종료가 있다. 커널 내 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있고 커널은 이것들을 이용해 프로세스의 상태를 관리한다. 생성(create) : 프로세스..
- Stack(스택)이란? 스택은 LIFO(Last In First Out) 구조의 자료형으로 한 쪽으로만 데이터를 넣고 뺄 수 있는 선형 구조로 되어있다. 즉, 마지막으로 넣은 데이터가 먼저 나오게 된다. 스택에서 삽입은 push, 삭제는 pop 명령어로 실행된다. 이는 브라우저에서 뒤로가기, 문서 작업 시 컨트롤+Z 같은 이전 상태로 되돌리기 등에 사용되며 DFS알고리즘에도 사용되는 자료형이다. 마지막 위치에 해당하는 데이터를 읽기 위해서는 Peek 명령어를 사용한다. 스택에 데이터가 꽉 차서 넣을 공간이 없는데 push를 하게 되는 경우를 overflow라고 하며 데이터가 없는데 pop을 하는 경우는 underflow라고 한다. 스택을 구현하는 방법은 배열을 사용하는 방법과 연결 리스트를 사용하는 ..