ios개발/개념 정리

<ios 운영체제> 선점 스케줄링, 네트워크 멀티 태스킹, 네트워크 요청 처리 방법

studying develop 2020. 3. 24. 14:54

결론부터 말하면, ios GCD로는 선점 스케줄링이 안되는거 같습니다. 그리고 네트워크 요청을 UrlSessionTask를 사용하는데, 그래서 이것을 resume, suspend, cancel을 통해 조절하는 방식으로 해보고자 하였습니다. 근데 문제는 async로 수행할 경우 suspend가 작동 안한다는 의견과 제 경험이 있었습니다......

[https://stackoverflow.com/questions/40662007/nsurlsessiontask-suspend-does-not-work/40663582#40663582]

 

그래서 cancel로 하면 그래도 된다는 의견인데, 제가 해보니 요청을 하고 중간에 cancel하면 요청했던 타임아웃으로 취소됩니다. 그런데 문제가 취소하자마자 실행한 새로운 요청이 연결을 시작은 하는거 같은데, 서버로부터 응답 받는데 시간이 걸립니다..... 그래서 이 부분은 UrlSessionTask에 관해 ,그리고 swift 네트워크 처리 방식을 좀 더 깊게 이해해야 할거 같습니다.

[https://developer.apple.com/documentation/network]

 

추후에 다시 요청 여러개하고 중간에 새로운 요청을 하면 이전 요청을 중지하고 새로운 요청이 완료된후 이전 요청을 다시 재개하는 과정을 도전해보고 싶습니다......

 


Operating Systems Basics • IOS Architecture Overview 

[https://cdn.ttgtmedia.com/searchNetworking/downloads/InsideIOS.pdf]

 

 

 


Preemption (computing) 

[https://en.wikipedia.org/wiki/Preemption_(computing)]

 

In computing, preemption is the act of temporarily interrupting a task being carried out by a computer system, without requiring its cooperation, and with the intention of resuming the task at a later time. Such changes of the executed task are known as context switches. It is normally carried out by a privileged task or part of the system known as a preemptive scheduler, which has the power to preempt, or interrupt, and later resume, other tasks in the system.

 

 

선점 스케줄링 방식들

-장기,단기

-각자의 장단점

[https://coding-factory.tistory.com/309]

 


모르겠는거, 

타스크 [https://en.wikipedia.org/wiki/Task_parallelism]

그룹 [https://en.wikipedia.org/wiki/Grand_Central_Dispatch]

디스패치큐 [https://developer.apple.com/documentation/dispatch/dispatchqueue]

 

 

이건 위랑같은데 [https://cdn.ttgtmedia.com/searchNetworking/downloads/InsideIOS.pdf] ios 운영체제에 대한거.

 


[https://medium.com/@vikasdalvi.29/multitasking-in-ios-using-gcd-b931885a719e] 이 글이 진짜 좋은거 같다!!!

 

func checkQos() {let queue1 = DispatchQueue(label: "com.gcd.simpleQueue1", qos: .userInitiated)let queue2 = DispatchQueue(label: "com.gcd.simpleQueue2", qos: .background)print("Start Race:")

func checkQos() {
let queue1 = DispatchQueue(label: "com.gcd.simpleQueue1", qos: .userInitiated)
let queue2 = DispatchQueue(label: "com.gcd.simpleQueue2", qos: .background)
print("Start Race:")
  
  queue1.async {
   for i in 0 ..< 5 {
    print("🐢 @ \(i+1) Km.")
   }
  }
queue2.async {
   for i in 0 ..< 5 {
    print("🐇 @ \(i+1) Km.")
   }
  }
}

 

Output:

Priorities of queue1 and queue2 are .userInitiated and .background respectively. User-initiated tasks are always at high priority than background tasks. Hence tasks in queue1 will get execute earlier than tasks in queue2.

🐢 @ 1 Km.
🐇 @ 1 Km.
🐢 @ 2 Km.
🐢 @ 3 Km.
🐇 @ 2 Km.
🐢 @ 4 Km.
🐇 @ 3 Km.
🐢 @ 5 Km.
🐇 @ 4 Km.
🐇 @ 5 Km.

이 부분이 내가 필요한 부분인데, 이게 거북이가 먼저 수행된다고 볼 수 있는건가??;

 

음 아닌거 같다.

 

GCD - Dispatch Queue

 

글에서 계~~~속 queue가 나왔는데, queue는 선입선출! 즉 FIFO가 특징이죠? 먼저 온 사람이 먼저 서비스를 받는 그런 자료구조에요.

 

이 queue에는 두가지 종류가 있었죠. 바로

Serial

Concurrent

였습니다.

 

Serial은 다들 아시다 시피, 하나의 작업이 끝나고 그 작업이 끝나야만! 다음 작업을 시작하는? 한번에 하나의 작업만 하는 그런 queue였죠.

그리고 concurrent는 한번에 하나의 작업만 하고 그런게 아니라!!!!! 동시에!!!동시에!!!! 여러 작업들을 시작하는 거죠.

하지만!!!!!!!!!!!!!!!!!!!!!! 동시에 여러작업을 한다고

 

큐라는거 자체는 선입 선출인거고, 그룹은 그냥 A group of tasks that you monitor as a single unit. 타스크들을 묶어서 모니터 하는 개념이다. 즉 내가 원하는 기법은 GCD로 하는건 아니다.

 

GCD는

스레드 풀이란?

출처: https://zeddios.tistory.com/516?category=682195 [ZeddiOS]

 


스레드 풀

 

 


그래서 내가 결국 원하던 기능은 어떻게 할 수 있는 것인가??

10개 네트워크 타스크 처리중에 더 우선권 있는 1개가 요청되면 1개를 먼저 하는건 어떻게 하지?

 


[https://en.wikipedia.org/wiki/Cooperative_multitasking]

Cooperative multitasking

From Wikipedia, the free encyclopedia

Jump to navigationJump to search

Cooperative multitasking, also known as non-preemptive multitasking, is a style of computer multitasking in which the operating system never initiates a context switch from a running process to another process. Instead, processes voluntarily yield control periodically or when idle or logically blocked in order to enable multiple applications to be run concurrently. This type of multitasking is called "cooperative" because all programs must cooperate for the entire scheduling scheme to work. In this scheme, the process scheduler of an operating system is known as a cooperative scheduler, having its role reduced down to starting the processes and letting them return control back to it voluntarily.[1][2]

 


[https://en.wikipedia.org/wiki/Preemption_(computing)]

 

Preemption (computing)

From Wikipedia, the free encyclopedia

Jump to navigationJump to search

In computing, preemption is the act of temporarily interrupting a task being carried out by a computer system, without requiring its cooperation, and with the intention of resuming the task at a later time. Such changes of the executed task are known as context switches. It is normally carried out by a privileged task or part of the system known as a preemptive scheduler, which has the power to preempt, or interrupt, and later resume, other tasks in the system.


Preemptive multitasking

The term preemptive multitasking is used to distinguish a multitasking operating system, which permits preemption of tasks, from a cooperative multitasking system wherein processes or tasks must be explicitly programmed to yield when they do not need system resources.

 

선점 멀티 타스킹은 멀티타스킹 운영체제 시스템과 구분된다. 선점 멀티타스킹은 타스크의 선점을 허락한다. 이는 시스템을 차지하기 위해서는 명시적으로 프로그래밍 되어야 하는 협력전인 멀티타스킹  운영체제와는 구분된다.

 

In simple terms: Preemptive multitasking involves the use of an interrupt mechanism which suspends the currently executing process and invokes a scheduler to determine which process should execute next. Therefore, all processes will get some amount of CPU time at any given time.

 

단일 용어로서, 선점 멀티타스킹은 인터럽트 메커니즘을 포함한다. 인터럽트 메커니즘은 현재 실행중인 프로세스를 일시 중지 시킨다 그리고 스케줄러에게 다음 차례로 실행 되어야할 프로세스를 결정해준다. 그럼으로서, 모든 프로세스들은 일정한 CPU시간을 어느 시점에 얻을 수 있다.

 

In preemptive multitasking, the operating system kernel can also initiate a context switch to satisfy the scheduling policy's priority constraint, thus preempting the active task. In general, preemption means "prior seizure of". When the high priority task at that instance seizes the currently running task, it is known as preemptive scheduling.

 

 

 

The term "preemptive multitasking" is sometimes mistakenly used when the intended meaning is more specific, referring instead to the class of scheduling policies known as time-shared scheduling, or time-sharing.

Preemptive multitasking allows the computer system to more reliably guarantee each process a regular "slice" of operating time. It also allows the system to rapidly deal with important external events like incoming data, which might require the immediate attention of one or another process.

 

At any specific time, processes can be grouped into two categories: those that are waiting for input or output (called "I/O bound"), and those that are fully utilizing the CPU ("CPU bound").

 

어느 시점에서도, 프로세스는 두가지 카테고리중 한개이다. 입출력을 기다리는 상태와 cpu에 의해 완전히 사용되는 상태 두개다.

 

In early systems, processes would often "poll", or "busywait" while waiting for requested input (such as disk, keyboard or network input). During this time, the process was not performing useful work, but still maintained complete control of the CPU. With the advent of interrupts and preemptive multitasking, these I/O bound processes could be "blocked", or put on hold, pending the arrival of the necessary data, allowing other processes to utilize the CPU. As the arrival of the requested data would generate an interrupt, blocked processes could be guaranteed a timely return to execution.

 

Although multitasking techniques were originally developed to allow multiple users to share a single machine, it soon became apparent that multitasking was useful regardless of the number of users.

 

비록 처음에는 멀티타스킹 기술들은 다수의 유저들이 단일 머신을 공유하기 위해서 개발되었지만, 곧 이내 사용자 수에 상관없이 항상 유용하다는 것이 밝혀졌다.

 

Many operating systems, from mainframes down to single-user personal computers and no-user control systems (like those in robotic spacecraft), have recognized the usefulness of multitasking support for a variety of reasons. Multitasking makes it possible for a single user to run multiple applications at the same time, or to run "background" processes while retaining control of the computer.