뮤텍스(Mutex)와 세파모어(Semaphore)는 모두 동시성 프로그래밍의 가장 큰 숙제인, "여러 프로세스나 스레드가 공유자원에 접근하는 것을 제어(관리)" 하기 위해 고안된 기법이다.
원하는 상태(desired stats)를 다양한 오브젝트(objects)로 정의(spec)하고 API 서버에 yaml 형식으로 전달한다.
쿠버네티스에서 Pod를 그냥 띄우는 경우는 사실 거의 없다. 실제로는 클라이언트가 도메인을 통해 접속을 하면, 로드밸런서를 거쳐서, 노드포트를 거쳐서, 클러스터IP를 거쳐서, Pod로 연결된다. ➡️ 진정한 마이크로서비스 아키텍처...
현재 상태와 Desired State(원하는 상태)를 계속 체크하고(ex.컨테이너 하나가 떠있어야 되는데 잘 떠있는지), 만약 문제가 있다면 조치를 한다. 이 단순한 작업을 잘 반복하면 서버 관리에 문제가 없을 것이다.
파이프와의 차이점은, 표준입력과 표준출력을 넘겨주는(변경하는) 대상이 프로세스가 아니라 파일(file)이라는 것 뿐이다.
"한 가지 일만 아주 잘하는 프로그램들을 작성하라. 프로그램들이 다른 프로그램들과 함께 일할 수 있도록 작성하라. 프로그램들이 텍스트 스트림을 처리할 수 있도록 작성하라. 왜냐하면 그것은 보편적인 인터페이스이기 때문이다." - Doug McIlroy
모든 명령어는 종료 상태(exit status) 리턴한다. 명령어 성공시에는 0을 리턴하고 실패시에는 에러 코드로 해석될 수 있는 1~255를 리턴한다. 즉 유닉스 관례를 잘 따르는 프로그램이라면, 함수의 가장 마지막에 실행된 명령어가 종료 상태를 결정한다.
시그널을 받은 프로세스는 다음 3가지 반응 중 하나의 액션을 취한다. 1. 프로세스 종료 / 2. 시그널 무시 / 3. 사용자가 지정한 함수(핸들러) 호출
완성하기까지 총 7주. 예외처리를 하다보면 코드가 지저분해지고, 또 원래는 잘 동작했던 것들이 무용지물이 되는 경우가 많았습니다. 지쳐갈 때 쯤 힘이 되어 주었던 건 많은 42 동료의 도움덕이었고, 그래서 저도 메모했던 내용들을 자세하게 정리해서 공유하고 싶었습니다.
미니쉘 과제를 시작하기 전 알고있으면 좋을 Shell의 구성요소, Shell에서 프로세스를 시작하는 방법, 허용함수 동작방식을 정리했습니다.
컴파일할 때 아래 옵션을 넣어주면 어디서 문제 생긴건지 알려준다. -g -fsanitize=address
어셈블리어로 프로그램을 짜려면 먼저 함수 호출 규약을 알아야 한다. syscall 함수의 사용법과 에러 처리 방법도 함게 알아보자.
Opcode로 사용하는 어셈블리 명령어는 엄청나게 많다. 자주 사용한다는 몇 가지 명령어만 정리해봤다
어셈블리어 소개 및 문법 구조, 그리고 어셈블리에서 다루는 64비트 범용 레지스터 종류를 정리했다.
돌아보니 한 프로젝트의 Dockerfile을 만드는 과정은, 내가 지금까지 차근차근 만들어온 프로젝트를 적절히 분해해서 srcs, Dockerfile, 쉘스크립트에 잘 나눠 담는 일인 것 같다.
사실 예발자 프로젝트는 앱 규모가 복잡하지 않고, 동적으로 state 값이 변할 일이 없기 때문에 굳이 상태관리 라이브러리가 필요 없을수도 있겠지만, 편리함을 경험해보자는 취지로 redux를 사용해보기로 했다.