İçeriğe geç
academia.sh

Ders 07 / 14

Arka Plan İşleme Sınırları

Arka plan işleme sınırları, işletim sisteminin uygulama görünmezken iş çalıştırmaya koyduğu kuralları anlatır. Ders arka plan yeteneği kısıldığında medya yedeklemenin ertelendiğini, canlı konumun kapandığını ölçer.

Yayın Güncelleme

Bu derste

  • İki platformun arka plan görevi düzeneğini ve işletim sisteminin getirdiği sınırları açıklar
  • Düşük güç kipinin bir koşul olduğunu, işlerlik düzeyi olmadığını ayırt eder
  • Arka plan yeteneği kısıldığında medya yedeklemenin ertelendiğini ölçer
  • Ertelenen işin koşmadığını ama kaybolmadığını, kapalı işin ise sonraya kalmadığını gösterir
İçindekiler

Önceki derste çevrimdışıyken yapılan değişiklikler kuyruğa girdi ve ağ dönünce gönderilecekti. Gönderimi kimin başlatacağı sorulmadı. Kullanıcı uygulamayı kapatmış olabilir, telefon cebinde olabilir. Uygulamanın görünmezken iş çalıştırabilmesi için işletim sisteminin izni gerekir ve işletim sistemi bu izni cömert vermez. Bu ders iki platformun arka plan işleme düzeneğini ve getirdikleri sınırları anlatır, sonra bu sınırların bir özelliği ne kadar etkilediğini ölçer.

Kursun sorusu aynı kalır: bu koşulda bu özellik ne kadar çalışıyor? Açılış dersindeki dokuz kayıt beş tam, bir kısıtlı, iki ertelenen ve bir kapalı çıkmıştı. Bu ders o sayıyı değiştirmez; yalnız kendi kesitini ölçer.

İşletim Sistemi Karar Verir

Arka planda çalışmak uygulamanın değil işletim sisteminin kararıdır. Uygulama bir iş ister; işletim sistemi pil, ağ, kullanıcının alışkanlıkları ve diğer uygulamaların yükü gibi koşullara bakar ve işin ne zaman, hatta çalışıp çalışmayacağını belirler. Bu yüzden arka plan işi hiçbir zaman “şu an koş” demek değildir; “uygun bir anda koş” demektir.

iOS’ta uygulama bir görev isteği kaydeder ve sistem uygun bulduğunda uygulamayı kısa bir süre için uyandırır. Uyanma zamanını uygulama belirlemez. Android’de iş, çalışması için gereken koşullarla birlikte bir iş yöneticisine verilir; yönetici koşullar sağlandığında ve aygıtın güç yönetimi izin verdiğinde işi çalıştırır. İki düzenekte de uygulamanın elinde kesin bir saat yoktur. Süre ve sıklık sınırlarını sistemin sürümü ve kullanıcının ayarları belirler; bu derste bu sınırlar sayıyla yazılmaz, çünkü her sürümde ve her aygıtta değişirler.

Aşağıdaki iOS parçası bir yedekleme görevinin istenmesini gösterir. Parça ölçülmez.

// Platform kodu: iOS arka plan gorevi
func scheduleBackup() {
    let request = BGProcessingTaskRequest(identifier: "app.media-backup")
    request.requiresNetworkConnectivity = true
    request.requiresExternalPower = false
    try? BGTaskScheduler.shared.submit(request)
}

Android’de aynı istek koşullarla birlikte iş yöneticisine verilir. Parça ölçülmez.

// Platform kodu: Android arka plan gorevi
fun scheduleBackup(context: Context) {
    val constraints = Constraints.Builder()
        .setRequiredNetworkType(NetworkType.CONNECTED)
        .build()
    val request = OneTimeWorkRequestBuilder<BackupWorker>()
        .setConstraints(constraints)
        .build()
    WorkManager.getInstance(context).enqueue(request)
}

İki parça aynı şeyi ister: ağ varken çalışacak bir yedekleme işi. İkisi de bir kayıt oluşturur, iş hemen koşmaz. Çalışıp çalışmayacağı sistemin cevabına kalır.

Düşük Güç Kipi

Kullanıcı ya da sistem pil tasarrufu için düşük güç kipini açabilir. Kip açıkken sistem arka plan çalışmasını keser ya da seyrekleştirir: yenileme durur, planlanan işler daha geç çalışır. Uygulama açıkken ağ ve depolama alanı yine vardır; kaybolan, arka planda çalışma izni olur.

Bu ders düşük güç kipini bir koşul olarak ele alır. Koşul, o anda var olan yeteneklerin kümesidir: düşük güç kipinde network ve storage vardır, background yoktur. Aynı koşulda bir özellik tam, bir başkası ertelenen, üçüncüsü kapalı çıkabilir.

Özellikleri Kurmak

Ölçüm için kursun çekirdeği gerekir. Çekirdek ilk dersten tanıdıktır ve her derste aynı biçimde yeniden verilir; ders ona dokunmaz.

// operability.mjs — bir ozelligin bir kosulda ne kadar calistigini siniflandirir
export const LEVELS = ["tam", "kisitli", "ertelenen", "kapali"];
const FALLBACKS = ["kisitli", "ertelenen"];

export function feature(name, needs, fallback = {}) {
  return { name, needs, fallback };
}

export function condition(name, has) {
  return { name, has };
}

function judge(item, cond) {
  const missing = item.needs.filter((need) => !cond.has.includes(need)).sort();
  let level = "tam";
  for (const need of missing) {
    const given = FALLBACKS.includes(item.fallback[need]) ? item.fallback[need] : "kapali";
    if (LEVELS.indexOf(given) > LEVELS.indexOf(level)) level = given;
  }
  return { level, feature: item.name, condition: cond.name, missing };
}

export function assess(features, conditions) {
  const records = [];
  for (const cond of conditions) {
    for (const item of features) records.push(judge(item, cond));
  }
  return records;
}

export function printLevels(records) {
  for (const r of records) {
    const missing = r.missing.length === 0 ? "-" : r.missing.join(",");
    console.log(`${r.level}: ${r.feature} @ ${r.condition} eksik=${missing}`);
  }
}

export function countLevels(records) {
  for (const name of LEVELS) {
    console.log(`${name}: ${records.filter((r) => r.level === name).length}`);
  }
  console.log(`etkilenen: ${records.filter((r) => r.level !== "tam").length}`);
}

Dersin yardımcı dosyası üç özellik kurar. MediaBackup fotoğrafları yedekler; network ve background ister ve arka plan eksikse işini sonraya bırakır, yani yedeği ertelenendir. LiveLocation konumu sürekli paylaşır; aynı iki yeteneği ister ve yedeği yoktur, çünkü eski bir konum paylaşmanın anlamı yoktur. Catalog ürün listesidir ve yalnız network ister. stateOf(link) bağlantı ve arka plan durumundan koşul üretir.

// background.mjs — arka plan ozelliklerini ve kosullarini kurar
import { feature, condition } from "./operability.mjs";

export const mediaBackup = feature("MediaBackup", ["network", "background"], { background: "ertelenen" });
export const liveLocation = feature("LiveLocation", ["network", "background"]);
export const catalog = feature("Catalog", ["network"]);

export function stateOf(link) {
  const has = [];
  if (link.network) has.push("network");
  if (link.background) has.push("background");
  return condition(link.name, has);
}

Zamanlayıcının modeli ikinci yardımcı dosyadadır. schedule bir kaydın işlerliğine bakar: tamsa iş koşar, ertelenense bekleyenlere eklenir, kapalıysa koşmaz ve bekleyenlere girmez. runWindow sistemin verdiği bir pencereyi taklit eder: pencere, bekleyenlerden belli sayıda işi çalıştırır.

// scheduler.mjs — arka plan isini isletim sisteminin penceresine gore kurar
export function schedule(record, pending, job) {
  if (record.level === "ertelenen") {
    pending.push({ feature: record.feature, job });
    return "bekliyor";
  }
  return record.level === "tam" ? "kosuyor" : "kosmaz";
}

export function runWindow(pending, slots) {
  return pending.splice(0, slots).length;
}

İlk ölçüm yedekleme ve kataloğu iki durumda koşar: uygulama önde ve arka plan kısıtlı.

// main.mjs
import { assess, printLevels } from "./operability.mjs";
import { mediaBackup, catalog, stateOf } from "./background.mjs";
import { schedule } from "./scheduler.mjs";

const states = [
  { name: "foreground", network: true, background: true },
  { name: "background-restricted", network: true, background: false },
];
const records = assess([mediaBackup, catalog], states.map(stateOf));
printLevels(records);
const pending = [];
for (const r of records.filter((x) => x.feature === "MediaBackup")) {
  console.log(`${r.condition}: ${schedule(r, pending, "foto-1")}`);
}
console.log(`bekleyen: ${pending.length}`);
tam: MediaBackup @ foreground eksik=-
tam: Catalog @ foreground eksik=-
ertelenen: MediaBackup @ background-restricted eksik=background
tam: Catalog @ background-restricted eksik=-
foreground: kosuyor
background-restricted: bekliyor
bekleyen: 1

Uygulama öndeyken yedekleme tamdır ve iş hemen koşar. Arka plan kısıtlıyken yedekleme ertelenendir ve iş bekleyenlere girer. Catalog iki durumda da tamdır, çünkü yalnız ağa dayanır.

CE3. Model, arka planı tek bir yetenek olarak kurar: ya vardır ya yoktur. Gerçek bir sistem arka plan çalışmasına kısa ve öngörülemeyen pencereler verir; işin ne zaman koştuğu, kaç pencerede bittiği ve hiç koşup koşmadığı sistemin kararıdır. Modelde runWindow pencerenin büyüklüğünü ders için seçilmiş bir iş sayısı olarak alır; bu sayı bir sistemin davranışını söylemez. Model, bu işlerliğin kuralını kurar; model çerçevenin kendisi değildir.

Ertelenen İş Kaybolmaz

Ertelenen bir iş koşmamıştır, ama kaybolmamıştır. Bekleyenler listesinde durur ve sistem bir pencere verdiğinde çalışır. İkinci ölçüm üç yedekleme işini kısıtlı koşulda sıraya alır ve iki pencere verir. Aynı koşulda LiveLocation üç konum güncellemesi ister.

// main.mjs
import { assess, printLevels } from "./operability.mjs";
import { mediaBackup, liveLocation, stateOf } from "./background.mjs";
import { schedule, runWindow } from "./scheduler.mjs";

const states = [
  { name: "background-restricted", network: true, background: false },
  { name: "foreground", network: true, background: true },
];
const records = assess([mediaBackup, liveLocation], states.map(stateOf));
const restricted = records.filter((r) => r.condition === "background-restricted");
printLevels(restricted);
const pending = [];
for (const job of ["foto-1", "foto-2", "foto-3"]) schedule(restricted[0], pending, job);
for (const job of ["konum-1", "konum-2", "konum-3"]) schedule(restricted[1], pending, job);
console.log(`birinci pencere: ${runWindow(pending, 2)} kosti, ${pending.length} bekliyor`);
console.log(`ikinci pencere: ${runWindow(pending, 2)} kosti, ${pending.length} bekliyor`);
ertelenen: MediaBackup @ background-restricted eksik=background
kapali: LiveLocation @ background-restricted eksik=background
birinci pencere: 2 kosti, 1 bekliyor
ikinci pencere: 1 kosti, 0 bekliyor

Üç yedekleme işi iki pencerede bitti: birincide ikisi koştu ve biri bekledi, ikincide kalan koştu. Konum güncellemeleri hiçbir pencerede görünmedi, çünkü schedule kapalı bir kaydın işini bekleyenlere eklemez. Kapalı özellik de koşmaz, ama işi sonraya kalmaz; kullanıcı arka planda konumunu paylaşamaz ve bu paylaşım bir sonraki fırsatta yapılmaz.

Düşük Güç Kipi Düzey Değildir

Üçüncü ölçüm düşük güç kipini uygulama önde koşuluyla yan yana koyar. Üç özellik iki koşulda koşar ve yalnız düşük güç kayıtları basılır.

// main.mjs
import { assess, printLevels } from "./operability.mjs";
import { catalog, mediaBackup, liveLocation, stateOf } from "./background.mjs";

const states = [
  { name: "foreground", network: true, background: true },
  { name: "low-power", network: true, background: false },
];
const records = assess([catalog, mediaBackup, liveLocation], states.map(stateOf));
printLevels(records.filter((r) => r.condition === "low-power"));
tam: Catalog @ low-power eksik=-
ertelenen: MediaBackup @ low-power eksik=background
kapali: LiveLocation @ low-power eksik=background

Düşük güç kipi açıkken üç özellik üç ayrı düzeye düştü. Düşük güç kipi bir koşuldur; kısıtlı ise bir işlerlik düzeyidir ve iki sözcük aynı şey değildir. Kip, hangi yeteneğin eksildiğini söyler; düzeyi, özelliğin o eksik için tanımladığı yedek belirler.

Sınırlayıcı Ölçüm

Bu dersin odak kaydı MediaBackup @ background-restricted’dır. Son ölçüm üç özelliği üç koşulda koşar ve arka plan kısıtlı koşulunun kayıtlarını, sayımı ve bekleyen işleri basar.

// main.mjs
import { assess, printLevels, countLevels } from "./operability.mjs";
import { mediaBackup, liveLocation, catalog, stateOf } from "./background.mjs";
import { schedule } from "./scheduler.mjs";

const states = [
  { name: "foreground", network: true, background: true },
  { name: "background-restricted", network: true, background: false },
  { name: "low-power", network: true, background: false },
];
const records = assess([mediaBackup, liveLocation, catalog], states.map(stateOf));
const restricted = records.filter((r) => r.condition === "background-restricted");
printLevels(restricted);
countLevels(records);
const pending = [];
for (const r of restricted) {
  for (const job of ["is-1", "is-2", "is-3"]) schedule(r, pending, job);
}
const waiting = (name) => pending.filter((p) => p.feature === name).length;
console.log(`bekleyen: MediaBackup ${waiting("MediaBackup")}, LiveLocation ${waiting("LiveLocation")}`);
ertelenen: MediaBackup @ background-restricted eksik=background
kapali: LiveLocation @ background-restricted eksik=background
tam: Catalog @ background-restricted eksik=-
tam: 5
kisitli: 0
ertelenen: 2
kapali: 2
etkilenen: 4
bekleyen: MediaBackup 3, LiveLocation 0

İlk satır dersin işlerliğini taşır: arka plan yeteneği kısıldığında yedekleme ertelenen çıktı. Dokuz kaydın beşi tam, ikisi ertelenen, ikisi kapalıdır; etkilenen dört. İki ertelenen kayıt aynı özelliğin iki koşuludur: kısıtlı ve düşük güç.

Son satır M12/K04’ün sorusundan farkı gösterir. O ders bir parçanın bu istekte koşup koşmadığını sordu. Burada yedekleme de konum paylaşımı da arka planda koşmadı, ama durumları ayrıdır. Ertelenen yedekleme koşmamıştır ve kaybolmamıştır: üç iş bekler. Kapalı konum paylaşımı da koşmamıştır, ama bekleyen işi yoktur. İşlerlik bir işin koşup koşmadığını değil, koşmadığında işin ne olduğunu sınıflar.

Özet

  • Bu dersin işlerliği: ertelenen. MediaBackup @ background-restricted, background eksik olduğu ve ertelenen yedeği tanımlandığı için ertelenen çıktı; LiveLocation aynı koşulda yedeksiz olduğundan kapalı kaldı.
  • Arka planda çalışmak işletim sisteminin kararıdır. iOS’ta sistem görev isteğini uygun bulduğunda uygulamayı uyandırır, Android’de iş yöneticisi koşullar sağlandığında çalıştırır; süre ve sıklık sınırları sürüme ve ayara göre değişir.
  • Düşük güç kipi bir koşuldur, işlerlik düzeyi değil: aynı kipte Catalog tam, MediaBackup ertelenen, LiveLocation kapalı çıktı.
  • Ertelenen iş koşmamıştır ama kaybolmamıştır: üç yedekleme işi iki pencerede bitti. Kapalı özelliğin işi bekleyenlere girmez.
  • Dokuz kaydın beşi tam, ikisi ertelenen, ikisi kapalıdır; etkilenen dört.

Sonraki Adım

Bu derste arka plan yeteneği vardı ya da yoktu; bağlantı ise hep vardı. Gerçekte bağlantı da kesilir, yavaşlar, geri gelir. Sıradaki ders, Bağlantı Durumu Yönetimi, bağlantının izlenmesini, zayıf bağlantıyı, yeniden deneme ile üstel geri çekilmeyi ve bağlantı durumunun kullanıcıya gösterilmesini ele alır. Sonra zayıf bağlantıda bir görsel galerisinin ne kadar çalıştığını ölçer.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ ↵ Esc gezin · aç · kapat