DevJong12

22. 05. 30 F-Lab 멘토링 본문

Java,Spring/F-Lab

22. 05. 30 F-Lab 멘토링

Jong12 2022. 6. 12. 17:40
728x90

다음 수업까지 책을 다 읽어보겠다고 내가 약속을 하여.. 먼저 읽다보니 Article의 작성이 많이 늦어졌다.

 

 

일단 고민중이었던게 알고리즘 스터디와 관련해서였다.

 

과거에도 공부를 하면서 언어의 유리함은 Python이나 C++이 좀 더 유리하지 않나 라는 생각을 주로 했어서,

알고리즘의 경우 코테의 통과만을 위해서라도 변경하는게 좋지 않을지 물어봤었다.

 

들었던 말이 다른언어로 해도 상관은 없으나, 다시 자바에서 유사한 알고리즘을 사용하거나 할 경우 작성만 할 수 있다면 상관없을 거라는 의견을 받았다.

 

의견을 받고 든 생각은 일단 자바부터 확실하게 익히자는 생각을 하게 되었고, Java를 베이스로 스터디를 시작해보고자 한다.


[ConcurrentModificationException]

처음 들었을 때 어떠한 종류의 Exception인지조차 가늠이 안되는 이름이었다..

동시수정 예외처리라고 해석은 되고, 다른 예제들을 보면 실제종류에서도 멀티 스레드로 인해서 발생할수도 있는 문제도 있어 보인다.

 

나는 Loop를 중점으로 다뤄보려한다.

루프를 진행하면서도 해당 문제는 발생이 가능하며 Collection에 있는 modCount에 의해서 문제가 발생하는데

Collection내부에서 Iterator의 next()메소드를 통해 순회를 진행할 때 해당 값이 expectedModCount가 일치하지 않는 경우 발생이 된다고 한다.

 

Collection의 remove를 사용을 하면서 해당 문제가 발생이 될 수 있으며 문제를 피할수 있는 방법은 

Iterator를 호출하여 Iterator의 remove()메소드를 호출하는 방식으로 해결이 가능하다.

 

[Process와 Thread의 관계에 대해서]

  •  Process
    • OS로부터 자원을 할당받는 작업의 단위
    • 프로그램을 실행시키기 위한 인스턴스로, 여러개의 프로세스가 존재할 수도 있슴
    • 기본적으로 Process는 최소 1개의 스레드(Main Thread)를 가지게 됨.
    • 각 Process는 별도의 주소공간에서 실행되며, 다른 Process에 접근이 불가능하며,
      IPC통신(프로세스간의 통신)을 이용하는 경우에는 Process간에 접근이 가능하다
  • Thread
    • Process가 할당받은 자원을 이용하는 실행흐름의 단위
    • Thread는 Process의 한계를 극복하기 위해 제작되었으며, 한프로세스 내에 있는 스레드끼리 공유가 가능함.
    • 한개의 Process에서 여러개의 Thread가 실행이 가능
    • 같은 Process 내의 Thread는 Code,Data, Heap영역을 공유하며 , 각자 별도의Stack영역만 할당을 받음

 

 

  • Multi Process
    • 하나의 응용 Program을 여러개의 프로세스로 구성, 각 프로세스가 하나의 작업을 처리하는 것
      • 장점
        • 여러개의 자식 프로세스중 하나가 문제가 되어도 다른 자식프로세스로 영향이 확산이 안됨
        • 각 프로세스들이 독립적으로 (자원이 각각 다르게 할당)되기에 안정적
      • 단점
        • Multi Thread보다 많은 메모리 공간, CPU시간차지 (자원의 사용량이 더 많음)
        • Process간의 통신을 위해서는 IPC가 필요함
        • 작업량이 많을수록 오버헤드가 발생, Context Switching으로 인한 성능 저하 우려
  • Multi Thread
    • 하나의 응용 프로그램을 여러개의 스레드로 구성해 각 스레드가 하나의 작업을 처리하는 것
      • 장점
        • 시스템의 자원과 처리비용 감소, 비교적 빠른 속도
        • Context Switching이 빠름 (Thread의 경우 Thread의 Stack영역만 처리하면 되기 떄문)
        • Thread간의 자원을 공유하고 있기 떄문에 통신의 부담이 적고 응답시간이 빠름
      • 단점
        • 스레드간의 데이터 공유시 동기화문제
        • 하나의 스레드오류는 전체 프로세스에 문제
        • 과한 스레드 사용은 오버해드를 발생
        • 프로그램 테스트, 디버깅에 어려움이 존재

멀티프로세스에서 영향확신이 안되는 말은 다음과 같은 말이다.
스레드의 경우에는 모든 메모리 영역을 공유하기 떄문에 하나에서 오류가 발생한다면 같은 프로세스 내의 다른 스레드도 모두 오류로 인해 종료가 된다.

하지만 프로세스의 경우에는 한개의 자식프로세스에서 문제가 발생하더라도, 두개가 서로 공유하고 있는 무언가가 존재하지 않는다면 어느 영향도 주지않는다, 이게 확산이 안된다는 의미.
메모리의 관리가 이뤄지는 레벨은 OS레벨이다. 이게 쓰레드가 메모리를 공유하는 이유이다.
CPU의 입장에서는 최소작업단위는 스레드이다.

하지만 운영체제의 입장에서는 최소 작업단위는 프로세스이다. 또한 위에있듯 메모리의 관리는 운영체제의 레벨에서 이뤄지며, 
최소작업단위가 프로세스기에 프로세스의 소속인 스레드는 서로 메모리를 공유 할 수 밖에 없다.

 

※ Process의 상위로는 Program이 존재하며, 메모리에 로드(실행되지 않은)가 되어있지 않은 상태를 의미

※ 오버헤드는 어떤 처리를 위해 들어가는 간접적인 처리시간, 메모리등을 의미함

 - https://ko.wikipedia.org/wiki/%EC%98%A4%EB%B2%84%ED%97%A4%EB%93%9C

 

 

 

[Context Switching]

- Context의 의미는 CPU가 해당 프로세스를 실행하기 위한 프로세스 정보를 의미

 

- 하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하기 위해 이전에 사용중이던 프로세스의 상태를

보관하고 새로운 프로세스의 상태로 적재하는 작업

 

- 운영체제의 CPU자원을 할당하는 스케쥴러에 의해 발생.

 

- CPU가 프로세스를 실행하던 상황에서 스케쥴러의 우선순위를 확인하며 높은 우선순위를 가진 프로세스가 실행되어야 할 때 레지스터에 저장된 기존 프로세스 정보값이나 상태값을 PCB에 저장한 이후 새 프로세스 정보값이나 상태값을 PCB에서 가져와서 교체하는 작업

 

- 스위칭이 가능한 이유
  PC와 스택포인트가 핵심.

 

-발생하는 경우는 스케쥴러에 의해서 인터럽트 요청이 생기는 경우 발생하며, 경우는 다음과 같다.

1. 입/출력을 요청 할 때

2. CPU사용시간이 만료되었을때

3. 자식 프로세스를 만드는 경우

4. 인터럽트 처리를 기다릴 떄

PCB의 경우에는 Kernal에 위치해 있슴.
PCB에는 프로세스 번호(PID),  프로세스 상태(Process State), PC(Program Counter), CPU레지스터 및 일반 레지스터, CPU스케쥴링 정보, 메모리 관리정보, 입출력 상태, 프로세스 계정 정보 등이 일반적으로 같이 포함되는 정보들
프로그램카운터란?
마이크로 프로세서 내부에 있는 레지스터중 하나로, 다음에 실행될 명령어의 주소를 가지고 있으며, 실행할 기계어 코드의 위치를 지정하는 역할을 함.
스택포인트?
CPU안에서 스택에 데이터가 채워진 마지막 위치를 가리키는 레지스터 라고 한다.
엄청 감이 오진 않는다..
728x90

'Java,Spring > F-Lab' 카테고리의 다른 글

F-Lab을 마치며.. 회고를  (0) 2022.11.05
22. 06. 20 F-Lab 멘토링  (0) 2022.06.27
22.05.24 F-Lab멘토링  (0) 2022.05.30
22.05.16 F-Lab멘토링  (0) 2022.05.18
22.05.09 F-Lab멘토링  (0) 2022.05.11
Comments