본문 바로가기
기타

[5주차] 멘토링 키워드 정리

by jaee_ 2021. 9. 12.

벌써 다음주면 멘토링 6주차에 접어든다. 6주동안 두꺼운 책을 읽으면서 그동안 몰랐던 자바의 기능들을 발견했다.. 

 

그동안 나름 공부한다고 공부를 했지만 온전히 내 것으로 만들지는 못하는 것 같다. 왜냐면 막상 멘토님께서 질문을 하시면 난 대답을 자신있게 하지 못하기 때문이다.. 머릿속으로는 그려지고 어떤것인지도 알고는 있는 것 같은데 조리있게 대답이 안된다...나중에 면접에서도 그럴 것 같아서 무섭다..ㅠ 

 

책을 읽을 때 이해하고 적용시키는 것도 좋지만 스스로에게 질문을 던지면서 대답하는 습관을 들여봐야겠다. 

 

멘토님께서 멘토링 시간에 질문에 대해 대답하지 못한것, 또는 더 깊게 알아보면 좋을 것 같은것들을 멘토링이 끝난 후에 정리해서 보내주신다. 오늘은 이 내용들에 대해서 알아보고 정리하는 시간을 가져보겠다. 이번주는 운영체제와 관련된 키워드들이라 사실 정리하면서도 이해를 못하는 내용이 많을 것 같다. 그래도 우선 정리하고 차근차근 하나씩 짚어가면서 이해하는 시간을 가지도록 하자. 

 


 

 📝  교착상태와 해결방법 

 

교착상태(deadlock)란 ? 멀티 프로세스 또는 멀티쓰레드 환경에서 공유하고 있는 일부 자원들을 점유하고 놓지 않으면서 다른 프로세스 또는 쓰레드가 가지고 있는 자원들을 원하여 무한정으로 기다리고 있는 상태를 말한다. 즉, 두 개의 프로세스 또는 쓰레드가 서로가 가지고 있는 락이 해제되기만을 기다리는 무한정 대기상태가 되는 상태이다. 

 

교착상태 발생조건

  • 상호배제 ( Mutual Exclusion ) : 한 자원에 대해 여러 쓰레드 동시 접근 불가
  • 점유와 대기 ( Hold and Wait ) : 자원을 가지고 있는 상태에서 다른 쓰레드가 사용하고 있는 자원 반납을 기다리는 것
  • 비선점 ( Non Preemptive ) : 다른 쓰레드의 자원을 실행 중간에 강제로 가져올 수 없음
  • 환형대기 ( Circle Wait ) : 각 쓰레드가 순환적으로 다음 쓰레드가 요구하는 자원을 가지고 있는 것

위의 네가지 조건을 모두 만족하게 되면 교착상태(deadlock)가 발생한다. 아래는 환형대기를 그림으로 표현한 것으로 두 개의 프로세스가 자원을 점유하고 놓지 않으면서 다른 자원을 원하여 무한정 기다리는 상태이다. 

 

 

교착상태를 해결하는 방법

이런 교착상태를 해결하는 방법은 총 네가지가 있다. 

 

1. 예방( Prevention )

교착상태 발생 조건은 위의 네 가지 조건을 모두 만족시켜야 발생한다. 반대로 말하면 네 가지 조건 중 하나라도 해결하면 교착상태를 면할 수 있다. 자세한 예방에 대해서 아래에 쓰겠다. 

 

2. 회피 ( Avoidance )

교착상태의 발생을 없애기보다는 발생하지 않도록 알고리즘을 작성하는 방법으로, 자원 할당 그래프 알고리즘과 은행원 알고리즘이 있다. 

  • 자원 할당 그래프 알고리즘 (Resource Allocation Graph Algorithm) : 교착상태 회피를 위해서 자원할당그래프에 예약간선을 추가, 시스템에서 자원이 반드시 미리 예약되어 그래프에 예약간선이 모두 표시되어야 한다. 
  • 은행원 알고리즘 (Banker's algorithm) : 필요한 자원의 최대 개수를 미리 신고해 프로세스가 자원을 요청했을 때 요청을 수락하여도 안전상태에 머무를 수 있는지 판단 후 요청을 수락한다. 안전상태가 아니게 된다면 다른 프로세스가 끝날 때까지 요청 수락 대기 

3. 회복 ( Recovery )

교착상태가 발생하는 것을 아예 막지 않고, 만약 교착상태가 발생하면 발생 이후에 문제를 해결하는 방법

  • 교착상태가 일어난 프로세스를 종료 : 교착상태의 프로세스를 모두 중지, 교착 상태가 제거될 때까지 한 프로세스씩 중지
  • 프로세스에 할당된 자원을 선점 : 교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스로 할당하고, 해당 프로세스는 일시 정지시킨다. 우선 순위가 낮은 프로세스 위주로 자원을 선점할당한다. 

 

4. 무시 ( Ignore )

교착상태를 해결할 때에도 문맥교환에 의한 오버헤드로 성능 저하가 생긴다. 교착상태에 의한 성능 저하보다 이를 해결할 때의 성능저하가 큰 경우 그냥 무시한다. 

 

 

교착상태 예방은 네가지 조건 중 하나라도 해결하면 된다고 말했다. 그렇다면 위의 네 가지 발생 조건을 어떻게 예방하는지 하나씩 살펴보도록 하자.

 

상호배제 ( Mutual Exclusion ) 조건 방지

상호배제는 자원의 비공유가 전제되어야 한다. 공유자원은 배타적 접근이 필요 없어서 교착상태가 발생하지 않는다. 

 

점유와 대기 ( Hold and Wait ) 조건 방지

점유와 대기의 조건이 발생하지 않으려면, 프로세스가 작업을 수행하기 전에 필요한 자원을 모두 요청하고 획득해야 한다. 이를 최대 자원 할당이라고 하는데 이는 자원 효율성이 낮고 기아상태가 발생할 수 있다는 단점이 존재한다. 

 

비선점 ( Non Preemptive ) 조건 방지

비선점 조건의 방지는 이미 할당되 낮원에 선점권이 없어야 한다. 하지만 비선점 조건을 사용한다면 어떤 프로세스든 중간에 자원을    사용할 수 있어서 기존에 사용중이던 프로세스는 작업 내용을 잃을 수 있다. 

 

환형대기 ( Circle Wait ) 조건 방지

모든 자원에 일련의 순서를 부여하고 각 프로세스가 오름차순으로만 자원을 요청할 수 있게 한다. 하지만 작업에 필요한 자원은 훨씬 오래전부터 자원을 할당받은 상태가 되어야 하므로 자원의 낭비가 있을 수 있다. 

 

 📝 CPU 코어 갯수, 쓰레드 상관관계 

 

 

 📝 OSI 7 Layer 

OSI 모형(Open Systems Interconnection Reference Model)은 국제 표준화기구에서 개발한 모델로, 컴퓨터 네트워크 프로토콜 디자인과 통신을 계층으로 나누어 설명한 것이다. 일반적으로 OSI 7 계층 모형이라고 한다. 현대 네트워크는 대부분 TCP/IP 와 이더넷으로 이루어져 있다. OSI모델과 TCP/IP모델은 조금 다르다. OSI모델은 7계층으로 이루어져 있고, TCP/IP 모델은 4계층으로 이루어져 있다. 하지만 계층별 이해를 돕기 위해 OSI 7 계층 기반으로 알아보도록 하자. 

OSI Model 과 TCP/IP Model

 

1계층 : 물리계층(Physical Layer)

1계층은 물리계층으로 물리적 연결과 관련된 정보를 정의한다. 주로 전기 신호를 전달하는 데 초점이 맞추어져 있다. 1계층의 주요 창비로는 허브, 리피터, 케이블 등이 있다.

 

2계층 : 데이터 링크 계층 (Data Link Layer)

2계층은 데이터 링크 계층으로 네트워크 기기 간에 데이터를 전송하고 물리주소를 결정한다. 데이터 링크 계층의 데이터 전송은 Point-To-Point 로 안전한 정보의 전달을 한다. 안전한 정보의 전달이라는 것은 오류나 재전송을 하는 기능을 갖고 있다는 것을 의미한다. 데이터 링크 계층은 Mac주소를 갖고있어 통신해야할 포트를 지정해 내보낼 수 있다. 데이터 링크 계층의 데이터 단위는 프레임(Frame)이다.

 

3계층 : 네트워크 계층(Network Layer)

네트워크 계층은  IP주소와 같은 논리적인 주소가 정의된다. 데이터 통신을 할 때에는 두 가지 주소가 사용되는데 바로 2계층의 물리적인 MAC주소와 3계층의 논리적인 IP주소이다. MAC주소와 달리 IP주소는 사용자가 환경에 맞게 변경해 사용할 수 있다. 또한, 라우팅 기능을 맡고 있는 계층으로 목적지까지 가장 안전하고 빠르게 데이터를 보내는 기능을 가지고 있다.(최적의 경로를 설정가능) 

이 네트워크 계층에서 사용하는 데이터 단위는 패킷(Packet)이다. 장비로는 라우터, L3 스위치가 있다. 

 

** 4계층 : 전송 계층(Transport Layer) **

종단 간 신뢰성 있고 정확한 데이터 전송을 담당하며 송신자와 수신자 간의 신뢰성있고 효울적인 데이터를 전송하기 위하여 오류검출 및 복구, 흐름제아와 중복검사 등을 수행한다.

데이터 전송을 위해서 Port번호를 사용한다. 대표적인 프로토콜로 TCP와 UDP가 있다. 전송계층에서의 데이터 단위는 세그먼트(Segment)이다. 

 

5계층 : 세션 계층 (Session Layer)

통신 장치 간 상호작용 및 동기화를 제공한다. TCP/IP 세션을 만들고, 유지, 없애는 기능을 한다. 

 

6계층 : 표현 계층(Presentation Layer)

표현방식이 다른 어플리케이션이나 시스템 간의 통신을 돕기 위해 하나의 통일된 구문으로 변환시키는 기능을 수행한다. 일종의 번역기 또는 변환기 같은 역할을 하는 계층이며, 사용자 시스템의 응용 계층에서 데이터의 형식상 차이를 다루는 부담을 덜어준다. MIME 인코딩이나 암호화, 압축, 코드 변환과 같은 동작이 표현 계층에서 이루어진다.

 

 

7계층 : 응용 계층 (Application Layer)

사용자와 가장 밀접한 계층으로 인터페이스 역할을 한다. 네트워크 소프트웨어의 UI부분이나 사용자 입/출력 부분을 정의하는 것이 응용계층의 역할이다. 즉, 응용프로세스 간의 정보 교환을 담당한다. 응용계층의 프로토콜은 많지만 대표적인 것은 SMTP, FTP, HTTP, TELNET 등이 있다.

 

글로만 설명을 보니 감이 잡히지 않아서 찾아본 동영상이 있다. 글로만 봐서 이해가 안된다면 40분만 투자해서 아래의 동영상을 참고해보자 정말 이해가 쏙쏙된다. https://youtu.be/1pfTxp25MA8

 

[10분 테코톡] 🔮 히히의 OSI 7 Layer

🙋‍♀️ 우아한테크코스의 크루들이 진행하는 10분 테크토크입니다. 🙋‍♂️ '10분 테코톡'이란 우아한테크코스 과정을 진행하며 크루(수강생)들이 동료들과 학습한 내용을 공유하고 이야

youtu.be

 

📝 TCP , 3way handshaking, 4way handshaking 

 

TCP란? OSI 7계층의 4계층인 전송계층에 해당하는 프로토콜로서 데이터를 전송하기 전에 데이터 전송을 위한 연결을 만드는 연결지향 프로토콜이다. TCP는 데이터의 정확한 전달을 중요시하는 신뢰성이 높은 프로토콜로서 신뢰성을 더하기 위해 세그먼트 단위로 분할하고, 전송 속도를 조절하며 데이터가 제대로 전달되지 않았을 경우엔 재전송을 한다.  TCP통신은 연결을 하는 단계가 3단계로 이루어 지는데 이를 3way handshaking라고 하며, 맺어진 TCP 세션을 종료는 4way handshaking 절차를 통해 이루어진다. 아래의 사진은 3way handshaking과 4way handshaking 의 과정을 그림으로 나타낸 것이다. 

 

[STEP 1]

A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다. 이때 A클라이언트는 SYN 을 보내고 SYN/ACK 응답을 기다리는SYN_SENT 상태가 되는 것이다.

 

[STEP 2] 

B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK 와 SYN flag 가 설정된 패킷을 발송하고 A가 다시 ACK으로 응답하기를 기다린다. 이때 B서버는 SYN_RECEIVED 상태가 된다.

 

[STEP 3]

A클라이언트는 B서버에게 ACK을 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게 되는것이다. 이때의 B서버 상태가 ESTABLISHED 이다.

위와 같은 방식으로 통신하는것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식이다.

[STEP 1]

클라이언트가 연결을 종료하겠다는 FIN플래그를 전송한다.

 

[STEP 2] 

서버는 일단 확인메시지를 보내고 자신의 통신이 끝날때까지 기다리는데 이 상태가 TIME_WAIT상태다.

 

[STEP 3]

서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN플래그를 전송한다.

 

[STEP 4]

클라이언트는 확인했다는 메시지를 보낸다.

 

📝 HTTPS 동작방식 (대칭키, 비대칭키) 

HTTPS는 HTTP의 보안처리가 된 버전으로 HyperText Transfer Protocol Secure의 약자이다. 

 

위의 사진처럼 TCP 위에 SSL/TLS 층을 추가하여 암호화, 인증 그리고 무결성 보장을 통해 더 안전하게 만들어주는 프로토콜이다.

HTTPS 의 통신과정은 대칭키와 비대칭키 방식을 전부 사용하는 하이브리드 방식이다. 데이터 전송을 위해 대칭키 방식을 사용하며 대칭키를 안전하게 전달하기 위해 비대칭키 방식을 사용한다. 조금 자세히 알아보기 위해 대칭키와 비대칭키에 대한 설명을 먼저 하도록 하겠다. 

 

대칭키란?호화에 쓰이는 키와 복호화에 쓰이는 키가 동일한 기법으로 클라이언트와 서버가 대칭키 방식으로 통신을 한다면 클라이언트도 키를 가지고 있어야 한다. 클라이언트에게 키를 전달하기도 위험하며, 클라이언트의 소스코드는 누구든지 열어볼 수 있으므로 가지고 있기도 위험하다. 

 

비대칭키란? 암호화와 복호화에 쓰이는 키가 다른 기법으로 공개키와 개인키가 하나의 쌍을 이루고 있는 형태이다. 비대칭키는 어떤 암호화 할 문서 혹은 텍스트를 공개키로 암호화하면 개인키로 복호화를 할 수 있고, 개인키로 암호화하면 공개키로 복호화 할 수 있는 것이다. 

 

SSL을 적용하기 위해서는 인증서라는 것이 필요하다. 인증서는 local로 내가 만들 수 있는 인증서(사설 인증서)와 CA기관에서 만든 인증서(공인 인증서)가 있다.

인증서의 내용은 크게 2가지로 구분할 수 있는데 1. 서비스의 정보(CA, 도메인 등) 2. 서버 측의 공개키 (공개키의 내용, 공개키의 암호화 방식) 이다. 

 

HTTPS의 통신과정은 아래와 같다. 

 

1. TCP 3 way HandShake 이후

2. 클라이언트는 서버에게 지원 가능한 방식을 알리고 서버는 클라이언트에게 알리게 된다.

3. 서버는 공개키가 포함된 서버 인증서를 클라이언트에게 발송한다.

4. 클라이언트는 전송받은 서버 인증서에 대해 신뢰 기관 발급 여부를 확인하고 암호화키로 사용될 세션 키를 랜덤으로 생성하여 공개키로 암호화해서 암호화된 텍스트 파일을 서버로 전송한다.

5. 서버는 자신의 개인키로 클라이언트에게 전송받은 파일을 복호화한다.

6. 이제 클라이언트와 서버는 모두 동일한 세션키 ( 대칭키 )를 공유하게 된다.

7. 이제 데이터 전송 시 대칭키인 서로 공유된 세션키로 암호화된 전송이 시작된다. 

 

 

 

📝 try-with-resource (AutoClosable) 

try-wirh-resource 문은 자바 1.7 부터 try-catch문의 변형이 되어 추가된 것으로 try에 자원 객체를 전달하면, try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능이다.

 

그럼 어떨때 사용하는가? 예를 들어 프로그램에서 입출력을 할 때 사용하는 클래스인 Stream은 단방향 통신으로 생성을 하여 열어주었으면 반드시 close()문을 사용하여 닫아주어야 한다. 닫아주지 않으면 메모리 누수가 발생하기 때문이다. 이처럼 열어준 다음에 꼭 닫아주어야 하는 클래스들이 존재하며 이럴 때 유용하게 사용할 수 있는 것이 try-with-resource이다. 아래의 예제를 통해 사용방법을 알아보자. 우선 try-catch 만을 사용한 예제이다. 

public class TryCatchResource {

    public static void main(String[] args) {
        FileInputStream fis = null;
        DataInputStream dis = null;
        try {
            fis = new FileInputStream("score.dat");
            dis = new DataInputStream(fis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally { // finally를 통해 null이 아닐경우 close()를 호출
            try {
                if (dis != null) {
                    dis.close(); // close()가 예외를 발생시킬 수 있어 try-catch문으로 감싸줌
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}

주석으로 메모해놓은 부분을 보면 코드가 매우 복잡한 것을 볼 수 있다. 게다가 아직 fis 는 닫아주지도 않았다. 저기에 fis도 닫는 코드도 추가되어야 한다는 말이다. 그럼 위의 복잡한 코드를 try-with-resource를 사용하여 한결 간결하게 만들어보자. 

public class TryCatchResource{

    public static  void main(String[] args) {
        try ( // (1)
            FileInputStream fis = new FileInputStream("score.dat");
            DataInputStream dis = new DataInputStream(fis))
        {
            System.out.println("try-with-resource 적용");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

(1)로 주석처리해놓은 밑의 코드를 보면 try-with resource 문의 괄호 안에 객체를 생성하는 문장을 넣으면, 이 객체는 따로 close()를 호출하지 않아도 try블럭을 벗어나는 순간 자동적으로 close()가 호출된다. 그 다음에 catch문 또는 finally문이 수행된다. try-with resource를 적용하기 전 코드와 비교해보면 봤을 때 많이 간결해진 것을 확인할 수 있고 실수로 close()를 하지 않는 경우를 대비할 수도 있다. 

 

알아야 할 사항이 한가지 더 있다. try에 전달할 수 있는 자원은 AutoCloseable 인터페이스의 구현체로 한정된다는 것이다.

 

위의 코드를 보면 FilterInputStream클래스는 InputStream을 상속받은 클래스이다. InputStream은 Closeable을 구현한 구현체이며, Closeable은 AutoCloseable을 상속받고 있다. 그렇기 때문에 FilterInputStream클래스를 try에 전달할 수 있는 것이다. 이처럼 try-with resource를 사용하기 위해선 AutoCloseable 인터페이스의 구현체여야 한다는 점을 인지하고 있어야 한다. 

 


참고

https://junsday.tistory.com/31

https://mingmi-programming.tistory.com/79

https://mysterico.tistory.com/30

https://100100e.tistory.com/317

https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake 

 

'기타' 카테고리의 다른 글

면접 질문 정리 (1)  (0) 2021.10.13
[8주차] 멘토링 키워드  (0) 2021.10.06
[7주차] 멘토링 키워드  (0) 2021.09.29
[6주차] 멘토링 키워드  (0) 2021.09.19
[Eclipse] Git 연동시 Can't connect to any URI 에러  (0) 2021.08.16

댓글