크래프톤 정글 13DAY 1주일차 cs책 질문 총망라
레퍼런스
- 멀티 테스킹과 컨텍스트 스위칭
- 종류별 컨텍스트 스위칭
- cisc와 risc
- 커널과 시스템콜
- 공유 라이브러리와 정적 라이브러리
- 지인 분의 머리에서 나온 static과 지역변수의 차이
static과 전역변수
전역변수도 전체에서 다 알아서 초기화되고 static도 대충 비슷한 거 같은데 싶다면 꼭 제대로 짚고 넘어가야한다.
static은 main함수에서 접근이 불가능하기 떄문에, 일종의 은닉화 기능을 제공하는 것이나 마찬가지이다.
더 정확하게 설명하자면 static으로 선언된 부분에 대해서는 그 파일에서만 접근이 가능하다.
만약 다른 파일에서 static을 불러오고자 한다면 컴파일 에러가 뜨게된다.복제
static 키워드로 정의된 변수들은 해당 변수가 정의된 범위 내에서 하나의 인스턴스로 존재한다.
따라서 여러개를 불러와도 하나가 되는 방식으로 복제가 되는 것이 아니기 때문에 효율적인 메모리 사용의 효과도 있다.
또한프로그램 실행시 단 한번만 할당
되기 때문에 보다 효율적인 메모리 관리가 가능한 부분도 있다.단위별 컨텍스트 스위칭
멀티 테스킹은 프로세스를 잘게 쪼개어 여러개의 일을 동시에 하는 것처럼 보이게 하는 작업이다.
즉 프로세스가 변경되는 작업이 반드시 수반되어야하며 프로세스가 바뀐다는 것은 컨텍스트 스위칭도 일어남을 의미한다.(이것이 이해 안가면 내 11일차 til 다시보기)프로세스 단위의 컨텍스트 스위칭
아주 간단하게 설명하자면, 스레드 단위와 달리 프로세서의 관점에서는 스레드 정보 뿐 아니라 프로세스에 대한 정보 역시 스위칭이 이루어져야한다.
그렇다면 당연 참조하는 프로세스의 pid와 같이 더 큰 단위의 정보들이 모조리 바뀌게 되는 것이다.
이러한 과정 때문에 프로세스 단위의 컨텍스트 스위칭은 스레드 단위의 컨텍스트 스위칭에 비하여 더 많은 정보를 관리해야하며 당연 시스템 프로그래머 입장에서는 고려해야할 요소가 늘어나게 된다.(자원 관리,오버헤드 현상 등)스레드 단위의 컨텍스트 스위칭
아마 우리가 통상적으로 생각하는 컨텍스트 스위칭은 이쪽일 것이다.
동일한 프로세스 내에서 하나의 쓰레드를 중지하고 다른 쓰레드의 pcb를 참조하여 작업을 실행하는 것이다.
안드로이드 개발자였다면new handler new thread
함수를 써봤을텐데 얘가 바로 스레드 단위의 컨텍스트 스위칭을 가능케해주는 함수이다.RISC/CISC(책에 없음)
책에 없는 키워드인데, 지인분께서 좀 더 쉽게 이해하라고 알려주신 내용이다.
레퍼런스 탭에 보면 설명이 너무 잘나와있으나, 아마 다들 나처럼 명령어가 많은데 왜 레지스터가 적을까라고 의문이 들 것이다.
바로 이것이 가능한 이유가 인스트럭션 수준의 병렬성 덕분으로, 일종의 명령어 조합을 사용하여 보다 적은 레지스터로 보다 많은 명령어를 구현해낸 것이다.
또한 모바일에서는 주로 risc방식을 사용하는데 그 이유는 cisc방식은 전력소모가 크기 때문이다.파이프라이닝
간단하게 설명하자면, 여러 명령어를 중첩시켜서 실행함으로써 한 사이클 내에서 노는 컴포넌트가 없도록 하는 기술이다.
이 역시 책에서 나오는 인스트럭션 수준의 병렬성과 연관되는 키워드로 인스트럭션a와 인스트럭션b를 중첩시켜 실행하는 기술이라 이해하면 된다.커널과 시스템 콜
메인메모리의 주소 접근 방식중에 시스템콜을 사용하여 주소에 접근하는 부분이 잘 납득가지 않았다.
GPT한테 물어보니 포인터를 사용하면 잘못된 주소에 접근 가능하다는데, 그럴거면 왜 굳이 커널 단위에서 시스템 콜 함수를 통하여 접근해야하는가?
간단하게 설명하자면, 프로그램의 보안과 안전성을 보장하기 위한 것이다.
메모리 누수나 잘못된 접근을 원천차단하는 것은 불가능하나, 최대한 막기 위한 예방책 같은 것으로 이해하면 쉽다커널 별 관리
커널은 거대하게 하나로 이루어진 것이 아니라, 기능별로 쪼개어 구현이 되어있다.
이런 신기한 구조를 가져야하는 이유는 커널이 일종의 o/s의 코어와 같은 역할을 하기 때문이다.
만약 커널을 기능 별로 나누어 놓지 않는다면, o/s의 버전이 바뀔 때마다 우리가 일반적인 프로젝트를 할 때마다 직면하는 의존성 문제 같은 것들이 빵빵 터질 수 있다.
일반적으로 코딩을 할 때 지나치게 결합도와 응집도가 높은 코드를 짰을 때 생기는 문제들과 유사하다BSD소켓(정글 키워드)
BSD소켓은 이번주차 책에서 나오는 내용은 아니고, 정글 학습 키워드 내용이다.
여기에서 말하는 소켓은 일종의 인터페이스와 비슷한 역할로 응용프로그램과 특정 파일들을 연결해주는 프로토콜의 기능을 한다.
사실 좀 더 정확하게 설명하자면 소켓은 api에 가까운데, 네트워크 통신을 위한 api라고 생각하면 된다.모든 것은 파일이다
파이썬이 주소값까지 object로 바라보듯, unix시스템은 모든 것을 파일로 바라본다.
여기서 말하는 파일은 단순히 우리가 말하는.exe나 .py
같은 것 외에도 소켓 파이프 등 정말 모든 것을 파일로 바라본다고 이해하면 된다.소켓의 기능
소켓은 일종의 필터링 기능을 제공할 수도 있는데, 특정 파일만 접근 가능하도록 할 수 있다. 그 외에도 a라는 프로세스에서 80포트를 쓰는데, b라는 프로세스에서도 동일하게 쓰고자 한다면 막는 기능을 해줄 수도 있다.
추상화
위에 기능들을 보면 알 수 있듯, bsd소켓뿐 아니라 소켓은 네트워크 통신을 위한 추상화된 인터페이스다.
소켓이 추상화하고 있는 대상은 복잡한 네트워크 기술들로, 응용프로그래머들에게 보다 간편한 네트워크 관리를 할 수 있도록 도와준다고 생각하면 된다.동적 라이브러리
윈도우에서는
dll
형식으로 불리는 이 녀석은 자주 사용하는 함수들을 모조리 집어넣은 뒤 버전 불일치와 같은 문제들을 예방할 때에 주로 쓰인다.
일반적인 헤더의 경우 전처리기에 의해 컴파일러에게 넘겨지는 반면, 동적 라이브러리는 실행시간에 동적으로 로드되기 때문에 메모리를 절약하는 기능도 제공하여준다.
댓글남기기