[iOS] Modularization(2) - Loose Coopling
2023. 5. 18. 01:31
iOS/iOS
"모듈화"란 Software를 각 기능별로 분할하여 설계하는 기법이다. 지난 포스팅에서 모듈화가 적용이 안된 모노리틱 앱 구조는 코드의 영향 범위를 파악하기 어렵고, 앱의 규모가 커질 경우 빌드시간이 오래 걸리게 된다. 이에 따라 Swift에서 모듈화를 진행하는 방법에 대해 알아보았다. 하지만, 이러한 물리적인 코드의 분리는 반쪽짜리 모듈화에 지나지 않는다. "좋은 모듈화"는 용도에 맞게 잘 구분된 기능을 가진 독립적인 모듈로 나누는 것이다.모듈의 독립성은 응집도와 결합도로 판단하게 된다. 모듈의 "응집도"란 모듈 내부의 기능적인 집중도를 의미한다.모듈의 "결합도"란 다른 모듈간의 상호 의존성을 의미한다. 즉, 좋은 모듈이란 응집도는 높고 결합도는 낮아야 한다. 이번 포스팅에선 모듈간의 느슨한 결합..
[OS] File System(2) - Implementation
2023. 5. 18. 00:40
CS/Operating System
File System은 Interface와 Implementation으로 나뉠 수 있다. 저번 포스팅에선 User와 File System 간의 상호작용을 위한 "Interface"를 다뤘다면, 이번 포스팅에선 실제 내부적으로 어떻게 구현되는지 "Implementation"에서 다뤄볼 것이다. Main Memory와 Disk간의 데이터 교환 단위는 "Block"인데, File System은 Disk에서 "Sequence of Block"으로 표현된다. 각 "Block"은 하나 이상의 Sector로 구성된다. Disk에는 MetaData와 File Data가 저장되어야 한다. Unix에선 inode(MetaData)를 위한 공간과 File Data를 위한 공간이 따로 할당되어 있다. inode의 경우 사이즈..
[OS] File System(1) - Interface
2023. 5. 17. 15:57
CS/Operating System
Disk의 기본 단위는 Sector이다. 이러한 Sector들을 묶어서 논리적으로 독립적인 Disk를 만들 수 있었다. 이를 Partition이라 부르며, 각 Partition은 Logical Formatting 단계를 거쳐 File System을 설치하거나 Swap-Space로 활용할 수 있다. "File System"는 SSD, Disk 등과 같은 각 저장장치에 설치되어 File을 저장하고 관리하며, 검색할 수 있는 등의 기능을 제공하는 SW이다. File System은 User 관점 혹은 저장장치 관점에 따라 2가지로 나뉠 수 있다. "File System Interface"는 File System과 사용자 간의 상호작용을 위한 추상화 계층이다. 예를 들어, 우리는 File의 실제 어떻게 저장되어 ..
[OS] I/O Systems
2023. 5. 16. 03:05
CS/Operating System
PC System에는 다양한 I/O Device가 존재한다. 예를 들어 우리는 마우스를 사용하기 위해 본체에 마우스를 연결한다. 이렇게 연결된 마우스는 Device Controller에 의해 CPU와 상호작용 할 수 있게 된다. Device Controller에는 Data를 Read & Write를 할 수 있는 "Data Register"를 가지고 있다. 마우스에서 클릭이 이루어지고, 우클릭을 하였는지 좌클릭을 하였는지 CPU에게 정보를 전달해 줄 필요가 있다. 또한, I/O Device에서 특정하게 수행해야 할 Instruction이 있다면, CPU는 Device Controller의 Regsiter에 Instruction들을 저장한다. 추가적으로 Device Controller는 I/O Device의..
[OS] Mass-Storage Structure
2023. 5. 15. 00:02
CS/Operating System
Main Memory는 휘발성이기 때문에, 영구적으로 데이터를 저장할 때는 비휘발성인 Disk에 저장하여야 한다. Hard Disk Hard Disk는 자기 패턴을 이용해 데이터를 읽고 쓴다. Hard Disk는 다음과 같이 구성 된다. Head : 데이터를 읽고 쓰는 역할을 담당한다. Disk Arm : Head를 데이터가 있는 곳으로 움직인다. Platter : 위 아래 Surface에 자기적 성질을 통해 데이터를 기록한다. Spindle : Platter를 회전 시킨다. Track : Platter에서 회전축을 중심으로 동심원이다. 하나의 Platter에 여러개 존재할 수도 있다. Cylinder : Platter가 여러 장일 때, Head가 동시에 접근하는 Track들의 집합이다. Sector :..
[OS] Virtual Memory
2023. 5. 13. 20:19
CS/Operating System
"Virtual Memory"란 Process전체가 Memory에 할당되지 않아도 실행시키도록 하는 메모리 관리 기법 중 하나이다. 즉 이를 통해, Process는 Memory Space보다 더 큰 가상 주소 공간을 할당할 수 있게 된다. 저번 포스팅에서 Physical Address와 Logical Address의 차이점을 비교하였다. "Logical Address"는 CPU 입장에서의 주소이다. Contiguous Allocation에선, Process의 시작위치를 0으로 하는 상대 주소와 (Load Time Binding, Run Time Binding) 실제 Main Memory에서의 주소인 절대 주소가 (Compile Time Binding) Logical Address가 될수 있다. 하지만, ..
[OS] Main Memory(2) - Memory Allocation
2023. 5. 11. 01:17
CS/Operating System
Process를 Memory에 할당하는 방식은 Contiguous Allocation과 Non-Contiguous Allocation방식으로 나눌 수 있다. Contiguous Allocation "Contiguous Allocation"이란, Process를 Memory의 한 곳에 연속적으로 Load하는 방식이다. Memory Protection OS와 User 모두 Memory를 사용할 수 있기 때문에, Main Memory는 OS를 위한 공간과 User Process를 위한 공간으로 나눈다. 따라서 User Process를 OS를 위한 Kernel Space를 침범하면 안되며, 다른 Process의 영역도 침범해서는 안된다. 즉, Process가 자신이 소유한 범위를 넘지 않도록 할 필요가 있다. ..
[OS] Main Memory (1)
2023. 5. 9. 16:34
CS/Operating System
File이 Executable(실행가능한) File이면 이를 Program이라 부른다. Program이 "실행 중"인 상태라면 이를 Process라 부른다. "실행 중"이란 말은 CPU에 의해 Instruction이 수행 중인 상태를 의미한다. CPU는 Main Memory와 내부의 Register에 직접 접근할 수 있기 때문에, "실행 중"인 상태로 만들기 위해선 Disk의 Program을 Main Memory로 Load하여야 한다. 즉, Program이 Process가 되기 위해선 Main Memory에 Load되어야 한다. Multistep Processing of a User Program 우선, Program이 Main Memory에 Load되기 까지의 과정을 살펴보자. Source File이 ..
[Design Pattern] DI(Dependency Injection)
2023. 5. 8. 01:10
iOS/Pattern
"의존성 주입"이란, 객체가 의존관계에 있을 때 "직접 생성"하는 것이 아닌, DIP를 적용하여 "외부에서 제공"받는 패턴을 말한다. 한 번에 이해하기 어려우니 천천히 알아보자. Dependency 대부분의 프로그램에서 여러 객체들은 협력하게 되기 때문에, 객체 사이의 의존성은 존재하게 된다. 예를 들어, User의 정보를 Networking을 통해 가져와 이를 화면에 출력시키는 객체가 있다 하자. class UserRepository { func fetchUser() -> User { ... return User(name: "Jung", id: "111") } } class UsersPresentation { private let usersRepository = UserRepository() func ..
[iOS] Modularization(1) - Library, Framework, Swift Package
2023. 5. 4. 01:55
iOS/iOS
Xcode에서 Project를 생성하면, 하나의 App Target이 자동으로 생성된다. 이때의 App Target은 하나의 Module이 된다. 별도의 Framework를 추가하지 않는 이상, 모든 코드는 Single Target에 추가되게 된다. 위와 같이 하나의 Module로 이루어진 App을 "Monolitic App"이라 부른다. 이러한 Monolitic App은 여러 가지 단점을 가지고 있다. 하나의 모듈에 모든 소스코드가 들어있기 때문에 internal과 public을 구분할 수 없다. 이로 인해, 객체들은 무분별하게 참조될 가능성이 있으며, 이는 코드 변경의 영향 범위를 파악하기 어려워진다. 또한, 특정 기능만 테스트하고 싶다 해도 Project내의 모든 소스코드를 빌드해야 한다. App의..
[OS] DeadLock
2023. 4. 29. 17:24
CS/Operating System
DeadLock이란, 이전의 Dinner-Philosipher 문제와 같이, 두 개 이상의 Task가 각각 Shared Resource를 점유하고 있고, 각 Task는 서로가 점유하고 있는 Shared Resource를 필요로 하여, 상대방의 Task가 끝나기를 기다리고 있기에 결과적으론 아무것도 못하는 상태이다. 각 Task는 다음과 같은 순서로 Resource를 이용한다. Request : Resource를 요청한다. (만약, 다른 Task가 먼저 점유하고 있다면 대기한다) Use : Task가 Resource를 할당받아, 작업을 수행한다. Release : Task가 Resource의 점유를 해제한다. DeadLock Characterization DeadLock 발생 조건 DeadLock이 발생하..
[OS] Synchronization
2023. 4. 6. 21:13
CS/Operating System
Concurrency 환경 혹은 Parallelism 환경에서 둘 이상의 Thread 혹은 Process가 공유자원에서 접근할 때 여러 문제들이 발생한다. Race Condition Race Condition은 Concurrency 환경 혹은 Parallelism 환경에서 공유자원에 접근할 때, 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. Race Condition은 결과적으로 데이터의 불일치(inconsistency)를 일으킬 수 있다. 데이터 불일치(Data inconsistency)란 같은 데이터임에도 다른 값을 가지는 상태가 존재하는 것을 의미한다. "Multi-Processor"의 경우 부터 살펴보자. 우선 P1, P2는 memory로부터 데이터를 읽어오는 "Load..