CPU & I/O Burst프로그램 실행은 결국 CPU로 작업하는 단계와 I/O 작업을 하는 단계를 연속해서 지나가는 과정이다. 여기서 CPU burst는 CPU가 기계어를 해석하고 있는 단계, I/O하는 단계를 I/O burst라고 부른다. 프로그램별로 burst의 간격은 다르다. 주로 사람과 ineract하는 프로그램이 위처럼 버스트가 번갈아 등장한다. 연산량을 많이 필요로하는 작업은 CPU Burst의 간격이 넓어지게된다. 만약 I/O를 길게 쓰는 프로그램이 있다면 I/O bound job(process) 라 부르고 , CPU를 길게 쓰는 프로그램을 CPU bound job(process)이라고 부른다. 이 때 Burst Time 종류에 따라 CPU 우선권이 다르게 주어진다. I/O bound jo..
전체 글
프로세스의 생성프로세스는 부모 프로세스에 의해 만들어져 자식 프로세스가 만들어지는 구조이다 (최상단 부모 프로세스는 init 프로세스로 부팅 과정에서 커널에 의해 생성되는 첫 번째 사용자 공간 프로세스). 이렇게 되다보니 자연적으로 프로세스 트리가 형성된다. 이때 자식 프로세스끼리는 자원을 공유하기도 하지만 보통은 서로 독립적인 프로세스로 CPU를 두고 경쟁하지 기타 자원 공유는 잘 하지 않는다. 프로세스가 생성될 때 자식 프로세스는 부모프로세스의 공간을 복사하고 자신만의 데이터를 위에 올리게된다. 여기서 복제는 fork() 메서드에 의해, 복제한 데이터 위에 자기 데이터를 올리는건 exec() 메서드로 시스템 콜을 하여 새로운 프로그램에 메모리를 올리게 된다.프로세스의 종료 (Termination)..
Rx를 실제 사용한다고 생각해보자. Rx를 사용할 때 순서를 생각해보면 아래와 같이 크게 3가지 과정을 거칠것이다. 1. 먼저 Observable을 만든다.2. 원하는 연산자를 사용한다.3. 구독해서 사용한다. 그렇다면 위에서 반드시 만나는 문제는 어떤 Observable 과 Operator 를 사용할 것이냐이다. 이때 알아야할 지식이 바로 Hot Observable & Cold Observable 개념이다. 두 옵저버블의 특성을 알아보고 실전에서 어떻게 쓰이는지 살펴보자 Unicast vs Muticast먼저 Observable에는 개별적으로 스트림을 던지는 녀석과 던지는 스트림을 공유하는 녀석이 있다. 전자를 Unicast로, 후자인 multicast라고 부르며 Unicast 를 하는 대표적인 예로..
FlutterError (Tried to listen to an InheritedWidget in a life-cycle that will never be called again. context.watch() 메서드는 기본적으로 변경된 상태를 확인하고 리빌드하는 메서드이다. 하지만 앞서 쓰여진 create 메서드는 한 번만 호출되고 이후 변화가 생기더라도 호출되지 않아 watch메서드를 쓴 의미가 없고 이를 컴파일 에러로 잡아준다. 따라서 한 번만 호출되는 create 안에서는 read 메서드를 사용해준다. 그렇다면 값의 변화를 탐지할 수 없고 초기 상태만 읽어오는 read메서드를 통해 어떻게 값의 변화를 알 수 있을까? Future Provider 와 Stream Provider는 상태가 변경될 때마..
Process 란?Process란 실행중인 프로그램이다. 하드디스크에서 가상메모리를 거쳐 램메모리에 올라온 상태라고 볼 수 있다. CPU의 PC(Program Counter)는 램메모리에 올라온 프로세스의 코드/데이터/스택중 코드 한 부분을 포인팅을 하고 CPU는 PC가 포인팅 해주는 명령어를 읽어가며 작업을 처리한다. 이때 CPU의 PC가 프로세스의 어느부분을 가리키고 있는가, 다시말해 프로세스 전체 작업중 어느 부분을 지나가고 있는가를 프로세스의 문맥(context)이라고 부른다. 항상 메모리에 상주해있던 커널은 프로세스가 하나씩 올라올 때마다 커널의 코드/데이터/스택 중 데이터 공간에서 PCB(Process Control Block)를 통해 프로세스를 관리한다. 또한 특정 프로세스가 운체에게 시스..
플러터를 하다보면 가장 많이 보는 안내창이 바로 위젯에 const 키워드를 넣으라는 문구일 것이다. 그렇다면 왜 IDE에서 제발 const를 넣으라고 울부짖는걸까? Flutter 위젯에 const를 붙여야하는 이유는 바로 메모리 최적화 때문이다. const없이 위젯을 선언하게 되면 새로운 중복된 위젯 메모리공간을 사용하게 되기 때문이다. 단순히 메모리 최적화뿐만 아니라원하는 위젯 메모리를 바라보게 해야할 때 위젯이 중복되버리면 어느 위젯 메모리를 포인팅해주어야하는지 상당히 난감해지므로 왠만하면 위젯 앞에 const를 붙이자. 주의할점으로는 위젯 앞에 const를 붙인다는 것 자체가 해당 위젯은 변하지 않는다는 것을 선언하는 것이다. const 자체가 컴파일 상수임을 의미하기 때문이다. Stateful..
flutter localization 작업중 localizations 2.1.1 패키지가 들어가지 않는 오류가 있었다. 터미널을 천천히 읽어보니 Flutter Localization은 intl에 의존성이 걸려있었다. localization 패키지는 intl 패키지의 예전버전을 쓰고 있고 내 프로젝트에서는 가장 최신버전을 쓰고 있어서 Flutter Localization 내에서 intl 버전 업데이트가 되지 않아 생긴 에러같았다. 해결하는 방법은 간단했다. 먼저 의존성이 걸린 intl의 버전을 any로 선언한 뒤에 flutter update-packages --force-upgrade명령어로 넣은뒤 flutter pub get을 입력하면 알맞은 버전으로 업데이트 된다 ^^https://stackoverfl..
Sliver 개념 이해Sliver를 이해하기 앞서 RenderBox를 먼저 알아야한다. RenderBox는 2D 데카르트 좌표계를 가진 렌더 객체로 Flutter 레이아웃 구성요소의 대부분은 RenderBox로 구현된다. Renderbox는 부모 위젯의 제약조건 내에서 구현되는 너비높이이기 때문에 동적인 상호작용이나 스크롤에 대처하기 힘들다. (이미 높이 너비가 부모 제약에 의해 정해져있음) 이러한 동적인 상호작용에 대응하기 위해 Flutter 팀은 Sliver를 만들었다. Sliver 를 통해 기존의 부모위젯 제약조건을 활용하는 대신 Sliver Protocol 에서 제공되는 다양한 제약조건을 활용했다. 특히 RenderBox에서 구현하기 어려웠던 스크롤 효과를 구현하는데 용이하다. (GridView..
Flutter 프로그래밍을 하면서 Swift의 Result 타입과 대응하는 개념이 있을까? 를 찾아보던 도중 우연히 마주친 좋은 세션을 정리해보고자 한다.if-else 의 문제점 에러를 가장 단순하게 처리한다면 위와 같이 연속적인 if-else문으로 처리할 수 있을 것이다. 하지만 이러한 방식의 문제점은 에러 발생 컨텍스트를 풍부하게 표현하기 어렵다는 것이다. 가장 먼저 오는 조건과 가장 아래 오는 조건이 부분집합 관계이기 때문이다. Exception - 에러에 풍부한 의미 부여하기 if-else문의 문제를 해결하기 위해 try-catch를 이용해 에러를 처리해줄 수 있다. 위와 같이 try-catch문을 사용하면 정상적인 로직과 에러 처리 로직을 명확히 분리하여 코드를 간결하게 유지 할 수 있다. 하지..
운영체제란?운영체제란 컴퓨터 하드웨어 바로위에 설치되어 사용자 및 다른 소프트웨어와 하드웨어를 연결하는 계층이다. 컴퓨터 하드웨어를 직접적으로 다루면 매우 어렵고 복잡하기 때문에 운영체제라는 중간다리를 만듦으로서 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공한다. 또한 운영체제는 실행중인 프로그램을 메모리 공간에 적절히 분배함으로서 컴퓨터 시스템의 자원을 효율적으로 관리한다. 엄밀히 따지자면 좁은 의미의 운영체제는 "커널"이라 부르며 항상 메모리에 상주하는 부분을 의미한다. 넓은 의미의 운영체제는 커널 뿐 아니라 메모리 상주하지 않는 주변 유틸리티 시스템을 포함하는 개념이다. 운영체제는 동시작업 가능 여부로도 분류할 수 있다. 한 번에 하나의 작업만 처리하는 MS-DOS와 같은 운영체제와 동시에 ..