본문 바로가기
Study/Study Alone

[나혼자공부] 4주차 복습-1

by 햄리뮤 2024. 12. 25.
반응형

으아아아 뭔가 많아아아아



오늘의 공부 내용

내 답변은 혼자 계속 다듬어 가면서 고치고 고치고 고치다가 정리된 답변입니다... 처음부터 절때 저렇게 정리하지 않았습니다...!

 

  1. 스레드 생명주기를 설명해 주세요.
    • 내 답변: 스레드 생명주기는 다섯가지 상태로 나눕니다. 첫번째는 New일때 인데요 스레드 객체가 생성되었지만 아직 시작되지 않은 상태입니다. start() 메소드가 호출되 면 Runnable상태로 들어가는데요 실행 대기열에 등록되고 실행 가능한 상태입니다. 이후에는 JVM의 스케쥴러에 의해 CPU를 할당 받으면 Running 상태로 들어갑니다. 실행중 잠시 멈춰야하는 상황이 발생하면 Blocked 상태가 됩니다. 스레드의 실행이 끝나면 Terminated 상태가 됩니다.
  2. 스레드 풀의 스레드들이 작업을 처리하는 과정을 설명해주세요.
    • 내 답변: 먼저 스레드 풀을 생성합니다. ExecutorService 인터페이스를 구현한 클래스로 생성을 하고 반환 값이 없는 Runnable 또는 반환 값이 있는 Callable 인터페이스를 구현한 객체로 표현할 수 있습니다. 스레드 풀에 생성된 스레드는 작업 큐에서 작업을 가져와 실행합니다. 모든 스레드가 현재 작업중이라면 작업 큐에 작업이 쌓입니다. 작업이 완료되면 반환 값이 있는 Callable 작업은 Future 객체를 통해 결과를 반환하고 스레드 풀을 더이상 사용하지 않을 경우는 종료 합니다.
  3. 스레드를 사용할 때의 주의점은 무엇인가요?
    • 내 답변: 스레드 간에 공유 자원을 사용할 때 동기화를 하지 않으면 데이터의 일관성이 깨지는 문제가 있습니다. synchronized 키워드를 사용해서 공유 자원에 대한 접근을 동기화 해야합니다. 스레드를 직접 생성해서 사용하는 것은 자원 낭비와 관리에 여러움이 있습니다. 그래서 스레드 풀을 사용해서 스레드 재사용성을 높이고 성능을 최적화 함으로 자원 관리를 잘 할 수 있습니다.
  4. 쓰레드와 프로세스의 차이를 설명해보세요.
    • 내 답변: 프로세스는 실행 중인 프로그램의 인스턴스이고 독립된 실행 환경에서 동작하고 각각 고유한 메모리 공간을 가집니다. 스레드는 프로세스 내에서 실행되는 작은 실행 단위입니다. 하나의 프로세스는 여러 스레드를 가질 수 있습니다. 
  5. 스레드 로컬의 사용 사례와 구현 방법에 대해 설명해 주세요.
    • 내 답변: ThreadLocal 은 각 쓰레드가 독립적으로 변수를 가지도록 해주는 클래스입니다. 각 요청마다 인증 정보를 저장하여 사용자 인증 정보 저장이나 데이터베이스 트랜잭션 컨텍스트를 스레드 단위로 관리하는 사용 사례를 들 수 있습니다. 구현 방법은 ThreadLocal을 선어하고 초기화 해 준 다음 사용을 다하면 remove() 메소드를 호출해서 종료하면 됩니다.
  6. 자바 멀티스레딩에서 Runnable과 Thread 클래스를 상속받는 방식의 차이점은 무엇인가요?
    • 내 답변: Runnable 인터페이스를 구현하여 멀티스레드를 이용합니다. 다중 상속이 가능하고 같은 Runnable 객체를 여러 Thread에서 실행 가능하기 때문에 스레드 재사용성이 좋다는 장점이 있습니다. Thread 클래스를 상속받아 멀티스레드를 이용합니다. Runnable 객체를 생성하지 않아도돼서 코드 작성이 간단합니다.
  7. 웨이팅 상태의 스레드를 다시 실행 가능 상태로 만드는 방법은 무엇인가요?
    • 내 답변: wait() 나 sleep() 상태에서는 대기중인 스레드를 깨울 수 있는 notify()나 notifyAll() 메소드를 이용해서 실행 가능 상태로 만들 수 있습니다. 
  8. Runnable과 Callable 인터페이스의 차이점을 설명하고, 각각 어떤 상황에서 사용되는지 예를 들어 설명하세요.
    • 내 답변: 두 인터페이스의 차이점은 반환 값에 대한점에서 차이가 있습니다. Runnable은 반환 값이 없는 인터페이스이고 Callable은 반환 값이 있는 인터페이스여서 Future객체를 통해서 값을 반환할 수 있습니다.
  9. 자바에서 멀티 스레딩을 구현할 때 Runnable 인터페이스와 Thread 클래스 중 어느 것을 사용하는 것이 더 효율적인가요? 그 이유는 무엇인가요?
    • 내 답변: 효율성 측면에서는 Runnable 인터페이스를 사용하는 것이 더 효율적입니다. Runnable은 인터페이스이므로 다중 상속이 가능하기때문에 Runnable을 구현한 클래스는 다른 클래스의 기능도 상속받을 수 있습니다. 그리고 Runnable을 사용하면 그 객체를 여러 스레드에서 재사용할 수 있습니다. 스레드 재사용성면에서도 Runnable이 더 효율 적 입니다.
  10. synchronized 키워드의 작동 원리와 사용 시 주의사항은 무엇인가요?
    • 내 답변: 락을 획득하려는 스레드는 해당 객체나 클래스의 모니터 락을 요청하고, 락을 소유하고 있는 다른 스레드가 없으면 락을 획득해서 동기화된 코드 블록을 실행합니다. 코드 블록이 끝나면 JVM은 자동으로 락을 해제하여 다른 스레드가 접근할 수 있게 합니다. 이로인해 데이터 일관성을 보장할 수 있다는 장점이 있지만 락을 획득한 스레드만 접근할 수 있기 때문에 스레드가 많을 경우 성능이 저하될 수 있습니다. 
  11. 스트림 기반 I/O와 버퍼 기반 I/O의 차이점을 이용한 파일 처리 예제를 설명해주세요.
    • 내 답변: 스트림은 데이터를 한 바이트씩 순차적으로 읽고 쓸 수 있도록 해주기 때문에 성능이 상대적으로 떨어질 수 있습니다. InputStream, OutputStream을 사용해서 파일을 처리합니다. 버퍼는 데이터를 메모리 버퍼에 임시로 저장한 후, 한 번에 여러 바이트씩 읽거나 쓰는 방식입니다. 버퍼를 사용하면 I/O 작업이 더 효율적이고 빠르게 처리될 수 있습니다. BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream을 사용하여 처리합니다.
  12. NIO와 IO의 차이점은 무엇인가요?
    • 내 답변: I/O 방식은 데이터를 스트림을 사용하여 순차적으로 처리하고 블로킹 방식으로 동작하고, NIO 방식은 Non-Blocking I/O 방식을 지원합니다. 버퍼(Buffer) 와 채널(Channel)을 통해 데이터를 비동기적으로 읽고 쓰며, 여러 작업을 동시에 처리할 수 있습니다.
  13. 블로킹 I/O와 논 블로킹 I/O의 예를 들어 설명해주세요.
    • 내 답변: 블로킹 I/O는 데이터를 읽거나 쓸 때 해당 작업이 완료될 때까지 현재 스레드가 다른 작업을 하지 못하고 대기하는 방식입니다. 논블로킹 I/O는 데이터를 읽을 때 읽을 데이터가 준비되지 않으면 즉시 반환하고 다른 작업을 계속할 수 있게 해줍니다.
  14. 파일 I/O 최적화를 위해 사용할 수 있는 다른 기법들은 무엇이 있나요?
    • 내 답변: 버퍼를 사용하면 한 번에 큰 덩어리로 데이터를 읽거나 쓸 수 있습니다. 그리고 병렬화로 여러 스레드를 사용하여 파일을 분할해서 동시에 읽고 쓰면서 작업 시간을 단축시킬 수 있습니다.
  15. 디스크 I/O와 메모리 I/O의 성능 차이를 어떻게 극복할 수 있나요?
    • 내 답변: 디스크 I/O는 상대적으로 느린 속도를 가지고있지만, 메모리 I/O는 훨신 빠릅니다. 디스크에서 자주 접근하는 데이터를 메모리에 캐시하여 디스크 접근을 줄일 수 있습니다. 

 

공부한 후 느낀점

어렵다... 점점 어려워진다....................

 

반응형

'Study > Study Alone' 카테고리의 다른 글

[나혼자공부] 5주차 복습-1  (2) 2025.01.03
[나혼자공부] 4주차 복습-2  (0) 2024.12.26
[나혼자공부] 3주차 복습-2  (1) 2024.12.20
[나혼자공부] 3주차 복습-1  (0) 2024.12.19
[STUDY] 2주차  (0) 2024.12.16

댓글