TIL

23.10.25

오잉머신 2023. 10. 25. 21:41

1. 리사의 [면접 특강]을 들었다.

 

질문을 본인에게 유리한 방향으로 끌어올 수 있어야 한다!!!!!!!!!!!!!

 

>> 면접 볼 때 회사와 서비스 등에 대한 조사 없이 참여하는 경우가 예상보다 정말 많더라고요. 특히 프로그래머 면접할 때. 제발 회사가 하고 있는 일과 서비스에 대한 최소한의 조사는 하고 참여하면 좋겠어요

>> 회사 최근 관련 기사 본 거 있는지 물어보고 최근 매출 얼마인지 아냐고 물어보더라구요

>> 회사 홈페이지 들어가서 비전, 핵심가치, 인재상 정도는 읽어보고, 내가 가진 어떤 경험과 행동이 이에 부합하는지 고민해봐도 좋아요

 

>> 면접에서 마지막 하고 싶은 말있냐는 질문에는 어떻게 대답하는게 좋을까?

없다고 하거나 의미 없는 말 할 바에는 회사나 직무에 대해 궁금한 점을 물어보는 경우가 낫다고 하는 사람도 있더라고요. 진정성 어필!

(ex. 코드리뷰 문화가 있나요?)(ex. 회사의 ~~서비스에 이런 문제를 느꼈는데 ~게 개선하면 좋겠다)

(ex. 회사에 ~~이런 문화가 있던데, 제가 여기 들어가면 그 문화를 실제로 경험할 수 있나요?) 회사에 대한 영상 자료 살펴보고 가자!

 

>> 짧은 기간동안 찾아본 부족한 도메인에 지식을 이야기하다 발목이 잡힐까 걱정되는데 찾아본 내용을 다 이야기하는 편이 그래도 나을까요?

의견 개진이면 하지마라.

 

>> 열심히 하겠습니다. 열심히 배우겠습니다. 성장하겠습니다. 금지

 

2. 리팩토링 미션 3단계를 반정도 했다.

📍 일대다 단방향 매핑의 단점

매핑한 객체가 관리하는 외래 키가 다른 테이블에 있다.

본인 테이블에 외래 키가 있으면 엔티티의 저장과 연관관계 처리를 Insertl 한번으로 끝낼 수 있지만,

다른 테이블에 외래 키가 있으면 연관관계 처리를 위해 update를 추가로 실행해야한다.

member엔티티는 team엔티티를 모른다. 그리고 연관관계에 대한 정보는 team이 관리한다.

따라서 member엔티티를 저장할 때는 member 테이블의 team_id 외래키에 아무값도 저장되지 않는다(null)

대신 team 엔티티를 저장할 때 team.members의 참조 값을 확인해서 회원 테이블에 있는 team_id 외래 키를 업데이트한다.

 

 

cascade persist를 걸어줌

그래서 menu가 영속화되는 시점에 menuproduct도 영속화

근데 Menu의 id는 영속화될 때 생김.

그러므로 menuproduct가 영속화 될 때에는 menu의 id가 없는 상태라 Null로 들어감.

menu의 id가 정해진 이후에 menuproduct의 menu_id에 update나감

 

현재 ddl에 menu_id가 Not null이라 null이 들어와서 에러 발생!

-> 해결 nullable=false + updateable=false 붙이기

 

이 설정은 OneToMany 관계에서 Many쪽 엔티티의 FK 값을 update 하지 않고, 바로 insert를 할 수 있게 해주는 역할을 합니다.

OneToMany 단방향 매핑의 update쿼리를 없애려면 어떻게 해야할까

 

3. 프로세스, 스레드, 멀티프로그래밍, 멀티태스킹, 멀티스레딩, 멀티프로세싱

https://www.youtube.com/watch?v=QmtYKZC0lMU&list=PLcXyemr8ZeoT-_8yBc_p_lVwRRqUaN8ET&index=6

 

  • 프로그램 : 컴퓨터가 실행할 수 있는 명령어들의 집합
  • 프로세스 : 컴퓨터에서 실행중인 프로그램
    • 각각의 프로세스는 독립된 메모리 공간을 할당받음
    • 명령어들과 데이터를 가짐
  • cpu : 명령어들을 실행하는 연산 장치
  • 메인메모리 : 프로세스가 cpu에서 실행되기 위해 대기하는 곳
  • I/O
    • 파일을 읽고 쓰거나
    • 네트워크의 어딘가에서 데이터를 주고 받는 것
    • 입출력장치와 데이터를 주거나 받는 것

 

컴퓨터 시스템 발전 과정~

 

1. 단일 프로세스 시스템

  • 한번에 하나의 프로그램만 실행됨
  • 단점 : cpu 사용률이 좋지 않음
    • 왜? p1이 cpu작업하다가 IO 작업이 필요하면 cpu는 그 시간동안 아무것도 안하고 논다. IO 작업 끝나면 다시 cpu 작동.
    • 실행중인 프로세스가 IO 작업하는 동안 cpu 논다
  • 해결책 : 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행시키자!

 2. 멀티프로그래밍

  • 여러 개의 프로그램을 메모리에 올려놓고 동시에 실행
  • 현재 실행중인 프로세스에 IO작업이 발생하면 다른 프로세스가 cpu에서 실행
  • 목적 : cpu 사용률 극대화
  • 단점 : cpu 사용시간이 길어지면 다른 프로세스는 계속 대기
  • 해결책 : 프로세스가 한번 cpu를 사용할 때 아주 짧은 시간(quantum)만 cpu에서 실행되도록 하자!

3. 멀티태스킹

  • 멀티프로그래밍과 유사(동시에 여러 프로그램을 실행시킴) + cpu 사용시간 아아아주 짧게
  • 목적 : 프로세스의 응답 시간 최소화 (일반 사용자는 진짜 여러 프로그램이 동시에 실행되는 것처럼 느낌)
  • 단점 : 하나의 프로세스가 동시에 여러 작업을 수행하지는 못함
    • 물론 프로세스를 여러개 만들어서 동작시킬 수는 있겠지만.. 단점 많음!
      • 프로세스의 컨텍스트 스위칭(cpu에서 p1에서 p2로 교체)은 무거운 작업
      • 프로세스끼리 데이터 공유 어려움 (프로세스는 독립적인 메모리 공간을 가지니까)
  • 해결책 : 스레드

4. 멀티스레딩

  • 프로세스는 한개 이상의 스레드를 가질 수 있다
    • 스레드의 등장 배경자체가 한 프로세스안에서 여러 작업을 동시에 하기 위해서니까
  • cpu에서 실행되는 단위 (unit of execution)
    • 예전에는 process가 cpu에서 실행되는 단위. 스레드 등장 이후에는 스레드가.
    • 그러므로 프로세스는 하나 이상의 스레드를 갖는다 (실행 단위니까)
  • 같은 프로세스의 스레드들끼리의 컨텍스트 스위칭은 가볍다
  • 스레드들은 자신들이 속한 프로세스의 메모리 영역을 공유
    •  그래서 컨텍스트 스위칭 가볍다
    • 그래서 같은 프로세스의 스레드들끼리의 데이터 공유 쉽다

스레드 등장 전 / 후

같은 프로세스에 속한 스레드들은 그 프로세스의 메모리 영역을 공유한다

  • heap 영역 공유
  • 자신만의 stack 영역 가짐

코어 두개면 진짜 동시에. 병렬

  • 멀티 스레딩의 목적 : 하나의 프로세스가 동시에 여러작업을 실행하기 위해서
  • 멀티 스레딩의 등장으로 확장된 멀티 태스킹의 개념
    • 기존 : 프로세스끼리의 스위칭
    • 이후 :  스레드끼리의 스위칭 (여러 스레드가 아주 짧게 나뉘어진 cpu time을 나눠 갖는것)

 

+) 멀티프로세싱 : 두 개 이상의 프로세서나 코어를 사용하는 시스템

 

 

멀티태스킹 : cpu를 두고 경합

멀티스레딩 : 싱글스레드가 아닌

멀티프로세싱 : cpu 여러개

 

4. 컨텍스트 스위칭

https://www.youtube.com/watch?v=Xh9Nt7y07FE&list=PLcXyemr8ZeoT-_8yBc_p_lVwRRqUaN8ET&index=7

 

  • 컨텍스트 스위칭 : CPU/코어에서 실행중이던 프로세스/스레드가 다른 프로세스/스레드로 교체되는 것
    • 오늘날 하나의 프로세스는 기본적으로 하나의 스레드를 가진다
    • 왜? 스레드가 cpu에서 실행되는 기본 단위이기 때문!
    • 프로세스 -> 프로세스 교체란? a 프로세스의 스레드가 b 프로세스의 스레드로 교체 (서로 다른 소속의 스레드 사이 교체)
  • 컨텍스트 : 프로세스/스레드의 상태, cpu, 메모리 등등
    • 상태 : cpu에서의 상태, 메모리에서의 상태
  • 왜 필요한가?
    • 여러 프로세스/스레드를 동시에 실행시키기 위해서
  • 언제 발생하는가?
    • 주어진 time slice(quantum)을 다 사용했거나
    • I/O 작업을 해야하거나
    • 다른 리소스를 기다려야 하거나
    • 등등..
  • 누구에 의해 실행되는가?
    • OS 커널 : 각종 리소스를 관리/감독하는 역할
      • 운영체제의 가장 핵심. 컴퓨터의 여러 리소스(ex. cpu, 메모리, 디스크 등)을 관리
  • 구체적으로 어떤 과정에 의해 일어나는가?
    • 다른 프로세스끼리의 스위칭(process context switching)인지 같은 프로세스의 스레드끼리의 스위칭(thread context switching)인지에 따라 다르다
    • 공통점
      • 1) 커널 모드에서 실행
        • 커널 모드란?
          • p1이 쭉 실행되다가 하드웨어와 밀접한 일들 혹은 컴퓨터의 리소스들을 다뤄야 하는 일이 생기면 프로세스가 직접 리소스에 접근하는 것이 아니라, 운영 체제의 kernel을 통해 접근!
          • 프로세스에서 커널로 통제권이 넘어가 커널에 의해 실행되는 것 : 커널 모드
      • 2) cpu의 레지스터 상태를 교체
        • cpu안에는 여러 register가 있다. register는 각종 명령어를 수행하기 위해 필요한 여러 데이터를 저장하는 곳
        • p1이 실행되는 동안 레지스터에 여러 값 들어가서 돈다
          -> p2가 실행되게 되면 레지스터에 있던 p1의 데이터를 어딘가에 저장해두고 p2시작
          (다시 p1이 실행되었을 때 어디까지 진행되었는지 알고 있어야 다음 작업을 할 수 있으니)
    • 차이점
      • process context switching : 가상(virtual) 메모리 관련 처리를 추가로 수행
        • 서로 다른 프로세스는 서로 다른 독립적인 메모리 영역을 가진다.
        • 그러므로 다른 프로세스이면 메모리 주소체계가 다르기 때문에 메모리 관련 처리를 해줘야한다 (MMU, TLB)
      • thread context switching
        • 같은 프로세스에 속하는 스레드간의 컨텍스트 스위칭은, 같은 프로세스의 메모리 영역을 공유하기 때문에 메모리 관련해서 처리해줄게 없다

thread간 / process간

MMU가 P2를 바라보도록

TLB(가상의 메모리 주소와 실제 메모리 주소의 매핑 정보를 담고 있는 캐시) 비워줌

-> 이래야 p2가 자신의 메모리 영역에 접근할 수 있다

 

  • thread context switching이 더 빠른 이유는?
    • 메모리 주소 관련 처리를 하지 않기 때문
  • context switching이 미치는 간접적인 영향은?
    • 캐시 오염
      • cpu안에는 cache가 있다. 맨날 mem갔다오기 그러니까 자주 사용하는 것들은 cache에 올려놓고 사용
      • 컨텍스트 스위칭이 일어나면 서로 다른 데이터이기 때문에 캐시값들이 오염
      • 컨텍스트 스위칭 직후 캐시에 가봤자 이전 프로세스 혹은 스레드에서 실행되었던 정보들이 들어있을 것이기 때문에 내가 필요로 하는 정보가 없을 가능성 큼
      • 결국 메모리까지 가야하기때문에 성능이 조오금 떨어짐 (그래서 어떤 cpu architecture는 컨텍스트 스위칭 직후에 cache비우기도)
      • 스레드 컨텍스트 스위칭인 경우에는 있을 확률 높지만, 프로세스 컨텍스트 스위칭의 경우에는 낮다
  • 유저 관점에서 context switching이란?
    • 순수한 오버헤드
      • 내가 실행한 이 프로그램과의 동작과는 전혀 상관없는
      • 순수하게 cpu를 잡아먹는 오버헤드

 

감정회고

히히 아주 좋은 유튜브를 발견해서 기분이 좋다!!!

시간이 비거나 뭔가하기 싫을 때 재밌어보이는거 위주로 한두개씩 듣고 정리중인데

매우 만족스럽고 즐겁다 ㅎㅎㅎ