일단 씻고 나가자

23.04.17 본문

Study/닥치는 대로 주워 담기

23.04.17

일단 씻고 나가자 2023. 4. 18. 05:39

2023. 04. 17 월요일

 

- [Java] Arrays.sortcomparator를 적용하는 방법?

: Arrays.sort(arr, new Comparator<int[]> { @override public int compare(int[] o1, int[] o2) { ~~ } });

 

람다식을 활용할 수도 있다.

Arrays.sort(arr, (o1, o2) -> { ~~ });

https://ifuwanna.tistory.com/328

 

 

- [Java] return으로 초기화된 배열을 바로 보내는 법?

: return new int[] {1};

 

 

- fork()란 무엇이며 서버에서 왜 쓰이는지?

: LINUX 환경에서 모든 프로세스는 부모를 갖고, 따라서 부팅 시 swapper이라는 0번 프로세스를 만들고 이를 이용해서 init 프로세스를 만들며 init이 모든 프로세스의 부모가 된다. (init을 통해 자식을 만들어줌.)

 

프로세스는 스스로 프로세스를 만들 수 없으니, OS에게 요청해 자식 프로세스를 만든다. 이때 부모의 pid는 양수이고 자식은 0이다. 이런 pid가 다름을 이용하여 각 프로세스는 같은 일이 아닌 다른 일을 하게 되고, 이는 스레드처럼 동작한다. fork로 만들어진 자식 프로세스는 해당 프로세스의 처음부터 실행되는 것이 아닌 호출된 순간부터 실행된다.

 

서버에서는 하나의 프로세스가 서버처럼 켜져 있다가, 호출이 들어오면 자식 프로세스를 만들어 처리하고 부모 자신은 계속 호출을 기다리는 방식으로 작동한다.

https://structuring.tistory.com/130

https://kldp.org/node/32210

 

 

- IPC는 왜 중요한가? IPC 기법 8가지? IPC의 이슈와 해결 방안 두 가지?

: fork()로 만들어진 멀티 프로세스 환경에서 프로세스 간 통신의 부분에 중요하다. 스레드처럼 공유 메모리가 존재하지 않기 때문에, 프로세스 간 의사소통을 위해 통신을 위한 별도의 공간이 필요하다. 인터넷 통신을 IPC의 확장으로 이해할 수 있다. (서버-클라와의 통신과 유사) 상황에 맞는 IPC의 선택이 중요하다.

 

1. PIPE (Anonymous PIPE)

// 통신할 두 프로세스가 명확할 때, 하나의 프로세스는 쓰기, 다른 하나의 프로세스는 읽기처럼 단일 기능을 가진 파이프를 연결한다. (이때 두 프로세스는 부모-자식 or 형제간 통신에만 가능하다. , 외부 프로세스에 사용할 수 없다) 이를 Half-Duple(반이중) 방식이라 하며, /수신 모두를 원한다면(전이중 통신) 파이프를 두 개 연결하면 되지만 구현이 복잡해진다.

 

2. Named PIPE FIFO 방식

// 프로세스 통신을 위해 이름이 있는 파일을 사용하며, 원칙적으론 읽기/쓰기가 동시에 가능하지 않지만 파일 두 개를 열어 해결할 수 있음. (두 개의 파이프와 두 개의 FIFO 파일이 필요함) 특정 프로세스가 모든 프로세스와 통신을 할 수 있다.

 

3. Message Queue

// 선입선출로 Named PIPE와 유사하지만, 데이터 흐름이 아닌 메모리 공간을 이용하여 쓸 데이터에 번호를 붙여 여러 프로세스가 동시에 데이터를 다룰 수 있음.

 

4. Shared Memory (공유 메모리)

// 통신 방식이 아닌 데이터를 아예 공유하는 것. 특정 프로세스가 공유 메모리 할당을 커널에 요청하면 커널은 메모리를 할당해주고, 이후 어떤 프로세스건 해당 공유 메모리 영역을 이용할 수 있음. 중개자 없이 바로 접근할 수 있어 모든 IPC 중 가장 빠르다.

 

5. Memory Map

// 열린 파일을 메모리에 매핑시켜서 공유 메모리처럼 공유.

 

6. Socket

// 네트워크 통신처럼, 양쪽 프로세스에서 임의의 port를 맡아 연결하고 11로 데이터를 주고받는다.

 

7. Signal

// 커널 또는 프로세스에서 다른 프로세스에게 어떤 이벤트가 발생 되었는지를 알림.

 

이렇게 IPC에서 공유자원에 접근하기 때문에 데이터를 동기화하고 보호하기 위해 세마포어와 뮤텍스를 사용한다.

https://dar0m.tistory.com/233

https://jwprogramming.tistory.com/m/54

https://devraphy.tistory.com/m/175

 

 

- SemaphoreMutex? 둘의 설명과 차이?

: Mutex는 공유자원에 접근하기 위해선 특정 keyobject가 필요하며 동기화 대상이 하나일 때 사용하고,

Semaphoresignaling mechanism으로 공유자원에 접근할 수 있는 개수를 숫자로 표현하며 동기화 대상이 하나 이상일 때 활용. (양의 정수 Counting, 1 Binary semaphore)

 

Mutexlocking mechanism으로 공유자원을 사용한 스레드만이 lock을 해제하고 나올 수 있지만, semaphoresignaling mechanism으로 signal을 통해 기다리는 스레드도 lock을 해제할 수 있다.

https://worthpreading.tistory.com/90

https://mangkyu.tistory.com/104

https://heeonii.tistory.com/14

https://jhnyang.tistory.com/101

 

 

- 메모리 구조 두 가지와 그중 사용자가 사용하는 영역의 종류?

: 메모리는 커널, 유저(사용자) 영역으로 나뉘며 커널 영역은 시스템의 통제를 맡고 있기에 System call로의 전환으로만 접근이 가능하다.

유저 영역은 스택, , 데이터, 코드 영역으로 나뉘며,

스택 함수(지역, 매개 변수) / 동적 할당 변수 / 데이터 전역, 정적 변수 / 코드

네 가지의 세그먼트를 하나의 세그먼트로 묶어 구분한다.

https://hdacker.tistory.com/m/6

 

 

- 스레드의 장단점?

: IPC가 필요 없고 문맥 교환의 비용이 적게 들지만 하나의 스레드에서 발생한 문제가 프로세스 전반에 영향을 미치며, 자원을 공유하기에 동기화 문제가 생긴다.

 

 

- 기아/교착 상태란?

: 기아 상태 (Starvation) // 특정 프로세스가 영원히 자원 할당이 되지 않는 경우. (우선순위 조정 필요)

교착 상태 (Deadlock) // 서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기.

 

 

- [Effective Java] configuration 클래스의 내부 필드 정의의 주의할 점? 해결책?

: 필드를 직접 static으로 값을 명시하면 서버의 환경 (국가)마다 값이 맞지 않을 수 있으므로 주의를 요한다. (ex. 주소 필드 혹은 번호 필드는 지역, 국가마다 다르므로 특정 값이나 자릿수로 명시했을 때 오류 발생)

따라서 DI로 서버에서 객체를 받아 해당 서버의 정보를 가져와 필드를 초기화하는 방법을 사용하자.

 

 

- [Git] local 저장소와 github를 연결할 때의 명령어? 설명?

: git remote add origin github의 주소

현재 위치하고 있는 local 저장소에서 remote 저장소를 add 할 건데 주소의 별명은 origin.

git push u origin main

-u 명령어는 현재 local 디렉토리 기준, 앞으로 push 명령어만 입력하면 origin 주소의 main branchpush 하겠다. 이후 자동 연결되며, commit 이후 push를 하면 자동으로 github와 연결된다.

 

추가로 이미 github에 있는 원격 저장소를 다른 컴퓨터, 혹은 폴더로 옮기는 방법은

git clone github의 주소 . 이다.

이때 ‘.’은 현재 디렉토리를 의미한다.

 

 

- 운영체제의 3가지 역할?

1. 시스템 자원(system resource 하드웨어 (CPU, Memory, I/O, HardDisk...)) 관리자

// 각 프로그램이 얼마나 CPU를 사용할지, 메모리 주소 위치와 공간 확보, I/O의 표시

 

2. 사용자와 컴퓨터 간의 커뮤니케이션 지원

// 쉘의 역할

 

3. 응용 프로그램 제어

// 응용 프로그램이 요구하는 권한의 허용과 응용 프로그램 중지 실행 등 (+관리자 권한)

 

 

- 프로세스란? 프로세스가 실행되는 단계?

: 실행된 프로그램을 프로세스라 칭한다. (작업, task, job)

정확하게는, 폰 노이만의 컴퓨터 구조에서 프로그램의 실행으로 메모리에 해당 코드가 올라가고 01 기계어로 바뀌었을 때를 칭하며 응용 프로그램의 파일 형태는 코드 이미지, 혹은 바이너리라고도 한다.

 

 

- 배치 처리 시스템이란?

: Batch Processing. 최초의 운영체제는 현대처럼 여러 프로세스를 동시에 실행시키지 못했고, 단일 프로세스가 끝난 후 사용자에게 다음에 실행할 프로세스를 또 등록받아 실행하는 구조였다. 그러다 보니 사용자 입장에서는 실행 중인 프로세스가 끝나기를 기다릴 수밖에 없었는데, 그를 해결하기 위해 프로세스가 종료되면 자동으로 다음에 등록된 프로세스를 실행해주기만 해주는 기능을 구현하여 사용자는 실행할 프로세스를 등록해두기만 하면 됐었다. 이것이 배치 처리 시스템이라 하는 스케줄링 기법이다.

'Study > 닥치는 대로 주워 담기' 카테고리의 다른 글

23.04.19  (0) 2023.04.20
23.04.18  (0) 2023.04.19
23.04.13  (0) 2023.04.14
23.04.12  (0) 2023.04.13
23.04.11  (0) 2023.04.12