Search
🎼

프로세스란?

프로세스란?

실행중에 있는 프로그램, 프로그램 자체는 프로세스가 아니다.
프로그램은 보다 수동적인 존재. 실행을 해주어야하는 존재
프로세스는 능동적인 존재. ( 다음에 실행할 명령어의 주소를 저장하는 등의 자원의 집합을 가짐. )
task(작업) = 프로세스
iOS = 시분할 시스템

iOS 에서 프로세스란?

iOS에서는 Process는 어떤 것을 의미할까요? 실행 중인 App을 의미합니다

프로세스의 메모리 구조

메모리는 물리적으로 하드디스크, 램, 레지스터, 캐쉬로 구성되나 각각 특성에 따른 비용과 속도가 다르고 용도가 달라 개발자가 일일히 저장될 공간을 지정해주기 어렵다.
따라서 보통 운영체제에서는 아래와 같이 가상 메모리로 만들어 관리하기 편하게 만들어줍니다.
즉, 아래 구조는 물리적 구조 추상화된 가상 메모리

Stack

LIFO 구조
local 변수

Heap

프로그램 실행 도중에 할당(동적할당)되는 공간.
ClassClosure 즉, Reference 타입들이 이 공간에 저장된다.
Swift 의 ARC(Automatic Reference Counting)이 Heap 영역과 관련된 개념임.
원본은 하나만 만들어져 저장해 두었다가 인자로 호출될때마다 원본을 참조한다. 이 방식을 call by reference 라고 부른다.
이 Heap 영역의 Reference 타입들이 프로그램상에서 얼마나 참조되고 있는지 숫자를 센다. (Reference Counting)
이렇게 숫자를 세서 메모리에 할당(alloc, allocation) , (malloc, de-allocation)을 자동으로 관리하는 것이 바로 ARC

Data

전역변수 저장되는 공간

Text

프로그램 코드가 저장되는 공간

프로세스 상태 (Process State)

프로세스의 상태는 시시각각변한다.

new

자원을 할당 받는 상태.

Ready

FIFO 구조의 큐에 올라감
메인 메모리에 데이터가 올라가 CPU 를 할당받을 준비가 끝난 상태

Running

하나의 CPU Core 를 점유(할당)해 실행되는 상태
싱글 코어 CPU 에서는 하나의 프로세스 만이 이 상태에 존재 가능

Waiting

입출력 이벤트에 의해 CPU 할당 해제된 상태.
입출력 이벤트 종료시 다시 ready 큐로 들어감

Terminated

실행이 종료되어 모든 자원을 할당해제받은상태.

Process Control Block : PCB

일반 사용자가 접근하지 못하도록 보호된 메모리에 저장 = 커널 스택
→ 시분할 시스템에서 문맥교환이 매우 빠른 속도로 빈번하게 일어나기 때문에, 프로세스의 정보를 담고 있는 PCB 는 가장 접근 속도가 빠른 메모리 공간인 커널 스택에 저장됨.
프로세스와 연관된 여러 정보를 보유.
1.
State
프로세스의 상태
2.
프로그램 counter
이 프로세스가 다음에 실행할 명령어의 주소
3.
레지스터
CPU 점유를 양보할 때의 CPU 의 레지스터 값
→ 다시 CPU 를 점유하였을 때 상태를 복구하기 위해 보유.

프로세스 스케쥴링

현재 메모리에 있는 프로세스 수 = 다중 프로그래밍 정도
즉 CPU 는 한정되어 있지만 여러개의 프로세스를 실행하기 위해,
CPU 할당 순서 및 방법을 결정하는 일을 스케쥴링이라고 한다.

Queue

Ready Queue

메인 메모리에 존재하는 모든 프로세스가 담긴 큐
linked list 형태로 존재.

Device Queue

입출력 이벤트를 기다리는 모든 프로세스

Job Queue

운영체제 내의 모든 프로세스

스케쥴링 과정

1.
Ready Queue 의 tail 에 해당 되는 프로세스가 CPU 를 점유하여 running 상태로 돌입
2.
입출력 요청이 발생 → CPU 인터럽트
3.
인터럽트된 프로세스는 Device queue 로 진입
4.
입출력 장치를 사용할 순서를 기다림
5.
입출력 장치의 사용을 마치면 다시 ready queue 의 head 로 진입
iOS 운영체제는 Time-Sharing System이기 때문에 Timer를 갖고 있습니다. 이 Timer의 최대 시간이 지나게 되면 CPU의 점유권을 다른 Process에게 넘겨주게 됩니다. 즉, Timer Interrupt를 받으면 현재 실행중인 Running상태를 갖는 Process는 실행을 멈추고 Ready Queue에 다시 줄을 서게 됩니다. 그러면 다시 Process는 Ready 상태로 바뀌고, CPU Scheduler는 다시 Ready Queue에서 한 Process 꺼내 실행시키면 Process는 Running 상태로 바뀝니다.

스케쥴러 종류

Long term scheduler

Ready Queue 에 올라갈 프로세스를 고름
비교적 덜 호출됨
multiprogramming 의 degree 를 조절함.

Short term scheduler

Ready Queue 에 있는 프로세스 중 CPU 에 할당될 프로세스를 고름.
매우 빈번하게 호출됨

Context Switch

CPU 가 다른 프로세스로 스위칭 되려면 시스템은 이전 프로세스의 상태를 저장하고 다음에 실행될 프로세스의 상태를 불러와야한다.
이러한 과정을 Context Switch 라고 부른다.
Context Switch time 은 overhead 즉, 낭비다. 프로세스가 아니라 OS가 실행되는 시간이기 때문. 이 시간이 길 수록 사용자의 사용성이 떨어진다.
문맥교환 시간은 하드웨어 성능에 달려있다.( CPU 쿨럭 )

IPC InterProcess Communication

프로세스는 일반적으로 독립적이나, 협력구조를 사용할 수 있다.
이렇게 협력구조를 사용하게 되면 프로세스는 서로 영향을 줄 수 있게 된다.

프로세스간 협력이 필요한 이유

정보 공유 → 중복된 정보의 단일화
병렬처리 → 연산속도 증대
Modularity 이식가능성
편의성

IPC

Shared memory
Message Passing
보통 프로세스간 소통을 위해서는 OS 의 도움 즉, 커널의 도움을 받아야 하는데
접근 속도가 느리다. 커널 메모리 접근을 위해서는 시스템콜이 필수 이므로. 문맥교환시간이 늘어난다.

Shared Memory

프로세스 A,B 가 공유하는 메모리 공간이 생기면 상호작용이 빨라지는 장점이 있다
몇가지 제약조건이 생기는데
동시에 동일한 위치에 쓰지 않도록 책임져야 한다. 즉, 충돌 회피에 대해 고려하여 개발해야한다.
하지만 이는 운영체제의 소관이 아니다.
→ 개발자가 담당해야하는 결과

Message Passing

커널 스택에 존재하는 메일박스를 참조.
충돌 회피를 할 필요가 없다. → 어차피 커널 수준에서 접근이 이루어지기 때문에 동시 접근 불가.
적은 양의 데이터 교환 시 유용
구현하기 쉽다.
시스템 콜 → 부가적인 시간 소비 작업. = Shared memory 모델 보다는 느림

IPC in iOS

iOS 에서는 프로세스간 통신을 엄격하게 block

UIApplication 클래스의 open(_:options:completionHandler:)

UIApplication 클래스의 open(_:options:completionHandler:) 메소드를 통해 하나의 앱에서 다른 앱(프로세스)을 실행함으로써 프로세스간 통신이 가능하다
앱 내에서 다른 앱을 실행시킬 때 사용하는 메서드인가요?
A: 맞습니다 아래 블로그를 참고하시면 될 것 같네요!
A notification dispatch mechanism that enables the broadcast of notifications across task boundaries. 태스크 경계를 넘어서 notification을 브로드캐스트 할 수 있는 notification 발송 매커니즘
서로 다른 프로세스 간의 notification 을 위해 사용
앱이 서브앱을 필요로 하는 경우에 사용하면 좋을 듯 하다.
예:
쿠팡 알바 예약 앱   쿠팡 알바 셔틀버스 앱
모든 프로세스들은 기본적인 distributed notification center 를 가진다.
다양한 타입의 분산 알림 센터가 존재할 수 있다.
NSDistributedNotificationCenter 을 사용할 경우 보안 문제 발생가능 ( 보안 프로토콜 구현 안되어 있음) → 보안이 필요한 데이터는 해당 클래스를 사용하지 말 것.
NSDistributedNotificationCenter 은 같은 프로세스 내부의 스레드간 noti 전달에는 사용하지 말 것.
NotificationCenter 는 Single app 내부에서만 사용 가능.

Drag and Drop

단일 앱이 아닌
다른 앱으로의 드래그 앤 드롭
iPad 에서만 가능했음 → iOS 에서도 멀티 윈도우를 지원하니까 이제 가능하지 않을까>..?
NSItemProvider 을 사용 (Starting in iOS 11,
An item provider for conveying data or a file between processes during drag-and-drop or copy/paste activities, or from a host app to an app extension.
서로 다른 앱간 드래그앤 드롭 복사 붙여넣기 호스트앱 → 확장 앱으로의 데이터 전달에 사용되는 클래스
source app : item을 드래그 한 앱
destination app : item이 드롭된 앱.

iOS 에서의 프로세스, 스레드 관리

A collection of information about the current process.
A lock that multiple applications on multiple hosts can use to restrict access to some shared resource, such as a file.