반응형

 

 

* What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file at '/Users/tobe-nsh/Desktop/rn/FirstNoti/android/local.properties'.

 

npm run android을 입력 후 에러.

 

이 에러가 떴다면, android studio를 이용해 본인이 만든 react-native 플젝안의 android를 열어준다.

그러면 알아서 깔린다.

반응형
반응형
 if (UITraitCollection.current.userInterfaceStyle == .dark) {
                textView.textColor = UIColor.white
            } else {
                textView.textColor = UIColor.black
            }

 

반응형
반응형
do {
              
                
            } catch {
                print("JSONSerialization error:", error)
            }

do try catch문 사용.

반응형
반응형

1. info - plist 클릭

2. Information Property List 옆 + 버튼 클릭

3. 

-> Privacy - Location When In Use Usage Description(IOS 11이상) :  포그라운드에서 실행

-> Privacy - Location Always and When In Use Usage Description(IOS 11이상) : 백그라운드에서 실행

-> Privacy - Location Always Usage Description(IOS 11이전, deprecated) : 백그라운드에서 위치 정보 액세스

 

만약, 앱 실행시 바로 위치가 필요하다면, 첫번째를 사용하면 된다.

 

4. Value 부분에 권한 요청 시, 띄울 값을 설정 (예, 위치 권한 요청)

5. 실행

 

 

 

 

 

위치권한설정

https://velog.io/@yoogail/%EC%9C%84%EC%B9%98-%EA%B6%8C%ED%95%9C-%EC%84%A4%EC%A0%95-info.Plist

 

# 위치 권한 설정 (info.Plist)

iOS는 앱이 사용되는 동안 '나의 위치 정보를 제공하겠는가?'에 대한 세부적인 통제권을 사용자가 소유하고 있다. 따라서 개발자는 다양한 상황에 대한 권한을 사용자에게 요청해야 하고, 사용자

velog.io

 

코어로케이션 설명

https://www.slideshare.net/JihoonKong/ss-10193888

 

코어 로케이션

Core Location 발표자 : 공지훈 sagehoon@gmail.com

www.slideshare.net

 

코어로케이션 메소드 설명

https://abc1211.tistory.com/512

 

ios 코어 로케이션 프레임워크로 위치 정보 수집하기

ios 코어 로케이션 프레임워크로 위치 정보 수집하기 1. 코어로케이션 매니져 코어 로케이션 프레임워크의 주요 클래스는 CLLocatoinManager 와 CLLocatoin 이다 CLLocatoinManager 클래스의 인스턴스는 아래

abc1211.tistory.com

 

위대한 성과는 함께 이루어지는 작은 일들의 연속으로 이룩된다.
- 빈센트 반 고흐 -
반응형
반응형

운영체제(OS)

컴퓨터 시스템은 크게 CPU, 메모리, 디스크로 구성되어 있다고 볼 수 있다.

각각의 하드웨어를 연결했다고 해서 우리가 원하는 프로그램을 수행할 수 있는 것은 아니다.

단지 하드웨어는 각각 특정 기능을 수행 할 뿐이다.

 

 

CPU는 '연산'을 메모리는 '순간 기억'을 디스크는 '저장'하는 역할을 물리적으로 하게 된다.

컴퓨터라는 하드웨어 상에 어플리케이션(소프트웨어)들이 동작되려면, 적절하게 데이터를 주고 받으며 논리적인 일들을 해야하는데,

이러한 응용 프로그램들을 수행하기 위해서 하드웨어와 인터페이스하는 기본 프로그램으 '운영체제'라고 한다.

 

운영체제의 3대 기능

1. CPU수행 시간을 나누는 '프로세스 관리'

2. 서로 다른 앱이 메모리를 사용하는데 있어서 문제가 없도록 해주는 '메모리 관리'

3. 파일이 저장되어 있는 '디스크 관리'

 

 

운영체제의 기능 'CPU' 관리

스레드 :  각 프로세스에 한 개 이상 존재하고 그 프로세스가 포함하고 있는 수행부를 한개씩 수행하는 역할을 함.

 

여러 개의 스레드가 동시에 CPU를 사용(연산을위해)하려고 요청하는데, 정리해주고 효율적으로 CPU를 사용할 필요가 있다.

이를 '프로세스/스레드 관리'라고 한다.

 

프로그램이 수행된다는 의미는,

디스크에 있는 파일이 메모리 상으로 로드가 되고 ->  CPU가 그 명령어를 수행

하는 것을 의미한다.

 

✔️ 레지스트리 :  운영 체제의 설정과 선택 항목을 담고 있는 데이터베이스로, 모든 하드웨어, 운영 체제 소프트웨어, 사용자 PC 선호도 등에 대한 정보와 설정이 들어 있다

 

여러 개의 스레드가 동시에 수행이 되는데, 엄밀히 말하면 동시가 아니라 순차적으로 수행이 된다.

기존에 수행되고 있던 것은 수행을 멈추고, 다음 스레드에게 CPU 사용권을 넘겨줘야한다.

이를 위해서 현재 수행되고 있는 레지스트리나 CPU내의 값의 정보를 남겨둬야하는데, 이 상태를 '컨텍스트'라고 하고,

이것을 남기고 다음 환경으로 복원하는 과정을 '문맥 교환' == 컨텍스트 스위칭(context switching)이라고 한다.

 

동시 수행을 위한 멀티 스레드

멀티 스레드 프로그램은 스레드를 2개 이상 가지며, 동시에 기능을 처리 할 수 있다. (엄밀히 말하면 동시 수행은 아니다.)

물론 최근 듀얼 코어라고 하면 동시에 명령어를 2개 수행할 수 있기 때문에, 동시라는 말이 성립이 된다.

 

✔️ 멀티스레드 : 여러 개의 스레드하나의 프로세스 내에서 수행한다.

 

우선순위 스케줄링

: 여러 개의 앱이 동시에 수행을 요구하고, CPU의 사용을 요구할 때 어떻게 할 것인지?를 반영하여 적절하게 CPU사용을 할 수 있도록

시간을 배분해 주는 것.

 

이때, 중요한 개념이 두 가지가 있다.

1. 어떤 어플리케이션을 먼저 수행 할 것인가?

2. 어떻게 효율적으로 적은 노력과 시간으로 수행중인 어플리케이션을 중지시키고 다음 어플리케이션을 수행할 수 있을 것인가?

 

 

현재 사용하고 있는 스케줄링 방식은 '라운드-로빈' 방식이다.

선점형 우선순위 방식인데, 이는 수행중인 스레드보다 우선 순위가 높은 스레드가 오면 그 수행을 멈추고

자리를 비쳐줘야 하는 방식이다.

 

이렇게 하는 이유는 : 전체 효율이 가장 높이지기 때문

 

우선순위는 프로세스와 스레드가 갖게 된다. 태생부터가 우선순위가 높은 것이 있는가 하면,

수행 도중에 그 우선순위를 일시적으로 높게 바꿀 수도 있다.

하지만, 수행 중에는 바꿀 수 있는 범위에 한계가 있다.

즉, 태생이 높은 것을 일시적으로 바꿔서 더 높아질 수는 없다는 의미.

 

윈도우는 기본적으로 스레드가 CPU 사용을 대기하고 있고, 그 줄은 여러 줄로 서 있는데,

그 줄의 의미는 우선순위이다. 이때, 수행이 계속 안되는 현상이 생길 수 있는데, 이를 '기아현상'이라고 부른다.

 

 

운영체제의 기능 '가상 메모리'

프로그램은 수행되는 동안 프로그램의 일부 모듈이 메모리에 적재된다.

메모리는 CPU에 가까울수록 속도가 높아진다. 이러한 상태에서 메모리는 한계를 가지게 되는데,

그 메모리의 용량을 좀 더 크게 사용할 필요가 있다.

 

이것이 가능한 이유는 프로그램에서 바라보는 메모리의 주소가 실제 주소도 있지만, 가상주소로 지정이 가능하기 때문이다.

이를 프로그램에서 바라볼 때는 가상주소로 보고 실제 메모리를 접근할 때에는 실제 주소로 대응을 하게 된다.

 

실제 메모리 이상의 메모리를 사용하려고 할 때, 가상 메모리를 사용하게 된다.

가상 메모리라고 디스크의 일부를 메모리로 사용하는 것이다.

실제 메모리를 사용하다가 사용하지 않는 데이터를 디스크에 저장하게되고, 수행을 할 때에는 실제 메모리로 로드하게 된다.

이러한 동작의 반복은 하드웨어와 운영체제간의 동작이며 앱 측면에서는 메모리를 사용하는 것과 동일한 상태로 보여진다.

 

 

운영체제의 기능  '디스크 관리'

하드 디스크는 외부 기억장치로써 시스템을 구성하는 요소 중 하나가 된다.

CPU와 메모리 디스크로 구성이 될 때, 디스크는 전원이 꺼진 상태에도 내용이 유지되는 저장장치이다. 

 

윈도우에서의 어플리케이션 실행 순서

 

반응형
반응형

커널

: 커널은 운영체제(OS)의 일부로써 하드웨어프로세스운용을 위한 소프트웨어이다.

커널이라고하면, 운영체제를 말하기도하고, 응용 프로그램(엑셀, 파워포인트, 메모장 등)의 실행 환경을 이루고 운용하는 것을 말하기도 한다.

시스템의 자원은 한정되어 있지만, 동작되고 있는  프로그램들은 많기 때문에, 커널은 한 프로그램이 언제 얼마큼 자원을 써야하는지 결정하고 운영시켜야 한다.

CPU를 얼만큼씩 어떠한 일에 쓸 것인가 등의 스케줄링을 하게 된다.

 

커널의 특징 및 기능

- 커널은 디스크에 파일로써 존재하는 프로그램

- 시스템이 가동될 때 boot(부팅) 프로그램에 의해 구동되며 메모리에 상주

- 프로세스와 파일을 관리

- 입출력(I/O) 장치 관리

- 메모리 관리

- 시스템 호출 인터페이스기능 수행 

- 디스크, 네트워크, 비디오 카드 등 하드웨어 관리

- 응용 프로그램(엑셀, 파워포인트, 메모장 등 실행)이 이러한 하드웨어를 접근하는 통로

응용프로그램의 요청 -> 하드웨어 수행 -> 결과를 응용프로그램에게 반환

 

 

커널의 분류

✔️ Linux 커널만을 다루겠습니다.

 

리눅스 커널

리눅스는 가장 유명한 오픈 소스 OS(운영체제)이다. 리눅스는 한 사람의 프로젝트에서 수 천명의 개발자들이 포함된 전 세계적인 개발 프로젝트로 진화했다.

 

커널과 사용자 애플리케이션은 서로 다른 주소 공간들을 사용한다.

사용자 공간은 고유의 가상 주소 공간을 차지하지만, 커널은 하나의 주소 공간을 차지

 

 

커널공간 내부

- 시스템 호출 인터페이스(System Call Interface) : 사용자 공간에서 커널로 함수 호출을 수행하는 수단을 제공

 

- 프로세스 관리(PM) : 프로세스의 실행을 관리. 보통 이를 쓰레드라고하고, 프로세스의 직접적인 수행하는 자.

✔️ 사용자 공간에서는 일반적으로 프로세스라는 말이 사용된다. 쓰레드, 데이터, 스택, CPU레지스터를 포함한다.

 

- 메모리관리(MM) : 하드웨어는 가상 메모리를 관리하고, 메모리는 페이지(page)라고 하는 곳에서 관리된다.

✔️ 다중 메모리 사용자를 지원할 때, 메모리가 차면 디스코로 옮겨야하는 경우에, 이 페이지는 메모리에서 하드디스크로 교환(swap)하게 된다. 페이지 교체(swapping)이라고 부른다.

 

등등이 있다.

반응형
반응형

버스 : 메모리에 있는 값들을 CPU의 레지스터로 불러들이거나 기록하는 등의 데이터의 이동이 필요한데, 이 값들을 주고 받는 통로

 

캐시 메모리

: 메인 메모리와 CPU간의 데이터 속도 향상을 위한 중간 버퍼(중간지점: 데이터를 기억) 역할을 하는 CPU내 또는 외에 존재하는 메모리

 

데이터의 임시 보관소

'Cache'는 보관이나 저장의 의미이다. CPU와 메인 메모리 사이에 존재한다고 말할 수 있다.

즉, CPU는 빠르게 일을 진행하고 있는데, 메모리(느림)에서 데이터를 가져오고 가져가는데 느려서 중간에 미리 CPU에 전달될 데이터를 들고 서 있는 형태라고 말할 수 있다.

 

캐시 메모리의 성능

메인 메모리의 블록(예: 박스)사이즈의 데이터를 담아 두었다가 CPU에게 워드(예: 글자)사이즈 만큼의 데이터를 전송하게 된다.

이때, 이 사이즈들이 캐시의 성능에 영향을 미치게 된다. 블록사이트나 워드사이즈가 상대적으로 크다면 그만큼 Cache의 Hit률(캐시메모리에 CPU가 찾는 데이터가 존재할 확률)이 높아지기 때문이다.

 

이때, CPU가 필요한 데이터가 캐시에 들어와 있으면 'Cache Hit'이라 하고, 없으면 'Cache Miss'라 한다.

그리고 CPU가 원하는 데이터가 캐시에 있을 확률을 'Hit Ratio'라고 한다.(스페인어 Ratio는 확률이라는 뜻)

 

동작과정

1. CPU가 필요로하는 메모리 주소를 받는다.

2. 캐시에 존재하는가? (YES/NO)

 

YES

CPU가 요청한 데이터를 캐시로부터 읽어 전달 -> 끝

 

NO

메인 메모리로부터 해당 주소의 메모리를 블록사이즈만큼 읽어들인다. ->

메인 메모리로부터 읽어들인 데이터를 캐시에 기록한다. ->

CPU가 요청한 데이터를 워드사이즈로 전달해준다. ->

끝 

캐시의 지역성(Locality)

CPU에서 명령어를 수행하면서 매번 Cache Memory를 참조하게 되는데, 이때 Hit률(데이터가 있을 확률)이 지역성을 갖는다.

지역성 : 어느 순간에 특정부분집중적으로 참조하는 것. 공간적 시간적 특성이 있다. 

 

공간적 지역성

: 한 번 참조한 메모리의 옆에 있는 메모리를 다시 참조하게 되는 성질 

예) Array(배열)는 일정한 메모리 공간순차적([0],[1])으로 할당받아 사용하는 것

 

int a[10] 이라고 한다면, a[0]을 사용 후, 인접한 a[1]를 사용될 확률이 높다는 것이다. 

 

시간적 지역성

: 한 번 참조된 주소의 내용은 곧 다음에 다시 참조 된다는 특성을 말한다.

예) 반복문(for, while)을 연상해볼 수 있다. 

.

.

 

지역성의 특성은 블록 사이즈의 크기와 연관이 있다. 블록 사이즈가 커지면 캐시의 Hit률이 높아지는 건 당연지사다.

그렇다고, 무작정 블록 사이즈를 키우는 것 만으로는 효율성을 높일 수는 없다.(CPU가 원하는 데이터를 캐시가 가지고 있냐? 문제이기 때문)

 

이에 따라 몇 가지 요소를 고려하여 설계해야한다.

설계의 목표는 Hit률을 높이고, 최소의 시간에 데이터를 전달(데이터 찾아서 전달) 하는 것이다.

Hit 실패 시 다음 동적을 처리하는데 있어서 시간을 최소화(메인 메모리에서 가져오기)하는 것이 중요하며 데이터의 일관성(정확한 데이터)을 유지해야한다.

 

Write Through 정책

프로세서에서 메모리에 쓰기(write) 요청을 할 때마다 캐시의 내용과 메인 메모리의 내용을 같이 바꾸는 방식.

캐시의 데이터를 최신화 시켜준다고 보면 된다. 하지만,  메인 메모리에도 계속 접근해야 하므로(캐시가 아니라 메인메모리에 접근하게 되면 시간이 늘어난다.) 캐시에 의한 접근 시간의 개선이 없어지게 되며, 쓰기(데이터 업데이트)시에 접근 시간은 메인 메모리의 접근 시간과 같게 된다는 단점을 가지게 된다.

 

하지만, 실제 프로그램에서 메모리 참조 시 쓰기에 대한 작업은 통계적으로 10 ~ 15%에 불과하다.

 

Write Back 정책

CPU에서 메모리에 대한 쓰기 작업 요청 시, 캐시에서만 쓰기 작업을 하고 그 변겨이 사실을 확인 할 수 있는 표시를 하여 놓은 후,

캐시로부터 해당 블록의 내용이 제거(사용 끝 -> 마지막 데이터는 유지) 될 때, 그 블록을 메인 메모리에 복사함으로써 메인 메모리와 캐시의 내용을 동일하게 유지하는 방식.

 

이 방식은 동일한 블록 내에 여러 번 쓰기를 실행하는 경우 캐시에만 여러번 쓰기를 하고 메인 메모리는 한 번만 쓰기 되므로 매우 효율적으로 동작하게 된다.

 

 

캐시 메모리의 주소 매핑 방식

캐시 메모리는 실제 메인 메모리에 비해 그 크기가 매우 작아서 메인 메모리와의 1:1 매칭되는 동일한 주소 체계를 가질 수 없다.

그래서 메인 메모리와의 다른 형태의 주소 매핑 방식을 사용하고 있다.

 

매핑 : '연관성을 관계하여 연결시켜준다.' 는 의미

 

직접매핑

: 메인 메모리를 일정한 크기의 블록(캐시사이즈)으로 나누고 각각의 블록을 캐시의 정해진 한 위치에 매핑하는 방식

 

예) 메인 메모리가 16메가바이트, 캐시메모리가 64킬로메가바이트 라면,

메인 메모리를 캐시 사이즈 단위로 나누게 되고, 각각의 블록들에 대하여 태그(명찰)값을 매기게 된다.

예의 경우 64KByte의 캐시 사이즈를 가지므로 64KByte 단위로 블록을 나누고,

각각의 블록들은 하나의 태그 값으로 나타내게 되므로,

메인 메모리 주소 0~0x00FFFF까지는 태그 값 00,

메인 메모리 주소 0x010000~ 0x01FFFF까지는 태그 값 01 과 같은 식이 되는 것이다.

 

완전 연관 매핑 

: 직접 매핑이 한 곳에 밖에 매핑할 수 없다는 단점은 캐시의 성능을 매우 저하(블록을 계속 교체 시켜야하기에) 시킴.

이에 따른 개선으로 캐시의 태그 필드를 확장하여, 캐시의 비어 있는 곳이라면 어디든지 매핑 시킬 수 있는 매핑 방법

 

집합 연관 매핑 

정해진 위치 + 남은 자리에 매핑하는 방법

 

캐시 일관성 문제를 해결하기 위한 프로토콜

메모리를 공유하는 구조에서는 다중 프로세스가 메모리 사용 시, 그 성능을 개선하기 위해 캐시에 저장하게 되는데,

메모리간에 데이터 불일치가 발생된다.

 

해결방법

1. 공유 캐시를 사용 : 모든 프로세스들이 하나의 캐시를 사용. 충돌이 심하다. 지역 참조 위반.

2. 버스 감시 메커니즘 : 변경에 대한 자신의 캐시 블록 상태를 제어.. (블록 상태감시)

3.  디렉토리 기반 캐시 일관 성 유지 : 캐시 상태를 디렉토리에 저장 -> 데이터 일관성 유지 -> 주기억장치 디렉토리에 기억

 

 

캐시의 교체 알고리즘

: 캐시에 빈 공간이 없는 상태에서 새로운 내용이 메인 메모리로부터 캐시 메모리에 복사되어야 하는 상황에서 어떤 것을 뺄 것인가?

FIFO(first in first out) : 가장 오래있던 놈 나가!

LRU(least recently used) : 사용되지 않은 채로 오래있던 놈 나가!

LFU(least frequently used) : 사용빈도수 가장 적은놈 나가!

랜덤 : 아무나 한놈 나가!

 

 

반응형
반응형

메모리

: 기억.

: 컴퓨터에서 말하는 메모리는 기억소자(memory cell 이하, 기억세포라 부르겠다.) 즉, 반도체를 의미한다.

.

.

컴퓨터는 이진 1과 0으로 값을 저장하기 때문에, 기억세포는 상태가 ON인지 OFF인지 기억을 하게 되는 것이다.

.

.

다시 돌아와서,

기억 세포들이 공통적으로 하는 일은 set과 get이다. 우리는 주로 write와 read로 사용한다.

0과 1중의 하나를 저장하고, 값(0,1)이 있다면 그 값을 가져오는 일이다. (상태를 가져온다고 한다.)

 

기억세포에서 확장하면 기억장소,, 그리고 더 확장하면 저장 장소라는 개념의 우리가 사용하는 하드디스크, CD, USB 저장장치다.

메모리와 이런 저장장치와의 차이는 메모리는 휘발성(값이 날아감)이라는 것이다.

시스템이 활성화 된 상태에서 그 값을 기억하고 있다가 시스템이 종료될 때, 지워지게 된다.

 

 

 

메모리 동작

메모리는 0 또는 1로 저장이 되는데,  이 값을 유지하기 위해서는 전기적으로 연속적이게 재충전 되어야 한다.

우리는 이것을 '메모리 리프레시(Memory refresh)'라고 부르기로 했어요.

 

메모리는 정보를 저장(write) 또는 읽기(read)위해서 밑의 사진과 비슷한 행렬구조의 주소를 가지고 있습니다.

 

행(세로)과 열(가로)로 이루어진 행렬

 

RAS(Row Address Strobe, 가로 주소) :   프로세서가 메모리에 있는 정보를 읽거나 저장할 때 먼저 RAS를 보낸다.

CAS(Column Address Strobe, 세로 주소 ) : 그 후에, 어떤 특정 메모리 주소에 데이터가 들어있는지 아니면 비어있는지 확인 담당

 

 

 

메모리 동작 과정

1. CPU가 '메인보드 칩셋'에게 데이터를 요청한다.

2. '메인보드 칩셋'이 데이터가 있는 곳의 행(가로)주소를 메모리로 보낸다.

3. 행 주소가 메모리 버퍼로 들어오면 그 행의 모든 셀을 RAS가 읽는다

4. 하지만, 행 주소로는 필요한 데이터가 어디에 있는지 모르니까, CAS보낸다.

5. 찾았다.

6. 메모리 셀(기억세포)에 있는 내용이 출력 버퍼로 옮겨진다.

7. '메인보드 칩셋'이 출력 버퍼의 내용을 읽고 CPU로 전달한다.

 

 

메모리 성능

: 메모리가 CPU와 데이터를 주고 받는 시간 이를 액세스(access : 접근)라 부르며, 단위는 ns(nano-secode) - 10억분의 1초다.

 

✔️ 리스페시 시간(refresh time) : 메모리는 일정 시간마다 재충전을 해줘야한다.(정보를 유지하기 위해) 이 일정기간을 리프레시 시간이라고 한다. 

 

✔️ 메모리 액세스 시간  : 데이터를 읽어오라는 CPU의 명령을 받고 데이터를 읽기 시작하기까지의 시간.

즉, 메모리 동작과정 1~7

 

✔️ 사이클 시간 : 메모리 작업이 완료와 동시에 다음 신호를 받을 준비가 되었다는 신호를 주기까지의 시간.

사이클 시간 = 메모리 액세스 시간 + 리프레시 시간

 

메모리 분류

RAM(Random access memory : 무작위 접근 메모리)는 주기억 장치에서 사용되며 자료 저장 방식, 형태별 사용처에 따라서 메모리를 분류 할 수 있다.

 

1. 자료 저장 방식에 따른 분류

정적방식(SRAM: static RAM) : 플립플롭을 이용한 방식으로 고정된 값을 기억하는 방식 재충전 필요 없음.

동적방식(DRAM: Dynamic RAM) : 캐패시터에 전하를 충전하는 방식으로 데이터를 저장하는 기억세포들로 이루어진 것.

저장내용을 기억하기 위해서는 주기적인 재충전이 필요.

 

 

플립플롭

: 1비트의 정보를 보관 및 유지할 수 있는 회로이다. 전기 신호가 지속적으로 공급되어야만 정보를 유지할 수 있다.

✔️ 자세한건 clean code를 읽어보거나, 검색해보는 것을 추천합니다. 

 

캐패시터

캐패시터 출처 : 구글

캐패시터 : 직류 전압을 가하면 각 전극에 전기(전하)를 축적(저장)하는 역할

 

 

 

 

 

 

 

반응형

+ Recent posts