보기 좋게 수정 할 예정~
멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다.
힙 영역을 통해서 스레드간 통신이 가능해서 프로세스간 통신보다 간단합니다.
스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다.
단점
힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다.
동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다.
하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.
상호 배제(Mutual Exclusion): 한 프로세스가 임계구역에서 동작중이면 다른 프로세스는 접근할 수 없다.
진행(Progress): 임계구역에서 작업중인 프로세스가 없다면 입계구역으로 진입하려는 프로세스를 진입할 수 있도록 합니다.
유한 대기(Bounded Waiting): 무한대기로 인해 기아상태가 발생하는걸 막아주기 위해 한정된 대기 시간을 가져야합니다.
임계영역 해결 방법은 뮤텍스와 세마포어
페이지는 모두 같은 크기를 가진다.
물리주소 공간을 페이지와 같은 사이즈로 나눈 것들을 프레임이라고 한다.
페이지 테이블을 이용해 논리주소에서 프레임을 가리키는 물리주소로 매핑한다.
외부 단편화는 발생하지 않으나, 내부 단편화는 발생한다.
세그멘테이션은 논리적 내용을 기반으로 나눠서 메모리에 배치하는것을 의미한다. code영역, data영역, stack영역 등으로 나눠서 물리메모리에 저장한다. 세그먼트는 크기가 일정하지 않아, limit 정보가 추가로 들어가 있다. 내부단편화는 적지만 외부 단편화가 발생한다
둘의 비교
세그멘테이션은 페이징보다 보호와 공유 면에서는 더 낫다.
세그멘테이션은 read/write/execute 권한을 테이블에 추가하는데, 이때 이것을 논리적으로 나누기 때문에 해당 비트를 설정하기 간단하고 안전하다. 반면, 페이징은 code+data+stack 영역이 존재할 때 이를 일정한 크기로 나누기 때문에 영역이 섞여 비트를 설정하기 까다로워질 수 있다.
공유의 측면에서도 마찬가지로, 페이징은 영역이 섞일 가능성이 존재하지만, 세그멘테이션은 정확히 영역을 나누므로 더 효율적으로 공유를 할 수 있다.
하지만, 현재 대부분은 페이징 기법을 세그멘테이션보다 많이 사용한다.그 이유는 세그멘테이션의 세그먼트 크기가 일정하지 않고 다양하기 때문이다. 세그먼트의 크기가 다양하기 때문에 다양한 hole이 발생해 외부단편화가 발생하여 메모리 낭비가 크게 된다.
가상메모리라는것이 어디서 부터 할당되어 오는지 또한 정리가 돼있으면 좋을 것 같습니다.
Thread-safe하게 자바 코드를 작성한 적이 있나요 라는 질문이 나온다면 AtomicLong 등과 같은 래퍼 클래스를 사용 해본 적이 있다고 말씀하시면 좋을 것 같습니다!
저도 Cocurrent의 개념을 최근에 학습하게 되었는데, 8코어 16스레드와 같은 다중스레드가 보편화된 요즘에는 자바 개발자라면 무조건 알아야 할 개념 같습니다.
동기 비동기 방식의 차이에 있어서는 직접 프로젝트에 도입해본 경험을 정리 해보시는 것도 좋을 것 같습니다. spring은 동기 node.js는 비동기라고 보편적으로 알려졌지만, spring5부터 Spring WebFlux라는 개념이 도입 된 이후 논블락킹 방식인 비동기 처리 기술이 보급 되었습니다. 예를 들면 Spring Cloud Gateway같은 경우 Spring WebFlux stack 아래에서 기본적으로 작동하고 있습니다.MVC stack의 어플리케이션의 경우, 탐킷이 기본적으로 켜지는데, WebFlux stack 의 경우에는 nettty 서버가 자동으로 켜지는 것 부터 차이를 느낄 수 있죠.
다양한 질문들을 잘 작성하신 것 같아서 좋습니다. 다만 본인의 경험을 연관 지어서 정리해보는 시간도 가지시면 더 좋은 블로그가 될 것 같습니다!