운영체제란?
운영체제는 컴퓨터 하드웨어가 컴퓨터 소프트웨어와 통신하고 작동하도록 하는
소프트웨어 프로그램이다.
운영체제의 주목적은 무엇인가?
운영체제에는 두 가지 주요 목적이 있다.
- 컴퓨터 시스템의 계산 활동을 관리하여 컴퓨터 시스템이 제대로 작동하도록 한다.
- 프로그램 개발 및 실행을 위한 환경을 제공한다.
프로세스와 스레드의 차이 (Process vs Thread)
※ 참고 : 메모리 영역
코드(Code) 영역 : 프로그램 소스 코드를 저장 (프로그램 명령)
데이터(Data) 영역 : 전역변수, 정적변수, 배열 등
스택(Stack) 영역 : 지역변수, 매개변수, 리턴 값 (임시 메모리 영역)
힙(Heap) 영역 : 동적 할당 시 사용 (new(), malloc() 등)
✔️ 프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 프로세스 주소 공간이 할당됨
✔️ 프로세스 주소 공간
더보기
프로그램이 CPU에 의해 실행됨 → 프로세스가 생성되고 메모리에 '프로세스 주소 공간'이 할당됨
✔️ 메모리 영역
1) Code (Text)
- 우리가 작성한 소스코드가 들어 가는 부분. 즉, 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(code)영역 이라고도 부른다.
- 코드영역은 실행 파일을 구성하는 명령어들이 올라가는 메모리 영역으로 함수, 제어문, 상수 등이 여기에 지정된다.
- 컴파일 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 지정돼있다.
2) Data
- 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역이다. 즉, 프로그램이 구동되는 동안 항상 접근 가능한 변수가 저장되는 영역이다.
- 전역변수, static 값을 참조한 코드는 컴파일 하고 나면 Data 영역의 주소값을 가르키도록 바뀐다.
- 데이터 영역은 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
- 실행 중도에 전역변수가 변경 될 수도 있으니 이 영역은 Read-Write로 지정돼있다.
- 초기화 된 데이터는 Data 영역에 저장되고,초기화 되지 않은 데이터는 BSS(Block Stated Symbol)영역에 저장된다.
3) Stack
- 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.
- Stack은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.
- 원시타입의 데이터가 값과 함께 할당된다.
- Heap 영역에 생성된 Object 타입의 데이터 참조값이 할당된다.
- 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
- 컴파일 타임에 크기가 결정되기 때문에 무한히 할당 할 수 없다. 재귀함수가 너무 깊게 호출되거나 함수가 지역변수를 너무 많이 가지고 있어 stack 영역을 초과하면 stack overflow 에러가 발생한다.
4) Heap
- 런타임에 크기가 결정되는 메모리 영역이다.
- 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
- 참조형의 데이터의 값이 저장된다.
- 예를 들어 클래스가 이 부분에 해당 된다.
- Heap은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
- HEAP과 STACK영역은 사실 같은 공간을 공유한다. HEAP이 메모리 위쪽 주소부터 할당되면 STACK은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 HEAP OVERFLOW, STACK OVERFLOW라고 칭합니다.
※ 스택과 힙은 동적 할당이 되며, 동적 할당은 런타임 단계에서 메모리를 할당받는 것이다.
※ 데이터 영역과 코드 영역은 정적으로 할당되며, 정적 할당은 컴파일 단계에서 메모리를 할당하는 것이다.
✔️ 프로세스
- 정의 : 컴퓨터에서 실행 중인 프로그램.
- 특징
- 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
- 프로세스들은 독립적이기 때문에, 통신하기 위해 IPC(inter-process communication, 프로세스 간의 통신)를 사용해야 한다.
- 프로세스는 최소 1개의 쓰레드(메인 쓰레드)를 가지고 있다.
✔️ 쓰레드
- 정의 : 프로세스 내에서 실행되는 여러 흐름의 단위.
- 특징
- 스레드는 프로세스 내에서 각각 Stack만 따로 할당받고, 메모리 영역(Code, Data, Heap)은 공유한다.
- 따라서 다른 쓰레드의 실행 결과를 즉시 확인할 수 있다. (∵ 자원 공유)
- 프로세스 내에 존재하며, 프로세스가 할당받은 자원을 이용하여 실행된다.
✔️ 정리
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
프로세스는 운영체제로부터 메모리, 주소 공간 등을 할당받고,
스레드는 할당받은 자원들을 내부 스레드끼리 공유하면서 실행된다.
멀티 프로세스 vs 멀티 쓰레드
✔️ 멀티 프로세스
하나의 프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 병렬적으로 작업을 수행하는 것.
- 장점
- 안정성 (메모리 침범 문제를 OS 차원에서 해결)
- 하나의 프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않고 계속 실행
- 단점
- 각각 독립된 메모리를 갖고 있어, 작업량이 많을수록 오버헤드 발생. Context Switching으로 인한 성능 저하
- 멀티 쓰레드보다 많은 메모리 공간과 CPU 시간을 차지
※ Context Switching이란?
- 프로세스의 상태 정보를 저장하고 복원하는 일련의 과정
- 즉, 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고,
대기하고 있던 다음 순번의 프로세스가 동작하면서
이전에 보관했던 프로세스 상태를 복구하는 과정이다.
→ 프로세스는 각 독립된 메모리 영역을 할당받아 사용되므로,
캐시 메모리 초기화 같은 무거운 작업이 진행되었을 때 오버헤드가 발생할 문제가 존재함.
✔️ 멀티 쓰레드
하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것.
때문에 스레드들이 공유 메모리를 통해 다수의 작업을 동시헤 처리하도록 해줌.
- 장점
- 적은 메모리 공간을 차지하고 문맥 전환이 빠름.
- 프로세스를 위해 자원을 할당하는 시스템콜이나, Context Switching의 오버헤드를 줄일 수 있음.
- 쓰레드는 메모리를 공유하기 때문에, 통신이 쉽고 자원을 효율적으로 사용할 수 있음.
- 단점
- 하나의 쓰레드에 문제가 생기면, 전체 프로세스가 영향을 받는다. (∵ 공유 메모리를 갖기 때문)
- 여러 쓰레드가 하나의 자원에 동시 접근하는 경우, 자원 공유(동기화)의 문제가 발생할 수 있음.
- 교착상태를 발생시킬 수 있다.
✔️ 멀티 프로세스 대신 멀티 스레드를 사용하는 이유는?
프로그램을 여러 개 키는 것보다, 하나의 프로그램 안에서 여러 작업을 해결하는 것이다.
1. 자원의 효율성 증대
- 스레드는 프로세스 내의 메모리를 공유하기 때문에
독립적인 프로세스와 달리 스레드 간 데이터를 주고받는 것이 간단해지고,
시스템 자원 소모가 줄어들게 된다.
- 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우,
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
(프로세스 간의 Context Switching 시, 단순히 CPU 레지스터 교체 뿐만 아니라
RAM과 CPU 사이의 캐시 메모리에 대한 데이터까지 초기화 되므로 오버헤드가 크기 때문)
2. 처리 비용 감소 및 응답 시간 단축
- 프로세스 간의 통신(IPC)보다 스레드 간의 통신 비용이 적으므로,
작업들 간의 통신의 부담이 줄어든다.
(스레드는 Stack 영역을 제외한 모든 메모리를 공유하기 때문)
- 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 빠르다.
(Context Switching 시, 스레드는 Stack 영역만 처리하기 때문)
출처
- https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
- https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Operating%20System/Process%20vs%20Thread.md
- https://dev-coco.tistory.com/162
- https://hyonee.tistory.com/95
- https://mangkyu.tistory.com/92
- https://hongchan.tistory.com/44
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 데드락 (DeadLock, 교착 상태) (0) | 2023.02.01 |
---|---|
[운영체제] CPU 스케줄링 알고리즘 (0) | 2023.02.01 |
[운영체제] PCB & Context Switching (0) | 2023.01.27 |
[운영체제] 시스템 콜(System Call) (0) | 2023.01.26 |
[운영체제] 인터럽트(Interrupt) (0) | 2023.01.26 |