[컴퓨터 구조] 메모리 & 프로세스와 스레드

D A S H B O A R D
D E V E L O P
S E C U R I T Y
 프로그래밍 에러 종류  논리적 에러  컴파일 에러  런타임 에러  Java 에러 & 예외  Checked / Unchecked Exception
주요내용
Reference

 메모리 구조

코드(Code) 영역
실행할 프로그램의 코드가 저장되는 영역
CPU는 해당 영역의 명령어들을 가져와 실행함
READ + EXECUTE 권한을 가지고 있음
Text 영역으로도 불림
데이터(Data) 영역
전역 변수와 정적(static) 변수가 저장되는 영역
프로그램 시작과 동시에 할당되며 종료와 동시에 해제됨
READ 권한을 가지고 있음
힙(Heap) 영역
사용자가 관리할 수 있고 해야만 하는 영역 (Memory Leak 가능성)
동적으로 할당되는 메모리 공간
new 연산자로 생성되는 객체들이 저장됨
READ + WRITE 권한을 가지고 있음
스택(Stack) 영역
지역 변수와 매개변수가 저장되는 영역
함수 호출 시 생성되고 함수가 종료되면 자동으로 반환됨 → 지역변수, 매개 변수, Caller의 주소 등을 저장
READ + WRITE 권한을 가지고 있음
데이터(Data) 영역은 3가지 영역으로 세분화된다.
data : 초기화된 전역, 정적 변수가 저장됨
bss : 초기화되지 않은 전역, 정적 변수들이 저장됨
rodata : 상수들이 저장되는 영역
주의점!
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸됩니다.
힙 영역은 메모리 누수(Memory Leak)의 주요 원인이 될 수 있으므로 적절한 관리가 필요합니다.
데이터 영역의 변수들은 프로그램의 시작부터 종료까지 메모리에 존재합니다.

 Process & Thread

Process : 운영체제로부터 작업을 할당받은 Task의 단위 → CPU에게 자원을 할당받아 메모리에 적재되어 실행중인 프로그램
Thread : 프로세스가 할당받은 자원을 이용하는 실행흐름의 단위 → 프로세스 내에서 자원 효율적으로 여러 작업을 동시에 실행하기 위한 실행 흐름
Thread 자원 공유
프로세스가 생성이되면 메모리 상에 자원을 할당 받아 code, data, heap, stack 영역으로 나뉜 공간을 할당 받는다. 그럼 쓰레드는?
쓰레드는 프로세스 내 실행흐름의 단위로 프로세스의 자원을 공유 받음
But, code, data, heap 3가지 영역은 프로세스의 영역을 공유 받고 Stack 영역만 각 쓰레드 별로 할당됨 → 각 실행 흐름별로 생기는 지역변수, Caller 등이 다르기 때문에 쓰레드 충돌을 막기 위함
해당 에러는 프로그램은 정상적인 동작으로 인식하기 때문에 별 다른 에러를 뱉지 않는다. 하지만 해당 에러는 어떠한 오류도 내지 않기 때문에, 그 어떠한 에러보다 개발자들이 싫어하는 오류이다.
주의점!!
논리적 에러는 향후 취약점으로 연결될 수 있다.
의도와 다르게 동작하기 때문에 서비스 가용성에 문제가 생길 가능성이 크다.
해당 에러를 잡기 위해서는 모든 코드를 디버깅 해봐야 하는 불상사가 생길 수 있다…..

 Context Switching

프로세스 상태
생성(New) : 프로세스가 생성되었지만 실행 준비 X
준비(Ready) : CPU를 할당받으면 바로 실행가능한 상태
실행(Running) : CPU를 할당받고 실행중인 상태
대기(Waiting) : 프로세스가 특정 이벤트에 의해 대기, 이벤트가 발생하면 다시 ready로 변경
종료(Terminate) : 실행완료에 모든 자원에서 해제된 상태
CPU가 한 프로세스(쓰레드)에서 다른 프로세스(쓰레드)로 전환할 때 발생하는 일련의 과정
CPU의 코어는 한번에 하나의 프로세스만 실행할 수 있기 때문에 여러 프로세스를 번갈아가며 실행하여 CPU의 활용률을 높이고자 함
동작중인 Process가 대기하면서 해당 프로세스의 상태 (Context)를 보관하고 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업 → 이는 CPU 스케쥴러가 관리한다.
교착상태 (DeadLock)
→ 다중 프로그래밍 시스템 하에서 서로 다른 프로세스가 일어날 수 없는 사건을 무한정 기다리며 더 이상 진행되지 못하는 상태(circular wait)
→ 교착상태 발생 조건
상호 배제: 동시에 여러 프로세스 사용 불가
점유와 대기: 다른 자원을 점유하면서 자신에게 할당된 자원 미해제
비중단(비선점) 조건: 프로세스에 할당된 자원을 끝날 때 까지 강제 해제 불가
순환 대기(Circular wait): 각 프로세스가 꼬리를 물며 자원 점유하고 있어야 한다.
⇒ 자원과 프로세스의 관계를 그래프로 표현을 한 자원 할당 그래프를 통해 시스템의 교착상태를 파악 ⇒ 일반적으로 자원할당 그래프는 시스템 내부의 모든 프로세스의 집합인 P와 모든 자원의 집합인 R로 정점의 집합 V를 구성, P로 부터 R로 벗어나는 간선은 특정 프로세스가 해당 자원을 요청하고 기다리는 것을 표시하고 자원 R에서 P로 뻗어나가는 간선은 할당 간선으로 해당 자원이 해당 프로세스에 할당 되었음을 나타냄
→ 교착상태 해결 방법
예방: 교착상태 발생 조건이 모두 성립되지 않도록 하는 방법
회피: 교착상태 발생 조건 중 일부는 성립될 수 있으나, 교착상태를 발생하지 않도록 하는 방법
탐지: 교착상태 발생을 허용하고, 발생 시 이를 발견하여 원인 규명
복구: 교착상태 발견 후, 순환 대기를 제거하거나, 자원을 중단

 프로세스 스케쥴링

운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고 CPU를 할당하는 작업
다양한 알고리즘으로 동작
크게, Non-Preemtive(비선점형), Preemtive(선점형)으로 구분
Non-Preemtive(비선점형)
CPU에 올라오는 프로세스는 CPU 점유 시간을 모두 채우고 나올 수 있다.
Ex. FCFS, SJF, HRN
Preemtive(선점형)
알고리즘을 이용해 CPU에 올라간 프로세스가 점유시간을 채우지 않고 내려올 수 있게 함
EX. RR, SRT, Multi-Level Queue