프로세스 구조에 대해 가능한 상세하게 설명해 주세요
프로세스는 Code(Text), Data, Stack, Heap 4가지 영역으로 구성되어 있습니다. 먼저 Code혹은 Text 영역은 작성한 코드들이 순서대로 실행되기 위해서 보관되는 영역이고 data영역은 전역변수와 같이 코드의 실행중에 계속 유지해야 할 데이터를 할당하는 영역입니다.
heap영역은 코드를 실행할때 동적으로 필요한 메모리를 할당하기 위한 영역이고 Stack 영역은 함수가 동작하는 영역으로 역순으로 명령어들이 쌓이면서 실행이되고 다시 위에서부터 하나씩 삭제되면서 원래 코드로 돌아오는 구조를 가지고 있습니다.
컨텍스트 스위칭에 대해 가능한 상세하게 설명해주세요
컨텍스트 스위칭은 스케쥴러에 의해 실행될 프로세가 교체되는 것을 말합니다. 프로세스 교체시 CPU에서 다음 실행할 명령을 기록하는 PC레지스터와 프로세스 스택영역에 최상단주소를 기록하는 SP레지스터의 정보를 가져와 각 프로세스별로 작성되는 PCB에 기록하고
다음 실행될 프로세스에 PCB에서 PC와 SP를 각각 불러와 CPU 레지스터에 덮어씌워서 다음프로세스가 실행되도록 합니다. 이렇게 cpu에서 작업되고 있는 프로세스가 교체되는 일련의 과정을 컨텍스트 스위칭이라고 합니다.
프로세스간에는 어떻게 통신하는지 가능한 상세하게 설명해주세요
프로세스간에 공간은 분리되어 있기 때문에 프로세스 통신을 위해서는 특별한 기법이 필요하고 이러한 특별한 기법을 IPC라고 부릅니다. 대부분의 IPC기법은 프로세스내의 커널공간을 활용하는데 분리되어 있는 사용자 공간과는 다르게 커널공간을 프로세스 간에 공유되는 공간이기 때문입니다.
이렇게 커널공간을 활용하는 IPC방식으로는 파이프, message quue, share memroy 방식이 있습니다. 이외에도 file을 활용하는 방식이 있지만 실시간으로 통신이 불가능하다는 단점이 있습니다
프로세스간에는 어떻게 통신하는지, 쓰레드와 비교해서 가능한 상세하게 설명해주세요
쓰레드는 하나의 프로세스안에서 수행에 필요한 부분만 스택메모리로 로딩해서 사용함기 때문에 기본적으로 공통된 자원을 공유하지만 프로세는 다른 프로세스와 독립적으로 구성되기 때문에 스레드에 비해 프로세스간 통신이 어렵다 단점이 있습니다.
하지만 구분되어 있는 프로세스 사이에도 커널공간이라는 공유되는 공간이 있는데 이곳에 메모리 공간을 만들어 프로세스간에 통신을 하게 되는 방식을 주로 사용하게 됩니다.
프로세스와 쓰레드의 차이점에 대해 설명해주세요
프로세스는 Code영역, Data영역, Heap영역, Stack영역이 온전하게 구비된 하나의 응용프로그램이 메모리에 로딩된 상태를 뜻하고 쓰레드는 해당 응용프로그램내에서 특정 작업을 더 효율적으로 수행하기 위해서 스택영역만 생성하여 사용하는 일종의 함수같은 기능을 뜻합니다.
그래서 프로세스 간에는 서로 데이터에 대한 접근을 할 수없기 때문에 특별한 기법이 필요하지만 스레드는 하나의 프로세스의 공유된 공간활용하기 때문에 프로세스 내의 데이터 모두 접근이 가능합니다. 또한 스레드의 경우 하나의 프로세스안에서 동작하기 때문에
하나의 프로세스가 문제가 생기면 전체 프로세스의 영향이 가지만 프로세스는 독립적으로 구성되기 때문에 하나의 프로세스에 문제가 생겨도 다른 프로세스에 영향을 주지 않는다는 차이점이 있습니다
언제 멀티 프로세스를 사용하고, 언제 멀티 쓰레드를 써야하는지 가능한 구체적으로 설명해주세요
멀티프로세스와 멀티 쓰레드 모두 성능향상을 위해서 병렬적으로 cpu에 작업을 요청하기 위해서 사용하지만 하나의 프로세스안에서 공통의 영역을 공유하는 멀티스레드가 독립적인 공간을 가져서 프로세스간 통신을 위해 특정기법을 활용해야 하는
멀티프로세스에 비해 통신속도가 빠르기 때문에 성능적인 우위가 있어 대부분의 경우 멀티 스레드를 사용하게 됩니다. 하지만 멀티스레드의 경우 공통의 공간을 공유한다는 특징때문에 동시성 문제가 발생할 수 있기 때문에 이를 해결하기 위한 기법을 사용 이것이 오히려
비효율성이 커질때는 멀티 프로세스를 사용하게 됩니다
쓰레드와 동기화란 무엇이며 왜 사용해야하는지 예를 들어 설명해주세요
만약 하나의 스레드가 특정 변수의 값을 읽고 더하고 저장하기라는 명령어로 구성되어 있더라도 멸티스레드 환경에서는 순차적으로 하나의 스레드의 요청이 끝나면 다른 스레드의 요청을 순차적으로 실행하는 것이아닌 명령어 실행 중간에도 스케쥴러에 의해 컨텍스트 스위칭이 일어날 수 있습니다
그래서 우리가 기대하는 읽고 더하고 쓰고에 반복이 아닌 읽고 더하고 다시 읽고 더하고 쓰고 쓰고라는 의도치 않는 순서로 작업이 일어날 수 있게 되고 이로 인해 실행할때마다 결과값이 달라지는 동시성 문제가 발생하게 됩니다.
이를 해결하기 위해 스레드간의 동기화를 해주어야 하며 이는 하나의 스레드가 순차적으로 작업을 완료할수 있게 보장해주기 위해 일종의 키를 만들어 키를 가진 스레드만 작동하고 다시 키를 반납하여 다른 스레드가 작동하는 방식으로 구현이 됩니다
뮤텍스와 세마포어의 차이점에 대해 간략히 설명해주세요
뮤텍스와 세마포어 모두 멀티스레드 환경에서 동기화 이슈를 해결하기 위해 동기화 이슈가 발생하는 영역에 대한 스레드의 접근을 제한하는 방식이지만 뮤텍스의 경우 하나의 스레드만 임계구역에 접근할 수 있게 허용하고
세마포어의 경우 여러개의 스레드가 동시에 접근할 수 있게 허용하는 방식을 뜻합니다. 세마포의 경우 counter를 두어서 동시에 접근할 수있는 스레드의 수를 설정할 수 있습니다.
class Solution {
public int solution(int n) {
StringBuilder stringBuilder = new StringBuilder();
while (n >= 3) {
stringBuilder.append(n % 3);
n = n / 3;
}
if (n > 0) {
stringBuilder.append(n);
}
String str = stringBuilder.toString();
char[] chars = str.toCharArray();
int count = 0;
int sum = 0;
for (int i = chars.length - 1; i >= 0; i--) {
int temp = chars[i] - '0';
count *= 3;
if (i == chars.length-1) {
sum += temp;
count++;
continue;
}
sum += (temp * count);
}
return sum;
}
}