목록전체 글 (23)
문제가 되는 코드guard let navigationBar = navigationController?.navigationBar else { return }navigationBar.addSubview(navigationProgressView)navigationProgressView.snp.makeConstraints { let margins = navigationBar.layoutMarginsGuide $0.leading.equalTo(margins).offset(60) $0.trailing.equalTo(margins).offset(-75) $0.centerY.equalToSuperview() $0.height.equalTo(8)}✔ 왜 이런 현상이 생길까?Navigation Bar는 push ..
왜 Sandbox 라고 부를까?애플의 경우 기술 개념을 추항화 할때 보통 고유 명사로 설명하는 방식을 선호하는 것 같다.App SandBox 역시 sandbox (n.) = 모래상자, 모래밭모래 상자안에서만 놀수 있다는 물리적인 비유로 그 밖의 공간에는 손댈수 없다는 은유적인 표현이다.앱(macOS, iOS .. 등등)이 시스템 리소스에 제한된 범위 내에서만 작동하여 시스템 훼손을 원천 차단해버린다.Sandbox 구조눈으로 보는게 아무래도 더 기억에 남기때문에 직접 파악해보자아무 앱을 시뮬레이터로 빌드 시켜본 후시뮬레이터는 Xcode에서 Widnow/Devices and Simulators 에서 Identifier를 확인할 수 있다.~/Library/Developer/CoreSimulator/Device..
HTTP 목적웹 상의 리소스(문서, 이미지, JSON 등)의 표현(representation)을 표준화된 요청/응답 방식으로 서로 주고받게 만드는 것어떤 클라이언트(브라우저·앱)와 어떤 서버라도 상호운용되도록, 확장 가능하고, 캐시 가능한 방식으로 통신을 규정합니다.전반적인 운영HTTP 프로토콜은 요청/응답 패러다임을 기반으로 한다.클라이언트는 서버와의 연결을 설정하고 요청 메서드, URI 및 프로토콜 버전 형식으로 서버에 요청을 보낸 다음 요청 수정자, 클라이언트 정보 및 가능한 본문 내용이 포함된 MIME 형식 메시지를 보냅니다.서버는 메시지의 프로토콜 버전과 성공 또는 오류 코드를 포함하는 상태 줄과 서버 정보, 엔티티 메타 정보 및 ㄷ가능한 본문 내용을 포함하는 MIME 형식의 메시지가 표시됩니다..
배경 과 문제 정의현재 진행중인 알쏭달쏭 프로젝트에서는 Tuist같은 모듈을 관리해주는 도구를 사용하지 않고, Xcode에서 지원해주는 Workspace를 사용하여 Projects 그룹화하여 관리한다.Tuist를 사용하기에는 짧은 기간 내에 개발을 완벽하게 이해하고있는 상황이 아니였기 때문에 Workspace로 결정하여 개발을하게 되었다.결합도를 줄이기 위해서 큰 기능에 따라 뷰와 데이터, 네트워크를 하는 모듈을 분리하여 작업을 진행하였는데메인 앱에 통합시키는 과정에서 시뮬레이터에서는 빌드가 잘 되었지만, 앱을 배포했을 때 크래시가 발생하는 문제가 발생하였다.해결 과정문제는 dyld 이슈인 것으로 추정된다.dyld란 Dynamic loader/linker 로 앱이 실행될 때 필요한 동적 라이브러리를 찾아..
전체 빌드 타이밍 출력xcodebuild \ -workspace "App명".xcworkspace \ -scheme "Scheme명" \ -configuration "Debug/Release중 선택" \ -destination 'generic/platform=iOS' \ build \ -showBuildTimingSummary포메팅 해서 보는 방법TIMEFORMAT=$'\n⏱ Total build time: %3R seconds'time xcodebuild \ -workspace "App명".xcworkspace \ -scheme "Scheme명" \ -configuration Debug \ -destination 'generic/platform=iOS' \ build > /dev/..
악의적인 코드로부터 앱을 보호하기 위해 Apple은 거의 모든 기기의 샌드박스에 앱을 배치합니다.각 샌드박스에는 해당 앱만 접근할 수 있는 컨테이너 디렉터리가 있습니다.생성한 두 앱 간 또는 앱과 앱 익스텐션 간에 파일 공유하기 위해서 두 프로세스 모두에 앱 그룹을 구성해야합니다.적절한 권한이 있는 프로세스는 앱 그룹 디렉터리의 URL을 요청하고, 해당 디렉터리의 파일에 접근할 수 있습니다. 앱 그룹을 생성하면 여러 프로세스가 파일을 공유할 수 있는 디스크 공유 공간이 생성됩니다.또한 Mach IPC, POSIX 세마포어 및 공유 메모리, UNIX 도메인 소켓, 기타 IPC 메커니즘을 사용하여 프로세스 간의 추가정인 프로세스 간 통신(IPC) 이 가능합니다. 즉, 직접 메모리 공유는 불가하고, App G..
다양한 범주의 병행성 문제 해결을 위해서는 락과 조건 변수가 모두 필요하다. Edsger Dijkstra는 세마포어 라는 다양한 동기화 관련 문제를 해결하는 기법을 탄생하였다. 세마포어는 락과 컨디션 변수로 모두 사용할 수 있다.세마포어 사용법세마포어는 정수 값을 갖는 객체로서 두 개의 루틴으로 조작할 수 있다.sem_wait() / sem_post() 이다.세마포어는 초기값에 의해 동작이 결정되기 때문에 값을 초기화 해야한다.#include 세마포어 s를 선언 후, 3번째 인자로 1을 전달하여 세마포어의 값을 1로 초기화sem_init()의 두번 째 인자는 0이다. → 같은 프로세스 내의 쓰레드 간에 세마포어를 공유한다는 뜻두번 째 인자에 다른 값을 넣어서 다른 프로세스 간에 동기화또한 제공 가능초기화..
쓰레드가 계속 진행하기 전에 어떤 조건이 참인지를 검사해야 하는 경우가 많이 있다. 예를 들어 부모 쓰레드가 작을 시작하기 전에 자식 쓰레드가 작업을 끝냈는지를 검사하기를 원할 수 있다(이 과정을 보통 join()이라 부른다). 그런 대기문은 어떻게 구현해야 할까?volatile int done = 0;void *child(void *arg) { printf("child\\n"); done = 1; return NULL;}int main(int argc, char *argv[]) { printf("parent: begin\\n"); pthread_t c; Pthread_create(&c, NULL, child, NULL); // 자식 생성 while (done == 0 ); // Spin printf("..
락(Lock)이란 무엇인가?락은 하나의 변수다. 사용 가능(available) 또는 사용 중(acquired)을 나타냄.소스 코드의 임계 영역을 락으로 둘러서 그 임계 영역이 마치 하나의 원자 단위 명령어인 것처럼 실행되도록 한다.사용 가능: 어느 스레드도 락을 보유하지 않은 상태사용 중: 단 하나의 스레드가 임계 영역에 들어가기 위해 락을 보유한 상태lock()/unlock()의 동작lock() 호출락이 비어 있으면 즉시 획득 → 해당 스레드는 임계 영역 진입 (진입 한 쓰레드를 락 owner라고 부름)이미 사용 중이면 임계 영역 안으로 진입하지 않고 대기(블록 혹은 스핀)unlock() 호출락을 해제 → 대기 중인 쓰레드가 있으면 그 중 하나가 락 획득프로그래머에 대한 이점쓰레드 스케줄링의 최소한 제..
쓰레드 vs 프로세스쓰레드는 어디서 명령어들을 불러 들일지 추적하는 프로그램 카운터(PC) 와 연산을 위한 레지스터들을 가지고있다.두 개의 쓰레드가 하나의 프로세서에서 실행 중이라면 실행하고자 하는 쓰레드 (T2) 는 반드시 문맥 교환(context switch)을 통해서 실행 중인 쓰레드 (T1) 와 교체되어야 한다.쓰레드 간의 문맥 교환은 T1이 사용하던 레지스터들을 저장하고 T2가 사용하던 레지스터의 내용으로 복원한다프로세스가 문맥 교환할 때 프로세스의 상태를 프로세스 제어 블럭 (PCB)에 저장하듯이, 쓰레드들의 상태를 저장하는 TCB가 필요하다.쓰레드는 프로세스와 달리 쓰레드 간의 문맥 교환에서는 주소 공간을 그대로 사용한다. 사용하고있던 페이지 테이블을 그대로 사용한다.쓰레드와 프로세스의 큰 ..
개요지금까지 가상 주소 공간이 비현실적으로 작아서 모두 물리 메모리에 탑재가 가능한 것으로 가정하였다. 사실 실행 중인 프로세스의 전체 주소 공간이 메모리에 탑재된 것으로 가정하고 있었다. 이 가정을 이제 완화한다. 다수 프로세스들이 동시에 각자 큰 주소 공간을 사용하고 있는 상황을 가정한다.메모리 계층에 레이어의 추가가 필요하다. 지금까지는 모든 페이지들이 물리 메모리에 존재하는 것을 가정하였다. 하지만 큰 주소 공간을 지원하기 위해서 하드 디스크 드라이브를 사용한다. 이제 메모리 계층에서 크고 느린 하드 디스크 드라이브가 가장 하부에 위치하고 그 위에 메모리가 있다.핵심 질문운영체제는 어떻게 크고 느린 장치를 사용하면서 마치 커다란 가상 주소 공간이 있는 것 처럼 할 수 있을까?왜 프로세스에게 굳이 ..
최근 구글이 터미널 안에서 자연어로 코드를 작성하고 디버깅, 작업 자동화 등 강력한 기능을 무료로 이용할 수 있는 제미나이 CLI를 오픈소스로 공개했습니다. 지메일 계정만 연동하면 하루 1천회 요청을 할수 있다고 합니다. 1천회 정도면 개인이 사용하기에는 충분하다고 느껴지네요 안그래도 GPT 유료로 사용하느라 조금 비싸다고 느꼈는데, 공짜는 못참아서 안써볼수가 없겟죠 CLI 로 작업하니 개발자인 저로써는 굉장히 흥미로웠습니다. 성능만 괜찮다면 자주 사용할 것 같네요. 한번 설치해봅시다. 설치방법은 오픈소스로 공개한 재미나이 CLI 링크에서도 확인가능합니다.https://github.com/google-gemini/gemini-cli?tab=readme-ov-file#quickstart GitHub -..
개요페이징은 상당한 성능 저하를 가져올 수 있다.페이징은 프로세스 주소 공간을 작은 고정 된 크기 로 나누고 각 페이지의 실제 위치를 메모리에 저장한다.핵심 질문주소 변환을 어떻게 빨리할 수 있을까?페이징에서 발생하는 추가 메모리 참조를 어떻게 피할 수 있을까?어떤 하드웨어가 추가로 필요할까?운영체제는 어떤식으로 개입하는가?TLB 의 등장운영체제의 실행 속도를 개선하려면 대부분의 경우 헤드위어로부터 도움을 받는다.변환-색인 버퍼(translation-lookaside buffer) 또는 TLB라고 부르는 것을 도입한다.TLB는 MMU의 일부로 자주 참조되는 가상 주소-실주소 변환 정보를 저장하는 하드웨어 캐시이다.가상 메모리 참조 시, 하드웨어는 먼저 TLB에 원하는 변환 정보가 있는지를 확인한다.만약 ..
개요운영체제는 거의 모든 공간 관리 문제를 해결할 때 두 가지 중 하나를 사용한다.우리가 가상 메모리의 세그멘테이션에서 보았듯이 가변 크기 조각을 분할하는 것이다.이 해결책은 태생적인 문제를 가지고 있다. 공간을 다양한 크기의 청크로 분할할 때 공간 자체가 단편화(fragmented) 될 수 있고, 할당은 점점 더 어려워진다.두 번째 방법인 공간을 동일한 크기의 조각으로 분할하는 것을 고려해볼 필요가 있다.이를 페이징(Paging)이라 부른다.이 각각의 고정 크기 단위를 페이지(Page) 라고 부르고, 물리 메모리도 페이지 프레임이라고 불리는 고정 크기의 슬롯의 배열이라고 생각한다. 이 프레임 각각은 하나의 가상 메모리 페이지를 저장할 수 있다.프로세스의 주소 공간을 몇개의 가변 크기의 논리 세그멘트(코..
메모리 관리 시스템모든 메모리 관리 시스템의 근본적인 측면, 구체적으로 빈 공간 관리에 관련된 문제를 논의 할 것이다.고정 크기 공간 관리메모리가 일정 크기로 나누어져있으면 리스트만 유지하다가 요청 시 첫번 째 블록을 반환하면 되어 간단가변 크기 공간 관리malloc/free나 세그멘테이션처럼 크기가 다양한 빈 공간들로 구성되면 외부 단편화가 발생총 빈 공간이 20바이트여도 10바이트짜리 두 개로 나뉘어 있으면, 15바이트 요청은 실패핵심 질문빈 공간을 어떻게 추적, 관리 할 것인가가변 크기 요구를 만족시키면서 단편화를 최소화 하려면 어떤 전략을 써야할 까?각 전략은 시공간 오버헤드가 어떻게 되는가?가정주로 사용자 수준 메모리 할당 라이브러리(예: malloc/free)의 역사와 기법에 초점을 맞춤voi..
베이스와 바운드 레지스터를 사용하면 운영체제는 프로세스를 물리 메모리의 다른 부분으로 쉽게 재배치할 수 있다.하지만 이런 단점이있다.메모리 낭비가 심하다.여러 프로세스를 연속 영역에 할당하고 제거하다 보면, 메모리 여기저기에 작은 빈 공간이 흩어짐 (조각남) 이 조각난 빈 공간들은 개별로는 작아서 새 프로세스를 못 담는다.전체 사용 가능 메모리는 충분해도, 연속 공간이 부족해서 새 프로세스를 못 올림.유언성이 떨어진다.실행 중 프로세스의 크기가 커지면 이미 연속 공간으로 고정된 베이스-바운드 방식에서는 그 뒤 영역이 다른 프로세스가 쓰고 있으면 확장 불가.실행 중에 다른 프로세스로 인해 공간을 옮겨야 한다면?베이스 값을 바꿔야 하고, 이 과정에서 프로그램의 모든 주소 참조를 안전히 관리해야 함.단일 연속..
초기 시스템메모리 관점에서 초기 컴퓨터는 많은 개념을 사용자에게 제공하지 않았다.운영체제는 메모리에 상주하는 루틴(라이브러리) 의 집합 이었다.물리 메모리에 하나의 실행중인 프로그램(프로세스)이 존재했고, 나머지 메모리를 사용하였다.특별한 가상화 X멀티프로그래밍과 시분할시간이 흐른 후 사람들이 더 효과적으로 컴퓨터를 공유하기 시작하며 멀티 프로그래밍 시대가 도래했다.여러 프로세스가 실행 준비 상태에 있고 운영체제는 그들을 전환하면서 실행하였다.한 프로세스가 입출력을 실행하면, CPU는 다른 프로세스로 전환하였다. (CPU 이용률 증가)오랜 시간이 걸리는 프로그램-디버그 사이클에 지친 프로그래머가 일괄처리방식 컴퓨팅의 한계를 느꼇다현재 실행 중인 작업으로부터 즉시 응답을 원하기 때문에 대화식 이용(inte..
배경 : 멀티 프로세서 구조단일 CPU 하드웨어와 멀티 CPU 하드웨어의 근본적인 차이에 대한 이해가 필요다수의 프로세서 간에 데이터의 공유하드웨어 캐시의 사용 방식단일 CPU 시스템에는 하드웨어 캐시 계층이 존재한다.자주 사용 되는 데이터의 복사본을 저장하는 작고 빠른 메모리프로그램이 처음 이 load 명령어를 실행할 때, 데이터가 메인 메모리에 존재하므로 데이터를 가져오는 데 긴 시간이 소모된다데이터가 다시 사용될 것으로 예상한 프로세서는 읽은 데이터의 복사본을 CPU 캐시에 저장한다.프로그램이 나중에 다시 같은 데이터를 가져오려고 하면, CPU는 우선 해당 데이터가 캐시에 존재하는지 검사한다.캐시에 존재하기 때문에 데이터는 훨씬 더 빨리 접근되고 프로그램은 빨리 실행된다.캐시는 지역성(localit..
스케줄링 : 비례 배분반환 시간이나 응답 시간을 최적화하는 대신 스케줄러가 각 작에게 CPU 의 일정 비율을 보장하는 것이 목적대표적인 예시가 추첨 스케줄링(lottery scheduling) - Waldspurger and Wdihl다음 실행될 프로세스를 추첨을 통해 결정한다.더 자주 수행되어야 하는 프로세스는 당첨 기회를 더 많이 준다.기본 개념: 추첨권이 당신의 몫을 나타낸다추첨권(티켓)이라는 개념 도입추첨권은 프로세스가 받아야 할 자원의 몫을 나타내는 데 사용된다.프로세스가 소유한 티켓의 개수와 전체 티켓에 대한 비율이 자신의 몫을 나타낸다.예를 들어,,A와 B 두 프로세스가 있다고 가정하자.A는 75장의 추첨권을, B 는 25장의 추첨권을 가지고 있다.A에게 75%의 CPU를, B에게 남은 25..
CPU 스케줄링이 필요한 이유시스템에는 동시에 실행을 요청하는 여러 프로세스가 존재하므로 한정된 CPU 자원을 효율적·공정하게 분배하기 위해 프로세스의 실행 순서를 관리하는 CPU 스케줄링이 필요하다.스케줄링 정책 평가 항목워크로드 에 대한 가정일련의 프로세스들이 실행하는 상황을 워크로드(workload)라고 부름.정책 개발에 매우 중요한 부분워크로드를 잘 알수록 그에 맞게 정책을 정교하게 손질할 수 있음.스케쥴링 평가 항목 반환 시간 : 작업이 완료된 시각 - 작업이 시스템에 도착한 시간으로 정의모든 작업은 동시에 도착한다고 workload에서 가정한다면 Tarrival 은 0 , turnaround = completion반환 시간은 성능 측면에서 평가 기준임. 다른 평가 기준으로는 정성(fairnes..