한 프로세스에서 다른 프로세스의 변수 OR 자료구조 접근 불가 (다른 프로세스의 자원에 접근 하려면 프로세스간의 통신 IPC사용)
참고 IPC (Inter Process Communication) ?
파이프, 소켓 통신
프로세스 구성
Cdoe : 실행 명령을 포함하는 코드들
Data : Static 변수 혹은 Global 변수
Heap : 동적 메모리 영역
Stack : 지역변수, 매개변수, 반환 값 등 .. 일시적인 데이터
스레드 개념
프로세스 내에서 실행되는 여러흐름 단위
프로세스가 할당받은 자원을 이용하는 실행단위
스레드는 프로세스 내에서 Stack만 따로 할당 받고 Code, Data, Heap 영역은 공유
멀티프로세스
하나의 응용프로그램을 여러개의 프로세스로 구성, 각 프로세스가 하나의 작업을 처리 하도록 함
장점
여러개의 자식 프로세스 중 하나에 문제가발생하면 그 자식프로세스가 죽는것 이상으로 다른 영향 확산 없음
단점
Context Switching 에서의 오버해드 Context Switching 과정에서 캐쉬메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 오버헤드 발생
참고 Context Switching란?
CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching라 한다. 구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이 전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
멀티스레드
하나의 응용프로그램을 여러 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리 하도록 하는 것
장점
시스템 자원 소모 감소
프로세스 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 할 수 있음
스레드사이의 작업량이 작아 Contet Switching이 빠르다
간단한 통신 방법으로 프로그램 응답시간 단축
스레드는 프로세스 내의 Stack 영역을 제외하는 모든 메모리를 공유 함으로
단점
디버깅 까다로움
하나의 스레드 문제 발생시 전체 프로세스 영향받음
멀티 스레드의 경우 자원공유 문제 발생 (동기화 문제)
멀티 프로세스대신 멀티 스레드 사용 이유?
여러개의 프로그램을 실행하는 것보다 하나의 프로그램 안에서 여러가지 작업을 해결 함으로
Muti-Core
Concurrency (동시성)
하나의 코어에서 하나이상의 프로세스가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는것
코드로 처리하는게 아닌 프로젝트 내에서 default 언어를 설정하는 방법을 계속 찾아봤다
위 value를 직접 변경해 보기도 하고
프로젝트 파일을 에디터로 열어서 변경도 했었다
제 3언어로 설정하면 직전에 설정한 언어로 표기가 되는 문제가 발생한다.
위 증상을 확인해보니 IOS는 현재 폰에 설정된 언어가 앱이 지원하는 언어가 아닐경우에 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다.
결국엔 프로젝트내에서 설정 할 수 없어, 코드로 처리하기로 함
import Foundation
extension String {
var localized: String {
return NSLocalizedString(self, tableName: "Localizable", value: self, comment: "")
}
}
protocol Localizable {
var localized: String { get }
}
protocol XIBLocalizable {
var xibLocKey: String? { get set }
}
extension UILabel: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
text = key?.localized
}
}
}
extension UIButton: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
setTitle(key?.localized, for: .normal)
}
}
}
extension UINavigationItem: XIBLocalizable {
@IBInspectable var xibLocKey: String? {
get { return nil }
set(key) {
title = key?.localized
}
}
}
기본 구성 방식은
스토리보드에 위와같이 설정해서 로컬라이징 하는 방식으로 구현 되어있다.
func localizableBundleSet() -> Bundle {
var language = UserDefaults.standard.array(forKey: "AppleLanguages")?.first as! String // 초기에 "ko-KR" , "en-KR" 등으로 저장되어있음
if language.hasPrefix("en") { language = SupportedLanguage.en.rawValue }
else if language.hasPrefix("ko") { language = SupportedLanguage.ko.rawValue }
else if language.hasPrefix("ja") { language = SupportedLanguage.ja.rawValue }
else if language.hasPrefix("zh") { language = SupportedLanguage.zh_CN.rawValue }
else if language.hasPrefix("es") { language = SupportedLanguage.es.rawValue }
else { language = SupportedLanguage.ko.rawValue
/**
정의되지 않은 언어들은 한국어로 로컬라이징 한다.
navigation barItem이 선호하는언어의 상단 언어를 따라가는것을 확인
setAppleLanguageTo()를 통하여 AppleLanguages 순서를 변경 해주었으나 앱이 재구동 시켜야지 적용 되는것을 확인, 주석처리
*/
// setAppleLanguageTo(lang: "ko-US")
}
let path = Bundle.main.path(forResource: language, ofType: "lproj")
let bundle = Bundle(path: path!)!
return bundle
}
Navigation barItem 은 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다. (ex : Back )
func setAppleLanguageTo(lang: String) {
// Get the current list
var languages = UserDefaults.standard.stringArray(forKey: "AppleLanguages") ?? []
// Get all locales using the specified language
let matching = languages.filter { $0.hasPrefix(lang) }
if matching.count > 0 {
// Remove those entries from the list
languages.removeAll { $0 == lang }
// Add them back at the start of the list
languages.insert(contentsOf: matching, at: 0)
} else {
// It wasn't found in the list so add it at the top
languages.insert(lang, at: 0)
}
UserDefaults.standard.set(languages, forKey: "AppleLanguages")
}
위와같이 AppleLanguages의 순서를 변경 해주었는데 앱을 재구동해야 적용 되는 문제가 있었다...
일단 순서를 변경해 주는 부분은 주석처리하였고 Navigation barItem의 문제는 수정하지 않아도 된다고 하여 변경하지 않았다.