운영체제와 응용 프로그램
- 응용 프로그램은 컴퓨터를 이용해 다양한 작업을 하는 것이 목적이고, 운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 도와줌
*운영체제가 없다면 응용 프로그램이 실행될 수 없음
1. 운영체제
1) 시스템 자원 관리
운영체제는 프로세스 관리(CPU), 메모리 관리, I/O(입출력) 관리(디스크, 네트워크 등)를 수행
- 운영체제 : 하드웨어를 구성하는 CPU, 자료를 저장하는 RAM, 디스크 등의 시스템 자원을 관리하는 주체
2) 응용 프로그램 관리
- 운영체제 : 응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리
- 응용 프로그램의 권한 관리의 필요성 : 모든 응용 프로그램이 시스템의 자원을 마음대로 사용한다면 해커에 의한 공격에 무방비한 상태가 되기 때문에 중요
- 여러 사람이 하나의 기기를 사용하는 경우 사용자를 관리하는 일도 매우 중요
2. 응용 프로그램
응용 프로그램이 시스템의 자원 사용에 대한 권한을 획득한 후, 시스템의 자원을 사용할 때 필요한 API를 호출해야 하는데, 이 API는 시스템 콜로 이루어짐
- 응용 프로그램이 운영체제를 통해 컴퓨터에게 일을 시키려면, 컴퓨터를 조작할 수 있는 권한을 운영체제로부터 부여받아야 함
*권한을 부여받고 난 후 운영체제가 제공하는 기능을 이용할 수 있음
- 응용 프로그램이 운영체제와 소통하기 위해서는, 운영체제가 응용 프로그램을 위해 인터페이스(API)를 제공해야 함
- 시스템 콜(System call) : 응용 프로그램이 시스템 자원을 사용할 수 있도록 운영체제 차원에서 다양한 함수를 제공하는 것
스레드
1. 프로세스(Process)
- 운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라 함
- 사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코드를 실행
- 운영체제에서는 실행 중인 하나의 애플리케이션을 프로세스라 함
- 하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도 함
*Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성
2. 스레드(Thread)
- 한 가지 작업을 실행하기 위해 순차적으로 실행한 코드를 실처럼 이어 놓았다고 해서 유래된 이름
- 하나의 스레드는 코드가 실행되는 하나의 흐름이기 때문에, 한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개 생긴다는 의미
- 싱글 스레드와 멀티 스레드 존재
특징
- 프로세스 내에서 실행되는 흐름의 단위
- 각 스레드마다 call stack이 존재
*call stack: 실행중인 서브루틴을 저장하는 자료 구조
- 스레드는 다른 스레드와 독립적으로 동작
2. 멀티 스레드(Multi-Thread)
- 멀티 태스킹 : 두 가지 이상의 작업을 동시에 처리하는 것을 의미
- 운영체제 : 멀티 태스킹을 할 수 있도록 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행
- 멀티 태스킹은 꼭 멀티 프로세스를 의미하는 것은 아니며, 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 애플리케이션도 존재
*멀티 스레드에 의해 가능
- 멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹
멀티 스레드의 사용
- 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리하는 데에 사용
- UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용
- 여러 클라이언트의 요청을 처리하는 서버를 개발할 때에 사용
1) 장단점
(1) 장점
- 프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우, 메모리 공간과 시스템 자원의 소모가 줄어듦
- 프로세스 간 통신 방법(IPC)에 비해 스레드 간의 통신 방법이 훨씬 간단 : 스레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하기 때문
- 시스템의 처리량(Throughput)이 향상되고 자원 소모가 줄어들어 자연스럽게 프로그램의 응답 시간이 단축
(2) 단점
- 멀티 프로세스 기반으로 프로그래밍할 경우 프로세스 간 공유하는 자원이 없기 때문에 동일한 자원에 동시에 접근하는 일이 없었지만, 멀티 스레딩을 기반으로 프로그래밍할 때에는 공유하는 자원에 대한 고민 필요
- 서로 다른 스레드가 같은 데이터에 접근하고, 힙 영역을 공유하기 때문에 서로 다른 스레드가 서로 사용중인 변수나 자료구조에 접근하여 잘못된 값을 읽어오거나 수정하는 일 발생 가능
- 따라서, 멀티스레딩 환경에서는 동기화 작업이 필요 : 동기화를 통해 작업 처리 순서를 제어하고, 공유 자원에 대한 접근을 제어해야 함
2) 동시성과 병렬성
Concurrency(동시성, 병행성)
: 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각을 불러일으킴
Parallelism(병렬성)
: 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨
- 동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한됨
- 시분할 : 운영체제(또는 가상 머신)가 각 스레드를 시간에 따라 분할하여 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 하는 방식
3) Context Switching
- 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행중인 태스크(프로세스, 스레드)를 멈추는 것을 의미