[TodayKeywords] 오늘 공부한 키워드
하드웨어적 스레드
: 하나의 코어가 수행하는 명령어 단위. 1개의 코어는 1개의 명령어를 수행할 수 있다. 내부에 명령어 레지스터가 여러개 존재하면, 여러개의 명령어를 수행 할 수 있다.소프트웨어적 스레드
: 하나의 프로그램을 실행하는 중에 생기는 실행단위프로세스
: CPU로 부터 자원을 할당받아 메모리에 프로그램을 올리는 것. 커널단에 PCB를 만들고, Code, Data, Heap, Stack 영역을 만들어 사용자 영역 메모리에 올린다. Heap과 Stack 영역은 프로세스에 따라 가변적으로 설정된다.멀티프로세스
: 1개의 프로그램을 여러개의 프로세스로 관리하는 것. 각각의 PID가 생겨 독립적으로 동작한다. 각각의 영역을 공유하지 않기 때문에, 전환 시 Context Switching이 발생하고 이는 리소스를 잡아먹는다. 다만, 1개의 프로세스가 손상이 되도 전체 프로세스에 큰 영향을 미치지않는다.스레드
: 1개의 프로세스 내에 최소 1개이상 생기는 실행단위.멀티스레드
: Code, Data, Heap 영역을 공유하고, 스레드별로 자신의 Stack을 가진다. 한 프로세스 내에 있기 때문에, Context Switching에 대해 안전하다. 하지만, 1개의 스레드에서 문제가 생길경우, 프로세스에 모두 문제가 발생한다.스레드 경합
: Code, Data, Heap 영역을 공유하기에, 같은 타이밍에 같은 데이터의 수정을 할 경우, 데이터의 무결성이 손상될 수 있다.무결성
: 데이터가 항상 일관적이고 정확한 상태를 유지하는 것.동시성
: 한개의 코어가 여러가지일을 처리하기 위해, 시분할로 스케쥴링을 하여 동시에 동작하는 것 처럼 보이게 하는것.병렬성
: 여러개의 코어가 여러가지일을 처리하기 위해, 일을 나누어 실제로 동시에 여러일을 처리하는 것.
[NextKeyworks] Study Queue
- HTTPS
- SOLID
- loop label
- CSV
- 파일입출력
- UML
- UTC
- epoch time / Instant time
- MVC
- URL ClassLoader
- Secure ClassLoader
- JNI
- GC
- HOF
- 자바 해시코드
- OSI 7 계층
- PCB
[221203] 회고 : 내가 뭘모르는지를 모를때
컴퓨터란 분야는 파고들기 참 좋은 분야이다. A라는 개념은 B에서 파생되고, B라는 개념은 C에서 파생되고, 이렇게 꼬리에 꼬리를 물며 들어가는 것이 가능한 영역이다. 따라서, 면접질문도 이렇게 나온다.
하지만, 독립적으로 학습도 가능하다. A -> B -> C 순으로 공부를 해야한다고 생각했을 때, B를 굳이 알지 못하더라도 A,C는 독립적인 개념이기 때문에 학습은 가능하다. 중간개념을 모르기에 찝찝한것이 생긴다. 그래서 기존에 알고있는 A와 C를 깊게판다. 하지만, 이것은 A를 깊게파거나 C를 깊게판다고 해결되는 문제가 아니다. B를 학습해야한다.
하지만, 그 B가 뭔지를 모를경우엔 A, C 만 깊이 들어가게 된다. 얻는것은 아무것도 없다.
오늘 자바의 멀티스레드를 이용하는 기술을 학습했다. 그리고 나는 멀티코어도 학습했다. 자바를 이용해 돌아가는 프로세스는 멀티스레드를 이용해서 운용하는게 가능하다. 나는 문득 궁금해졌다. 그럼 내가 자바프로그램을 실행하고, 크롬을 틀고, 메모장을 열어서 동시에 이용하는것은 멀티스레드로 인해 가능한 건가..? 멀티프로세스로 인해 가능한 것인가..?
일단, 잘못된 접근이었다. 위에서 배운 멀티스레드나 멀티프로세스는 한 프로그램을 실행 할 때에 대한 이론이고 내가 궁금한건 os의 스케쥴링과 더 관계있는 것이다. 또한, 코어에서 연산을 하는 것은 하나의 프로그램이라는 고정관념이 있는데, 하나의 명령어를 실행할 수 있는 것이지, 그게 꼭 하나의 프로그램에 국한되는 것은 아니다. OS의 스케쥴링에 따라 서로다른 프로그램에 대한 연산이 수행 될 수도 있는것이다. 이처럼 멀티코어 / 멀티스레드+프로세스에 대한 각각의 지식은 있지만, 그 사이의 지식에 인과 관계가 맺어지지 않다보니, 납득이 안되는 상황이 발생했다.
이런 경우를 난 '뭔가를 모르는데, 뭘 모르는지를 모를때' 의 상태라고 정의하기로 했다. 오늘 거의 내가 뭘 모르는 건지 납득하기 위해 많은 시간을 보냈다.
이런 상태가 되면 각 개념에 대해서 깊이 들어가는 것보단, 인과관계에 대해서 찾아보는 것이 가장 문제를 해결에 가까워 질 수 있는 방법인 것 같다. 그래도 코어와 실행단위를 구분지어서 이 사이에 내가모르는 무언가가 있다는 것을 인지하고 나니, 내가 무언가를 모르는지 아는 상태가 된 것 같다.
넣어야하는 지식이 많은 분야인 만큼 효율적으로 공부하여 빠르게 지식을 쌓고, 중간중간의 비어있는 영역을 빠르게 인지하고, 빠르게 채워나가야겠다는 생각을 했다.