[F-Lab 모각코 챌린지] 11일차
F-Lab 모각코 챌린지 11일차 순수 함수의 개념과 주의점, 프로세스간 자원 공유 방법, 컨텍스트 스위칭을 줄이는 방법들, IPC를 간단하게 학습하였습니다. 흥미로운 부분은 LinkedList 대신 ArrayList 를 사용하면 컨텍스트 스위칭이 줄어들 수 있다는 것이였습니다.
![[F-Lab 모각코 챌린지] 11일차](/content/images/size/w1200/2023/06/---_---_---.png)
순수함수(pure function)
개념
순수 함수는 아래의 조건을 만족하는 함수
- 같은 입력에 대해 항상 같은 결과를 출력하는 함수
- 함수의 바깥 영역에 side effect 를 초래하지 않는 함수
(함수의 외부 데이터나 함수에 전달된 데이터를 변경하지 않는 함수)
순수 함수 사용 시 주의점
- 외부의 상태를 변경하지 않아야 함
- 불변성 유지:
순수 함수 내부에서 사용하는 자료구조나 객체를 변경하지 않아야 함
Immutable 객체를 사용하거나 깊은 복사를 통해 원본 객체의 불변성을 유지해야 함 - 외부 의존성을 주입하여 사용
외부 리소스나 의존성을 사용해야 할 경우 직접 참조의 형태가 아니라 외부에서 주입 받아 사용해야 함 - 예외 처리는 함수 실행 결과를 예측하기 힘들게 만듬.
명확한 문서화와 처리 방법을 정의 해야 함. 명시적인 사이드 이펙트 제공을 통해 결과를 예측 할 수 있게 만들어야 함. - 불필요한 객체 생성이나 복사는 성능상 단점이 될 수 있으니 신중히 사용
프로세스간 자원 공유 방법
- 파일 공유
- IPC
- Shared memory: 공유 메모리(공유 메모리 세그먼트)
- Message passing: 메시지 전달 (파이프, 시그널, 메시지 큐, 소켓 등)
IPC(Inter-Process Communication)
프로세스간 데이터를 공유하고 메시지를 주고 받을 때 생기는 문제를 해결하기 위한 방법중 하나.
Shared memory
IPC 를 위해 메모리 영역을 구축하고 공유 영역을 통해 자원이나 데이터를 주고받음
- 장점
커널 의존성이 낮기 때문에 속도가 빠름. 유저 레벨에서 IPC 가 가능하기 때문에 통신이 자유로움. - 단점
자원과 데이터를 공유하기 때문에 동기화 이슈가 발생. 동기화 기술 필요
공유 메모리 세그먼트를 이용한 프로세스간 자원 공유
Java 에서 공유 메모리를 통한 프로세스간 자원 공유
Java 에서는 Java Native Interface(JNI) 를 사용하여 네이티브 코드로 직접 구현한 공유 메모리 세그먼트에 접근 가능.
- 공유 메모리 세그먼트 생성
운영체제에서 제공하는 공유 메모리 세그먼트를 생성
공유 할 데이터가 저장될 메모리 공간을 할당하는 단계. 일반적으로 운영체제의 특정 api 를 사용하여 세그먼트 생성 - 공유 메모리 세그먼트에 데이터 쓰기
- 공유 메모리 세그먼트에서 데이터 읽기
- 동기화
여러 프로세스가 동시에 공유 메모리에 접근 할 수 있으므로 동기화 메커니즘 수행. 세마포어나 락을 사용하여 수행
컨텍스트 스위치를 줄이는 방법들
불필요한 컨텍스트 스위칭을 제거함으로서 줄일 수 있다
- 동기화 최소화
락을 사용하여 여러 스레드 또는 프로세스가 동시에 접근 할 수 없는 자원을 보호하는 경우, 스레드가 락을 획득하거나 해제 할 때 마다 컨텍스트 스위치가 발생
불필요한 락을 제거하거나 락의 범위를 효율적으로 좁혀서 해결 - 너무 많은 일을 처리하는 스레드
멀티 스레드 환경에서 작업의 세분화가 부족한 경우, 한 스레드가 너무 많은 작업을 처리 하려고 할 때 컨텍스트 스위치가 빈번하게 발생 할 수 있다 - 비동기 프로그래밍으로 불필요한 대기 상태를 최소화
스레드가 락을 획득하기 위해 대기하면서 불필요한 컨텍스트 스위치가 발생 할 수 있음. 락을 기다리는 대신 비동기적인 방식으로 작업을 진행하여 컨텍스트 스위칭을 최소화. - 적절한 데이터 구조 활용
LinkedList 대신 ArrayList 를 활용함으로서 컨텍스트 스위칭 최소화
- 메모리 접근의 지역성:
배열은 연속된 메모리 공간에 데이터를 저장. LinkedList 는 각 노드가 독립적인 메모리 공간에 저장. ArrayList 는 메모리 상의 인접한 위치에 있는 요소에 접근 할 수 있으므로 CPU 캐시 지역성을 활용 할 수 있음. 따라서 캐시 미스가 줄어들고 메모리 시간이 단축되어 컨텍스트 스위칭 횟수 감소
- 순차적인 데이터 접근:
LinkedList 는 포인터 디리퍼런싱 등의 추가 작업을 필요로 하며 컨텍스트 스위칭을 발생 시킬 수 있음
- 공간 효율성:
ArrayList 는 메모리 상에서 고정된 크기의 연속된 공간을 사용. 이로 인해 메모리 사용량이 LinkedList 에 비해 줄어들고, 더 많은 데이터를 캐시에 저장할 수 있게 되어 컨텍스트 스위칭 횟수를 감소.