<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.haidhi.my.id/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SanzSkuy</id>
	<title>Haidhi Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.haidhi.my.id/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=SanzSkuy"/>
	<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php/Special:Contributions/SanzSkuy"/>
	<updated>2026-11-01T19:02:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Cara_install_OKD&amp;diff=888</id>
		<title>Cara install OKD</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Cara_install_OKD&amp;diff=888"/>
		<updated>2026-10-28T04:17:44Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;OKD&amp;#039;&amp;#039;&amp;#039; adalah distribusi Kubernetes komunitas (upstream dari Red Hat OpenShift). Halaman ini mencatat langkah lengkap memasang &amp;#039;&amp;#039;&amp;#039;OKD Single Node (SNO)&amp;#039;&amp;#039;&amp;#039; sebagai satu VM di Proxmox VE, memakai &amp;#039;&amp;#039;&amp;#039;Agent-based Installer&amp;#039;&amp;#039;&amp;#039;, untuk keperluan cluster dev.   == Ringkasan == {| class=&amp;quot;wikitable&amp;quot; ! Item !! Nilai |- | Versi OKD || &amp;lt;code&amp;gt;5.0.0-okd-scos.3&amp;lt;/code&amp;gt; (stable) |- | OS node || CentOS Stream CoreOS (SCOS), ter-bake di ISO |- | Metode install || Agent-based Installer, t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;OKD&#039;&#039;&#039; adalah distribusi Kubernetes komunitas (upstream dari Red Hat OpenShift). Halaman ini mencatat langkah lengkap memasang &#039;&#039;&#039;OKD Single Node (SNO)&#039;&#039;&#039; sebagai satu VM di Proxmox VE, memakai &#039;&#039;&#039;Agent-based Installer&#039;&#039;&#039;, untuk keperluan cluster dev.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item !! Nilai&lt;br /&gt;
|-&lt;br /&gt;
| Versi OKD || &amp;lt;code&amp;gt;5.0.0-okd-scos.3&amp;lt;/code&amp;gt; (stable)&lt;br /&gt;
|-&lt;br /&gt;
| OS node || CentOS Stream CoreOS (SCOS), ter-bake di ISO&lt;br /&gt;
|-&lt;br /&gt;
| Metode install || Agent-based Installer, topologi SNO&lt;br /&gt;
|-&lt;br /&gt;
| Hypervisor || Proxmox VE, standalone node &amp;lt;code&amp;gt;node-3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Bridge jaringan || &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt; (LAB) → subnet &amp;lt;code&amp;gt;192.168.90.0/24&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Gateway || &amp;lt;code&amp;gt;192.168.90.1&amp;lt;/code&amp;gt; (MikroTik)&lt;br /&gt;
|-&lt;br /&gt;
| VM bastion (DNS) || &amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;, AlmaLinux, dnsmasq&lt;br /&gt;
|-&lt;br /&gt;
| VM OKD (node) || &amp;lt;code&amp;gt;192.168.90.30&amp;lt;/code&amp;gt;, hostname &amp;lt;code&amp;gt;okd-sno&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Cluster / base domain || &amp;lt;code&amp;gt;okd&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;lab.local&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Mesin kerja || Arch Linux (edit config + generate ISO)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Memilih topologi ==&lt;br /&gt;
* &#039;&#039;&#039;SNO (1 node)&#039;&#039;&#039;: paling hemat resource, cocok untuk dev. Tidak ada HA, dan &#039;&#039;&#039;tidak bisa&#039;&#039;&#039; dikonversi ke cluster HA setelah terpasang.&lt;br /&gt;
* &#039;&#039;&#039;Compact cluster (3 node)&#039;&#039;&#039;: ketiga node jadi master sekaligus worker. Lebih mirip production, tetap punya quorum etcd.&lt;br /&gt;
* &#039;&#039;&#039;2 node&#039;&#039;&#039;: OKD punya topologi &#039;&#039;two-node with fencing&#039;&#039; (butuh BMC, tidak cocok untuk VM Proxmox) dan &#039;&#039;two control plane + arbiter&#039;&#039; (tetap 3 mesin, salah satunya arbiter kecil). Untuk lab, praktis pilih SNO atau 3 node.&lt;br /&gt;
&lt;br /&gt;
Dipilih &#039;&#039;&#039;SNO&#039;&#039;&#039; supaya resource host tetap lega untuk VM lain.&lt;br /&gt;
&lt;br /&gt;
== Arsitektur ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Arch Linux (laptop) ──WireGuard──► Proxmox (vmbr0, 192.168.11.x)&lt;br /&gt;
   │  generate ISO&lt;br /&gt;
   ▼&lt;br /&gt;
Proxmox vmbr3 (LAB, 192.168.90.0/24)&lt;br /&gt;
   ├── VM bastion  192.168.90.29  → dnsmasq (DNS cluster)&lt;br /&gt;
   └── VM OKD SNO  192.168.90.30  → seluruh cluster OKD&lt;br /&gt;
          ▲&lt;br /&gt;
   gateway MikroTik 192.168.90.1 → internet (quay.io)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa butuh bastion di dalam vmbr3?&#039;&#039;&#039; Host Proxmox tidak punya IP di &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;, dan laptop berada di jaringan lain (lewat WireGuard). Node OKD harus bisa menjangkau DNS-nya, jadi DNS diletakkan di VM yang satu subnet dengan node.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bastion&#039;&#039;&#039; hanyalah istilah untuk mesin pembantu yang mengurus cluster (tempat &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt;, DNS, dsb.). DNS ini harus &#039;&#039;&#039;tetap hidup selama cluster hidup&#039;&#039;&#039;, bukan hanya saat install, karena node memakai nama &amp;lt;code&amp;gt;api-int&amp;lt;/code&amp;gt; untuk komunikasi internal.&lt;br /&gt;
&lt;br /&gt;
== Kebutuhan resource ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VM !! vCPU !! RAM !! Disk&lt;br /&gt;
|-&lt;br /&gt;
| OKD SNO || 16 || 32 GB || 150 GB&lt;br /&gt;
|-&lt;br /&gt;
| Bastion (AlmaLinux minimal) || 1–2 || 1–2 GB || 10–20 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* Spesifikasi minimal SNO di dokumentasi sekitar 8 vCPU / 16 GB, tapi 32 GB lebih nyaman.&lt;br /&gt;
* Di Proxmox, pemakaian RAM VM OKD terlihat sekitar 27 GiB saat install. Angka itu termasuk page cache dan tanpa guest agent, jadi lebih besar dari pemakaian riil. Cek angka asli dengan &amp;lt;code&amp;gt;oc adm top node&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 1: Siapkan binary di mesin kerja ==&lt;br /&gt;
Binary diambil dari GitHub Releases proyek OKD: &amp;lt;code&amp;gt;https://github.com/okd-project/okd/releases&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pilih rilis &#039;&#039;&#039;stable&#039;&#039;&#039; (tanpa label &#039;&#039;Pre-release&#039;&#039; dan tanpa &amp;lt;code&amp;gt;ec&amp;lt;/code&amp;gt; di namanya).&lt;br /&gt;
* Download &amp;lt;code&amp;gt;openshift-install-linux-&amp;amp;lt;tag&amp;amp;gt;.tar.gz&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;openshift-client-linux-&amp;amp;lt;tag&amp;amp;gt;.tar.gz&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
TAG=&amp;lt;tag-stable&amp;gt;&lt;br /&gt;
BASE=https://github.com/okd-project/okd/releases/download/$TAG&lt;br /&gt;
curl -LO $BASE/openshift-install-linux-$TAG.tar.gz&lt;br /&gt;
curl -LO $BASE/openshift-client-linux-$TAG.tar.gz&lt;br /&gt;
&lt;br /&gt;
tar xzf openshift-install-linux-$TAG.tar.gz openshift-install&lt;br /&gt;
tar xzf openshift-client-linux-$TAG.tar.gz oc kubectl&lt;br /&gt;
sudo mv openshift-install oc kubectl /usr/local/bin/&lt;br /&gt;
&lt;br /&gt;
openshift-install version&lt;br /&gt;
oc version --client&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penting:&#039;&#039;&#039; &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; &#039;&#039;&#039;wajib&#039;&#039;&#039; ada di &amp;lt;code&amp;gt;$PATH&amp;lt;/code&amp;gt;, karena &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; memanggilnya saat membuat ISO.&lt;br /&gt;
&lt;br /&gt;
Binary &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; terkunci ke satu rilis, jadi versi OKD yang terpasang sama dengan versi binary.&lt;br /&gt;
&lt;br /&gt;
Install juga &amp;lt;code&amp;gt;nmstate&amp;lt;/code&amp;gt; (menyediakan &amp;lt;code&amp;gt;nmstatectl&amp;lt;/code&amp;gt;, dipakai untuk validasi IP statis):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
yay -S nmstate      # Arch (AUR)&lt;br /&gt;
nmstatectl --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buat SSH key kalau belum ada:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519 -N &amp;quot;&amp;quot;&lt;br /&gt;
cat ~/.ssh/id_ed25519.pub&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 2: Buat VM bastion (AlmaLinux) ==&lt;br /&gt;
AlmaLinux dipilih karena stabil dan support-nya panjang. Fedora kurang cocok untuk server yang hidup lama (siklus rilis cepat); CentOS Stream lebih sering berubah.&lt;br /&gt;
&lt;br /&gt;
Setelan VM di Proxmox:&lt;br /&gt;
* Bridge &#039;&#039;&#039;&amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;&#039;&#039;&#039;, NIC VirtIO.&lt;br /&gt;
* &#039;&#039;&#039;CPU type &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&#039;&#039;&#039; (lihat bagian Troubleshooting: kernel panic).&lt;br /&gt;
* RAM minimal 2 GB saat instalasi.&lt;br /&gt;
* Options → &#039;&#039;&#039;Start at boot&#039;&#039;&#039; aktif.&lt;br /&gt;
&lt;br /&gt;
=== Kunci IP statis ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
nmcli -t -f NAME,DEVICE con show&lt;br /&gt;
sudo nmcli con mod ens18 ipv4.method manual \&lt;br /&gt;
  ipv4.addresses 192.168.90.29/24 ipv4.gateway 192.168.90.1 \&lt;br /&gt;
  ipv4.dns &amp;quot;192.168.90.29&amp;quot;&lt;br /&gt;
sudo nmcli con up ens18&lt;br /&gt;
sudo hostnamectl set-hostname marshall-okd-bastion&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
DNS bastion diarahkan ke &#039;&#039;&#039;dnsmasq miliknya sendiri&#039;&#039;&#039; (&amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;), bukan ke DNS publik. Kalau tidak, bastion tidak bisa resolve &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; tidak bisa memantau install.&lt;br /&gt;
&lt;br /&gt;
Pastikan IP bastion dan IP node berada &#039;&#039;&#039;di luar pool DHCP&#039;&#039;&#039; MikroTik. Cek tanpa mengubah apa pun:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/ip pool print&lt;br /&gt;
/ip dhcp-server lease print&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cek IP node masih kosong:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ping -c2 192.168.90.30          # harus gagal&lt;br /&gt;
ip neigh | grep 192.168.90.30   # kosong atau FAILED&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 3: DNS dengan dnsmasq ==&lt;br /&gt;
OKD membutuhkan tiga record:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Record !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; || API cluster (port 6443), dipakai &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; dan installer&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;api-int.okd.lab.local&amp;lt;/code&amp;gt; || API internal, dipakai node dan komponen cluster&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*.apps.okd.lab.local&amp;lt;/code&amp;gt; || Ingress: web console, OAuth, dan semua aplikasi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di SNO, ketiganya mengarah ke IP node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnf install -y dnsmasq bind-utils&lt;br /&gt;
sudo tee /etc/dnsmasq.d/okd.conf &amp;lt;&amp;lt;&#039;EOF&#039;&lt;br /&gt;
listen-address=192.168.90.29&lt;br /&gt;
bind-interfaces&lt;br /&gt;
server=1.1.1.1&lt;br /&gt;
server=8.8.8.8&lt;br /&gt;
address=/api.okd.lab.local/192.168.90.30&lt;br /&gt;
address=/api-int.okd.lab.local/192.168.90.30&lt;br /&gt;
address=/apps.okd.lab.local/192.168.90.30&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Penjelasan:&lt;br /&gt;
* &amp;lt;code&amp;gt;server=&amp;lt;/code&amp;gt; adalah DNS upstream untuk nama di luar cluster (quay.io, dll.). dnsmasq hanya menjadi klien ke server itu, tidak mengubah konfigurasi router.&lt;br /&gt;
* &amp;lt;code&amp;gt;address=/apps.okd.lab.local/...&amp;lt;/code&amp;gt; otomatis mencakup semua subdomain (wildcard).&lt;br /&gt;
* &amp;lt;code&amp;gt;listen-address&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;bind-interfaces&amp;lt;/code&amp;gt; membuat dnsmasq hanya mendengarkan di IP tersebut, sehingga tidak bentrok dengan resolver lain.&lt;br /&gt;
&lt;br /&gt;
Pastikan folder &amp;lt;code&amp;gt;.d&amp;lt;/code&amp;gt; terbaca:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
grep -n conf-dir /etc/dnsmasq.conf&lt;br /&gt;
# kalau tidak ada / masih dikomentari:&lt;br /&gt;
echo &#039;conf-dir=/etc/dnsmasq.d/,*.conf&#039; | sudo tee -a /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan dan uji:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo dnsmasq --test&lt;br /&gt;
sudo systemctl enable --now dnsmasq&lt;br /&gt;
sudo firewall-cmd --add-service=dns --permanent &amp;amp;&amp;amp; sudo firewall-cmd --reload&lt;br /&gt;
sudo ss -lntup | grep &#039;:53&#039;&lt;br /&gt;
dig +short api.okd.lab.local @192.168.90.29    # → 192.168.90.30&lt;br /&gt;
dig +short quay.io @192.168.90.29              # harus ada jawaban&lt;br /&gt;
getent hosts api.okd.lab.local                 # dari bastion sendiri&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 4: install-config.yaml ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: v1&lt;br /&gt;
baseDomain: lab.local&lt;br /&gt;
metadata:&lt;br /&gt;
  name: okd&lt;br /&gt;
compute:&lt;br /&gt;
- name: worker&lt;br /&gt;
  replicas: 0&lt;br /&gt;
controlPlane:&lt;br /&gt;
  name: master&lt;br /&gt;
  replicas: 1&lt;br /&gt;
networking:&lt;br /&gt;
  networkType: OVNKubernetes&lt;br /&gt;
  machineNetwork:&lt;br /&gt;
  - cidr: 192.168.90.0/24&lt;br /&gt;
  clusterNetwork:&lt;br /&gt;
  - cidr: 10.128.0.0/14&lt;br /&gt;
    hostPrefix: 23&lt;br /&gt;
  serviceNetwork:&lt;br /&gt;
  - 172.30.0.0/16&lt;br /&gt;
platform:&lt;br /&gt;
  none: {}&lt;br /&gt;
pullSecret: &#039;{&amp;quot;auths&amp;quot;:{&amp;quot;fake&amp;quot;:{&amp;quot;auth&amp;quot;:&amp;quot;aWQ6cGFzcwo=&amp;quot;}}}&#039;&lt;br /&gt;
sshKey: &#039;ssh-ed25519 AAAA... (isi ~/.ssh/id_ed25519.pub)&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* &amp;lt;code&amp;gt;platform: none&amp;lt;/code&amp;gt; dipakai karena Proxmox tidak punya integrasi native.&lt;br /&gt;
* &#039;&#039;&#039;Pull secret dummy&#039;&#039;&#039; (&amp;lt;code&amp;gt;id:pass&amp;lt;/code&amp;gt; dalam base64) cukup untuk OKD, karena image diambil dari &amp;lt;code&amp;gt;quay.io/okd&amp;lt;/code&amp;gt; yang publik. Pull secret asli Red Hat hanya perlu untuk OpenShift atau image dari &amp;lt;code&amp;gt;registry.redhat.io&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 5: agent-config.yaml ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apiVersion: v1alpha1&lt;br /&gt;
kind: AgentConfig&lt;br /&gt;
metadata:&lt;br /&gt;
  name: okd&lt;br /&gt;
rendezvousIP: 192.168.90.30&lt;br /&gt;
hosts:&lt;br /&gt;
- hostname: okd-sno&lt;br /&gt;
  role: master&lt;br /&gt;
  interfaces:&lt;br /&gt;
  - name: eth0&lt;br /&gt;
    macAddress: BC:24:11:00:00:30&lt;br /&gt;
  networkConfig:&lt;br /&gt;
    interfaces:&lt;br /&gt;
    - name: eth0&lt;br /&gt;
      type: ethernet&lt;br /&gt;
      state: up&lt;br /&gt;
      mac-address: BC:24:11:00:00:30&lt;br /&gt;
      ipv4:&lt;br /&gt;
        enabled: true&lt;br /&gt;
        dhcp: false&lt;br /&gt;
        address:&lt;br /&gt;
        - ip: 192.168.90.30&lt;br /&gt;
          prefix-length: 24&lt;br /&gt;
    dns-resolver:&lt;br /&gt;
      config:&lt;br /&gt;
        server:&lt;br /&gt;
        - 192.168.90.29&lt;br /&gt;
    routes:&lt;br /&gt;
      config:&lt;br /&gt;
      - destination: 0.0.0.0/0&lt;br /&gt;
        next-hop-address: 192.168.90.1&lt;br /&gt;
        next-hop-interface: eth0&lt;br /&gt;
        table-id: 254&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan:&lt;br /&gt;
* &#039;&#039;&#039;MAC address ditentukan sendiri&#039;&#039;&#039;, lalu dipasang manual di NIC VM. Installer mencocokkan IP statis ke VM berdasarkan MAC.&lt;br /&gt;
* Aturan MAC: oktet pertama harus genap di digit keduanya (unicast). Prefix &amp;lt;code&amp;gt;BC:24:11&amp;lt;/code&amp;gt; adalah prefix Proxmox.&lt;br /&gt;
* Nama interface &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt; hanya label; pencocokan dilakukan lewat MAC.&lt;br /&gt;
&lt;br /&gt;
== Langkah 6: Generate ISO ==&lt;br /&gt;
ISO &#039;&#039;&#039;tidak didownload&#039;&#039;&#039;, melainkan dibuat oleh &amp;lt;code&amp;gt;openshift-install&amp;lt;/code&amp;gt; dari dua YAML di atas. File YAML akan &#039;&#039;&#039;dikonsumsi&#039;&#039;&#039; (dihapus) saat generate, jadi simpan backup.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/okd&lt;br /&gt;
mkdir -p ~/okd-backup &amp;amp;&amp;amp; cp install-config.yaml agent-config.yaml ~/okd-backup/&lt;br /&gt;
rm -rf cluster &amp;amp;&amp;amp; mkdir cluster&lt;br /&gt;
cp install-config.yaml agent-config.yaml cluster/&lt;br /&gt;
openshift-install agent create image --dir cluster --log-level=info&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasil: &amp;lt;code&amp;gt;cluster/agent.x86_64.iso&amp;lt;/code&amp;gt;, plus &amp;lt;code&amp;gt;cluster/auth/&amp;lt;/code&amp;gt; (kubeconfig dan password kubeadmin).&lt;br /&gt;
&lt;br /&gt;
* Tidak ada progress bar saat &amp;lt;code&amp;gt;Downloading base ISO&amp;lt;/code&amp;gt;; tunggu sampai prompt kembali.&lt;br /&gt;
* Warning &amp;lt;code&amp;gt;Failed to extract base ISO from release payload&amp;lt;/code&amp;gt; tidak fatal; installer jatuh ke jalur download.&lt;br /&gt;
* &#039;&#039;&#039;Setiap perubahan IP/DNS/MAC wajib generate ulang ISO&#039;&#039;&#039;, karena konfigurasi ter-bake di dalamnya.&lt;br /&gt;
&lt;br /&gt;
Salin folder &amp;lt;code&amp;gt;cluster/&amp;lt;/code&amp;gt; ke bastion supaya &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; bisa dijalankan dari sana.&lt;br /&gt;
&lt;br /&gt;
== Langkah 7: Buat VM OKD di Proxmox ==&lt;br /&gt;
Upload ISO lewat UI Proxmox (storage → ISO Images → Upload), lalu Create VM:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tab !! Setelan !! Alasan&lt;br /&gt;
|-&lt;br /&gt;
| General || Start at boot || Cluster ikut hidup saat host reboot&lt;br /&gt;
|-&lt;br /&gt;
| OS || ISO &amp;lt;code&amp;gt;agent.x86_64.iso&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| System || Machine &amp;lt;code&amp;gt;q35&amp;lt;/code&amp;gt;, BIOS SeaBIOS || q35 chipset modern (opsional, i440fx juga bisa). Kalau OVMF, matikan Secure Boot&lt;br /&gt;
|-&lt;br /&gt;
| Disks || VirtIO SCSI single, 150 GB, SSD, &#039;&#039;&#039;Discard&#039;&#039;&#039; + &#039;&#039;&#039;SSD emulation&#039;&#039;&#039; || Discard (TRIM) mengembalikan ruang thin-provisioned ke host; opsional&lt;br /&gt;
|-&lt;br /&gt;
| CPU || 1 socket, 16 core, type &#039;&#039;&#039;&amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;Wajib.&#039;&#039;&#039; SCOS butuh instruksi CPU modern; tipe default bisa memicu crash&lt;br /&gt;
|-&lt;br /&gt;
| Memory || 32768 MB, &#039;&#039;&#039;Ballooning off&#039;&#039;&#039; || &#039;&#039;&#039;Penting.&#039;&#039;&#039; Kubernetes mengasumsikan RAM tetap; balloon bisa memicu OOM/eviction&lt;br /&gt;
|-&lt;br /&gt;
| Network || Bridge &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;, VirtIO, MAC &#039;&#039;&#039;&amp;lt;code&amp;gt;BC:24:11:00:00:30&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Harus sama persis dengan agent-config.yaml&lt;br /&gt;
|-&lt;br /&gt;
| Options → Boot Order || &amp;lt;code&amp;gt;scsi0&amp;lt;/code&amp;gt; di atas CD-ROM || Setelah install, node boot dari disk, bukan installer lagi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Langkah 8: Install dan pantau ==&lt;br /&gt;
Start VM. Di Console Proxmox, tanda awal yang benar:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ens18: 192.168.90.30&lt;br /&gt;
Ignition: user-provided config was applied&lt;br /&gt;
This host (192.168.90.30) is the rendezvous host.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Urutan yang terlihat:&lt;br /&gt;
# &amp;lt;code&amp;gt;Waiting for services&amp;lt;/code&amp;gt; → service installer naik satu per satu.&lt;br /&gt;
# &amp;lt;code&amp;gt;Installation cannot proceed: Cluster status: insufficient&amp;lt;/code&amp;gt; → sementara, validasi host belum selesai.&lt;br /&gt;
# &amp;lt;code&amp;gt;Cluster installation in progress&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;lt;code&amp;gt;Writing image to disk&amp;lt;/code&amp;gt; 0–100%, lalu node reboot dari disk.&lt;br /&gt;
# Log &amp;lt;code&amp;gt;crio-... libcrun container&amp;lt;/code&amp;gt; berulang → container cluster dinyalakan (normal).&lt;br /&gt;
# &amp;lt;code&amp;gt;Finished bootkube.service&amp;lt;/code&amp;gt; → bootstrap selesai.&lt;br /&gt;
&lt;br /&gt;
Pantau dari bastion:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd ~/okd&lt;br /&gt;
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=info&lt;br /&gt;
openshift-install agent wait-for install-complete --dir cluster --log-level=info&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pesan &amp;lt;code&amp;gt;cluster bootstrap did not complete&amp;lt;/code&amp;gt; tepat setelah &#039;&#039;Writing image to disk: 100%&#039;&#039; bisa muncul karena &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; kehilangan kontak saat node reboot dari ISO ke disk. Jalankan ulang &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; (aman, tidak mengganggu installer).&lt;br /&gt;
* Install aktual memakan sekitar &#039;&#039;&#039;1 jam&#039;&#039;&#039; (cluster &amp;lt;code&amp;gt;Available&amp;lt;/code&amp;gt; sekitar 09:15 dari mulai 08:11).&lt;br /&gt;
&lt;br /&gt;
Cek status langsung:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export KUBECONFIG=~/okd/cluster/auth/kubeconfig&lt;br /&gt;
curl -k https://api.okd.lab.local:6443/version&lt;br /&gt;
oc get clusterversion&lt;br /&gt;
oc get co&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Install sukses bila &amp;lt;code&amp;gt;clusterversion&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;Available=True&amp;lt;/code&amp;gt; dan semua cluster operator &amp;lt;code&amp;gt;Available=True, Progressing=False, Degraded=False&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Langkah 9: Akses web console ==&lt;br /&gt;
Password:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat ~/okd/cluster/auth/kubeadmin-password&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Console tidak bisa dibuka lewat &amp;lt;code&amp;gt;IP:port&amp;lt;/code&amp;gt;, karena router OKD memilih tujuan berdasarkan &#039;&#039;&#039;nama host&#039;&#039;&#039;. Di mesin yang menjalankan browser, tambahkan ke &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.90.30 api.okd.lab.local console-openshift-console.apps.okd.lab.local oauth-openshift.apps.okd.lab.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buka &amp;lt;code&amp;gt;https://console-openshift-console.apps.okd.lab.local&amp;lt;/code&amp;gt;, login sebagai &amp;lt;code&amp;gt;kubeadmin&amp;lt;/code&amp;gt;. Peringatan sertifikat (self-signed) normal.&lt;br /&gt;
&lt;br /&gt;
Mesin itu juga harus bisa menjangkau &amp;lt;code&amp;gt;192.168.90.0/24&amp;lt;/code&amp;gt; (misalnya lewat route WireGuard atau &amp;lt;code&amp;gt;sshuttle&amp;lt;/code&amp;gt; via bastion).&lt;br /&gt;
&lt;br /&gt;
Tes router tanpa browser:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -kI --resolve console-openshift-console.apps.okd.lab.local:443:192.168.90.30 \&lt;br /&gt;
  https://console-openshift-console.apps.okd.lab.local&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Langkah 10: Setelah install ==&lt;br /&gt;
* &#039;&#039;&#039;Snapshot VM OKD&#039;&#039;&#039; selagi bersih.&lt;br /&gt;
* &#039;&#039;&#039;Lepas ISO&#039;&#039;&#039; dari VM OKD (CD/DVD → Do not use any media).&lt;br /&gt;
* &#039;&#039;&#039;Autostart dan urutan boot&#039;&#039;&#039;: bastion order 1, OKD order 2, beri jeda start.&lt;br /&gt;
* &#039;&#039;&#039;Simpan &amp;lt;code&amp;gt;cluster/auth/&amp;lt;/code&amp;gt;&#039;&#039;&#039; di tempat aman.&lt;br /&gt;
* &#039;&#039;&#039;Storage class&#039;&#039;&#039;: cluster baru di &amp;lt;code&amp;gt;platform: none&amp;lt;/code&amp;gt; belum punya storage dinamis; PVC akan Pending sampai dipasang NFS / local-path / LVMS. Cek dengan &amp;lt;code&amp;gt;oc get sc&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Image registry&#039;&#039;&#039; (dev): &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
oc patch configs.imageregistry.operator.openshift.io cluster --type merge \&lt;br /&gt;
  --patch &#039;{&amp;quot;spec&amp;quot;:{&amp;quot;managementState&amp;quot;:&amp;quot;Managed&amp;quot;,&amp;quot;storage&amp;quot;:{&amp;quot;emptyDir&amp;quot;:{}}}}&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; (emptyDir: isi hilang saat pod restart, hanya untuk dev.)&lt;br /&gt;
* &#039;&#039;&#039;Keamanan&#039;&#039;&#039;: jangan publikasikan console, OAuth, dan API ke internet selama masih memakai &amp;lt;code&amp;gt;kubeadmin&amp;lt;/code&amp;gt;. Ganti dengan user admin biasa lewat OAuth.&lt;br /&gt;
&lt;br /&gt;
== Publish aplikasi dengan domain sendiri (rencana) ==&lt;br /&gt;
Alur: &amp;lt;code&amp;gt;Internet → MikroTik NAT → nginx → router OKD (192.168.90.30:80) → app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Route dengan domain sendiri:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
oc create route edge myapp --service=myapp \&lt;br /&gt;
  --hostname=app.domainku.com --insecure-policy=Allow&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nginx (TLS di nginx, teruskan header Host):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
location / {&lt;br /&gt;
    proxy_pass http://192.168.90.30:80;&lt;br /&gt;
    proxy_set_header Host $host;&lt;br /&gt;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
    proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tes sisi OKD: &amp;lt;code&amp;gt;curl -sI -H &amp;quot;Host: app.domainku.com&amp;quot; http://192.168.90.30&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting (yang benar-benar terjadi) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| dnsmasq &amp;lt;code&amp;gt;start-limit-hit&amp;lt;/code&amp;gt;, log: &amp;lt;code&amp;gt;failed to create listening socket for port 53: Address already in use&amp;lt;/code&amp;gt; || Config di &amp;lt;code&amp;gt;/etc/dnsmasq.d/&amp;lt;/code&amp;gt; tidak terbaca (Arch tidak mengaktifkan &amp;lt;code&amp;gt;conf-dir&amp;lt;/code&amp;gt;), dnsmasq bind ke semua alamat dan bentrok dengan dnsmasq libvirt di &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; || Tambahkan &amp;lt;code&amp;gt;conf-dir=/etc/dnsmasq.d/,*.conf&amp;lt;/code&amp;gt;; gunakan &amp;lt;code&amp;gt;listen-address&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;bind-interfaces&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exec: &amp;quot;nmstatectl&amp;quot;: executable file not found in $PATH&amp;lt;/code&amp;gt; || Paket nmstate belum terpasang || &amp;lt;code&amp;gt;yay -S nmstate&amp;lt;/code&amp;gt;, atau jalankan installer di container Fedora&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;exec: &amp;quot;oc&amp;quot;: executable file not found in $PATH&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;oc&amp;lt;/code&amp;gt; belum diekstrak/di-PATH || Ekstrak &amp;lt;code&amp;gt;openshift-client&amp;lt;/code&amp;gt;, pindahkan ke &amp;lt;code&amp;gt;/usr/local/bin&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Node tidak bisa menjangkau DNS di laptop || Laptop (192.168.83.x, WiFi) tidak bisa dijangkau dari jaringan Proxmox (laptop masuk via WireGuard) || Pindahkan DNS ke VM bastion di &amp;lt;code&amp;gt;vmbr3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Kernel panic AlmaLinux: &amp;lt;code&amp;gt;Attempted to kill init! exitcode=0x00007f00&amp;lt;/code&amp;gt; || CPU type default Proxmox menyembunyikan instruksi x86-64-v2/v3 yang dibutuhkan Alma 9/10 || Ubah Processor → Type &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;wait-for&amp;lt;/code&amp;gt; stuck lama di &amp;lt;code&amp;gt;Waiting for cluster install to initialize. Sleeping for 30 seconds&amp;lt;/code&amp;gt; || Bastion tidak bisa resolve &amp;lt;code&amp;gt;api.okd.lab.local&amp;lt;/code&amp;gt; (DNS bastion ke 1.1.1.1). Cluster sebenarnya sudah jadi || Arahkan DNS bastion ke dnsmasq-nya (&amp;lt;code&amp;gt;192.168.90.29&amp;lt;/code&amp;gt;) atau tambah &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;. Cek dengan &amp;lt;code&amp;gt;getent hosts api.okd.lab.local&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Console tidak terbuka di laptop || Nama &amp;lt;code&amp;gt;*.apps&amp;lt;/code&amp;gt; tidak dikenal, atau subnet 192.168.90.x tidak terjangkau || Tambah &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;, pastikan route ke 192.168.90.0/24&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perintah debug yang berguna:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh core@192.168.90.30&lt;br /&gt;
sudo journalctl -b -f&lt;br /&gt;
sudo crictl ps&lt;br /&gt;
tail -n 60 ~/okd/cluster/.openshift_install.log&lt;br /&gt;
openshift-install agent wait-for bootstrap-complete --dir cluster --log-level=debug&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
* [https://docs.okd.io/latest/installing/overview/ OKD installation overview]&lt;br /&gt;
* [https://docs.okd.io/4.21/installing/installing_sno/install-sno-preparing-to-install-sno.html Preparing to install OKD on a single node]&lt;br /&gt;
* [https://docs.okd.io/4.22/installing/installing_two_node_cluster/about-two-node-arbiter-installation.html OKD two control plane + arbiter]&lt;br /&gt;
* [https://okd.io/blog/2025/05/14/okd-4.19-and-4.20-release OKD 4.19 / 4.20 release (transisi ke SCOS)]&lt;br /&gt;
* [https://github.com/okd-project/okd/releases OKD releases (GitHub)]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=887</id>
		<title>DevOps</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=887"/>
		<updated>2026-10-28T04:17:00Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Setup Jenkins]]&lt;br /&gt;
* [[Docker Registry &amp;amp; Rootless Docker]]&lt;br /&gt;
* [[Elasticsearch]]&lt;br /&gt;
* [[Postgres master &amp;amp; slave]]&lt;br /&gt;
* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;br /&gt;
* [[Deploy app bare-metal]]&lt;br /&gt;
* [[Cara install OKD]]&lt;br /&gt;
&lt;br /&gt;
== Microk8s == &lt;br /&gt;
* [[Microk8s: setup awal]] &lt;br /&gt;
* [[Microk8s: setup registry]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=886</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=886"/>
		<updated>2026-10-26T09:57:51Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Riyadhussholihiin Islamic Boarding School ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin (OSRIY) &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
* Tedja, H. A. (2025). Perbandingan Metode Vektorisasi Teks dan Algoritma Pembelajaran Mesin Klasik untuk Klasifikasi Teks Bahasa Arab. Journal of Computer and Information Systems Ampera, 7(3), 207–219. https://doi.org/10.51519/journalcisa.v7i3.793&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_5:_Bridge_VLAN_Filtering&amp;diff=885</id>
		<title>Mikrotik 5: Bridge VLAN Filtering</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_5:_Bridge_VLAN_Filtering&amp;diff=885"/>
		<updated>2026-10-26T09:41:07Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Tujuan == * Paham kapan cukup memakai VLAN interface di port, dan kapan butuh bridge VLAN filtering. * Paham tiga bagian bridge VLAN filtering: PVID, tabel VLAN, dan VLAN interface di atas bridge. * Bisa membuat access port, trunk ke switch, dan trunk ke server. * Bisa men-debug konfigurasi VLAN lewat CLI.  == Konsep ==  === Router sebagai switch VLAN === * &amp;#039;&amp;#039;&amp;#039;Part 4 (router-on-a-stick)&amp;#039;&amp;#039;&amp;#039;: VLAN diurus switch. Router hanya menerima satu kabel trunk. * &amp;#039;&amp;#039;&amp;#039;Part 5&amp;#039;&amp;#039;&amp;#039;: ro...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tujuan ==&lt;br /&gt;
* Paham kapan cukup memakai VLAN interface di port, dan kapan butuh bridge VLAN filtering.&lt;br /&gt;
* Paham tiga bagian bridge VLAN filtering: PVID, tabel VLAN, dan VLAN interface di atas bridge.&lt;br /&gt;
* Bisa membuat access port, trunk ke switch, dan trunk ke server.&lt;br /&gt;
* Bisa men-debug konfigurasi VLAN lewat CLI.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Router sebagai switch VLAN ===&lt;br /&gt;
* &#039;&#039;&#039;Part 4 (router-on-a-stick)&#039;&#039;&#039;: VLAN diurus switch. Router hanya menerima satu kabel trunk.&lt;br /&gt;
* &#039;&#039;&#039;Part 5&#039;&#039;&#039;: router &#039;&#039;&#039;sendiri&#039;&#039;&#039; menjadi switch VLAN. Setiap port bisa menjadi access atau trunk, dan router sekaligus menjadi gateway setiap VLAN.&lt;br /&gt;
&lt;br /&gt;
=== Kapan butuh bridge? ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Situasi !! Pakai&lt;br /&gt;
|-&lt;br /&gt;
| Satu port membawa beberapa VLAN, dan setiap VLAN hanya ada di port itu || &#039;&#039;&#039;VLAN interface langsung di port&#039;&#039;&#039; (cara Part 4, paling simpel)&lt;br /&gt;
|-&lt;br /&gt;
| Satu VLAN tersebar di &#039;&#039;&#039;beberapa port&#039;&#039;&#039; router || &#039;&#039;&#039;Bridge + VLAN filtering&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Port-port hanya bisa &amp;quot;disambung&amp;quot; menjadi satu segmen lewat bridge ([[Belajar MikroTik Part 3|Part 3]]). Begitu port-port berada dalam satu bridge, cara memisahkan VLAN-nya adalah bridge VLAN filtering.&lt;br /&gt;
&lt;br /&gt;
Analogi: VLAN interface di port = satu pipa dibagi beberapa jalur. Bridge VLAN filtering = gedung dengan banyak pintu, setiap pintu diberi label &amp;quot;khusus staff&amp;quot; atau &amp;quot;khusus tamu&amp;quot;, dan pintu berlabel sama tetap tersambung satu sama lain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VLAN yang sudah dipakai di satu port tetap bisa dipakai di port lain.&#039;&#039;&#039; Justru itu gunanya: VLAN 10 bisa ada di &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; sekaligus, dan semua perangkatnya tetap satu network.&lt;br /&gt;
&lt;br /&gt;
=== Tiga bagian + satu saklar ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Bagian !! Menu !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;PVID&#039;&#039;&#039; || Bridge → Ports || Frame &#039;&#039;&#039;polos&#039;&#039;&#039; yang masuk dari port ini dianggap milik VLAN berapa. Ini yang membuat port menjadi access port.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;Tabel VLAN&#039;&#039;&#039; || Bridge → VLANs || Untuk setiap VLAN: port mana yang menjadi anggota, dan frame yang &#039;&#039;&#039;keluar&#039;&#039;&#039; dikirim tagged atau untagged. Ini daftar VLAN yang boleh lewat trunk.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;VLAN interface di atas bridge&#039;&#039;&#039; || Interfaces → VLAN || Gateway Layer 3. Bridge sendiri harus menjadi anggota &#039;&#039;&#039;tagged&#039;&#039;&#039; di setiap VLAN (&amp;quot;port internal&amp;quot; ke otak router).&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;Saklar &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt;&#039;&#039;&#039; || Bridge → Bridge → tab VLAN || Selama mati, semua aturan VLAN diabaikan. &#039;&#039;&#039;Nyalakan paling akhir.&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Frame Types&#039;&#039;&#039; di Bridge → Ports:&lt;br /&gt;
* Access port: &amp;lt;code&amp;gt;admit-only-untagged-and-priority-tagged&amp;lt;/code&amp;gt; (frame bertag dari PC dibuang).&lt;br /&gt;
* Trunk port: &amp;lt;code&amp;gt;admit-only-vlan-tagged&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Peringatan&#039;&#039;&#039;: mengaktifkan &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt; saat terhubung ke router lewat port anggota bridge bisa memutus koneksi Winbox. Di router produksi, selalu nyalakan &#039;&#039;&#039;Safe Mode&#039;&#039;&#039; dulu.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
              ┌──────────── CHR ─────────────┐&lt;br /&gt;
              │  vlan10 … vlan70 (gateway)    │  ← Layer 3&lt;br /&gt;
              │        │ tagged               │&lt;br /&gt;
              │   ┌─ bridge-vlan ──────┐      │  ← &amp;quot;switch&amp;quot;&lt;br /&gt;
              │   │ ether2-4  access   │      │&lt;br /&gt;
              │   │ ether5-6  trunk    │      │&lt;br /&gt;
              │   └────────────────────┘      │&lt;br /&gt;
              │ ether1 (WAN, di luar bridge)  │&lt;br /&gt;
              └───────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pemakaian di dunia nyata ===&lt;br /&gt;
Di lab PC dicolok langsung ke port router agar sederhana. Di dunia nyata, port router biasanya tersambung ke:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port !! Tipe !! Tersambung ke !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| ether2 || access 10 || Switch ruangan staff || Switch biasa (bahkan unmanaged). Semua yang dicolok otomatis VLAN 10.&lt;br /&gt;
|-&lt;br /&gt;
| ether3 || trunk 10, 20 || Access point || Dua SSID: &amp;lt;code&amp;gt;Kantor&amp;lt;/code&amp;gt; (VLAN 10) dan &amp;lt;code&amp;gt;Kantor-Tamu&amp;lt;/code&amp;gt; (VLAN 20). Satu kabel, dua jaringan.&lt;br /&gt;
|-&lt;br /&gt;
| ether4 || trunk 10, 20, 30 || Server Proxmox || VM ditempatkan di VLAN mana pun lewat satu kabel.&lt;br /&gt;
|-&lt;br /&gt;
| ether5 || access 30 || Switch CCTV || Semua kamera terkurung di VLAN 30.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di kantor besar, router sering hanya memakai 1–2 port trunk ke switch inti. Switch MikroTik (CRS) dikonfigurasi dengan &#039;&#039;&#039;cara yang sama persis&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Homelab&#039;&#039;&#039;: pola ini juga populer di rumah, misalnya VLAN keluarga, VLAN lab/server, VLAN IoT (smart TV, CCTV murah), dan VLAN tamu. Ingat: VLAN saja tidak mengisolasi, karena router tetap me-routing antar VLAN. Isolasi dibutuhkan lewat firewall ([[Belajar MikroTik Part 6|Part 6]]).&lt;br /&gt;
&lt;br /&gt;
== Lab ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                         [NAT]&lt;br /&gt;
                           │ ether1 (WAN)&lt;br /&gt;
                         [CHR]  ── bridge-vlan&lt;br /&gt;
   ether2    ether3    ether4        ether5                 ether6&lt;br /&gt;
   VLAN10    VLAN10    VLAN20     trunk 30+40           trunk 50+60+70&lt;br /&gt;
     │         │         │            │                      │&lt;br /&gt;
  Staff1    Staff2     Tamu       [Switch1]              [Proxmox]&lt;br /&gt;
                                  /       \             eth0.50/.60/.70&lt;br /&gt;
                              PC-30      PC-40&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VLAN !! Subnet !! Gateway !! Lokasi&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether2, ether3 (access)&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &amp;lt;code&amp;gt;172.16.20.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether4 (access)&lt;br /&gt;
|-&lt;br /&gt;
| 30, 40 || &amp;lt;code&amp;gt;172.16.30.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;172.16.40.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether5 (trunk ke switch)&lt;br /&gt;
|-&lt;br /&gt;
| 50, 60, 70 || &amp;lt;code&amp;gt;172.16.50.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.60.&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.70.&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || ether6 (trunk ke server)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
PC memakai container &amp;lt;code&amp;gt;lab-ubuntu&amp;lt;/code&amp;gt; (lihat [[Belajar MikroTik Lampiran: Linux Networking|lampiran Linux]]) atau VPCS.&lt;br /&gt;
&lt;br /&gt;
=== 0. Persiapan ===&lt;br /&gt;
* Host: &amp;lt;code&amp;gt;virsh net-start default&amp;lt;/code&amp;gt; dan aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; ([[Belajar MikroTik Part 1|Part 1]]).&lt;br /&gt;
* Project baru, identity, NAT masquerade di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, DNS Allow Remote Requests ([[Belajar MikroTik Part 4|Part 4]]).&lt;br /&gt;
* Backup: snapshot GNS3 atau &amp;lt;code&amp;gt;/export file=...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 1. Access port (ether2–ether4) ===&lt;br /&gt;
&#039;&#039;&#039;Bridge&#039;&#039;&#039;: Bridge → Bridge → New, Name &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;, &#039;&#039;&#039;VLAN Filtering belum dicentang&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ports&#039;&#039;&#039;: Bridge → Ports → New&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Interface !! PVID !! Frame Types&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || 10 || admit only untagged and priority tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; || 10 || admit only untagged and priority tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; || 20 || admit only untagged and priority tagged&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tabel VLAN&#039;&#039;&#039;: Bridge → VLANs → New&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! VLAN IDs !! Tagged !! Untagged&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 20 || &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gateway&#039;&#039;&#039;: VLAN interface di &#039;&#039;&#039;&amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;&#039;&#039;&#039; (bukan di port fisik), IP, dan DHCP per VLAN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Saklar&#039;&#039;&#039;: Bridge → Bridge → &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; → tab VLAN → centang &#039;&#039;&#039;VLAN Filtering&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 2. Trunk ke switch (ether5, VLAN 30 + 40) ===&lt;br /&gt;
Switch GNS3: port 0 &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; (ke &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;), port 1 &amp;lt;code&amp;gt;access 30&amp;lt;/code&amp;gt; (PC-30), port 2 &amp;lt;code&amp;gt;access 40&amp;lt;/code&amp;gt; (PC-40).&lt;br /&gt;
&lt;br /&gt;
Di router:&lt;br /&gt;
* Bridge → Ports: &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;, Frame Types &#039;&#039;&#039;admit only VLAN tagged&#039;&#039;&#039;, PVID dibiarkan default.&lt;br /&gt;
* Bridge → VLANs: VLAN 30 dan 40, Tagged &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ether5&amp;lt;/code&amp;gt;, Untagged kosong.&lt;br /&gt;
* VLAN interface &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt;, IP, DHCP.&lt;br /&gt;
&lt;br /&gt;
Access port menerima frame &#039;&#039;&#039;polos&#039;&#039;&#039; dan memakai PVID untuk menentukan VLAN. Trunk menerima frame &#039;&#039;&#039;bertag&#039;&#039;&#039; karena VLAN-nya sudah tertulis di tag.&lt;br /&gt;
&lt;br /&gt;
=== 3. Trunk ke server (ether6, VLAN 50 + 60 + 70) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface bridge port add bridge=bridge-vlan interface=ether6 frame-types=admit-only-vlan-tagged&lt;br /&gt;
&lt;br /&gt;
/interface bridge vlan&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=50 tagged=bridge-vlan,ether6&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=60 tagged=bridge-vlan,ether6&lt;br /&gt;
add bridge=bridge-vlan vlan-ids=70 tagged=bridge-vlan,ether6&lt;br /&gt;
&lt;br /&gt;
/interface vlan&lt;br /&gt;
add name=vlan50 interface=bridge-vlan vlan-id=50&lt;br /&gt;
add name=vlan60 interface=bridge-vlan vlan-id=60&lt;br /&gt;
add name=vlan70 interface=bridge-vlan vlan-id=70&lt;br /&gt;
&lt;br /&gt;
/ip address&lt;br /&gt;
add address=172.16.50.1/24 interface=vlan50 comment=VLAN50-proxmox&lt;br /&gt;
add address=172.16.60.1/24 interface=vlan60 comment=VLAN60-proxmox&lt;br /&gt;
add address=172.16.70.1/24 interface=vlan70 comment=VLAN70-proxmox&lt;br /&gt;
&lt;br /&gt;
/ip pool&lt;br /&gt;
add name=pool50 ranges=172.16.50.100-172.16.50.200&lt;br /&gt;
add name=pool60 ranges=172.16.60.100-172.16.60.200&lt;br /&gt;
add name=pool70 ranges=172.16.70.100-172.16.70.200&lt;br /&gt;
&lt;br /&gt;
/ip dhcp-server network&lt;br /&gt;
add address=172.16.50.0/24 gateway=172.16.50.1 dns-server=172.16.50.1&lt;br /&gt;
add address=172.16.60.0/24 gateway=172.16.60.1 dns-server=172.16.60.1&lt;br /&gt;
add address=172.16.70.0/24 gateway=172.16.70.1 dns-server=172.16.70.1&lt;br /&gt;
&lt;br /&gt;
/ip dhcp-server&lt;br /&gt;
add name=server50 interface=vlan50 address-pool=pool50&lt;br /&gt;
add name=server60 interface=vlan60 address-pool=pool60&lt;br /&gt;
add name=server70 interface=vlan70 address-pool=pool70&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Menambah trunk untuk VLAN yang sudah ada&#039;&#039;&#039; cukup menambahkan port ke kolom Tagged. Hati-hati: &amp;lt;code&amp;gt;set tagged=...&amp;lt;/code&amp;gt; &#039;&#039;&#039;menimpa&#039;&#039;&#039; daftar lama, sehingga port yang sudah ada harus ditulis ulang:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface bridge vlan set [find vlan-ids=30] tagged=bridge-vlan,ether5,ether6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Sisi server (container Linux) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ip link set eth0 up&lt;br /&gt;
for v in 50 60 70; do&lt;br /&gt;
  ip link add link eth0 name eth0.$v type vlan id $v&lt;br /&gt;
  ip link set eth0.$v up&lt;br /&gt;
  dhclient -v eth0.$v&lt;br /&gt;
done&lt;br /&gt;
ip -br addr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hasil:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
eth0.50@eth0     UP     172.16.50.200/24&lt;br /&gt;
eth0.60@eth0     UP     172.16.60.200/24&lt;br /&gt;
eth0.70@eth0     UP     172.16.70.200/24&lt;br /&gt;
eth0             UP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;RTNETLINK answers: File exists&amp;lt;/code&amp;gt; saat &amp;lt;code&amp;gt;dhclient&amp;lt;/code&amp;gt; kedua/ketiga itu normal: Linux hanya memakai satu default gateway di tabel routing utama.&lt;br /&gt;
* Ctrl+C di tengah loop menghentikan &#039;&#039;&#039;seluruh&#039;&#039;&#039; loop. VLAN berikutnya harus dicoba manual.&lt;br /&gt;
* Baris &amp;lt;code&amp;gt;xid: warning ...&amp;lt;/code&amp;gt; aman diabaikan.&lt;br /&gt;
&lt;br /&gt;
=== Padanan di Proxmox sungguhan ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
auto vmbr0&lt;br /&gt;
iface vmbr0 inet manual&lt;br /&gt;
    bridge-ports eno1&lt;br /&gt;
    bridge-stp off&lt;br /&gt;
    bridge-fd 0&lt;br /&gt;
    bridge-vlan-aware yes&lt;br /&gt;
    bridge-vids 2-4094&lt;br /&gt;
&lt;br /&gt;
auto vmbr0.50&lt;br /&gt;
iface vmbr0.50 inet static&lt;br /&gt;
    address 172.16.50.20/24&lt;br /&gt;
    gateway 172.16.50.1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bridge-vlan-aware yes&amp;lt;/code&amp;gt; = bridge Proxmox juga memakai VLAN filtering, konsepnya sama dengan &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; di MikroTik.&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0.50&amp;lt;/code&amp;gt; = IP manajemen host, statis di range server.&lt;br /&gt;
* Setiap VM: Bridge &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; + &#039;&#039;&#039;VLAN Tag&#039;&#039;&#039; di setting network VM.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
* Setiap PC/VM mendapat IP sesuai VLAN-nya dan bisa &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; dalam satu VLAN langsung sampai; antar VLAN lewat gateway.&lt;br /&gt;
* &#039;&#039;&#039;Bridge → VLANs&#039;&#039;&#039;: keanggotaan tagged/untagged sesuai rencana.&lt;br /&gt;
* &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;: MAC setiap perangkat beserta port dan VLAN-nya.&lt;br /&gt;
&lt;br /&gt;
Entri dinamis seperti &amp;lt;code&amp;gt;VLAN 1 ;;; added by pvid&amp;lt;/code&amp;gt; di tabel VLAN itu normal: bridge sendiri punya PVID default 1.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== VLAN interface berflag R tapi parameternya salah ===&lt;br /&gt;
Ketiga kasus di bawah sama-sama terlihat normal di &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt; biasa. Flag &#039;&#039;&#039;R&#039;&#039;&#039; hanya berarti &amp;quot;interface hidup&amp;quot;, bukan &amp;quot;konfigurasinya benar&amp;quot;. Masalahnya baru terlihat di &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kasus !! Temuan di &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt; !! Penyebab !! Perbaikan&lt;br /&gt;
|-&lt;br /&gt;
| PC-30 &amp;amp; PC-40 tidak dapat IP || &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;vlan-id=1&amp;lt;/code&amp;gt; || Kolom VLAN ID terlewat, memakai default || &amp;lt;code&amp;gt;/interface vlan set vlan30 vlan-id=30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC-40 tidak dapat IP || &amp;lt;code&amp;gt;vlan40&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;use-service-tag=yes&amp;lt;/code&amp;gt; || Checkbox &#039;&#039;&#039;Use Service Tag&#039;&#039;&#039; tercentang. Itu mode QinQ (penanda &amp;lt;code&amp;gt;0x88a8&amp;lt;/code&amp;gt;), sedangkan switch mengirim tag biasa &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt;. || &amp;lt;code&amp;gt;... vlan-id=40 use-service-tag=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| VLAN 50 jalan, VLAN 60 tidak || &amp;lt;code&amp;gt;vlan60&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;interface=ether1&amp;lt;/code&amp;gt;, MAC sama dengan &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; || Dropdown Interface terpilih port WAN || &amp;lt;code&amp;gt;/interface vlan set vlan60 interface=bridge-vlan&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Efek samping VLAN interface ber-ID 1 di atas bridge: muncul entri dinamis &amp;lt;code&amp;gt;VLAN 1 ;;; added by vlan on bridge&amp;lt;/code&amp;gt; di tabel VLAN.&lt;br /&gt;
&lt;br /&gt;
=== Diagnosis cepat ===&lt;br /&gt;
&#039;&#039;&#039;Kalau satu VLAN jalan dan VLAN lain tidak&#039;&#039;&#039; di trunk yang sama, jalur fisik dan trunk sudah benar. Fokus ke konfigurasi khusus VLAN yang gagal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Menentukan layer masalah&#039;&#039;&#039;: jalankan DHCP di client, sementara di router:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/tool torch interface=vlan60&lt;br /&gt;
/tool sniffer quick interface=ether6&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Ada traffic di &amp;lt;code&amp;gt;vlanXX&amp;lt;/code&amp;gt; → paket sampai, masalah di DHCP/IP.&lt;br /&gt;
* Kosong → masalah di VLAN ID, interface induk, atau tabel bridge VLAN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Perintah pengecekan lengkap&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/interface vlan print detail&lt;br /&gt;
/interface bridge print&lt;br /&gt;
/interface bridge port print&lt;br /&gt;
/interface bridge vlan print&lt;br /&gt;
/ip address print&lt;br /&gt;
/ip pool print&lt;br /&gt;
/ip dhcp-server print&lt;br /&gt;
/ip dhcp-server network print&lt;br /&gt;
/ip dhcp-server lease print&lt;br /&gt;
/log print where topics~&amp;quot;dhcp&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Checklist VLAN baru ==&lt;br /&gt;
# &#039;&#039;&#039;Bridge → VLANs&#039;&#039;&#039;: VLAN ID; &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; + port trunk di Tagged; access port di Untagged.&lt;br /&gt;
# &#039;&#039;&#039;Interfaces → VLAN&#039;&#039;&#039;: cek &#039;&#039;&#039;vlan-id&#039;&#039;&#039;, &#039;&#039;&#039;interface = bridge-vlan&#039;&#039;&#039;, &#039;&#039;&#039;use-service-tag = no&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039;: gateway &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;DHCP&#039;&#039;&#039;: gateway/DNS di Networks.&lt;br /&gt;
# Langsung jalankan &amp;lt;code&amp;gt;/interface vlan print detail&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tips&#039;&#039;&#039;: simpan blok CLI VLAN sebagai template, ganti angkanya, lalu copy-paste. Sebagian besar kesalahan di lab ini terjadi saat mengisi form GUI.&lt;br /&gt;
&lt;br /&gt;
== Latihan ==&lt;br /&gt;
# &#039;&#039;&#039;Tebak dulu&#039;&#039;&#039;: hapus &amp;lt;code&amp;gt;ether6&amp;lt;/code&amp;gt; dari Tagged di VLAN 60. Di container, &amp;lt;code&amp;gt;dhclient -r eth0.60&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;dhclient -v eth0.60&amp;lt;/code&amp;gt;. Apa yang terjadi? Apakah VLAN 50 dan 70 ikut terdampak?&lt;br /&gt;
# &#039;&#039;&#039;IP manajemen statis&#039;&#039;&#039;: lepas DHCP di &amp;lt;code&amp;gt;eth0.50&amp;lt;/code&amp;gt;, pasang &amp;lt;code&amp;gt;172.16.50.20/24&amp;lt;/code&amp;gt; dengan gateway &amp;lt;code&amp;gt;172.16.50.1&amp;lt;/code&amp;gt;, sampai container bisa &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt; lewat VLAN 50.&lt;br /&gt;
# &#039;&#039;&#039;Detektif&#039;&#039;&#039;: di &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;, MAC container muncul berapa kali dan di VLAN apa saja? Kenapa satu MAC bisa muncul beberapa kali?&lt;br /&gt;
# &#039;&#039;&#039;Tebak dulu&#039;&#039;&#039;: hapus &amp;lt;code&amp;gt;bridge-vlan&amp;lt;/code&amp;gt; dari Tagged di VLAN 20 (biarkan &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; untagged). Apakah Tamu masih bisa mendapat IP? Ping gateway? Ping Staff1?&lt;br /&gt;
&lt;br /&gt;
== Catatan ==&lt;br /&gt;
Bridge VLAN filtering sudah melampaui cakupan dasar MTCNA dan lebih dekat ke materi switching. Kesalahan di lab ini hampir semuanya salah input, bukan salah konsep. Kemampuan yang paling berguna bukan menghafal menu, tapi melacak kenapa sesuatu tidak berjalan.&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* Satu VLAN di satu port → VLAN interface di port. Satu VLAN di banyak port → bridge VLAN filtering.&lt;br /&gt;
* PVID = VLAN untuk frame polos yang masuk. Tabel VLAN = keanggotaan dan tagged/untagged saat keluar.&lt;br /&gt;
* VLAN interface (gateway) ditempel di bridge, dan bridge harus tagged di setiap VLAN.&lt;br /&gt;
* Nyalakan &amp;lt;code&amp;gt;vlan-filtering&amp;lt;/code&amp;gt; paling akhir, dengan Safe Mode di router produksi.&lt;br /&gt;
* Flag R bukan jaminan benar: biasakan &amp;lt;code&amp;gt;print detail&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=884</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=884"/>
		<updated>2026-10-26T09:41:01Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Mikrotik =&lt;br /&gt;
* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;br /&gt;
* [[Mikrotik 2: Kantor Mini]]&lt;br /&gt;
* [[Mikrotik 3: Bridge]]&lt;br /&gt;
* [[Mikrotik 4: VLAN]]&lt;br /&gt;
* [[Mikrotik 5: Bridge VLAN Filtering]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
== Cisco Lab ==&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_4:_VLAN&amp;diff=883</id>
		<title>Mikrotik 4: VLAN</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_4:_VLAN&amp;diff=883"/>
		<updated>2026-10-26T06:33:34Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Tujuan == * Paham VLAN, tag 802.1Q, access port, dan trunk port. * Bisa membuat VLAN interface dan gateway per VLAN di RouterOS. * Bisa melihat tag VLAN di Wireshark. * Paham dua kesalahan klasik: VLAN ditentukan port switch, dan trunk yang tidak sepakat di kedua ujung.  == Konsep ==  === Masalah yang diselesaikan VLAN === Tanpa VLAN, setiap segmen butuh port router, switch, dan jalur kabel sendiri. Lima segmen (staff, tamu, CCTV, server, manajemen) berarti lima port...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tujuan ==&lt;br /&gt;
* Paham VLAN, tag 802.1Q, access port, dan trunk port.&lt;br /&gt;
* Bisa membuat VLAN interface dan gateway per VLAN di RouterOS.&lt;br /&gt;
* Bisa melihat tag VLAN di Wireshark.&lt;br /&gt;
* Paham dua kesalahan klasik: VLAN ditentukan port switch, dan trunk yang tidak sepakat di kedua ujung.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Masalah yang diselesaikan VLAN ===&lt;br /&gt;
Tanpa VLAN, setiap segmen butuh port router, switch, dan jalur kabel sendiri. Lima segmen (staff, tamu, CCTV, server, manajemen) berarti lima port router, lima switch, lima kabel.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VLAN (Virtual LAN)&#039;&#039;&#039; memecah satu switch fisik menjadi beberapa switch virtual yang terisolasi di Layer 2. Setiap VLAN punya nomor (&#039;&#039;&#039;VLAN ID&#039;&#039;&#039;, 1–4094). Perangkat di VLAN berbeda tidak bisa saling meng-ARP, persis seperti berada di switch berbeda.&lt;br /&gt;
&lt;br /&gt;
=== Tag 802.1Q ===&lt;br /&gt;
Satu kabel bisa membawa banyak VLAN karena setiap frame diberi &#039;&#039;&#039;tag&#039;&#039;&#039; (label) berisi VLAN ID. Standarnya &#039;&#039;&#039;IEEE 802.1Q&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Frame biasa:   [Dst MAC][Src MAC][Type][ Data ][FCS]&lt;br /&gt;
Frame 802.1Q:  [Dst MAC][Src MAC][TAG][Type][ Data ][FCS]&lt;br /&gt;
                                  └ 4 byte tambahan&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Isi tag (4 byte):&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Ukuran !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;TPID&#039;&#039;&#039; || 16 bit || Penanda &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt;: &amp;quot;frame ini bertag 802.1Q&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;PRI&#039;&#039;&#039; (PCP) || 3 bit || Prioritas untuk QoS (misalnya VoIP didahulukan)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DEI&#039;&#039;&#039; || 1 bit || Tanda boleh dibuang lebih dulu saat padat&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;VLAN ID&#039;&#039;&#039; || 12 bit || Nomor VLAN (2&amp;lt;sup&amp;gt;12&amp;lt;/sup&amp;gt; = 4096, dipakai 1–4094)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Contoh di Wireshark:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Ethernet II, Src: 00:50:79:66:68:00, Dst: ...&lt;br /&gt;
802.1Q Virtual LAN, PRI: 0, DEI: 0, ID: 10      ← tag&lt;br /&gt;
Internet Protocol Version 4, Src: 172.16.10.x, Dst: 8.8.8.8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Access port vs trunk port ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Access port !! Trunk port&lt;br /&gt;
|-&lt;br /&gt;
| Membawa || &#039;&#039;&#039;Satu&#039;&#039;&#039; VLAN || &#039;&#039;&#039;Banyak&#039;&#039;&#039; VLAN&lt;br /&gt;
|-&lt;br /&gt;
| Frame || &#039;&#039;&#039;Untagged&#039;&#039;&#039; || &#039;&#039;&#039;Tagged&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Tersambung ke || PC, printer, CCTV || Switch lain, router, server Proxmox&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PC tidak tahu apa-apa soal VLAN.&#039;&#039;&#039; PC mengirim frame polos. Switch menempelkan tag saat frame masuk dari access port, dan melepas tag saat frame keluar ke access port. Tag hanya hidup di jalur trunk.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Native VLAN&#039;&#039;&#039;: VLAN yang lewat trunk &#039;&#039;&#039;tanpa tag&#039;&#039;&#039;. Di switch GNS3, kolom VLAN pada port &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; adalah native VLAN (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Router-on-a-stick ===&lt;br /&gt;
Setiap VLAN adalah segmen terpisah, sehingga butuh &#039;&#039;&#039;subnet dan gateway sendiri&#039;&#039;&#039;. Router cukup tersambung ke switch dengan &#039;&#039;&#039;satu kabel trunk&#039;&#039;&#039;, lalu membuat satu &#039;&#039;&#039;VLAN interface&#039;&#039;&#039; per VLAN (misalnya &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;). Setiap VLAN interface diberi IP gateway. Satu kabel, banyak gateway.&lt;br /&gt;
&lt;br /&gt;
=== Keuntungan dan harga yang dibayar ===&lt;br /&gt;
&#039;&#039;&#039;Keuntungan&#039;&#039;&#039;&lt;br /&gt;
* Hemat port router: satu port trunk bisa membawa banyak segmen.&lt;br /&gt;
* Hemat switch: satu switch fisik dipakai bersama semua segmen.&lt;br /&gt;
* Hemat kabel antar lantai/ruangan: cukup satu trunk per switch.&lt;br /&gt;
* Fleksibel: memindahkan PC ke segmen lain cukup mengubah setting port switch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Harga yang dibayar&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Bandwidth trunk dibagi&#039;&#039;&#039; semua VLAN. Traffic antar VLAN naik ke router lewat trunk lalu turun lagi lewat trunk yang sama.&lt;br /&gt;
* &#039;&#039;&#039;Single point of failure&#039;&#039;&#039;: trunk putus = semua VLAN di switch itu putus.&lt;br /&gt;
* &#039;&#039;&#039;Butuh managed switch&#039;&#039;&#039;. Switch unmanaged tidak mengerti tag.&lt;br /&gt;
* CPU router mengerjakan semua routing antar VLAN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi umum&#039;&#039;&#039;: trunk di port cepat (SFP+ 10 Gbps), &#039;&#039;&#039;bonding/LACP&#039;&#039;&#039; (beberapa kabel menjadi satu trunk dengan cadangan), atau &#039;&#039;&#039;switch Layer 3&#039;&#039;&#039; untuk routing antar VLAN di kantor besar.&lt;br /&gt;
&lt;br /&gt;
=== Managed vs unmanaged switch ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Unmanaged !! Managed (termasuk &amp;quot;smart/easy smart&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
| Setup || Colok langsung jalan || Colok langsung jalan, tapi bisa dikonfigurasi&lt;br /&gt;
|-&lt;br /&gt;
| IP / web UI || Tidak ada || Ada (web UI, SSH/CLI, port console)&lt;br /&gt;
|-&lt;br /&gt;
| VLAN || Tidak || Ya&lt;br /&gt;
|-&lt;br /&gt;
| Fitur lain || – || Monitoring per port, port mirroring, LACP, STP, limit bandwidth&lt;br /&gt;
|-&lt;br /&gt;
| Contoh || Switch 5–8 port murah || MikroTik CRS/CSS, Cisco Catalyst, TP-Link Easy Smart/JetStream, UniFi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Managed switch baru &#039;&#039;&#039;berperilaku seperti unmanaged&#039;&#039;&#039;: semua port default &amp;lt;code&amp;gt;access VLAN 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jebakan di kantor&#039;&#039;&#039;&lt;br /&gt;
* Unmanaged switch di &#039;&#039;&#039;access port VLAN 10&#039;&#039;&#039; → semua perangkat di switch kecil itu masuk VLAN 10. Normal dan sering disengaja.&lt;br /&gt;
* Unmanaged switch di &#039;&#039;&#039;trunk port&#039;&#039;&#039; → perangkat hanya mendapat native VLAN, sementara frame bertag VLAN lain ikut diteruskan. Gejalanya: &amp;quot;PC di ruangan ini dapat IP dari segmen yang salah.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Lab ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                 [NAT]&lt;br /&gt;
                   │&lt;br /&gt;
                 ether1 (WAN, DHCP client)&lt;br /&gt;
                   │&lt;br /&gt;
                 [CHR]&lt;br /&gt;
                 ether2&lt;br /&gt;
                   ║  trunk (VLAN 10 + 20)&lt;br /&gt;
                   ║&lt;br /&gt;
               [Switch1]&lt;br /&gt;
           port1  port2  port3&lt;br /&gt;
          VLAN10 VLAN10 VLAN20&lt;br /&gt;
            │      │      │&lt;br /&gt;
         Staff1 Staff2  Tamu&lt;br /&gt;
&lt;br /&gt;
  vlan10 → 172.16.10.1/24  (staff)&lt;br /&gt;
  vlan20 → 172.16.20.1/24  (tamu)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Konvensi alamat&#039;&#039;&#039;: range privat &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt;, dengan oktet ketiga = VLAN ID (VLAN 10 → &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt;). Memudahkan saat VLAN sudah puluhan.&lt;br /&gt;
&lt;br /&gt;
=== 1. Persiapan host dan project ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo virsh net-start default 2&amp;gt;/dev/null&lt;br /&gt;
sudo iptables -I DOCKER-USER -i virbr0 -j ACCEPT&lt;br /&gt;
sudo iptables -I DOCKER-USER -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* GNS3: &#039;&#039;&#039;File → New blank project&#039;&#039;&#039; (contoh nama: &amp;lt;code&amp;gt;fase2-vlan&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Perangkat: NAT, MikroTik CHR, Ethernet switch, 3 VPCS (beri nama Staff1, Staff2, Tamu).&lt;br /&gt;
&lt;br /&gt;
=== 2. Konfigurasi switch GNS3 ===&lt;br /&gt;
Nyalakan &#039;&#039;&#039;View → Show interface labels&#039;&#039;&#039; untuk melihat nomor port tiap kabel, lalu klik kanan switch → &#039;&#039;&#039;Configure&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Untuk setiap port: klik barisnya di daftar &#039;&#039;&#039;Ports&#039;&#039;&#039;, isi &#039;&#039;&#039;VLAN&#039;&#039;&#039; dan &#039;&#039;&#039;Type&#039;&#039;&#039;, lalu klik &#039;&#039;&#039;Add&#039;&#039;&#039; (menimpa setting port dengan nomor yang sama). Akhiri dengan &#039;&#039;&#039;Apply → OK&#039;&#039;&#039;. Kalau perubahan tidak tersimpan, stop switch dulu.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Port !! Ke !! VLAN !! Type&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CHR &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || 1 || &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Staff1 || 10 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Staff2 || 10 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Tamu || 20 || &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; = trunk 802.1Q. QinQ EtherType dibiarkan &amp;lt;code&amp;gt;0x8100&amp;lt;/code&amp;gt; (hanya dipakai pada type &amp;lt;code&amp;gt;qinq&amp;lt;/code&amp;gt;). Sesuaikan nomor port dengan label kabel.&lt;br /&gt;
&lt;br /&gt;
=== 3. Setup dasar CHR ===&lt;br /&gt;
Di console:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system identity set name=router-vlan&lt;br /&gt;
/ip address print&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Catat IP WAN di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, connect Winbox, lalu:&lt;br /&gt;
* &#039;&#039;&#039;IP → Firewall → NAT&#039;&#039;&#039;: &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;, Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;IP → DNS&#039;&#039;&#039;: centang &#039;&#039;&#039;Allow Remote Requests&#039;&#039;&#039;&lt;br /&gt;
* Tes: &amp;lt;code&amp;gt;/ping 8.8.8.8 count=3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. VLAN interface dan gateway ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Interfaces → VLAN&#039;&#039;&#039; → New || &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, VLAN ID &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface vlan add name=vlan10 vlan-id=10 interface=ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Interfaces → VLAN&#039;&#039;&#039; → New || &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;, VLAN ID &amp;lt;code&amp;gt;20&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface vlan add name=vlan20 vlan-id=20 interface=ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; → New || &amp;lt;code&amp;gt;172.16.10.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, comment &amp;lt;code&amp;gt;VLAN10-staff&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=172.16.10.1/24 interface=vlan10 comment=VLAN10-staff&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; → New || &amp;lt;code&amp;gt;172.16.20.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;, comment &amp;lt;code&amp;gt;VLAN20-tamu&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=172.16.20.1/24 interface=vlan20 comment=VLAN20-tamu&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; sendiri &#039;&#039;&#039;tidak diberi IP&#039;&#039;&#039;. Ia hanya kabel trunk, sedangkan kerja Layer 3 ada di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;. Sama seperti aturan bridge: IP di interface logis, bukan di port fisik.&lt;br /&gt;
&lt;br /&gt;
=== 5. DHCP per VLAN ===&lt;br /&gt;
Setiap VLAN butuh &#039;&#039;&#039;pool, network, dan server sendiri&#039;&#039;&#039; karena subnetnya berbeda.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Lewat DHCP Setup&#039;&#039;&#039; (jalankan untuk &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;, lalu &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;): wizard membuat pool otomatis. Ubah &#039;&#039;&#039;Addresses to Give Out&#039;&#039;&#039; menjadi &amp;lt;code&amp;gt;.100–.200&amp;lt;/code&amp;gt; agar &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; tetap kosong untuk perangkat statis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manual&#039;&#039;&#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! VLAN 10 !! VLAN 20&lt;br /&gt;
|-&lt;br /&gt;
| Pool || &amp;lt;code&amp;gt;172.16.10.100-172.16.10.200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;172.16.20.100-172.16.20.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Network || &amp;lt;code&amp;gt;172.16.10.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;172.16.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;172.16.20.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;172.16.20.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Server || Interface &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; || Interface &amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Periksa&#039;&#039;&#039;: pool di subnet yang benar, gateway/DNS = &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;, server menempel di &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;vlan20&amp;lt;/code&amp;gt; (bukan &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;). Rule NAT tidak perlu diubah.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
ping 8.8.8.8&lt;br /&gt;
trace &amp;lt;IP PC lain&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Staff1 dan Staff2 mendapat &amp;lt;code&amp;gt;172.16.10.x&amp;lt;/code&amp;gt;, Tamu mendapat &amp;lt;code&amp;gt;172.16.20.x&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; Staff1 → Staff2: langsung sampai (satu VLAN, di-switch).&lt;br /&gt;
* &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; Staff1 → Tamu: lewat &amp;lt;code&amp;gt;172.16.10.1&amp;lt;/code&amp;gt; (beda VLAN, di-route).&lt;br /&gt;
&lt;br /&gt;
Ketiganya tersambung ke &#039;&#039;&#039;switch fisik yang sama&#039;&#039;&#039;, tapi VLAN memisahkan mereka di Layer 2.&lt;br /&gt;
&lt;br /&gt;
Kalau PC hanya menampilkan &amp;quot;DDD&amp;quot;, periksa dulu kecocokan nomor port switch dengan label kabel.&lt;br /&gt;
&lt;br /&gt;
== Latihan dan pembahasan ==&lt;br /&gt;
&lt;br /&gt;
=== Soal 1: melihat tag ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: capture Wireshark di kabel CHR ↔ Switch1 (trunk) dan Switch1 ↔ Staff1 (access), lalu ping dari Staff1. Di mana ada tag 802.1Q? VLAN ID-nya berapa?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Trunk&#039;&#039;&#039;: ada baris &amp;lt;code&amp;gt;802.1Q Virtual LAN&amp;lt;/code&amp;gt; dengan &#039;&#039;&#039;ID 10 dan ID 20&#039;&#039;&#039;. Meskipun ping hanya dari Staff1 (VLAN 10), traffic Tamu (ARP, DHCP renew) juga lewat kabel yang sama. Bukti satu trunk membawa banyak VLAN.&lt;br /&gt;
* &#039;&#039;&#039;Access&#039;&#039;&#039;: tidak ada tag, frame polos.&lt;br /&gt;
* Alur: Staff1 mengirim frame polos → Switch1 menempelkan tag &amp;lt;code&amp;gt;ID: 10&amp;lt;/code&amp;gt; → CHR membaca tag dan menyerahkan frame ke &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt;. Arah balik, switch melepas tag sebelum frame sampai ke Staff1.&lt;br /&gt;
&lt;br /&gt;
=== Soal 2: menambah VLAN CCTV ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: buat VLAN 30 (&amp;lt;code&amp;gt;172.16.30.0/24&amp;lt;/code&amp;gt;) dengan PC4 sampai bisa internetan.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Di mana !! Perubahan&lt;br /&gt;
|-&lt;br /&gt;
| Router || &#039;&#039;&#039;Interfaces → VLAN&#039;&#039;&#039;: &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;, ID &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;, di &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039;: &amp;lt;code&amp;gt;172.16.30.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || DHCP: pool, network (gateway/DNS &amp;lt;code&amp;gt;172.16.30.1&amp;lt;/code&amp;gt;), server di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Router || NAT: tidak perlu diubah&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Port PC4: &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt; VLAN &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Port trunk: tidak diubah (di GNS3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Jangan lupa IP gateway&#039;&#039;&#039; di &amp;lt;code&amp;gt;vlan30&amp;lt;/code&amp;gt;. DHCP Setup bisa berjalan tanpanya, tapi PC akan mendapat gateway yang tidak ada di router.&lt;br /&gt;
* &#039;&#039;&#039;Trunk di GNS3&#039;&#039;&#039; otomatis membawa semua VLAN. Di banyak switch sungguhan (termasuk MikroTik), trunk harus &#039;&#039;&#039;didaftarkan VLAN mana saja yang boleh lewat&#039;&#039;&#039;. Lupa menambahkan VLAN baru ke trunk = PC di VLAN itu &amp;quot;DDD&amp;quot; terus, padahal konfigurasi lain sudah benar.&lt;br /&gt;
* Beri comment &amp;lt;code&amp;gt;VLAN30-cctv&amp;lt;/code&amp;gt; di semua objek terkait.&lt;br /&gt;
&lt;br /&gt;
=== Soal 3: memindahkan VLAN tanpa menyentuh PC ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: ubah port Tamu dari access VLAN 20 menjadi access VLAN 10, tanpa mengubah PC. Lalu &amp;lt;code&amp;gt;ip dhcp -x&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil&#039;&#039;&#039;: Tamu mendapat &amp;lt;code&amp;gt;172.16.10.x&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;: &#039;&#039;&#039;VLAN sebuah PC ditentukan oleh port switch tempat ia tersambung.&#039;&#039;&#039; PC tidak tahu dan tidak bisa memilih.&lt;br /&gt;
* &#039;&#039;&#039;Enak&#039;&#039;&#039;: memindahkan karyawan ke segmen lain cukup mengubah port switch.&lt;br /&gt;
* &#039;&#039;&#039;Bahaya&#039;&#039;&#039;: siapa pun yang mencolok laptop ke port staff langsung masuk jaringan staff. Keamanan port fisik penting. Solusi lanjutannya &#039;&#039;&#039;802.1X&#039;&#039;&#039; (perangkat harus login sebelum port dibuka), yaitu fitur di menu &#039;&#039;&#039;Dot1X&#039;&#039;&#039; RouterOS.&lt;br /&gt;
&lt;br /&gt;
=== Soal 4: trunk yang salah ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: ubah port trunk (port 0) dari &amp;lt;code&amp;gt;dot1q&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;access&amp;lt;/code&amp;gt; VLAN 10.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil&#039;&#039;&#039;: Staff1 dan Tamu sama-sama tidak bisa internetan, tapi dengan alasan berbeda.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Normal (dot1q):     switch ══[tag 10][tag 20]══► CHR → vlan10 / vlan20 ✅&lt;br /&gt;
Salah (access 10):  switch ───[polos, VLAN 10 saja]──► CHR → ether2 (tanpa IP) ❌&lt;br /&gt;
                    VLAN 20 → tidak dikirim sama sekali ❌&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Staff1&#039;&#039;&#039;: switch mengirim traffic VLAN 10 ke CHR &#039;&#039;&#039;tanpa tag&#039;&#039;&#039;. &amp;lt;code&amp;gt;vlan10&amp;lt;/code&amp;gt; hanya menerima frame bertag 10, sehingga frame polos jatuh ke &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; yang tidak punya IP. ARP ke gateway tidak pernah terjawab.&lt;br /&gt;
* &#039;&#039;&#039;Tamu&#039;&#039;&#039;: port 0 sekarang hanya anggota VLAN 10, sehingga frame VLAN 20 tidak pernah dikirim keluar. Tamu terkurung di dalam switch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pelajaran&#039;&#039;&#039;: kedua ujung trunk harus &#039;&#039;&#039;sepakat&#039;&#039;&#039;. Kalau satu sisi mengirim bertag dan sisi lain menunggu polos (atau sebaliknya), link terlihat menyala (lampu hijau, interface Running), tapi traffic tidak tersambung. Sering terjadi saat mengganti switch atau saat ada yang &amp;quot;merapikan&amp;quot; konfigurasi.&lt;br /&gt;
&lt;br /&gt;
== Kesalahan umum ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| PC &amp;quot;DDD&amp;quot; setelah setting VLAN || Nomor port switch tidak cocok dengan kabel || Cek &#039;&#039;&#039;Show interface labels&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP tapi tidak bisa internetan || IP gateway belum dipasang di VLAN interface || &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; di &amp;lt;code&amp;gt;vlanXX&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| PC di VLAN baru &amp;quot;DDD&amp;quot; padahal router benar || VLAN belum didaftarkan di trunk switch || Tambahkan VLAN ke daftar trunk&lt;br /&gt;
|-&lt;br /&gt;
| Link menyala tapi semua VLAN putus || Trunk tidak sepakat (tagged vs untagged) || Samakan konfigurasi kedua ujung&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP dari segmen yang salah || Port switch salah VLAN, atau unmanaged switch di trunk port || Periksa port dan perangkat yang tersambung&lt;br /&gt;
|-&lt;br /&gt;
| Comment tidak sesuai isi || Typo saat membuat objek || Perbaiki, karena comment adalah dokumentasi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* VLAN memecah satu switch menjadi beberapa segmen Layer 2 terpisah.&lt;br /&gt;
* Tag 802.1Q (4 byte, berisi VLAN ID) hanya ada di trunk. PC selalu mengirim frame polos.&lt;br /&gt;
* Access = satu VLAN untagged. Trunk = banyak VLAN tagged.&lt;br /&gt;
* Router-on-a-stick: satu trunk, satu VLAN interface + gateway per VLAN.&lt;br /&gt;
* VLAN ditentukan port switch, bukan PC.&lt;br /&gt;
* Kedua ujung trunk harus sepakat.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=882</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=882"/>
		<updated>2026-10-26T06:33:28Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Mikrotik =&lt;br /&gt;
* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;br /&gt;
* [[Mikrotik 2: Kantor Mini]]&lt;br /&gt;
* [[Mikrotik 3: Bridge]]&lt;br /&gt;
* [[Mikrotik 4: VLAN]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
== Cisco Lab ==&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_3:_Bridge&amp;diff=881</id>
		<title>Mikrotik 3: Bridge</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_3:_Bridge&amp;diff=881"/>
		<updated>2026-10-25T05:17:00Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;&amp;quot;&amp;#039;&amp;#039;bridge&amp;#039;&amp;#039;&amp;#039; adalah cara menggabungkan beberapa port router menjadi satu segmen jaringan.   == Tujuan == * Paham apa itu bridge dan kenapa port router defaultnya berdiri sendiri. * Tahu kapan memakai bridge dan kapan memisahkan segmen. * Bisa membuktikan beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; lewat &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;. * Bisa melacak perangkat ke port fisik lewat &amp;#039;&amp;#039;&amp;#039;Bridge → Hosts&amp;#039;&amp;#039;&amp;#039;.  == Konsep ==  === Port router berdiri sendiri === Di RouterOS, &amp;#039;&amp;#039;&amp;#039;setiap port etherne...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;quot;&#039;&#039;bridge&#039;&#039;&#039; adalah cara menggabungkan beberapa port router menjadi satu segmen jaringan. &lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Paham apa itu bridge dan kenapa port router defaultnya berdiri sendiri.&lt;br /&gt;
* Tahu kapan memakai bridge dan kapan memisahkan segmen.&lt;br /&gt;
* Bisa membuktikan beda &#039;&#039;&#039;switching&#039;&#039;&#039; dan &#039;&#039;&#039;routing&#039;&#039;&#039; lewat &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bisa melacak perangkat ke port fisik lewat &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Konsep ==&lt;br /&gt;
&lt;br /&gt;
=== Port router berdiri sendiri ===&lt;br /&gt;
Di RouterOS, &#039;&#039;&#039;setiap port ethernet adalah interface terpisah&#039;&#039;&#039;. Tanpa bridge, &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; adalah dua segmen yang sama sekali tidak tersambung, seperti dua switch tanpa kabel penghubung.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
* Setiap port yang dipakai butuh &#039;&#039;&#039;subnet sendiri&#039;&#039;&#039; (seperti Part 2: &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Subnet yang sama &#039;&#039;&#039;tidak bisa&#039;&#039;&#039; dipasang di dua port (network tidak boleh tumpang tindih).&lt;br /&gt;
* Port tanpa IP dan bukan anggota bridge &#039;&#039;&#039;tidak melakukan apa-apa&#039;&#039;&#039;. Perangkat yang dicolok ke sana tidak mendapat apa pun.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Perangkat !! Kondisi default port LAN&lt;br /&gt;
|-&lt;br /&gt;
| Router rumahan || Sudah menjadi satu switch dari pabrik&lt;br /&gt;
|-&lt;br /&gt;
| Router MikroTik fisik || Biasanya membawa &#039;&#039;&#039;defconf&#039;&#039;&#039;: port LAN sudah dimasukkan ke &amp;lt;code&amp;gt;bridge&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| CHR || Tidak ada defconf, setiap port berdiri sendiri&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Bridge dengan comment &amp;lt;code&amp;gt;defconf&amp;lt;/code&amp;gt; di router MikroTik adalah bridge bawaan pabrik. Bridge lain biasanya dibuat oleh admin untuk memisahkan segmen.&lt;br /&gt;
&lt;br /&gt;
=== Apa itu bridge ===&lt;br /&gt;
&#039;&#039;&#039;Bridge adalah switch versi software di dalam router.&#039;&#039;&#039; Port yang dimasukkan ke satu bridge menjadi &#039;&#039;&#039;satu segmen Layer 2&#039;&#039;&#039;, seolah dicolok ke satu switch.&lt;br /&gt;
&lt;br /&gt;
Konsep yang sama dipakai di tempat lain:&lt;br /&gt;
* &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; (libvirt, [[Belajar MikroTik Part 1|Part 1]])&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; (Proxmox)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dua aturan penting&#039;&#039;&#039;&lt;br /&gt;
# &#039;&#039;&#039;IP, DHCP server, dan konfigurasi Layer 3 lainnya dipasang di bridge&#039;&#039;&#039;, bukan di port anggotanya. Port anggota hanya menjadi &amp;quot;colokan switch&amp;quot;.&lt;br /&gt;
# Port anggota bridge mendapat flag &#039;&#039;&#039;S&#039;&#039;&#039; (slave). Flag &#039;&#039;&#039;RS&#039;&#039;&#039; = Running + Slave.&lt;br /&gt;
&lt;br /&gt;
=== Bridge vs segmen terpisah ===&lt;br /&gt;
Analogi: bridge = satu ruangan besar, semua bisa langsung bicara. Segmen terpisah = banyak ruangan, komunikasi antar ruangan lewat resepsionis (router).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Segmen terpisah (routed) !! Bridge (switched)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Konfigurasi&#039;&#039;&#039; || Subnet, pool, DHCP server, DHCP network per port || Satu set untuk semua port&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Pindah colokan&#039;&#039;&#039; || IP ikut berubah || IP tetap&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Discovery berbasis broadcast/multicast&#039;&#039;&#039; (printer, network discovery, AirPlay, Wake-on-LAN) || Tidak menyeberang subnet || Berjalan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Kinerja antar port&#039;&#039;&#039; || Di-route oleh CPU || Di perangkat fisik bisa memakai &#039;&#039;&#039;hardware offload&#039;&#039;&#039; switch chip (di CHR semuanya software)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Isolasi&#039;&#039;&#039; || Bisa diberi firewall antar segmen || Tidak ada isolasi&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Dampak masalah&#039;&#039;&#039; (loop, broadcast storm, rogue DHCP) || Terbatas di satu segmen || Mengenai semua perangkat di bridge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kapan memakai yang mana&#039;&#039;&#039;&lt;br /&gt;
* Port LAN biasa untuk karyawan → &#039;&#039;&#039;bridge&#039;&#039;&#039;.&lt;br /&gt;
* Perlu memisahkan tamu, CCTV, atau server → &#039;&#039;&#039;segmen terpisah&#039;&#039;&#039; + firewall.&lt;br /&gt;
&lt;br /&gt;
Di kantor biasanya &#039;&#039;&#039;kombinasi&#039;&#039;&#039;: beberapa bridge, masing-masing berisi beberapa port, dan antar bridge di-route. Memisahkan segmen per port fisik itu kaku, sehingga solusi modernnya adalah &#039;&#039;&#039;VLAN&#039;&#039;&#039; ([[Belajar MikroTik Part 4|Part 4]]).&lt;br /&gt;
&lt;br /&gt;
== Lab: menggabungkan ether2 + ether3 ==&lt;br /&gt;
&lt;br /&gt;
=== Topologi ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    [NAT]&lt;br /&gt;
                      │&lt;br /&gt;
                    ether1 (WAN)&lt;br /&gt;
                      │&lt;br /&gt;
               [MikroTikCHR-1]&lt;br /&gt;
                 │         │          │&lt;br /&gt;
          ┌── bridge-lan ──┐       ether4&lt;br /&gt;
          │ 192.168.10.1/24│     192.168.20.1/24&lt;br /&gt;
        ether2          ether3        │&lt;br /&gt;
          │               │        [Switch3]&lt;br /&gt;
      [Switch1]       [Switch2]        │&lt;br /&gt;
     PC1 PC2 PC3      PC4 PC5         PC6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; digabung di &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt;, sehingga PC1–PC5 berada di satu subnet.&lt;br /&gt;
* &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; berdiri sendiri dengan subnet &amp;lt;code&amp;gt;192.168.20.0/24&amp;lt;/code&amp;gt; sebagai &#039;&#039;&#039;pembanding&#039;&#039;&#039; segmen yang di-route.&lt;br /&gt;
&lt;br /&gt;
=== 0. Backup dulu ===&lt;br /&gt;
Biasakan sebelum mengubah konfigurasi:&lt;br /&gt;
* GNS3: &#039;&#039;&#039;Edit → Manage snapshots → Create&#039;&#039;&#039;&lt;br /&gt;
* atau di terminal router:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/export file=fase1-selesai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 1. Hapus konfigurasi LAN2 lama ===&lt;br /&gt;
* &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039;: hapus &amp;lt;code&amp;gt;192.168.11.1/24&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;IP → DHCP Server → DHCP&#039;&#039;&#039;: hapus server di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;IP → DHCP Server → Networks&#039;&#039;&#039;: hapus &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;IP → Pool&#039;&#039;&#039;: hapus &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2–5. Buat bridge dan pindahkan konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;Bridge → Bridge&#039;&#039;&#039; → New || Name &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface bridge add name=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;Bridge → Ports&#039;&#039;&#039; → New (dua kali) || &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; ke &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/interface bridge port add bridge=bridge-lan interface=ether2&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;/interface bridge port add bridge=bridge-lan interface=ether3&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; → edit &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt; || Interface: &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address set [find address=&amp;quot;192.168.10.1/24&amp;quot;] interface=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;IP → DHCP Server → DHCP&#039;&#039;&#039; → edit server LAN || Interface: &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server set [find interface=ether2] interface=bridge-lan&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Rule NAT tidak perlu diubah, karena tetap mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Perbarui IP di semua PC ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp -x&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Pembanding: segmen ether4 ===&lt;br /&gt;
Untuk Switch3 + PC6, &amp;lt;code&amp;gt;ether4&amp;lt;/code&amp;gt; dikonfigurasi seperti LAN di Part 2: IP &amp;lt;code&amp;gt;192.168.20.1/24&amp;lt;/code&amp;gt;, pool, DHCP network (gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.20.1&amp;lt;/code&amp;gt;), dan DHCP server sendiri.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
* PC1–PC5 mendapat IP &amp;lt;code&amp;gt;192.168.10.x&amp;lt;/code&amp;gt; dari pool yang sama dengan gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Interfaces&#039;&#039;&#039;: &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; berflag &#039;&#039;&#039;RS&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;: daftar MAC semua PC beserta port tempat mereka terhubung.&lt;br /&gt;
* &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt; dari PC berhasil.&lt;br /&gt;
&lt;br /&gt;
== Membaca &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
trace &amp;lt;IP tujuan&amp;gt;            # di VPCS&lt;br /&gt;
/tool traceroute 8.8.8.8     # di router&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Setiap baris adalah satu &#039;&#039;&#039;hop&#039;&#039;&#039;, yaitu perangkat Layer 3 (router) yang dilewati. Trace mengirim paket dengan &#039;&#039;&#039;TTL&#039;&#039;&#039; kecil (mulai dari 1). Setiap router mengurangi TTL satu, dan router tempat TTL habis membalas, sehingga trace bisa menyusun daftar router di sepanjang jalur.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Switch dan bridge tidak mengurangi TTL&#039;&#039;&#039;, sehingga tidak pernah muncul di hasil trace.&lt;br /&gt;
* Baris terakhir dengan &amp;lt;code&amp;gt;Destination port unreachable&amp;lt;/code&amp;gt; itu &#039;&#039;&#039;normal&#039;&#039;&#039;. VPCS mengirim UDP ke port yang tidak dipakai, dan balasan &amp;quot;port tidak ada&amp;quot; menandakan paket sudah sampai di tujuan.&lt;br /&gt;
&lt;br /&gt;
== Latihan dan pembahasan ==&lt;br /&gt;
&lt;br /&gt;
=== Soal 1: bandingkan trace dengan Fase 1 ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: trace dari PC1/PC4 ke PC lain di bridge, bandingkan dengan Fase 1 (Part 2) dan dengan PC6.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC6 → PC1 (192.168.10.200):&lt;br /&gt;
 1   192.168.20.1     ← router, beda subnet → di-route&lt;br /&gt;
 2   192.168.10.200   ← tujuan&lt;br /&gt;
&lt;br /&gt;
PC4 → PC1 (192.168.10.200):&lt;br /&gt;
 1   192.168.10.200   ← langsung sampai, satu bridge → di-switch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;&lt;br /&gt;
* Di Fase 1, PC1 dan PC4 berada di subnet berbeda, sehingga ada hop tambahan lewat router.&lt;br /&gt;
* Sekarang PC4 dan PC1 berada di &#039;&#039;&#039;satu bridge = satu segmen Layer 2&#039;&#039;&#039;. PC4 meng-ARP PC1 secara langsung, dan CHR hanya meneruskan frame seperti switch.&lt;br /&gt;
* Paket &#039;&#039;&#039;tetap melewati CHR secara fisik&#039;&#039;&#039;, tapi tidak muncul sebagai hop. Router yang sama bekerja sebagai &#039;&#039;&#039;switch&#039;&#039;&#039; untuk traffic di dalam bridge dan sebagai &#039;&#039;&#039;router&#039;&#039;&#039; untuk traffic antar subnet (seperti ke PC6).&lt;br /&gt;
&lt;br /&gt;
=== Soal 2: detektif port ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: hanya lewat &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;, tentukan PC5 terhubung di port mana.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;: cocokkan MAC dari &amp;lt;code&amp;gt;show ip&amp;lt;/code&amp;gt; di PC5 dengan tabel Hosts → &#039;&#039;&#039;&amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;&#039;&#039;&#039;. Di kantor, ini cara tercepat mencari &amp;quot;PC ini dicolok di port mana&amp;quot; tanpa menyusuri kabel.&lt;br /&gt;
&lt;br /&gt;
=== Soal 3: disable port anggota bridge ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: disable &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; di &#039;&#039;&#039;Bridge → Ports&#039;&#039;&#039;. Apakah PC4 masih bisa ping PC5? Ping PC1?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil&#039;&#039;&#039;: PC4 → PC5 &#039;&#039;&#039;bisa&#039;&#039;&#039;, PC4 → PC1 &#039;&#039;&#039;tidak bisa&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;PC4 → PC5&#039;&#039;&#039;: keduanya terhubung ke Switch2. Switch2 meneruskan frame di antara mereka sendiri tanpa butuh router atau bridge.&lt;br /&gt;
* &#039;&#039;&#039;PC4 → PC1&#039;&#039;&#039;: &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; adalah satu-satunya penghubung Switch2 ke bridge. Setelah port itu mati, Switch2 menjadi &amp;quot;pulau&amp;quot; terpisah.&lt;br /&gt;
* &#039;&#039;&#039;Kenapa router tidak menolong?&#039;&#039;&#039; PC4 menganggap PC1 &#039;&#039;&#039;tetangga&#039;&#039;&#039; (sama-sama &amp;lt;code&amp;gt;192.168.10.x&amp;lt;/code&amp;gt;), sehingga PC4 tidak pernah memakai gateway untuk menuju PC1. Ia hanya meng-ARP PC1, dan ARP itu tidak sampai ke mana pun. &#039;&#039;&#039;Di dalam satu subnet, kalau jalur Layer 2 putus, router tidak bisa menjadi jalur alternatif.&#039;&#039;&#039;&lt;br /&gt;
* Gateway (&amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;) dan internet juga tidak terjangkau dari PC4 dan PC5.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pelajaran di kantor&#039;&#039;&#039;: gejala &#039;&#039;&#039;&amp;quot;satu ruangan tidak bisa apa-apa, tapi PC di ruangan itu masih bisa saling berbagi file&amp;quot;&#039;&#039;&#039; hampir pasti masalah &#039;&#039;&#039;uplink&#039;&#039;&#039; switch ruangan tersebut: kabel uplink, port di router/switch inti, atau port yang ter-disable.&lt;br /&gt;
&lt;br /&gt;
Jangan lupa enable kembali &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== Gateway DHCP berisi alamat network ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;: DHCP Networks berisi gateway &amp;lt;code&amp;gt;192.168.10.0&amp;lt;/code&amp;gt; dan DNS kosong setelah menjalankan &#039;&#039;&#039;DHCP Setup&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: isian gateway di wizard salah. &amp;lt;code&amp;gt;.0&amp;lt;/code&amp;gt; adalah alamat network, bukan alamat perangkat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: &#039;&#039;&#039;IP → DHCP Server → Networks&#039;&#039;&#039; → gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;. Selalu periksa hasil wizard.&lt;br /&gt;
&lt;br /&gt;
=== Static lease hilang setelah DHCP Setup ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;: lease PC1 kembali bertanda &#039;&#039;&#039;D&#039;&#039;&#039; (dynamic), nama server menjadi &amp;lt;code&amp;gt;server1&amp;lt;/code&amp;gt; dan pool menjadi &amp;lt;code&amp;gt;pool1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: lease terikat ke DHCP server. Server lama diganti oleh wizard, sehingga static lease ikut hilang.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: buat ulang static lease. &#039;&#039;&#039;Pelajaran&#039;&#039;&#039;: wizard bisa menimpa konfigurasi lama tanpa peringatan, jadi backup sebelum menjalankannya.&lt;br /&gt;
&lt;br /&gt;
=== IP WAN berubah ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;: IP &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; berubah dari &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;192.168.122.61&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: CHR/lab di-restart dan mendapat lease baru dari dnsmasq &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Flag &#039;&#039;&#039;D&#039;&#039;&#039; pada alamat WAN memang akan selalu ada karena dibuat oleh DHCP client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dampak&#039;&#039;&#039;: NAT tetap berjalan karena masquerade otomatis memakai IP yang sedang menempel. Winbox harus connect ulang ke IP baru. Ini contoh nyata kenapa masquerade cocok untuk WAN dinamis.&lt;br /&gt;
&lt;br /&gt;
=== VPCS hanya menampilkan &amp;quot;DDD&amp;quot; ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC1&amp;gt; ip dhcp&lt;br /&gt;
DDD&lt;br /&gt;
Can&#039;t find dhcp server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arti&#039;&#039;&#039;: VPCS mencetak satu huruf per langkah DORA. &#039;&#039;&#039;D&#039;&#039;&#039; = Discover terkirim. &amp;quot;DDD&amp;quot; berarti tiga Discover terkirim &#039;&#039;&#039;tanpa Offer&#039;&#039;&#039; yang kembali.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah diagnosis&#039;&#039;&#039;&lt;br /&gt;
# Periksa konfigurasi DHCP Networks (gateway &amp;amp; DNS).&lt;br /&gt;
# &#039;&#039;&#039;Log&#039;&#039;&#039; router: cari pesan dari &amp;lt;code&amp;gt;dhcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &#039;&#039;&#039;IP → DHCP Server → DHCP&#039;&#039;&#039;: pastikan server tidak berflag &#039;&#039;&#039;X&#039;&#039;&#039; (disabled) atau &#039;&#039;&#039;I&#039;&#039;&#039; (invalid).&lt;br /&gt;
# &#039;&#039;&#039;Tools → Torch&#039;&#039;&#039; di &amp;lt;code&amp;gt;bridge-lan&amp;lt;/code&amp;gt;: kalau muncul traffic &amp;lt;code&amp;gt;0.0.0.0 → 255.255.255.255&amp;lt;/code&amp;gt; (port 68 → 67), Discover sampai di router dan masalahnya di konfigurasi. Kalau kosong, masalahnya di jalur kabel/bridge.&lt;br /&gt;
# &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039;: apakah MAC PC terlihat.&lt;br /&gt;
# Di VPCS: &amp;lt;code&amp;gt;ip dhcp -d&amp;lt;/code&amp;gt; untuk melihat detail paket.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penyebab di lab ini&#039;&#039;&#039;: GNS3 &amp;quot;nyangkut&amp;quot; (koneksi virtual antar node tidak terbentuk ulang dengan benar setelah topologi diubah). Selesai setelah GNS3 di-restart.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Urutan perbaikan kalau GNS3 berperilaku aneh&#039;&#039;&#039; (setelah konfigurasi dipastikan benar):&lt;br /&gt;
# Stop/start node yang bermasalah, termasuk switch.&lt;br /&gt;
# Hapus dan sambungkan ulang kabel.&lt;br /&gt;
# Restart GNS3.&lt;br /&gt;
&lt;br /&gt;
== Sisipan: bridge di dunia virtualisasi (Proxmox) ==&lt;br /&gt;
Server Proxmox di LAN bisa menghasilkan banyak IP dari VM-VM-nya. Cara VM terlihat di jaringan tergantung modelnya.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Model !! Cara kerja !! Kelebihan !! Kekurangan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bridged&#039;&#039;&#039; (default, &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt;) || Bridge menyatukan NIC fisik dan NIC virtual VM. Setiap VM punya MAC sendiri dan terlihat seperti PC terpisah. || VM dapat IP dari DHCP router, bisa diakses langsung dari LAN || Setiap VM memakan IP subnet kantor&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NAT&#039;&#039;&#039; || Host menjadi router mini dan me-masquerade VM (sama seperti &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;) || Hemat IP, VM terisolasi || VM tidak bisa diakses langsung, perlu port forwarding&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Subnet/VLAN khusus&#039;&#039;&#039; || VM di segmen sendiri, di-route oleh router || Rapi, bisa diberi firewall || Butuh VLAN (Part 4)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Manajemen IP&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Rencanakan pembagian IP&#039;&#039;&#039;, contoh untuk &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Range !! Untuk&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; || Gateway&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.2–.19&amp;lt;/code&amp;gt; || Perangkat jaringan (switch, AP)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.20–.79&amp;lt;/code&amp;gt; || Server &amp;amp; VM (statis)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.80–.99&amp;lt;/code&amp;gt; || Printer, CCTV&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;.100–.250&amp;lt;/code&amp;gt; || Pool DHCP&lt;br /&gt;
|}&lt;br /&gt;
* &#039;&#039;&#039;Server/VM memakai IP tetap&#039;&#039;&#039;: manual di dalam VM atau static lease. MAC VM Proxmox tersimpan permanen di konfigurasi VM, sehingga static lease bekerja baik.&lt;br /&gt;
* &#039;&#039;&#039;Hati-hati saat clone&#039;&#039;&#039;: clone biasanya mendapat MAC baru, sehingga static lease tidak ikut. IP statis yang di-hardcode di template akan ikut ter-clone dan menyebabkan IP conflict.&lt;br /&gt;
* &#039;&#039;&#039;Catat semuanya (IPAM)&#039;&#039;&#039;: spreadsheet, atau tools seperti &#039;&#039;&#039;NetBox&#039;&#039;&#039; / &#039;&#039;&#039;phpIPAM&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Pantau ukuran subnet&#039;&#039;&#039;: &amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; hanya 254 host. Kolom &#039;&#039;&#039;Available&#039;&#039;&#039; di menu Pool menunjukkan sisa IP.&lt;br /&gt;
&lt;br /&gt;
Di host Proxmox, cek &amp;lt;code&amp;gt;/etc/network/interfaces&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;vmbr0&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;bridge-ports eno1&amp;lt;/code&amp;gt; → bridged.&lt;br /&gt;
* &amp;lt;code&amp;gt;bridge-vlan-aware yes&amp;lt;/code&amp;gt; → VM dipisah dengan VLAN.&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
* Port RouterOS defaultnya berdiri sendiri, dan bridge menggabungkannya menjadi satu segmen Layer 2.&lt;br /&gt;
* Konfigurasi Layer 3 (IP, DHCP) dipasang di &#039;&#039;&#039;bridge&#039;&#039;&#039;, bukan di port anggota.&lt;br /&gt;
* Di dalam bridge = &#039;&#039;&#039;switching&#039;&#039;&#039; (tidak ada hop). Antar subnet = &#039;&#039;&#039;routing&#039;&#039;&#039; (ada hop lewat gateway).&lt;br /&gt;
* Dalam satu subnet, jalur Layer 2 yang putus tidak bisa ditolong router.&lt;br /&gt;
* Wizard praktis, tapi periksa hasilnya dan backup sebelum menjalankannya.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=880</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=880"/>
		<updated>2026-10-25T05:16:52Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Mikrotik =&lt;br /&gt;
* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;br /&gt;
* [[Mikrotik 2: Kantor Mini]]&lt;br /&gt;
* [[Mikrotik 3: Bridge]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
== Cisco Lab ==&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=879</id>
		<title>Mikrotik 2: Kantor Mini</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=879"/>
		<updated>2026-10-23T07:38:21Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fase 1 dari roadmap: membangun &#039;&#039;&#039;&amp;quot;kantor mini&amp;quot;&#039;&#039;&#039;, yaitu satu router MikroTik sebagai gateway, beberapa PC yang mendapat IP otomatis, dan semuanya bisa internetan. Konfigurasi dilakukan lewat &#039;&#039;&#039;Winbox 4&#039;&#039;&#039;, dengan padanan CLI di setiap langkah.&lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Paham peran IP address, gateway, DHCP, DNS, dan NAT di jaringan kantor.&lt;br /&gt;
* Paham beda &#039;&#039;&#039;switching&#039;&#039;&#039; (Layer 2) dan &#039;&#039;&#039;routing&#039;&#039;&#039; (Layer 3).&lt;br /&gt;
* Bisa membaca kondisi router: siapa yang tersambung, dapat IP apa, lewat mana.&lt;br /&gt;
&lt;br /&gt;
== Topologi ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    [NAT]&lt;br /&gt;
                      │&lt;br /&gt;
                 ether1 (WAN, DHCP client)&lt;br /&gt;
                 192.168.122.212/24&lt;br /&gt;
                      │&lt;br /&gt;
               [MikroTikCHR-1]&lt;br /&gt;
            ether2 /       \ ether3&lt;br /&gt;
     192.168.10.1/24     192.168.11.1/24&lt;br /&gt;
           │                   │&lt;br /&gt;
       [Switch1]           [Switch2]&lt;br /&gt;
      /    |    \            /    \&lt;br /&gt;
   PC1   PC2   PC3        PC4    PC5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NAT node&#039;&#039;&#039; dari [[Belajar MikroTik Part 1|Part 1]] tetap di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Ethernet switch&#039;&#039;&#039; dan &#039;&#039;&#039;VPCS&#039;&#039;&#039; adalah perangkat bawaan GNS3 (kategori Switches dan End devices).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pengingat&#039;&#039;&#039;: setelah reboot host, jalankan ulang aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; dari Part 1, kalau tidak traffic lab tidak bisa keluar ke internet.&lt;br /&gt;
&lt;br /&gt;
== Konsep dasar ==&lt;br /&gt;
&lt;br /&gt;
=== IP address, subnet, dan alamat spesial ===&lt;br /&gt;
&amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; berarti 24 bit pertama adalah bagian &#039;&#039;&#039;network&#039;&#039;&#039;, 8 bit terakhir bagian &#039;&#039;&#039;host&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.10. | 00000000  → .0    semua bit host 0 = alamat network&lt;br /&gt;
192.168.10. | 00000001  → .1    host pertama&lt;br /&gt;
192.168.10. | 11111110  → .254  host terakhir&lt;br /&gt;
192.168.10. | 11111111  → .255  semua bit host 1 = broadcast&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Alamat !! Fungsi !! Bisa dipakai perangkat?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.0&amp;lt;/code&amp;gt; || Network address (identitas subnet) || Tidak&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;.254&amp;lt;/code&amp;gt; || Alamat host (254 host) || Ya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.255&amp;lt;/code&amp;gt; || Broadcast (ke semua di subnet) || Tidak&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kapan menulis &amp;lt;code&amp;gt;.1/24&amp;lt;/code&amp;gt; dan kapan &amp;lt;code&amp;gt;.0/24&amp;lt;/code&amp;gt;?&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; menjawab &amp;quot;IP gua apa?&amp;quot; → alamat host, misalnya &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;. Kolom Network dihitung otomatis.&lt;br /&gt;
* &#039;&#039;&#039;Route, DHCP Network, firewall&#039;&#039;&#039; menjawab &amp;quot;network yang mana?&amp;quot; → alamat network, misalnya &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Range IP privat&#039;&#039;&#039; (tidak dikenal di internet): &amp;lt;code&amp;gt;10.0.0.0/8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt; (172.16–172.31), &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
Gateway adalah &amp;quot;pintu keluar&amp;quot; PC. Tujuan di luar subnet sendiri dikirim ke gateway.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aturan emas&#039;&#039;&#039;: gateway &#039;&#039;&#039;harus berada di subnet yang sama&#039;&#039;&#039; dengan PC. Biasanya berupa IP router di interface tersebut. Gateway di &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; hanya kebiasaan, bukan aturan.&lt;br /&gt;
&lt;br /&gt;
=== ARP ===&lt;br /&gt;
Di dalam satu segmen, frame Ethernet dikirim berdasarkan &#039;&#039;&#039;MAC address&#039;&#039;&#039;, bukan IP. &#039;&#039;&#039;ARP&#039;&#039;&#039; menerjemahkan &#039;&#039;&#039;IP → MAC&#039;&#039;&#039; di dalam satu segmen.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Request (broadcast)&#039;&#039;&#039;: &amp;quot;Siapa yang punya &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;? Kasih tahu &amp;lt;code&amp;gt;192.168.10.100&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;Reply (unicast)&#039;&#039;&#039;: &amp;quot;Itu gua, MAC gua &amp;lt;code&amp;gt;0C:B3:C6:FB:00:01&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# Hasilnya disimpan di &#039;&#039;&#039;tabel ARP&#039;&#039;&#039; (cache) dan kedaluwarsa setelah beberapa waktu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Poin penting&#039;&#039;&#039;: saat PC ping &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;, yang di-ARP adalah &#039;&#039;&#039;gateway&#039;&#039;&#039;, bukan &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;. Di setiap lompatan, &#039;&#039;&#039;IP tujuan tetap sama&#039;&#039;&#039;, tapi &#039;&#039;&#039;MAC tujuan berganti&#039;&#039;&#039;. Inilah beda Layer 2 (antar tetangga) dan Layer 3 (ujung ke ujung).&lt;br /&gt;
&lt;br /&gt;
Switch juga punya tabel MAC, tapi isinya &amp;quot;MAC ini ada di port mana&amp;quot;. Switch tidak peduli IP.&lt;br /&gt;
&lt;br /&gt;
=== DHCP ===&lt;br /&gt;
PC yang baru tersambung belum punya IP, gateway, maupun DNS. DHCP membagikannya secara otomatis lewat proses &#039;&#039;&#039;DORA&#039;&#039;&#039;:&lt;br /&gt;
# &#039;&#039;&#039;Discover&#039;&#039;&#039;: PC broadcast &amp;quot;ada DHCP server?&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;Offer&#039;&#039;&#039;: server menawarkan IP + gateway + DNS&lt;br /&gt;
# &#039;&#039;&#039;Request&#039;&#039;&#039;: PC menerima tawaran&lt;br /&gt;
# &#039;&#039;&#039;Ack&#039;&#039;&#039;: server mengonfirmasi dan mencatat lease&lt;br /&gt;
&lt;br /&gt;
Di RouterOS, DHCP dipecah menjadi tiga bagian:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Menjawab !! Alasan dipisah&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Pool&#039;&#039;&#039; || IP mana yang boleh dibagikan? || Pool dipakai ulang oleh fitur lain (VPN, PPPoE, Hotspot)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Network&#039;&#039;&#039; || Info apa yang diberikan (gateway, DNS)? || Satu server bisa melayani banyak subnet (lewat relay)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server&#039;&#039;&#039; || Siapa yang melayani, di interface mana? || Mengikat semuanya ke satu segmen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lease time&#039;&#039;&#039; (default 30 menit): lama IP &amp;quot;disewakan&amp;quot;. PC memperpanjang sebelum habis, dan IP kembali ke pool kalau PC pergi.&lt;br /&gt;
* &#039;&#039;&#039;Kenapa pool mulai dari &amp;lt;code&amp;gt;.100&amp;lt;/code&amp;gt;&#039;&#039;&#039;: &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; disisakan untuk perangkat ber-IP tetap (server, printer, access point, CCTV).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Di mana DHCP server diletakkan?&#039;&#039;&#039; Broadcast DHCP &#039;&#039;&#039;tidak menyeberang router&#039;&#039;&#039;, jadi DHCP server harus berada di segmen yang sama dengan client, atau memakai &#039;&#039;&#039;DHCP relay&#039;&#039;&#039; yang meneruskan permintaan ke server di network lain.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skenario !! Lokasi DHCP server&lt;br /&gt;
|-&lt;br /&gt;
| Rumah || Modem/router ISP&lt;br /&gt;
|-&lt;br /&gt;
| Kantor kecil-menengah || Router MikroTik, satu server per segmen/VLAN&lt;br /&gt;
|-&lt;br /&gt;
| Kantor besar || Server khusus (Windows Server, Kea, dnsmasq) + DHCP relay di router&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di lab ini CHR berperan ganda: &#039;&#039;&#039;client&#039;&#039;&#039; di sisi WAN (dapat IP dari dnsmasq libvirt) dan &#039;&#039;&#039;server&#039;&#039;&#039; di sisi LAN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Satu segmen = satu DHCP server.&#039;&#039;&#039; Dua server di segmen yang sama membuat PC bisa mendapat konfigurasi yang salah. Kasus klasiknya &#039;&#039;&#039;rogue DHCP&#039;&#039;&#039;: router Wi-Fi rumahan yang dicolok ke jaringan kantor.&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
PC diarahkan ke router (&amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;) sebagai DNS server. Router meneruskan pertanyaan ke &#039;&#039;&#039;Dynamic Servers&#039;&#039;&#039; (&amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, didapat dari DHCP di WAN) dan menyimpan jawabannya di cache.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Allow Remote Requests&#039;&#039;&#039; harus dicentang, karena defaultnya DNS router hanya untuk dirinya sendiri.&lt;br /&gt;
* Keuntungan lewat router: cache, kontrol terpusat (nama lokal, blokir domain), dan ganti DNS upstream cukup di satu tempat.&lt;br /&gt;
&lt;br /&gt;
=== NAT (masquerade) ===&lt;br /&gt;
IP privat tidak bisa dibalas oleh internet. &#039;&#039;&#039;Masquerade&#039;&#039;&#039; mengganti &#039;&#039;&#039;IP sumber&#039;&#039;&#039; paket yang keluar lewat WAN menjadi IP router, lalu mencatat pemetaannya di &#039;&#039;&#039;connection tracking&#039;&#039;&#039; supaya balasan bisa dikembalikan ke PC yang benar.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;&#039;&#039;&#039;: yang diubah alamat sumber, diproses setelah keputusan routing.&lt;br /&gt;
* &#039;&#039;&#039;Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;&#039;&#039;&#039;: hanya traffic ke arah WAN yang di-NAT.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt;&#039;&#039;&#039;: masquerade otomatis memakai IP yang sedang menempel di interface, cocok untuk IP WAN dinamis. &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt; dipakai kalau IP publik statis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa NAT ada di menu Firewall?&#039;&#039;&#039; Firewall RouterOS adalah mesin pemroses paket dengan beberapa tabel (Filter, NAT, Mangle, Raw), persis seperti &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; di Linux:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# padanan rule masquerade di Linux&lt;br /&gt;
iptables -t nat -A POSTROUTING -o ether1 -j MASQUERADE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fakta menarik&#039;&#039;&#039;: &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; + dnsmasq dari libvirt (Part 1) melakukan hal yang sama persis dengan router di lab ini: IP gateway, DHCP, DNS, dan masquerade. Lab ini juga &#039;&#039;&#039;double NAT&#039;&#039;&#039;: paket di-masquerade CHR, lalu di-NAT lagi oleh &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Banyak kantor sungguhan juga begini (router kantor di belakang modem ISP).&lt;br /&gt;
&lt;br /&gt;
=== Perjalanan satu ping ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC1 (192.168.10.100) ping 8.8.8.8&lt;br /&gt;
 │ &amp;quot;bukan tetangga → kirim ke gateway&amp;quot;  (ARP gateway → dapat MAC router)&lt;br /&gt;
 ▼&lt;br /&gt;
CHR ether2 ── routing: 0.0.0.0/0 via 192.168.122.1 ── keluar ether1&lt;br /&gt;
 │ srcnat masquerade: src 192.168.10.100 → 192.168.122.212&lt;br /&gt;
 ▼&lt;br /&gt;
virbr0 (host) ── masquerade lagi: src → IP host&lt;br /&gt;
 ▼&lt;br /&gt;
Internet ── balasan kembali, setiap NAT membalik alamatnya ── PC1 ✅&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurasi LAN pertama ==&lt;br /&gt;
&lt;br /&gt;
=== Konek Winbox ===&lt;br /&gt;
Isi &#039;&#039;&#039;Connect To&#039;&#039;&#039; dengan IP WAN CHR (contoh &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt;), login &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;. Konek lewat MAC di tab &#039;&#039;&#039;Neighbors&#039;&#039;&#039; belum tentu berhasil melalui &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;, jadi pakai IP.&lt;br /&gt;
&lt;br /&gt;
=== Langkah-langkah ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; → New || Address &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Comment &amp;lt;code&amp;gt;LAN&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=192.168.10.1/24 interface=ether2 comment=LAN&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;IP → Pool&#039;&#039;&#039; → New || Name &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt;, Addresses &amp;lt;code&amp;gt;192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip pool add name=pool-lan ranges=192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;IP → DHCP Server&#039;&#039;&#039; → tab &#039;&#039;&#039;Networks&#039;&#039;&#039; → New || Address &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, Gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;, DNS &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server network add address=192.168.10.0/24 gateway=192.168.10.1 dns-server=192.168.10.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;IP → DHCP Server&#039;&#039;&#039; → tab &#039;&#039;&#039;DHCP&#039;&#039;&#039; → New || Name &amp;lt;code&amp;gt;dhcp-lan&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Address Pool &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server add name=dhcp-lan interface=ether2 address-pool=pool-lan disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;IP → DNS&#039;&#039;&#039; || Centang &#039;&#039;&#039;Allow Remote Requests&#039;&#039;&#039; || &amp;lt;code&amp;gt;/ip dns set allow-remote-requests=yes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &#039;&#039;&#039;IP → Firewall&#039;&#039;&#039; → tab &#039;&#039;&#039;NAT&#039;&#039;&#039; → New || General: Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;, Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;; Action: &amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment=&amp;quot;NAT ke internet&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Catatan langkah 1&#039;&#039;&#039;: entri &amp;lt;code&amp;gt;192.168.122.x&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; dengan flag &#039;&#039;&#039;D&#039;&#039;&#039; (Dynamic) adalah IP WAN dari DHCP client. Jangan dihapus. Router memang punya &#039;&#039;&#039;satu IP di setiap network&#039;&#039;&#039; yang ia sambungkan, dan network di interface berbeda &#039;&#039;&#039;tidak boleh tumpang tindih&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Peringatan keamanan&#039;&#039;&#039;: CHR ini belum punya firewall filter, dan &amp;lt;code&amp;gt;allow-remote-requests=yes&amp;lt;/code&amp;gt; membuat DNS router bisa ditanya dari sisi WAN. Aman di lab, tapi di router sungguhan harus diblok (Fase 3).&lt;br /&gt;
&lt;br /&gt;
=== Trik Winbox ===&lt;br /&gt;
* Tombol &#039;&#039;&#039;DHCP Setup&#039;&#039;&#039; mengerjakan langkah 2–4 sekaligus. Pakai setelah paham cara manualnya.&lt;br /&gt;
* &#039;&#039;&#039;Terminal&#039;&#039;&#039; tersedia di dalam Winbox. Jalankan &amp;lt;code&amp;gt;/ip firewall nat export&amp;lt;/code&amp;gt; untuk melihat padanan CLI dari apa yang diklik di GUI.&lt;br /&gt;
* &#039;&#039;&#039;Safe Mode&#039;&#039;&#039;: kalau koneksi putus karena salah setting, perubahan otomatis dibatalkan. Biasakan menyalakannya.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
Di VPCS:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
ping 192.168.10.1&lt;br /&gt;
ping 8.8.8.8&lt;br /&gt;
ping google.com&lt;br /&gt;
trace 8.8.8.8&lt;br /&gt;
show arp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; menampilkan hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, jadi double NAT terlihat langsung.&lt;br /&gt;
&lt;br /&gt;
=== Melihat perangkat yang tersambung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Menu !! Menampilkan !! Keterbatasan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → DHCP Server → Leases&#039;&#039;&#039; || IP, MAC, hostname, status (&amp;lt;code&amp;gt;bound&amp;lt;/code&amp;gt;) || Hanya perangkat yang memakai DHCP&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → ARP&#039;&#039;&#039; || Perangkat yang baru-baru ini berkomunikasi, termasuk IP statis || Perangkat yang diam bisa tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039; || MAC per port fisik || Hanya untuk port anggota bridge&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → Neighbors&#039;&#039;&#039; || Perangkat jaringan (MNDP/LLDP/CDP) || PC biasa umumnya tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools → IP Scan&#039;&#039;&#039; || Scan aktif satu range || Harus dijalankan manual&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kombinasi di kantor: &#039;&#039;&#039;Leases&#039;&#039;&#039; (perangkat siapa), &#039;&#039;&#039;ARP&#039;&#039;&#039; (siapa yang aktif), &#039;&#039;&#039;Bridge Hosts&#039;&#039;&#039; (colok di port mana).&lt;br /&gt;
&lt;br /&gt;
Melihat paket ARP secara langsung: klik kanan kabel di GNS3 → &#039;&#039;&#039;Start capture&#039;&#039;&#039;, lalu di PC jalankan &amp;lt;code&amp;gt;clear arp&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ping 192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== LAN kedua dan routing antar subnet ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Isian&lt;br /&gt;
|-&lt;br /&gt;
| IP → Addresses || &amp;lt;code&amp;gt;192.168.11.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; (beri comment, misalnya &amp;lt;code&amp;gt;LAN2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| IP → Pool || &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;192.168.11.100-192.168.11.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → Networks || &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.11.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → DHCP || Server baru di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NAT || &#039;&#039;&#039;Tidak perlu diubah&#039;&#039;&#039;: rule mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;, jadi semua subnet yang keluar ke WAN otomatis di-masquerade&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Kenapa PC1 bisa ping PC4? ===&lt;br /&gt;
# PC1 melihat &amp;lt;code&amp;gt;192.168.11.x&amp;lt;/code&amp;gt; bukan tetangga → kirim ke gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Router sudah mengenal kedua network sebagai &#039;&#039;&#039;connected route&#039;&#039;&#039; (lihat &#039;&#039;&#039;IP → Routes&#039;&#039;&#039;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAC  192.168.10.0/24   → ether2&lt;br /&gt;
DAC  192.168.11.0/24   → ether3&lt;br /&gt;
DAd  0.0.0.0/0         → 192.168.122.1  (dari DHCP client)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; = dynamic, &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; = active, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; = connected.&lt;br /&gt;
# Router meng-ARP PC4 di sisi &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; lalu meneruskan paket.&lt;br /&gt;
# &#039;&#039;&#039;Tidak kena NAT&#039;&#039;&#039;, karena traffic keluar lewat &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;. PC4 melihat IP asli PC1.&lt;br /&gt;
# &#039;&#039;&#039;Tidak ada yang memblokir&#039;&#039;&#039;, karena belum ada firewall filter.&lt;br /&gt;
&lt;br /&gt;
=== Switching vs routing ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tes !! Hasil &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; !! Yang bekerja&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC2 (satu switch) || Langsung sampai || &#039;&#039;&#039;Switch&#039;&#039;&#039; (Layer 2). Router tidak terlibat.&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC4 (beda subnet) || Satu hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Router&#039;&#039;&#039; (Layer 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implikasi di kantor&#039;&#039;&#039;: memisahkan subnet &#039;&#039;&#039;tidak sama dengan isolasi&#039;&#039;&#039;. Secara default router menyambungkan semua subnet. Untuk memisahkan misalnya Wi-Fi tamu atau CCTV dari jaringan karyawan, dibutuhkan &#039;&#039;&#039;firewall filter di chain &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;&#039;&#039;&#039; (Fase 3).&lt;br /&gt;
&lt;br /&gt;
== Kesalahan umum ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP tapi tidak bisa internetan setelah ganti subnet || Gateway/DNS di DHCP Network masih memakai alamat subnet lama. PC tidak bisa meng-ARP gateway yang bukan tetangganya. || Gateway &amp;amp; DNS = IP router di subnet baru&lt;br /&gt;
|-&lt;br /&gt;
| Router punya dua IP di satu interface setelah ganti subnet || Menambah entri baru tanpa menghapus yang lama || Edit entri yang ada (double-click)&lt;br /&gt;
|-&lt;br /&gt;
| PC masih memakai IP lama || Lease lama belum diperbarui || Jalankan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt; lagi di VPCS&lt;br /&gt;
|-&lt;br /&gt;
| Satu segmen mendadak dapat gateway aneh || Rogue DHCP (dua DHCP server di satu segmen) || Cari dan cabut DHCP server liar&lt;br /&gt;
|-&lt;br /&gt;
| Router bingung meneruskan paket || Dua interface memakai subnet yang tumpang tindih || Pakai subnet berbeda di setiap interface&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;failure: dhcp-client on that interface already exists&amp;lt;/code&amp;gt; || Appliance CHR sudah membawa DHCP client di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; || Normal, abaikan&lt;br /&gt;
|-&lt;br /&gt;
| Parameter ditolak || &amp;lt;code&amp;gt;disable=no&amp;lt;/code&amp;gt; || Yang benar &amp;lt;code&amp;gt;disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Static lease sudah diubah tapi IP perangkat tetap || DHCP menunggu client bertanya (renew) || &amp;lt;code&amp;gt;ip dhcp -x&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt;, atau restart perangkat&lt;br /&gt;
|-&lt;br /&gt;
| Koneksi dua PC putus-nyambung acak || IP conflict (static lease ke IP yang sedang dipakai) || Taruh static lease di luar pool, cek Leases/ARP dulu&lt;br /&gt;
|-&lt;br /&gt;
| Router bisa internetan, semua PC tidak || Rule NAT hilang/disabled/&amp;lt;code&amp;gt;out-interface&amp;lt;/code&amp;gt; salah || Cek &#039;&#039;&#039;IP → Firewall → NAT&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Static lease ==&lt;br /&gt;
&#039;&#039;&#039;Static lease&#039;&#039;&#039; adalah reservasi IP di DHCP server berdasarkan &#039;&#039;&#039;MAC address&#039;&#039;&#039;. Setiap kali perangkat dengan MAC tersebut meminta IP, DHCP selalu memberikan IP yang sama.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa tidak set IP manual di perangkat saja?&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Terpusat&#039;&#039;&#039;: semua IP diatur dari router. Ganti IP printer cukup dari Winbox.&lt;br /&gt;
* &#039;&#039;&#039;Gateway &amp;amp; DNS tetap ikut DHCP&#039;&#039;&#039;: kalau gateway berubah, perangkat ikut berubah otomatis.&lt;br /&gt;
* Dipakai untuk printer, server, CCTV/NVR, access point, dan target &#039;&#039;&#039;port forwarding&#039;&#039;&#039; (Fase 3).&lt;br /&gt;
&lt;br /&gt;
=== Contoh: mengunci IP PC4 ===&lt;br /&gt;
# &#039;&#039;&#039;IP → DHCP Server → tab Leases&#039;&#039;&#039;.&lt;br /&gt;
# Cari baris PC4 (cocokkan MAC dengan hasil &amp;lt;code&amp;gt;show ip&amp;lt;/code&amp;gt; di VPCS). Ada flag &#039;&#039;&#039;D&#039;&#039;&#039; (dynamic).&lt;br /&gt;
# Pilih baris → &#039;&#039;&#039;Make Static&#039;&#039;&#039;. Flag &#039;&#039;&#039;D&#039;&#039;&#039; hilang.&lt;br /&gt;
# Untuk mengganti ke IP lain, double-click lease lalu ubah kolom &#039;&#039;&#039;Address&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/ip dhcp-server lease make-static [find address=192.168.11.10x]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Perubahan tidak langsung berlaku ===&lt;br /&gt;
Setelah static lease diubah, PC masih memakai IP lama. DHCP bersifat &#039;&#039;&#039;&amp;quot;client yang bertanya&amp;quot;&#039;&#039;&#039;: router tidak bisa memaksa PC berganti IP. PC baru meminta lagi ketika:&lt;br /&gt;
* lease hampir habis (biasanya mulai memperpanjang di &#039;&#039;&#039;setengah lease time&#039;&#039;&#039;),&lt;br /&gt;
* kabel dicabut-colok atau perangkat restart,&lt;br /&gt;
* dipaksa manual.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp -x     # release lease lama&lt;br /&gt;
ip dhcp        # minta lease baru&lt;br /&gt;
show ip&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tombol &#039;&#039;&#039;Send Reconfigure&#039;&#039;&#039; di Winbox hanya bekerja kalau client mendukung fitur tersebut. Kebanyakan perangkat (termasuk VPCS) tidak, jadi cara paling pasti tetap dari sisi client.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Di kantor&#039;&#039;&#039;: setelah mengganti IP printer lewat static lease, printer tidak langsung pindah. Tunggu renew, atau restart perangkatnya.&lt;br /&gt;
&lt;br /&gt;
== Latihan dan pembahasan ==&lt;br /&gt;
&lt;br /&gt;
=== Soal 1: pindah subnet ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: ubah LAN pertama menjadi &amp;lt;code&amp;gt;10.10.10.0/24&amp;lt;/code&amp;gt; (gateway &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;, pool &amp;lt;code&amp;gt;.50–.99&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;: ada empat isian yang ikut berubah.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tempat !! Sebelum !! Sesudah&lt;br /&gt;
|-&lt;br /&gt;
| IP → Addresses || &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10.10.10.1/24&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP Network (address) || &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10.10.10.0/24&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP Network (gateway &amp;amp; DNS) || &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10.10.10.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Pool || &amp;lt;code&amp;gt;192.168.10.100–200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10.10.10.50–99&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
* &#039;&#039;&#039;Rule NAT tidak perlu diubah&#039;&#039;&#039;, karena mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;, bukan alamat LAN.&lt;br /&gt;
* &#039;&#039;&#039;Jebakan&#039;&#039;&#039;: lupa mengganti gateway di DHCP Network. PC mendapat &amp;lt;code&amp;gt;10.10.10.x&amp;lt;/code&amp;gt; dengan gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;, yang bukan tetangganya. PC tidak bisa meng-ARP gateway tersebut, dan router juga sudah tidak memilikinya. Hasilnya: dapat IP tapi tidak bisa internetan. Ini kesalahan yang sering terjadi saat migrasi subnet di kantor.&lt;br /&gt;
&lt;br /&gt;
=== Soal 2: static lease ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: buat PC1 selalu mendapat IP tetap, sementara PC lain tetap acak dari pool.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pengerjaan&#039;&#039;&#039;: Make Static pada lease PC1, ubah Address ke IP target (contoh: &amp;lt;code&amp;gt;192.168.10.253&amp;lt;/code&amp;gt;), lalu di PC1 jalankan &amp;lt;code&amp;gt;ip dhcp -x&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pertanyaan 1: kenapa static lease sebaiknya di luar pool?&#039;&#039;&#039;&lt;br /&gt;
* Pool adalah wilayah DHCP dynamic. IP di luar pool tidak akan pernah dibagikan ke perangkat lain, jadi &#039;&#039;&#039;tidak mungkin bentrok&#039;&#039;&#039;.&lt;br /&gt;
* Mudah dibaca: &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; = perangkat penting, &amp;lt;code&amp;gt;.100+&amp;lt;/code&amp;gt; = perangkat biasa.&lt;br /&gt;
* Aman saat pool diperbesar atau diperkecil.&lt;br /&gt;
* Konvensi umum: IP statis di range bawah (&amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pertanyaan 2: kenapa PC1 tidak langsung berganti IP?&#039;&#039;&#039;&lt;br /&gt;
Lihat [[#Perubahan tidak langsung berlaku|Perubahan tidak langsung berlaku]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pertanyaan 3: static lease ke IP di dalam pool yang sedang dipakai PC lain?&#039;&#039;&#039;&lt;br /&gt;
Kemungkinan urutannya:&lt;br /&gt;
# Static lease &amp;lt;code&amp;gt;.150&amp;lt;/code&amp;gt; dibuat untuk PC1, sementara PC2 masih memakai &amp;lt;code&amp;gt;.150&amp;lt;/code&amp;gt; karena belum renew.&lt;br /&gt;
# Kalau PC1 renew dan mendapat &amp;lt;code&amp;gt;.150&amp;lt;/code&amp;gt;, dua PC memakai IP yang sama: &#039;&#039;&#039;IP conflict&#039;&#039;&#039;.&lt;br /&gt;
# Keduanya menjawab ARP untuk &amp;lt;code&amp;gt;.150&amp;lt;/code&amp;gt;. Tabel ARP router berganti-ganti MAC, sehingga koneksi kedua PC &#039;&#039;&#039;putus-nyambung acak&#039;&#039;&#039;.&lt;br /&gt;
# Saat PC2 renew, server menolak (IP sudah direservasi untuk MAC lain), dan PC2 mendapat IP baru dari pool. PC2 tidak harus di-release manual; &amp;lt;code&amp;gt;ip dhcp -x&amp;lt;/code&amp;gt; hanya mempercepat.&lt;br /&gt;
&lt;br /&gt;
Catatan: perilaku detail di langkah 2 bisa berbeda antar implementasi DHCP. Buktikan sendiri di lab sambil memantau &#039;&#039;&#039;Leases&#039;&#039;&#039; dan &#039;&#039;&#039;IP → ARP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pelajaran&#039;&#039;&#039;: sebelum memasang static lease, pastikan IP-nya kosong (cek Leases dan ARP), atau taruh di luar pool.&lt;br /&gt;
&lt;br /&gt;
=== Soal 3: LAN kedua ===&lt;br /&gt;
Lihat [[#LAN kedua dan routing antar subnet|LAN kedua dan routing antar subnet]].&lt;br /&gt;
&lt;br /&gt;
=== Soal 4: NAT dimatikan ===&lt;br /&gt;
&#039;&#039;&#039;Soal&#039;&#039;&#039;: disable rule NAT, lalu tes &amp;lt;code&amp;gt;/ping 8.8.8.8&amp;lt;/code&amp;gt; dari router dan dari PC1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/ip firewall nat disable 0&lt;br /&gt;
/ping 8.8.8.8 count=4      # dari router&lt;br /&gt;
# ping 8.8.8.8 dari VPCS PC1&lt;br /&gt;
/ip firewall nat enable 0  # jangan lupa dinyalakan lagi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil&#039;&#039;&#039;: ping dari router &#039;&#039;&#039;berhasil&#039;&#039;&#039;, ping dari PC1 &#039;&#039;&#039;timeout&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pembahasan&#039;&#039;&#039;: paket dari keduanya keluar lewat kabel yang sama (&amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;). Yang membedakan adalah &#039;&#039;&#039;IP sumber&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Router → 8.8.8.8   src 192.168.122.212  → dikenal virbr0 ✅&lt;br /&gt;
PC1    → 8.8.8.8   src 192.168.10.200   → &amp;quot;ini siapa? baliknya lewat mana?&amp;quot; ❌&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Router&#039;&#039;&#039; membuat paket sendiri dengan IP sumber interface keluarnya, &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt;. IP itu ada di subnet &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;, sehingga host tahu cara membalas, dan masquerade libvirt (untuk &amp;lt;code&amp;gt;192.168.122.0/24&amp;lt;/code&amp;gt;) meneruskannya ke internet. Traffic yang dibuat router sendiri &#039;&#039;&#039;tidak membutuhkan&#039;&#039;&#039; rule masquerade di router.&lt;br /&gt;
* &#039;&#039;&#039;PC1&#039;&#039;&#039;: tanpa NAT, IP sumber tetap &amp;lt;code&amp;gt;192.168.10.x&amp;lt;/code&amp;gt;. Host tidak punya route ke &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, dan masquerade libvirt tidak mencakup subnet itu. Paket bisa keluar, tapi &#039;&#039;&#039;balasan tidak bisa pulang&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pelajaran di kantor&#039;&#039;&#039;: gejala &#039;&#039;&#039;&amp;quot;router bisa internetan, tapi semua PC tidak&amp;quot;&#039;&#039;&#039; adalah tanda klasik masalah NAT (rule hilang, disabled, atau &amp;lt;code&amp;gt;out-interface&amp;lt;/code&amp;gt; salah setelah port WAN diganti).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Alternatif tanpa NAT&#039;&#039;&#039;: kalau &amp;quot;dunia luar&amp;quot; diberi tahu jalan pulangnya, NAT tidak dibutuhkan. Misalnya route di host &amp;lt;code&amp;gt;192.168.10.0/24 via 192.168.122.212&amp;lt;/code&amp;gt; membuat host bisa ping PC1 langsung. Ini &#039;&#039;&#039;routing murni&#039;&#039;&#039;, cara jaringan internal besar menyambungkan antar subnet. NAT hanya terpaksa dipakai di batas ke internet karena IP privat tidak bisa di-routing di sana.&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/24805500/DHCP MikroTik Docs: DHCP]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/37748767/DNS MikroTik Docs: DNS]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/3211299/NAT MikroTik Docs: NAT]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/328088/IP+Addressing MikroTik Docs: IP Addressing]&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=878</id>
		<title>Mikrotik 2: Kantor Mini</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_2:_Kantor_Mini&amp;diff=878"/>
		<updated>2026-10-23T03:16:24Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;Fase 1 dari roadmap: membangun &amp;#039;&amp;#039;&amp;#039;&amp;quot;kantor mini&amp;quot;&amp;#039;&amp;#039;&amp;#039;, yaitu satu router MikroTik sebagai gateway, beberapa PC yang mendapat IP otomatis, dan semuanya bisa internetan. Konfigurasi dilakukan lewat &amp;#039;&amp;#039;&amp;#039;Winbox 4&amp;#039;&amp;#039;&amp;#039;, dengan padanan CLI di setiap langkah.  __TOC__  == Tujuan == * Paham peran IP address, gateway, DHCP, DNS, dan NAT di jaringan kantor. * Paham beda &amp;#039;&amp;#039;&amp;#039;switching&amp;#039;&amp;#039;&amp;#039; (Layer 2) dan &amp;#039;&amp;#039;&amp;#039;routing&amp;#039;&amp;#039;&amp;#039; (Layer 3). * Bisa membaca kondisi router: siapa yang tersambung, dapat IP...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Fase 1 dari roadmap: membangun &#039;&#039;&#039;&amp;quot;kantor mini&amp;quot;&#039;&#039;&#039;, yaitu satu router MikroTik sebagai gateway, beberapa PC yang mendapat IP otomatis, dan semuanya bisa internetan. Konfigurasi dilakukan lewat &#039;&#039;&#039;Winbox 4&#039;&#039;&#039;, dengan padanan CLI di setiap langkah.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Paham peran IP address, gateway, DHCP, DNS, dan NAT di jaringan kantor.&lt;br /&gt;
* Paham beda &#039;&#039;&#039;switching&#039;&#039;&#039; (Layer 2) dan &#039;&#039;&#039;routing&#039;&#039;&#039; (Layer 3).&lt;br /&gt;
* Bisa membaca kondisi router: siapa yang tersambung, dapat IP apa, lewat mana.&lt;br /&gt;
&lt;br /&gt;
== Topologi ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    [NAT]&lt;br /&gt;
                      │&lt;br /&gt;
                 ether1 (WAN, DHCP client)&lt;br /&gt;
                 192.168.122.212/24&lt;br /&gt;
                      │&lt;br /&gt;
               [MikroTikCHR-1]&lt;br /&gt;
            ether2 /       \ ether3&lt;br /&gt;
     192.168.10.1/24     192.168.11.1/24&lt;br /&gt;
           │                   │&lt;br /&gt;
       [Switch1]           [Switch2]&lt;br /&gt;
      /    |    \            /    \&lt;br /&gt;
   PC1   PC2   PC3        PC4    PC5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;NAT node&#039;&#039;&#039; dari [[Belajar MikroTik Part 1|Part 1]] tetap di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Ethernet switch&#039;&#039;&#039; dan &#039;&#039;&#039;VPCS&#039;&#039;&#039; adalah perangkat bawaan GNS3 (kategori Switches dan End devices).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pengingat&#039;&#039;&#039;: setelah reboot host, jalankan ulang aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; dari Part 1, kalau tidak traffic lab tidak bisa keluar ke internet.&lt;br /&gt;
&lt;br /&gt;
== Konsep dasar ==&lt;br /&gt;
&lt;br /&gt;
=== IP address, subnet, dan alamat spesial ===&lt;br /&gt;
&amp;lt;code&amp;gt;/24&amp;lt;/code&amp;gt; berarti 24 bit pertama adalah bagian &#039;&#039;&#039;network&#039;&#039;&#039;, 8 bit terakhir bagian &#039;&#039;&#039;host&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.10. | 00000000  → .0    semua bit host 0 = alamat network&lt;br /&gt;
192.168.10. | 00000001  → .1    host pertama&lt;br /&gt;
192.168.10. | 11111110  → .254  host terakhir&lt;br /&gt;
192.168.10. | 11111111  → .255  semua bit host 1 = broadcast&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Alamat !! Fungsi !! Bisa dipakai perangkat?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.0&amp;lt;/code&amp;gt; || Network address (identitas subnet) || Tidak&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; – &amp;lt;code&amp;gt;.254&amp;lt;/code&amp;gt; || Alamat host (254 host) || Ya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;192.168.10.255&amp;lt;/code&amp;gt; || Broadcast (ke semua di subnet) || Tidak&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kapan menulis &amp;lt;code&amp;gt;.1/24&amp;lt;/code&amp;gt; dan kapan &amp;lt;code&amp;gt;.0/24&amp;lt;/code&amp;gt;?&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; menjawab &amp;quot;IP gua apa?&amp;quot; → alamat host, misalnya &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;. Kolom Network dihitung otomatis.&lt;br /&gt;
* &#039;&#039;&#039;Route, DHCP Network, firewall&#039;&#039;&#039; menjawab &amp;quot;network yang mana?&amp;quot; → alamat network, misalnya &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Range IP privat&#039;&#039;&#039; (tidak dikenal di internet): &amp;lt;code&amp;gt;10.0.0.0/8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;172.16.0.0/12&amp;lt;/code&amp;gt; (172.16–172.31), &amp;lt;code&amp;gt;192.168.0.0/16&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Gateway ===&lt;br /&gt;
Gateway adalah &amp;quot;pintu keluar&amp;quot; PC. Tujuan di luar subnet sendiri dikirim ke gateway.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Aturan emas&#039;&#039;&#039;: gateway &#039;&#039;&#039;harus berada di subnet yang sama&#039;&#039;&#039; dengan PC. Biasanya berupa IP router di interface tersebut. Gateway di &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt; hanya kebiasaan, bukan aturan.&lt;br /&gt;
&lt;br /&gt;
=== ARP ===&lt;br /&gt;
Di dalam satu segmen, frame Ethernet dikirim berdasarkan &#039;&#039;&#039;MAC address&#039;&#039;&#039;, bukan IP. &#039;&#039;&#039;ARP&#039;&#039;&#039; menerjemahkan &#039;&#039;&#039;IP → MAC&#039;&#039;&#039; di dalam satu segmen.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Request (broadcast)&#039;&#039;&#039;: &amp;quot;Siapa yang punya &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;? Kasih tahu &amp;lt;code&amp;gt;192.168.10.100&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;Reply (unicast)&#039;&#039;&#039;: &amp;quot;Itu gua, MAC gua &amp;lt;code&amp;gt;0C:B3:C6:FB:00:01&amp;lt;/code&amp;gt;.&amp;quot;&lt;br /&gt;
# Hasilnya disimpan di &#039;&#039;&#039;tabel ARP&#039;&#039;&#039; (cache) dan kedaluwarsa setelah beberapa waktu.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Poin penting&#039;&#039;&#039;: saat PC ping &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;, yang di-ARP adalah &#039;&#039;&#039;gateway&#039;&#039;&#039;, bukan &amp;lt;code&amp;gt;8.8.8.8&amp;lt;/code&amp;gt;. Di setiap lompatan, &#039;&#039;&#039;IP tujuan tetap sama&#039;&#039;&#039;, tapi &#039;&#039;&#039;MAC tujuan berganti&#039;&#039;&#039;. Inilah beda Layer 2 (antar tetangga) dan Layer 3 (ujung ke ujung).&lt;br /&gt;
&lt;br /&gt;
Switch juga punya tabel MAC, tapi isinya &amp;quot;MAC ini ada di port mana&amp;quot;. Switch tidak peduli IP.&lt;br /&gt;
&lt;br /&gt;
=== DHCP ===&lt;br /&gt;
PC yang baru tersambung belum punya IP, gateway, maupun DNS. DHCP membagikannya secara otomatis lewat proses &#039;&#039;&#039;DORA&#039;&#039;&#039;:&lt;br /&gt;
# &#039;&#039;&#039;Discover&#039;&#039;&#039;: PC broadcast &amp;quot;ada DHCP server?&amp;quot;&lt;br /&gt;
# &#039;&#039;&#039;Offer&#039;&#039;&#039;: server menawarkan IP + gateway + DNS&lt;br /&gt;
# &#039;&#039;&#039;Request&#039;&#039;&#039;: PC menerima tawaran&lt;br /&gt;
# &#039;&#039;&#039;Ack&#039;&#039;&#039;: server mengonfirmasi dan mencatat lease&lt;br /&gt;
&lt;br /&gt;
Di RouterOS, DHCP dipecah menjadi tiga bagian:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Menjawab !! Alasan dipisah&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Pool&#039;&#039;&#039; || IP mana yang boleh dibagikan? || Pool dipakai ulang oleh fitur lain (VPN, PPPoE, Hotspot)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Network&#039;&#039;&#039; || Info apa yang diberikan (gateway, DNS)? || Satu server bisa melayani banyak subnet (lewat relay)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Server&#039;&#039;&#039; || Siapa yang melayani, di interface mana? || Mengikat semuanya ke satu segmen&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lease time&#039;&#039;&#039; (default 30 menit): lama IP &amp;quot;disewakan&amp;quot;. PC memperpanjang sebelum habis, dan IP kembali ke pool kalau PC pergi.&lt;br /&gt;
* &#039;&#039;&#039;Kenapa pool mulai dari &amp;lt;code&amp;gt;.100&amp;lt;/code&amp;gt;&#039;&#039;&#039;: &amp;lt;code&amp;gt;.2–.99&amp;lt;/code&amp;gt; disisakan untuk perangkat ber-IP tetap (server, printer, access point, CCTV).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Di mana DHCP server diletakkan?&#039;&#039;&#039; Broadcast DHCP &#039;&#039;&#039;tidak menyeberang router&#039;&#039;&#039;, jadi DHCP server harus berada di segmen yang sama dengan client, atau memakai &#039;&#039;&#039;DHCP relay&#039;&#039;&#039; yang meneruskan permintaan ke server di network lain.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Skenario !! Lokasi DHCP server&lt;br /&gt;
|-&lt;br /&gt;
| Rumah || Modem/router ISP&lt;br /&gt;
|-&lt;br /&gt;
| Kantor kecil-menengah || Router MikroTik, satu server per segmen/VLAN&lt;br /&gt;
|-&lt;br /&gt;
| Kantor besar || Server khusus (Windows Server, Kea, dnsmasq) + DHCP relay di router&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di lab ini CHR berperan ganda: &#039;&#039;&#039;client&#039;&#039;&#039; di sisi WAN (dapat IP dari dnsmasq libvirt) dan &#039;&#039;&#039;server&#039;&#039;&#039; di sisi LAN.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Satu segmen = satu DHCP server.&#039;&#039;&#039; Dua server di segmen yang sama membuat PC bisa mendapat konfigurasi yang salah. Kasus klasiknya &#039;&#039;&#039;rogue DHCP&#039;&#039;&#039;: router Wi-Fi rumahan yang dicolok ke jaringan kantor.&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
PC diarahkan ke router (&amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;) sebagai DNS server. Router meneruskan pertanyaan ke &#039;&#039;&#039;Dynamic Servers&#039;&#039;&#039; (&amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, didapat dari DHCP di WAN) dan menyimpan jawabannya di cache.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Allow Remote Requests&#039;&#039;&#039; harus dicentang, karena defaultnya DNS router hanya untuk dirinya sendiri.&lt;br /&gt;
* Keuntungan lewat router: cache, kontrol terpusat (nama lokal, blokir domain), dan ganti DNS upstream cukup di satu tempat.&lt;br /&gt;
&lt;br /&gt;
=== NAT (masquerade) ===&lt;br /&gt;
IP privat tidak bisa dibalas oleh internet. &#039;&#039;&#039;Masquerade&#039;&#039;&#039; mengganti &#039;&#039;&#039;IP sumber&#039;&#039;&#039; paket yang keluar lewat WAN menjadi IP router, lalu mencatat pemetaannya di &#039;&#039;&#039;connection tracking&#039;&#039;&#039; supaya balasan bisa dikembalikan ke PC yang benar.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;&#039;&#039;&#039;: yang diubah alamat sumber, diproses setelah keputusan routing.&lt;br /&gt;
* &#039;&#039;&#039;Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;&#039;&#039;&#039;: hanya traffic ke arah WAN yang di-NAT.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt;&#039;&#039;&#039;: masquerade otomatis memakai IP yang sedang menempel di interface, cocok untuk IP WAN dinamis. &amp;lt;code&amp;gt;src-nat&amp;lt;/code&amp;gt; dipakai kalau IP publik statis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa NAT ada di menu Firewall?&#039;&#039;&#039; Firewall RouterOS adalah mesin pemroses paket dengan beberapa tabel (Filter, NAT, Mangle, Raw), persis seperti &amp;lt;code&amp;gt;iptables&amp;lt;/code&amp;gt; di Linux:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# padanan rule masquerade di Linux&lt;br /&gt;
iptables -t nat -A POSTROUTING -o ether1 -j MASQUERADE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fakta menarik&#039;&#039;&#039;: &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; + dnsmasq dari libvirt (Part 1) melakukan hal yang sama persis dengan router di lab ini: IP gateway, DHCP, DNS, dan masquerade. Lab ini juga &#039;&#039;&#039;double NAT&#039;&#039;&#039;: paket di-masquerade CHR, lalu di-NAT lagi oleh &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Banyak kantor sungguhan juga begini (router kantor di belakang modem ISP).&lt;br /&gt;
&lt;br /&gt;
=== Perjalanan satu ping ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PC1 (192.168.10.100) ping 8.8.8.8&lt;br /&gt;
 │ &amp;quot;bukan tetangga → kirim ke gateway&amp;quot;  (ARP gateway → dapat MAC router)&lt;br /&gt;
 ▼&lt;br /&gt;
CHR ether2 ── routing: 0.0.0.0/0 via 192.168.122.1 ── keluar ether1&lt;br /&gt;
 │ srcnat masquerade: src 192.168.10.100 → 192.168.122.212&lt;br /&gt;
 ▼&lt;br /&gt;
virbr0 (host) ── masquerade lagi: src → IP host&lt;br /&gt;
 ▼&lt;br /&gt;
Internet ── balasan kembali, setiap NAT membalik alamatnya ── PC1 ✅&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurasi LAN pertama ==&lt;br /&gt;
&lt;br /&gt;
=== Konek Winbox ===&lt;br /&gt;
Isi &#039;&#039;&#039;Connect To&#039;&#039;&#039; dengan IP WAN CHR (contoh &amp;lt;code&amp;gt;192.168.122.212&amp;lt;/code&amp;gt;), login &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;. Konek lewat MAC di tab &#039;&#039;&#039;Neighbors&#039;&#039;&#039; belum tentu berhasil melalui &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;, jadi pakai IP.&lt;br /&gt;
&lt;br /&gt;
=== Langkah-langkah ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Winbox !! Isian !! CLI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;IP → Addresses&#039;&#039;&#039; → New || Address &amp;lt;code&amp;gt;192.168.10.1/24&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Comment &amp;lt;code&amp;gt;LAN&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip address add address=192.168.10.1/24 interface=ether2 comment=LAN&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &#039;&#039;&#039;IP → Pool&#039;&#039;&#039; → New || Name &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt;, Addresses &amp;lt;code&amp;gt;192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip pool add name=pool-lan ranges=192.168.10.100-192.168.10.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;IP → DHCP Server&#039;&#039;&#039; → tab &#039;&#039;&#039;Networks&#039;&#039;&#039; → New || Address &amp;lt;code&amp;gt;192.168.10.0/24&amp;lt;/code&amp;gt;, Gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;, DNS &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server network add address=192.168.10.0/24 gateway=192.168.10.1 dns-server=192.168.10.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &#039;&#039;&#039;IP → DHCP Server&#039;&#039;&#039; → tab &#039;&#039;&#039;DHCP&#039;&#039;&#039; → New || Name &amp;lt;code&amp;gt;dhcp-lan&amp;lt;/code&amp;gt;, Interface &amp;lt;code&amp;gt;ether2&amp;lt;/code&amp;gt;, Address Pool &amp;lt;code&amp;gt;pool-lan&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip dhcp-server add name=dhcp-lan interface=ether2 address-pool=pool-lan disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;IP → DNS&#039;&#039;&#039; || Centang &#039;&#039;&#039;Allow Remote Requests&#039;&#039;&#039; || &amp;lt;code&amp;gt;/ip dns set allow-remote-requests=yes&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &#039;&#039;&#039;IP → Firewall&#039;&#039;&#039; → tab &#039;&#039;&#039;NAT&#039;&#039;&#039; → New || General: Chain &amp;lt;code&amp;gt;srcnat&amp;lt;/code&amp;gt;, Out. Interface &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;; Action: &amp;lt;code&amp;gt;masquerade&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade comment=&amp;quot;NAT ke internet&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Catatan langkah 1&#039;&#039;&#039;: entri &amp;lt;code&amp;gt;192.168.122.x&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; dengan flag &#039;&#039;&#039;D&#039;&#039;&#039; (Dynamic) adalah IP WAN dari DHCP client. Jangan dihapus. Router memang punya &#039;&#039;&#039;satu IP di setiap network&#039;&#039;&#039; yang ia sambungkan, dan network di interface berbeda &#039;&#039;&#039;tidak boleh tumpang tindih&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Peringatan keamanan&#039;&#039;&#039;: CHR ini belum punya firewall filter, dan &amp;lt;code&amp;gt;allow-remote-requests=yes&amp;lt;/code&amp;gt; membuat DNS router bisa ditanya dari sisi WAN. Aman di lab, tapi di router sungguhan harus diblok (Fase 3).&lt;br /&gt;
&lt;br /&gt;
=== Trik Winbox ===&lt;br /&gt;
* Tombol &#039;&#039;&#039;DHCP Setup&#039;&#039;&#039; mengerjakan langkah 2–4 sekaligus. Pakai setelah paham cara manualnya.&lt;br /&gt;
* &#039;&#039;&#039;Terminal&#039;&#039;&#039; tersedia di dalam Winbox. Jalankan &amp;lt;code&amp;gt;/ip firewall nat export&amp;lt;/code&amp;gt; untuk melihat padanan CLI dari apa yang diklik di GUI.&lt;br /&gt;
* &#039;&#039;&#039;Safe Mode&#039;&#039;&#039;: kalau koneksi putus karena salah setting, perubahan otomatis dibatalkan. Biasakan menyalakannya.&lt;br /&gt;
&lt;br /&gt;
== Verifikasi ==&lt;br /&gt;
Di VPCS:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ip dhcp&lt;br /&gt;
show ip&lt;br /&gt;
ping 192.168.10.1&lt;br /&gt;
ping 8.8.8.8&lt;br /&gt;
ping google.com&lt;br /&gt;
trace 8.8.8.8&lt;br /&gt;
show arp&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; menampilkan hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; lalu &amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;, jadi double NAT terlihat langsung.&lt;br /&gt;
&lt;br /&gt;
=== Melihat perangkat yang tersambung ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Menu !! Menampilkan !! Keterbatasan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → DHCP Server → Leases&#039;&#039;&#039; || IP, MAC, hostname, status (&amp;lt;code&amp;gt;bound&amp;lt;/code&amp;gt;) || Hanya perangkat yang memakai DHCP&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → ARP&#039;&#039;&#039; || Perangkat yang baru-baru ini berkomunikasi, termasuk IP statis || Perangkat yang diam bisa tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Bridge → Hosts&#039;&#039;&#039; || MAC per port fisik || Hanya untuk port anggota bridge&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP → Neighbors&#039;&#039;&#039; || Perangkat jaringan (MNDP/LLDP/CDP) || PC biasa umumnya tidak muncul&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Tools → IP Scan&#039;&#039;&#039; || Scan aktif satu range || Harus dijalankan manual&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Kombinasi di kantor: &#039;&#039;&#039;Leases&#039;&#039;&#039; (perangkat siapa), &#039;&#039;&#039;ARP&#039;&#039;&#039; (siapa yang aktif), &#039;&#039;&#039;Bridge Hosts&#039;&#039;&#039; (colok di port mana).&lt;br /&gt;
&lt;br /&gt;
Melihat paket ARP secara langsung: klik kanan kabel di GNS3 → &#039;&#039;&#039;Start capture&#039;&#039;&#039;, lalu di PC jalankan &amp;lt;code&amp;gt;clear arp&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;ping 192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== LAN kedua dan routing antar subnet ==&lt;br /&gt;
&lt;br /&gt;
=== Konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bagian !! Isian&lt;br /&gt;
|-&lt;br /&gt;
| IP → Addresses || &amp;lt;code&amp;gt;192.168.11.1/24&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; (beri comment, misalnya &amp;lt;code&amp;gt;LAN2&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| IP → Pool || &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;192.168.11.100-192.168.11.200&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → Networks || &amp;lt;code&amp;gt;192.168.11.0/24&amp;lt;/code&amp;gt;, gateway &amp;amp; DNS &amp;lt;code&amp;gt;192.168.11.1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| DHCP → DHCP || Server baru di &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;pool-lan2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NAT || &#039;&#039;&#039;Tidak perlu diubah&#039;&#039;&#039;: rule mencocokkan &amp;lt;code&amp;gt;out-interface=ether1&amp;lt;/code&amp;gt;, jadi semua subnet yang keluar ke WAN otomatis di-masquerade&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Kenapa PC1 bisa ping PC4? ===&lt;br /&gt;
# PC1 melihat &amp;lt;code&amp;gt;192.168.11.x&amp;lt;/code&amp;gt; bukan tetangga → kirim ke gateway &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Router sudah mengenal kedua network sebagai &#039;&#039;&#039;connected route&#039;&#039;&#039; (lihat &#039;&#039;&#039;IP → Routes&#039;&#039;&#039;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAC  192.168.10.0/24   → ether2&lt;br /&gt;
DAC  192.168.11.0/24   → ether3&lt;br /&gt;
DAd  0.0.0.0/0         → 192.168.122.1  (dari DHCP client)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
:&amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; = dynamic, &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; = active, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; = connected.&lt;br /&gt;
# Router meng-ARP PC4 di sisi &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt; lalu meneruskan paket.&lt;br /&gt;
# &#039;&#039;&#039;Tidak kena NAT&#039;&#039;&#039;, karena traffic keluar lewat &amp;lt;code&amp;gt;ether3&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;. PC4 melihat IP asli PC1.&lt;br /&gt;
# &#039;&#039;&#039;Tidak ada yang memblokir&#039;&#039;&#039;, karena belum ada firewall filter.&lt;br /&gt;
&lt;br /&gt;
=== Switching vs routing ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tes !! Hasil &amp;lt;code&amp;gt;trace&amp;lt;/code&amp;gt; !! Yang bekerja&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC2 (satu switch) || Langsung sampai || &#039;&#039;&#039;Switch&#039;&#039;&#039; (Layer 2). Router tidak terlibat.&lt;br /&gt;
|-&lt;br /&gt;
| PC1 → PC4 (beda subnet) || Satu hop lewat &amp;lt;code&amp;gt;192.168.10.1&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Router&#039;&#039;&#039; (Layer 3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implikasi di kantor&#039;&#039;&#039;: memisahkan subnet &#039;&#039;&#039;tidak sama dengan isolasi&#039;&#039;&#039;. Secara default router menyambungkan semua subnet. Untuk memisahkan misalnya Wi-Fi tamu atau CCTV dari jaringan karyawan, dibutuhkan &#039;&#039;&#039;firewall filter di chain &amp;lt;code&amp;gt;forward&amp;lt;/code&amp;gt;&#039;&#039;&#039; (Fase 3).&lt;br /&gt;
&lt;br /&gt;
== Kesalahan umum ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| PC dapat IP tapi tidak bisa internetan setelah ganti subnet || Gateway/DNS di DHCP Network masih memakai alamat subnet lama. PC tidak bisa meng-ARP gateway yang bukan tetangganya. || Gateway &amp;amp; DNS = IP router di subnet baru&lt;br /&gt;
|-&lt;br /&gt;
| Router punya dua IP di satu interface setelah ganti subnet || Menambah entri baru tanpa menghapus yang lama || Edit entri yang ada (double-click)&lt;br /&gt;
|-&lt;br /&gt;
| PC masih memakai IP lama || Lease lama belum diperbarui || Jalankan &amp;lt;code&amp;gt;ip dhcp&amp;lt;/code&amp;gt; lagi di VPCS&lt;br /&gt;
|-&lt;br /&gt;
| Satu segmen mendadak dapat gateway aneh || Rogue DHCP (dua DHCP server di satu segmen) || Cari dan cabut DHCP server liar&lt;br /&gt;
|-&lt;br /&gt;
| Router bingung meneruskan paket || Dua interface memakai subnet yang tumpang tindih || Pakai subnet berbeda di setiap interface&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;failure: dhcp-client on that interface already exists&amp;lt;/code&amp;gt; || Appliance CHR sudah membawa DHCP client di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; || Normal, abaikan&lt;br /&gt;
|-&lt;br /&gt;
| Parameter ditolak || &amp;lt;code&amp;gt;disable=no&amp;lt;/code&amp;gt; || Yang benar &amp;lt;code&amp;gt;disabled=no&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Latihan ==&lt;br /&gt;
# &#039;&#039;&#039;Pindah subnet&#039;&#039;&#039;: ubah LAN pertama menjadi &amp;lt;code&amp;gt;10.10.10.0/24&amp;lt;/code&amp;gt; (gateway &amp;lt;code&amp;gt;.1&amp;lt;/code&amp;gt;, pool &amp;lt;code&amp;gt;.50–.99&amp;lt;/code&amp;gt;). Ada empat isian yang harus ikut berubah. Apakah rule NAT perlu diubah?&lt;br /&gt;
# &#039;&#039;&#039;Static lease&#039;&#039;&#039;: buat PC1 selalu mendapat &amp;lt;code&amp;gt;192.168.10.10&amp;lt;/code&amp;gt;, sementara PC lain tetap acak dari pool.&lt;br /&gt;
#* Bolehkah static lease memakai IP di luar pool? Kenapa justru bisa jadi ide bagus?&lt;br /&gt;
#* Bagaimana membuat PC1 memakai IP barunya?&lt;br /&gt;
#* Apa yang bisa terjadi kalau static lease memakai IP di dalam pool yang sedang dipakai PC lain?&lt;br /&gt;
# &#039;&#039;&#039;Sengaja dirusak&#039;&#039;&#039;: disable rule NAT. Tebak dulu: &amp;lt;code&amp;gt;/ping 8.8.8.8&amp;lt;/code&amp;gt; dari router masih jalan? Dari PC1? Tes, lalu jelaskan kenapa hasilnya berbeda.&lt;br /&gt;
&lt;br /&gt;
== Selanjutnya ==&lt;br /&gt;
Part 3: bridge dan VLAN, yaitu cara satu router melayani banyak segmen lewat satu kabel.&lt;br /&gt;
&lt;br /&gt;
== Referensi ==&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/24805500/DHCP MikroTik Docs: DHCP]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/37748767/DNS MikroTik Docs: DNS]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/3211299/NAT MikroTik Docs: NAT]&lt;br /&gt;
* [https://help.mikrotik.com/docs/spaces/ROS/pages/328088/IP+Addressing MikroTik Docs: IP Addressing]&lt;br /&gt;
&lt;br /&gt;
[[Category:Networking]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=877</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=877"/>
		<updated>2026-10-23T03:16:10Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Mikrotik =&lt;br /&gt;
* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;br /&gt;
* [[Mikrotik 2: Kantor Mini]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
== Cisco Lab ==&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_1:_Install_GNS3_Arch_Linux&amp;diff=876</id>
		<title>Mikrotik 1: Install GNS3 Arch Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Mikrotik_1:_Install_GNS3_Arch_Linux&amp;diff=876"/>
		<updated>2026-10-22T09:32:58Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;Halaman ini mencatat setup lab MikroTik virtual pakai &amp;#039;&amp;#039;&amp;#039;GNS3&amp;#039;&amp;#039;&amp;#039; di &amp;#039;&amp;#039;&amp;#039;Arch Linux&amp;#039;&amp;#039;&amp;#039;, dari install sampai router pertama bisa nge-ping internet. Semua error yang muncul selama setup juga dicatat, lengkap dengan penyebab dan solusinya.  __TOC__  == Tujuan == * Punya lab MikroTik tanpa beli hardware. * Router virtual bisa diakses dari host (WebFig) dan bisa keluar ke internet. * Paham istilah dasar: CHR, appliance, template, libvirt, &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;.  == Konsep dan ist...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Halaman ini mencatat setup lab MikroTik virtual pakai &#039;&#039;&#039;GNS3&#039;&#039;&#039; di &#039;&#039;&#039;Arch Linux&#039;&#039;&#039;, dari install sampai router pertama bisa nge-ping internet. Semua error yang muncul selama setup juga dicatat, lengkap dengan penyebab dan solusinya.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Tujuan ==&lt;br /&gt;
* Punya lab MikroTik tanpa beli hardware.&lt;br /&gt;
* Router virtual bisa diakses dari host (WebFig) dan bisa keluar ke internet.&lt;br /&gt;
* Paham istilah dasar: CHR, appliance, template, libvirt, &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Konsep dan istilah ==&lt;br /&gt;
&lt;br /&gt;
=== RouterOS dan CHR ===&lt;br /&gt;
&#039;&#039;&#039;RouterOS&#039;&#039;&#039; adalah sistem operasi router MikroTik. &#039;&#039;&#039;CHR (Cloud Hosted Router)&#039;&#039;&#039; adalah RouterOS versi x86 yang dijalankan sebagai VM.&lt;br /&gt;
&lt;br /&gt;
* Fiturnya sama dengan RouterOS di router fisik: bridge, NAT, firewall, VLAN, OSPF, BGP, VPN.&lt;br /&gt;
* Ringan: cukup RAM beberapa ratus MB per router, jadi bisa jalan banyak router sekaligus.&lt;br /&gt;
* Lisensi gratis dibatasi upload &#039;&#039;&#039;1 Mbps per interface&#039;&#039;&#039;, tapi semua fitur tetap jalan. Cukup buat belajar.&lt;br /&gt;
&lt;br /&gt;
=== Tools konfigurasi ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tool !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;WebFig&#039;&#039;&#039; || Antarmuka web bawaan RouterOS. Tanpa install, cukup buka IP router di browser. Hanya bisa konek lewat IP.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Winbox 4&#039;&#039;&#039; || Aplikasi native (Windows, macOS, Linux). Bisa konek lewat &#039;&#039;&#039;MAC address&#039;&#039;&#039;, berguna kalau router belum punya IP.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;CLI&#039;&#039;&#039; || Lewat console/telnet/SSH. Paling lengkap, dan yang dipakai di halaman ini.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== GNS3: appliance vs template ===&lt;br /&gt;
* &#039;&#039;&#039;Template&#039;&#039;&#039;: perangkat yang siap di-drag ke canvas.&lt;br /&gt;
* &#039;&#039;&#039;Appliance&#039;&#039;&#039;: file resep (&amp;lt;code&amp;gt;.gns3a&amp;lt;/code&amp;gt;) yang otomatis membuat template, lengkap dengan setting RAM, adapter, console, serta nama file dan checksum image yang dibutuhkan.&lt;br /&gt;
* GNS3 &#039;&#039;&#039;tidak membawa image&#039;&#039;&#039; vendor. Image CHR tetap diambil dari mikrotik.com.&lt;br /&gt;
&lt;br /&gt;
Di katalog appliance ada banyak model MikroTik (CCR, RB, CRS, dll). Buat belajar, cukup pakai &#039;&#039;&#039;MikroTik CHR&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== libvirt dan virbr0 ===&lt;br /&gt;
* &#039;&#039;&#039;libvirt&#039;&#039;&#039;: lapisan manajemen virtualisasi di Linux (daemon &amp;lt;code&amp;gt;libvirtd&amp;lt;/code&amp;gt;, tool &amp;lt;code&amp;gt;virsh&amp;lt;/code&amp;gt;). Mengatur VM, storage, dan network virtual.&lt;br /&gt;
* &#039;&#039;&#039;virbr0&#039;&#039;&#039; (&#039;&#039;virtual bridge&#039;&#039;): switch virtual di host yang dibuat oleh network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; libvirt. Fungsinya:&lt;br /&gt;
** gateway lab (&amp;lt;code&amp;gt;192.168.122.1&amp;lt;/code&amp;gt;),&lt;br /&gt;
** DHCP via dnsmasq (range &amp;lt;code&amp;gt;192.168.122.x&amp;lt;/code&amp;gt;),&lt;br /&gt;
** NAT supaya lab bisa keluar lewat internet host.&lt;br /&gt;
&lt;br /&gt;
Node &#039;&#039;&#039;NAT&#039;&#039;&#039; di GNS3 memakai &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; ini.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CHR (GNS3) ── NAT node ── virbr0 (host) ── internet&lt;br /&gt;
                             │&lt;br /&gt;
                     Browser/Winbox di host&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Efek ke host&#039;&#039;&#039;: koneksi internet asli tidak berubah. libvirt hanya menambah aturan NAT untuk &amp;lt;code&amp;gt;192.168.122.0/24&amp;lt;/code&amp;gt;, menyalakan &amp;lt;code&amp;gt;ip_forward&amp;lt;/code&amp;gt;, dan menjalankan dnsmasq khusus &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;. Pastikan subnet ini tidak bentrok dengan jaringan asli.&lt;br /&gt;
&lt;br /&gt;
== Instalasi ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Upgrade sistem ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo pacman -Syu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Wajib, untuk menghindari partial upgrade (lihat [[#Masalah 1: partial upgrade QEMU|Masalah 1]]).&lt;br /&gt;
&lt;br /&gt;
=== 2. Dependensi ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
paru -S --needed qemu docker vpcs dynamips libvirt ubridge inetutils&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;--needed&amp;lt;/code&amp;gt; melewati paket yang sudah terinstall.&lt;br /&gt;
* Kalau &amp;lt;code&amp;gt;qemu-full&amp;lt;/code&amp;gt; sudah ada, &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; tidak perlu dipasang lagi.&lt;br /&gt;
* &amp;lt;code&amp;gt;vpcs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dynamips&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ubridge&amp;lt;/code&amp;gt; dari AUR.&lt;br /&gt;
* &amp;lt;code&amp;gt;inetutils&amp;lt;/code&amp;gt; menyediakan &amp;lt;code&amp;gt;telnet&amp;lt;/code&amp;gt; untuk console.&lt;br /&gt;
&lt;br /&gt;
=== 3. GNS3 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
paru -S gns3-server gns3-gui&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Group user dan service ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for g in ubridge libvirt kvm docker wireshark; do&lt;br /&gt;
  getent group $g &amp;gt;/dev/null &amp;amp;&amp;amp; sudo gpasswd -a $USER $g || echo &amp;quot;group $g belum ada&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
sudo systemctl enable --now libvirtd docker&lt;br /&gt;
reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Group &amp;lt;code&amp;gt;wireshark&amp;lt;/code&amp;gt; baru ada setelah &amp;lt;code&amp;gt;sudo pacman -S wireshark-qt&amp;lt;/code&amp;gt;. Setelah reboot, cek dengan &amp;lt;code&amp;gt;groups&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 5. Network default libvirt ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo virsh net-list --all&lt;br /&gt;
# kalau &amp;quot;default&amp;quot; belum ada:&lt;br /&gt;
sudo virsh net-define /usr/share/libvirt/networks/default.xml&lt;br /&gt;
sudo virsh net-start default&lt;br /&gt;
sudo virsh net-autostart default&lt;br /&gt;
ip a show virbr0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Pakai &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; supaya &amp;lt;code&amp;gt;virsh&amp;lt;/code&amp;gt; konek ke koneksi &#039;&#039;system&#039;&#039;, bukan &#039;&#039;session&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== 6. Console terminal ===&lt;br /&gt;
GNS3 default memakai &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt;. Pilih salah satu:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo pacman -S xterm&amp;lt;/code&amp;gt;, atau&lt;br /&gt;
* ganti di &#039;&#039;&#039;Edit → Preferences → General → Console applications&#039;&#039;&#039;, contoh:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
kitty --title &amp;quot;%d&amp;quot; telnet %h %p&lt;br /&gt;
alacritty -t &amp;quot;%d&amp;quot; -e telnet %h %p&lt;br /&gt;
konsole -p tabtitle=%d -e telnet %h %p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
(&amp;lt;code&amp;gt;%h&amp;lt;/code&amp;gt; = host, &amp;lt;code&amp;gt;%p&amp;lt;/code&amp;gt; = port, &amp;lt;code&amp;gt;%d&amp;lt;/code&amp;gt; = nama node)&lt;br /&gt;
&lt;br /&gt;
=== 7. Template MikroTik CHR ===&lt;br /&gt;
# Jalankan &amp;lt;code&amp;gt;gns3&amp;lt;/code&amp;gt;, pilih &#039;&#039;&#039;Run appliances on my local computer&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;File → New template → Install an appliance from the GNS3 server&#039;&#039;&#039;.&lt;br /&gt;
# Cari &#039;&#039;&#039;MikroTik CHR&#039;&#039;&#039;, klik &#039;&#039;&#039;Install&#039;&#039;&#039;.&lt;br /&gt;
# Lihat &#039;&#039;&#039;nama file dan versi&#039;&#039;&#039; yang diminta wizard (contoh: &amp;lt;code&amp;gt;chr-7.22.1.img&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Download &#039;&#039;&#039;Raw disk image&#039;&#039;&#039; versi yang sama dari mikrotik.com, lalu unzip:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
unzip chr-7.22.1.img.zip&lt;br /&gt;
md5sum chr-7.22.1.img   # harus sama dengan checksum di wizard&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
# &#039;&#039;&#039;Import&#039;&#039;&#039; file &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; (bukan &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;), lalu Finish.&lt;br /&gt;
&lt;br /&gt;
Template muncul di panel &#039;&#039;&#039;Routers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Hello World ==&lt;br /&gt;
&lt;br /&gt;
=== Router pertama ===&lt;br /&gt;
# Drag &#039;&#039;&#039;MikroTik CHR&#039;&#039;&#039; ke canvas, klik kanan → &#039;&#039;&#039;Start&#039;&#039;&#039;.&lt;br /&gt;
# Double-click node untuk membuka console.&lt;br /&gt;
# Login &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt;, password kosong. Jawab &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; untuk lisensi, lalu set password baru.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/system identity set name=hello-world&lt;br /&gt;
/system resource print&lt;br /&gt;
/interface print&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Prompt berubah jadi &amp;lt;code&amp;gt;[admin@hello-world] &amp;gt;&amp;lt;/code&amp;gt;. Hello world selesai.&lt;br /&gt;
&lt;br /&gt;
=== Sambung ke internet ===&lt;br /&gt;
# Drag node &#039;&#039;&#039;NAT&#039;&#039;&#039; ke canvas, sambungkan ke &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt; CHR.&lt;br /&gt;
# Di console CHR:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/ip dhcp-client print&lt;br /&gt;
/ip address print&lt;br /&gt;
/ip route print&lt;br /&gt;
/ping 192.168.122.1&lt;br /&gt;
/ping 8.8.8.8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Appliance CHR sudah membawa DHCP client di &amp;lt;code&amp;gt;ether1&amp;lt;/code&amp;gt;, jadi menambah lagi akan memunculkan &amp;lt;code&amp;gt;failure: dhcp-client on that interface already exists&amp;lt;/code&amp;gt;. Itu normal. (Kalau perlu menambah manual, parameternya &amp;lt;code&amp;gt;disabled=no&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;disable=no&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Buka WebFig ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ping -c 3 192.168.122.212   # ganti dengan IP CHR&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Lalu buka &amp;lt;code&amp;gt;http://192.168.122.212&amp;lt;/code&amp;gt; di browser host. Kalau tidak terbuka, cek &amp;lt;code&amp;gt;/ip service print&amp;lt;/code&amp;gt; dan pastikan &amp;lt;code&amp;gt;www&amp;lt;/code&amp;gt; tidak disabled.&lt;br /&gt;
&lt;br /&gt;
== Masalah yang ditemui ==&lt;br /&gt;
&lt;br /&gt;
=== Masalah 1: partial upgrade QEMU ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
error: failed to prepare transaction (could not satisfy dependencies)&lt;br /&gt;
:: installing qemu-common (11.1.2-1) breaks dependency &#039;qemu-common=11.1.1-1&#039; required by qemu-audio-alsa&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: repo sudah punya QEMU 11.1.2, sistem masih 11.1.1. Menginstall &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; menarik &amp;lt;code&amp;gt;qemu-common&amp;lt;/code&amp;gt; baru, sedangkan puluhan paket QEMU lain masih mengunci versi lama. Arch tidak mendukung partial upgrade.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: &amp;lt;code&amp;gt;sudo pacman -Syu&amp;lt;/code&amp;gt;, lalu ulangi install dependensi tanpa &amp;lt;code&amp;gt;qemu&amp;lt;/code&amp;gt; (sudah ada lewat &amp;lt;code&amp;gt;qemu-full&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 2: gns3server crash, &amp;lt;code&amp;gt;No module named &#039;langchain&#039;&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CRITICAL gns3server.server:331 Critical error while running the server: No module named &#039;langchain&#039;&lt;br /&gt;
  File &amp;quot;.../gns3server/agent/gns3_copilot/gns3_client/gns3_project_info.py&amp;quot;, line 39, in &amp;lt;module&amp;gt;&lt;br /&gt;
    from langchain.tools import BaseTool&lt;br /&gt;
ModuleNotFoundError: No module named &#039;langchain&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: GNS3 versi baru (3.x alpha di AUR) meng-import modul fitur AI copilot/MCP tanpa pengaman, padahal dependensinya opsional dan tidak ikut terinstall. Pola serupa dilaporkan untuk modul &amp;lt;code&amp;gt;mcp&amp;lt;/code&amp;gt; di [https://github.com/GNS3/gns3-server/issues/2794 GNS3 issue #2794].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;:&lt;br /&gt;
* Install dependensi yang kurang (&amp;lt;code&amp;gt;python-langchain&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python-langchain-core&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;python-mcp&amp;lt;/code&amp;gt;, dari repo atau AUR), lalu jalankan &amp;lt;code&amp;gt;gns3server&amp;lt;/code&amp;gt; dan ulangi sampai tidak ada &amp;lt;code&amp;gt;ModuleNotFoundError&amp;lt;/code&amp;gt; lagi.&lt;br /&gt;
* Alternatif: bungkus import tersebut dengan &amp;lt;code&amp;gt;try/except ModuleNotFoundError&amp;lt;/code&amp;gt; (hilang saat update), atau pakai versi stabil.&lt;br /&gt;
&lt;br /&gt;
=== Masalah 3: import image CHR gagal ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Cannot install MikroTik CHR version 7.22.1: File chr-7.22.1.img with checksum a67290634f489071eae2fd99dcadba86 not found&lt;br /&gt;
The file is compressed with &#039;zip&#039;, it must be uncompressed first&lt;br /&gt;
Could not upload image chr-7.22.1.img: File &#039;/home/haidhi/GNS3/images/QEMU/chr-7.22.1.img&#039; already exists&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;:&lt;br /&gt;
* Yang di-import file &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt;, bukan &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt; hasil unzip.&lt;br /&gt;
* Sudah ada file dengan nama sama dari percobaan sebelumnya, sehingga GNS3 menolak menimpa.&lt;br /&gt;
* Wizard appliance mencocokkan &#039;&#039;&#039;nama file dan checksum&#039;&#039;&#039; secara persis.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
file ~/GNS3/images/QEMU/chr-7.22.1.img&lt;br /&gt;
md5sum ~/GNS3/images/QEMU/chr-7.22.1.img&lt;br /&gt;
# kalau salah:&lt;br /&gt;
rm ~/GNS3/images/QEMU/chr-7.22.1.img*&lt;br /&gt;
unzip chr-7.22.1.img.zip &amp;amp;&amp;amp; md5sum chr-7.22.1.img&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Lalu ulangi wizard dan import file &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt;. Kalau versi yang diminta sudah tidak tersedia, buat template QEMU manual (lihat [[#Catatan: template manual|catatan]]).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 4: console tidak terbuka, &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; tidak ada ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Could not start Telnet console with command &#039;xterm -T &amp;quot;MikroTikCHR-1&amp;quot; -e &amp;quot;telnet localhost 5000&amp;quot;&#039;: [Errno 2] No such file or directory: &#039;xterm&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: GNS3 default memakai &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt;, yang tidak terinstall di Arch.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: install &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; atau ganti console command (lihat [[#6. Console terminal|langkah 6]]).&lt;br /&gt;
&lt;br /&gt;
=== Masalah 5: &amp;lt;code&amp;gt;NAT interface virbr0 is missing&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Error while creating node from template: NAT interface virbr0 is missing, please install libvirt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: &amp;lt;code&amp;gt;libvirtd&amp;lt;/code&amp;gt; sudah jalan, tapi network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; belum dinyalakan, sehingga &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; belum ada. Daemon hidup ≠ network hidup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: [[#5. Network default libvirt|langkah 5]]. Kalau &amp;lt;code&amp;gt;net-start&amp;lt;/code&amp;gt; gagal, cek apakah &amp;lt;code&amp;gt;dnsmasq&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;iptables-nft&amp;lt;/code&amp;gt;/nftables sudah terpasang.&lt;br /&gt;
&lt;br /&gt;
Catatan: baris log &amp;lt;code&amp;gt;Libvirt doesn&#039;t support VirtualBox API version ...&amp;lt;/code&amp;gt; tidak berbahaya.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; statusnya DOWN?&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virbr0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; ... state DOWN&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;NO-CARRIER&amp;lt;/code&amp;gt; berarti belum ada perangkat yang tersambung ke bridge. Begitu node NAT di GNS3 aktif, statusnya berubah jadi UP. Normal.&lt;br /&gt;
&lt;br /&gt;
=== Masalah 6: CHR dapat IP, tapi ping internet timeout ===&lt;br /&gt;
&#039;&#039;&#039;Gejala&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 D 192.168.122.212/24  192.168.122.0  ether1  main&lt;br /&gt;
/ping 8.8.8.8&lt;br /&gt;
  sent=9 received=0 packet-loss=100%&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
DHCP jalan (IP didapat), tapi traffic keluar tidak tembus.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Penyebab&#039;&#039;&#039;: Docker mengatur policy chain &amp;lt;code&amp;gt;FORWARD&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;DROP&amp;lt;/code&amp;gt;, sehingga traffic dari &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; dibuang sebelum di-NAT keluar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Diagnosis&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sysctl net.ipv4.ip_forward          # harus 1&lt;br /&gt;
sudo iptables -S FORWARD | head     # cari: -P FORWARD DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Solusi&#039;&#039;&#039;: izinkan traffic &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt; di chain &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; (chain yang memang disediakan Docker untuk aturan user):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo iptables -I DOCKER-USER -i virbr0 -j ACCEPT&lt;br /&gt;
sudo iptables -I DOCKER-USER -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Aturan pertama: izinkan traffic yang masuk dari lab.&lt;br /&gt;
* Aturan kedua: izinkan balasan yang kembali ke lab.&lt;br /&gt;
&lt;br /&gt;
Aturan ini &#039;&#039;&#039;hilang setelah reboot&#039;&#039;&#039; atau restart Docker. Jalankan ulang sebelum nge-lab, atau buat permanen nanti.&lt;br /&gt;
&lt;br /&gt;
== Catatan: template manual ==&lt;br /&gt;
Kalau tidak memakai appliance:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
qemu-img convert -f raw -O qcow2 chr-*.img chr.qcow2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Edit → Preferences → QEMU → QEMU VMs → New&#039;&#039;&#039;:&lt;br /&gt;
* Binary: &amp;lt;code&amp;gt;qemu-system-x86_64&amp;lt;/code&amp;gt;, RAM: 256 MB, disk: &amp;lt;code&amp;gt;chr.qcow2&amp;lt;/code&amp;gt;&lt;br /&gt;
* Console: &amp;lt;code&amp;gt;telnet&amp;lt;/code&amp;gt;&lt;br /&gt;
* Adapter: 4+, tipe &amp;lt;code&amp;gt;virtio-net-pci&amp;lt;/code&amp;gt; (ganti &amp;lt;code&amp;gt;e1000&amp;lt;/code&amp;gt; kalau interface tidak muncul)&lt;br /&gt;
* Advanced: centang &#039;&#039;&#039;Use as a linked base VM&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Ringkasan ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Masalah !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| Dependency QEMU rusak || Partial upgrade || &amp;lt;code&amp;gt;pacman -Syu&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;No module named &#039;langchain&#039;&amp;lt;/code&amp;gt; || Dependensi opsional GNS3 alpha tidak terinstall || Install modul yang kurang&lt;br /&gt;
|-&lt;br /&gt;
| Image CHR tidak ditemukan || Import &amp;lt;code&amp;gt;.zip&amp;lt;/code&amp;gt; / file lama tertinggal / checksum beda || Hapus file lama, unzip, import &amp;lt;code&amp;gt;.img&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;xterm&amp;lt;/code&amp;gt; tidak ada || Console default GNS3 || Install xterm / ganti console command&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;virbr0 is missing&amp;lt;/code&amp;gt; || Network &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; belum start || &amp;lt;code&amp;gt;virsh net-start default&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ping internet timeout || Docker &amp;lt;code&amp;gt;FORWARD DROP&amp;lt;/code&amp;gt; || Aturan &amp;lt;code&amp;gt;DOCKER-USER&amp;lt;/code&amp;gt; untuk &amp;lt;code&amp;gt;virbr0&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=875</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=875"/>
		<updated>2026-10-22T09:32:46Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Mikrotik =&lt;br /&gt;
* [[Mikrotik 1: Install GNS3 Arch Linux]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
== Cisco Lab ==&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=874</id>
		<title>Networking</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Networking&amp;diff=874"/>
		<updated>2026-10-22T09:31:24Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: SanzSkuy moved page CCNA to Networking without leaving a redirect&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Networking =&lt;br /&gt;
* [[Model OSI]]&lt;br /&gt;
* [[Lapisan Transport (TCP dan UDP)]]&lt;br /&gt;
* [[Kelas Alamat IP]]&lt;br /&gt;
* [[Subnetting 1]]&lt;br /&gt;
* [[VLSM]]&lt;br /&gt;
* [[Magic Number Method &amp;amp; Subnetting Jaringan Besar]]&lt;br /&gt;
* [[Subnetting: Contoh Oktet ke-3 vs ke-4]]&lt;br /&gt;
* [[Private IP Address (RFC 1918)]]&lt;br /&gt;
* [[Ethernet &amp;amp; Layer 2 (Data Link)]]&lt;br /&gt;
* [[Media Koneksi Ethernet (Layer 1)]]&lt;br /&gt;
* [[Perangkat Jaringan: Hub, Switch, dan Router]]&lt;br /&gt;
&lt;br /&gt;
= Cisco =&lt;br /&gt;
* [[Cisco IOS]]&lt;br /&gt;
* [[Perintah Dasar Cisco IOS]]&lt;br /&gt;
&lt;br /&gt;
= Lab =&lt;br /&gt;
* [[Lab 0.1 - Basic Device Hardening]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Deploy_app_bare-metal&amp;diff=873</id>
		<title>Deploy app bare-metal</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Deploy_app_bare-metal&amp;diff=873"/>
		<updated>2026-10-20T06:42:08Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;Catatan tentang cara deploy aplikasi (Python FastAPI, Rust Actix, Node frontend) langsung di server Ubuntu (contoh: &amp;lt;code&amp;gt;marshall-3&amp;lt;/code&amp;gt;) tanpa Docker, memakai &amp;#039;&amp;#039;&amp;#039;uv&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;systemd&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;Ansible&amp;#039;&amp;#039;&amp;#039;. Fokus utama catatan ini adalah sisi &amp;#039;&amp;#039;&amp;#039;sysadmin&amp;#039;&amp;#039;&amp;#039;: layout direktori, model user dan permission, hardening service, dan otomasi.  == Gambaran besar ==  Docker memberi tiga hal: &amp;#039;&amp;#039;&amp;#039;isolasi&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;reproducibility&amp;#039;&amp;#039;&amp;#039;, dan &amp;#039;&amp;#039;&amp;#039;packaging&amp;#039;&amp;#039;&amp;#039;. Di bare metal, ketiganya tetap b...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Catatan tentang cara deploy aplikasi (Python FastAPI, Rust Actix, Node frontend) langsung di server Ubuntu (contoh: &amp;lt;code&amp;gt;marshall-3&amp;lt;/code&amp;gt;) tanpa Docker, memakai &#039;&#039;&#039;uv&#039;&#039;&#039;, &#039;&#039;&#039;systemd&#039;&#039;&#039;, dan &#039;&#039;&#039;Ansible&#039;&#039;&#039;. Fokus utama catatan ini adalah sisi &#039;&#039;&#039;sysadmin&#039;&#039;&#039;: layout direktori, model user dan permission, hardening service, dan otomasi.&lt;br /&gt;
&lt;br /&gt;
== Gambaran besar ==&lt;br /&gt;
&lt;br /&gt;
Docker memberi tiga hal: &#039;&#039;&#039;isolasi&#039;&#039;&#039;, &#039;&#039;&#039;reproducibility&#039;&#039;&#039;, dan &#039;&#039;&#039;packaging&#039;&#039;&#039;. Di bare metal, ketiganya tetap bisa didapat dengan alat bawaan Linux:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Kebutuhan !! Di Docker !! Di bare metal&lt;br /&gt;
|-&lt;br /&gt;
| Isolasi proses || namespace, cgroup || user terpisah per app + hardening systemd (juga pakai namespace &amp;amp; cgroup)&lt;br /&gt;
|-&lt;br /&gt;
| Dependency terkunci || image || lock file (&amp;lt;code&amp;gt;uv.lock&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Cargo.lock&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;package-lock.json&amp;lt;/code&amp;gt;) + venv per release&lt;br /&gt;
|-&lt;br /&gt;
| Restart otomatis || &amp;lt;code&amp;gt;restart: unless-stopped&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Restart=on-failure&amp;lt;/code&amp;gt; di unit systemd&lt;br /&gt;
|-&lt;br /&gt;
| Log || &amp;lt;code&amp;gt;docker logs&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;journalctl -u nama-app&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Rollback || tag image lama || folder release lama + symlink&lt;br /&gt;
|-&lt;br /&gt;
| Deploy berulang || compose / CI || Ansible&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kapan bare metal masuk akal:&#039;&#039;&#039; sedikit server, workload GPU, tim kecil, atau binary tunggal (Rust/Go).&lt;br /&gt;
&#039;&#039;&#039;Kapan Docker lebih unggul:&#039;&#039;&#039; banyak server, scaling horizontal, atau dependency sistem yang bentrok antar app (misalnya versi CUDA berbeda per app, karena di bare metal semua app berbagi satu driver NVIDIA).&lt;br /&gt;
&lt;br /&gt;
== Layout direktori (FHS) ==&lt;br /&gt;
&lt;br /&gt;
Setiap app memakai lokasi standar &#039;&#039;Filesystem Hierarchy Standard&#039;&#039;, supaya jelas mana kode, mana config, mana data:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! Isi !! Kenapa di sini&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/releases/&amp;amp;lt;versi&amp;amp;gt;/&amp;lt;/code&amp;gt; || kode + &amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;dist&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; untuk software tambahan yang bukan dari paket OS&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/current&amp;lt;/code&amp;gt; || symlink ke release aktif || service selalu menunjuk ke sini; ganti versi = ganti symlink&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;/&amp;amp;lt;app&amp;amp;gt;.env&amp;lt;/code&amp;gt; || environment variable &amp;amp; secret || &amp;lt;code&amp;gt;/etc&amp;lt;/code&amp;gt; untuk konfigurasi milik host, terpisah dari kode&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/&amp;lt;/code&amp;gt; || data, cache model, upload, cache uv/cargo/npm || &amp;lt;code&amp;gt;/var/lib&amp;lt;/code&amp;gt; untuk state yang ditulis aplikasi saat jalan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/uv/python/&amp;lt;/code&amp;gt; || interpreter Python bersama || dipakai semua app, bukan milik satu user&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/systemd/system/&amp;amp;lt;app&amp;amp;gt;.service&amp;lt;/code&amp;gt; || unit service || lokasi unit buatan admin (bukan dari paket)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pemisahan ini penting untuk permission: &#039;&#039;&#039;kode&#039;&#039;&#039; boleh read-only saat runtime, &#039;&#039;&#039;config&#039;&#039;&#039; hanya root yang boleh ubah, dan &#039;&#039;&#039;hanya folder data&#039;&#039;&#039; yang boleh ditulis aplikasi.&lt;br /&gt;
&lt;br /&gt;
== Model user &amp;amp; permission ==&lt;br /&gt;
&lt;br /&gt;
=== Satu app, satu system user ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo useradd --system --home-dir /var/lib/transcribe-api \&lt;br /&gt;
  --shell /usr/sbin/nologin transcribe&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--system&amp;lt;/code&amp;gt;: UID diambil dari rentang system (di Ubuntu di bawah 1000), tidak muncul di layar login, dan tidak dibuatkan mailbox atau aging password.&lt;br /&gt;
* &amp;lt;code&amp;gt;--shell /usr/sbin/nologin&amp;lt;/code&amp;gt;: user tidak bisa login interaktif. Kalau proses app dibobol, penyerang tidak otomatis dapat shell login.&lt;br /&gt;
* &#039;&#039;&#039;Kenapa per app?&#039;&#039;&#039; Kalau satu app bocor, app lain dan file-nya tidak ikut terbaca. Ini prinsip &#039;&#039;least privilege&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perintah berguna:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
id transcribe                 # UID, GID, dan group tambahan&lt;br /&gt;
getent passwd transcribe      # home &amp;amp; shell&lt;br /&gt;
getent group | grep transcribe&lt;br /&gt;
sudo -u transcribe -H bash -c &#039;whoami; echo $HOME&#039;   # tes sebagai user app&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Salah nama user?&#039;&#039;&#039; Rename tanpa bikin ulang:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo usermod -l transcribe -d /var/lib/transcribe-api appuser   # ganti login &amp;amp; home&lt;br /&gt;
sudo groupmod -n transcribe appuser                            # ganti nama group&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Karena UID/GID tidak berubah, ownership file otomatis ikut. &amp;lt;code&amp;gt;usermod -d&amp;lt;/code&amp;gt; akan gagal kalau user sedang dipakai proses yang jalan, jadi stop service-nya dulu.&lt;br /&gt;
&lt;br /&gt;
Error &amp;lt;code&amp;gt;chown: invalid group: &#039;root:appuser&#039;&amp;lt;/code&amp;gt; artinya group tersebut sudah tidak ada (sudah di-rename atau dihapus). Cek dengan &amp;lt;code&amp;gt;getent group&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Tabel ownership &amp;amp; mode ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Path !! Owner:Group !! Mode !! Artinya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || root:root || &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || hanya root yang bisa membuat/mengganti symlink &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;/releases&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || user app meng-clone dan build release di sini&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || root:app || &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || app boleh masuk &amp;amp; baca, user lain tidak bisa melihat isinya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/etc/&amp;amp;lt;app&amp;amp;gt;/&amp;amp;lt;app&amp;amp;gt;.env&amp;lt;/code&amp;gt; || root:app || &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt; || root tulis, app baca, lainnya tidak bisa apa-apa&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || satu-satunya tempat app boleh menulis&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/.ssh&amp;lt;/code&amp;gt; || app:app || &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt; || deploy key; SSH menolak key yang permission-nya terlalu terbuka&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;/opt/uv/python&amp;lt;/code&amp;gt; || root:root || &amp;lt;code&amp;gt;a+rX&amp;lt;/code&amp;gt; || semua user boleh baca &amp;amp; eksekusi interpreter, tidak boleh ubah&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Membaca mode oktal ===&lt;br /&gt;
&lt;br /&gt;
Tiap digit = &#039;&#039;&#039;owner&#039;&#039;&#039;, &#039;&#039;&#039;group&#039;&#039;&#039;, &#039;&#039;&#039;others&#039;&#039;&#039;. Nilainya jumlah dari &amp;lt;code&amp;gt;r=4&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;w=2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;x=1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Owner !! Group !! Others !! Dipakai untuk&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0755&amp;lt;/code&amp;gt; || rwx || r-x || r-x || folder publik, binary&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0750&amp;lt;/code&amp;gt; || rwx || r-x || --- || folder privat yang boleh dibaca group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt; || rwx || --- || --- || folder sangat privat (&amp;lt;code&amp;gt;.ssh&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt; || rw- || r-- || --- || file secret yang dibaca group&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt; || rw- || --- || --- || private key&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Untuk &#039;&#039;&#039;folder&#039;&#039;&#039;, bit &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; artinya &amp;quot;boleh masuk (traverse)&amp;quot;, bukan &amp;quot;eksekusi&amp;quot;. Tanpa &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; di folder induk, file di dalamnya tidak bisa diakses walaupun file-nya sendiri &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;chmod -R a+rX&amp;lt;/code&amp;gt; (huruf X besar) memberi &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; hanya ke folder dan file yang sudah executable. Ini cara aman membuka akses baca satu pohon direktori tanpa membuat semua file teks jadi executable.&lt;br /&gt;
&lt;br /&gt;
=== Kenapa env file &amp;lt;code&amp;gt;root:app 0640&amp;lt;/code&amp;gt;? ===&lt;br /&gt;
&lt;br /&gt;
* App perlu &#039;&#039;&#039;membaca&#039;&#039;&#039; secret (DATABASE_URL, SECRET_KEY), tapi tidak perlu &#039;&#039;&#039;mengubahnya&#039;&#039;&#039;.&lt;br /&gt;
* Kalau app dibobol, penyerang tidak bisa mengganti config agar persisten.&lt;br /&gt;
* User lain di server tidak bisa membaca secret sama sekali.&lt;br /&gt;
* Jangan simpan secret di &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt; dalam folder kode: gampang ikut ter-commit, dan ikut terbaca siapa pun yang bisa membaca kode.&lt;br /&gt;
&lt;br /&gt;
=== Toolchain bersama &amp;amp; masalah home directory ===&lt;br /&gt;
&lt;br /&gt;
uv bisa meng-install Python sendiri. Defaultnya ke &amp;lt;code&amp;gt;~/.local/share/uv/python&amp;lt;/code&amp;gt;. Masalahnya:&lt;br /&gt;
&lt;br /&gt;
* venv &#039;&#039;&#039;hanya symlink&#039;&#039;&#039; ke interpreter. Kalau interpreter ada di home user A, user B tidak bisa memakainya.&lt;br /&gt;
* Unit systemd dengan &amp;lt;code&amp;gt;ProtectHome=true&amp;lt;/code&amp;gt; membuat &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root&amp;lt;/code&amp;gt;, dan &amp;lt;code&amp;gt;/run/user&amp;lt;/code&amp;gt; tidak terlihat. Interpreter di home = service gagal start.&lt;br /&gt;
&lt;br /&gt;
Solusinya taruh di lokasi bersama dan buka akses baca:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export UV_PYTHON_INSTALL_DIR=/opt/uv/python&lt;br /&gt;
sudo -E uv python install 3.13&lt;br /&gt;
sudo chmod -R a+rX /opt/uv/python&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pola yang sama untuk Rust: &amp;lt;code&amp;gt;RUSTUP_HOME=/opt/rust/rustup&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CARGO_HOME=/opt/rust/cargo&amp;lt;/code&amp;gt;, lalu &amp;lt;code&amp;gt;a+rX&amp;lt;/code&amp;gt;. Cache per app (registry cargo, cache uv, cache npm) ditaruh di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; yang memang writable.&lt;br /&gt;
&lt;br /&gt;
=== Akses GPU ===&lt;br /&gt;
&lt;br /&gt;
Device NVIDIA ada di &amp;lt;code&amp;gt;/dev/nvidia*&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ls -l /dev/nvidia*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Kalau mode-nya &amp;lt;code&amp;gt;crw-rw-rw-&amp;lt;/code&amp;gt;, semua user bisa memakai GPU. Kalau hanya group &amp;lt;code&amp;gt;video&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;render&amp;lt;/code&amp;gt;, tambahkan user app ke group tersebut (&amp;lt;code&amp;gt;usermod -aG video transcribe&amp;lt;/code&amp;gt;) dan tulis &amp;lt;code&amp;gt;SupplementaryGroups=video&amp;lt;/code&amp;gt; di unit. Opsi &amp;lt;code&amp;gt;-a&amp;lt;/code&amp;gt; wajib; tanpa itu, group tambahan lain akan terhapus.&lt;br /&gt;
&lt;br /&gt;
=== sudo yang sempit ===&lt;br /&gt;
&lt;br /&gt;
Kalau deploy dijalankan sebagai user app dan perlu restart service, beri izin &#039;&#039;&#039;hanya&#039;&#039;&#039; untuk perintah itu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &#039;transcribe ALL=(root) NOPASSWD: /usr/bin/systemctl restart transcribe-api, /usr/bin/systemctl restart transcribe-api-worker&#039; \&lt;br /&gt;
  | sudo tee /etc/sudoers.d/transcribe-api&lt;br /&gt;
sudo chmod 0440 /etc/sudoers.d/transcribe-api&lt;br /&gt;
sudo visudo -cf /etc/sudoers.d/transcribe-api     # validasi sintaks!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Selalu validasi dengan &amp;lt;code&amp;gt;visudo -c&amp;lt;/code&amp;gt;. File sudoers yang rusak bisa mengunci &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; untuk semua orang.&lt;br /&gt;
* Path harus absolut dan persis sama. Di Ubuntu modern &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; adalah symlink ke &amp;lt;code&amp;gt;/usr/bin&amp;lt;/code&amp;gt;, tapi sudo membandingkan string path, jadi cek dengan &amp;lt;code&amp;gt;command -v systemctl&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Jangan beri &amp;lt;code&amp;gt;NOPASSWD: ALL&amp;lt;/code&amp;gt; ke user app. Itu sama saja memberi root.&lt;br /&gt;
&lt;br /&gt;
Kalau deploy dijalankan lewat Ansible dengan user admin + &amp;lt;code&amp;gt;become&amp;lt;/code&amp;gt;, aturan sudoers untuk user app &#039;&#039;&#039;tidak diperlukan sama sekali&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Siapa yang boleh menulis kode? ===&lt;br /&gt;
&lt;br /&gt;
Di setup ini user app yang meng-clone dan build release, jadi kode bisa ditulis oleh user app. Ini sederhana tapi berarti app yang dibobol bisa mengubah kodenya sendiri. Alternatif yang lebih ketat:&lt;br /&gt;
&lt;br /&gt;
* Buat user &amp;lt;code&amp;gt;deployer&amp;lt;/code&amp;gt; terpisah yang meng-clone &amp;amp; build semua release.&lt;br /&gt;
* User app hanya punya akses baca + eksekusi ke &amp;lt;code&amp;gt;/opt/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bonus: cache uv bisa dipakai bersama antar app, sehingga hardlink menghemat disk (berguna untuk paket besar seperti torch).&lt;br /&gt;
&lt;br /&gt;
Pada level ini, &amp;lt;code&amp;gt;ProtectSystem=strict&amp;lt;/code&amp;gt; sudah menahan sebagian besar risiko: saat runtime seluruh filesystem read-only bagi proses app, kecuali &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== systemd ==&lt;br /&gt;
&lt;br /&gt;
=== Anatomi unit ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe API&lt;br /&gt;
After=network-online.target redis-server.service&lt;br /&gt;
Wants=network-online.target redis-server.service&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=simple&lt;br /&gt;
User=transcribe&lt;br /&gt;
Group=transcribe&lt;br /&gt;
SupplementaryGroups=video&lt;br /&gt;
WorkingDirectory=/opt/transcribe-api/current&lt;br /&gt;
Environment=HOME=/var/lib/transcribe-api&lt;br /&gt;
Environment=PORT=6969&lt;br /&gt;
EnvironmentFile=-/etc/transcribe-api/transcribe-api.env&lt;br /&gt;
ExecStart=/opt/transcribe-api/current/.venv/bin/python -m uvicorn main:app --host 127.0.0.1 --port 6969&lt;br /&gt;
Restart=on-failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
&lt;br /&gt;
NoNewPrivileges=true&lt;br /&gt;
ProtectSystem=strict&lt;br /&gt;
ProtectHome=true&lt;br /&gt;
PrivateTmp=true&lt;br /&gt;
ReadWritePaths=/var/lib/transcribe-api&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan per baris:&lt;br /&gt;
* &amp;lt;code&amp;gt;After=&amp;lt;/code&amp;gt; mengatur &#039;&#039;&#039;urutan&#039;&#039;&#039;, &amp;lt;code&amp;gt;Wants=&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Requires=&amp;lt;/code&amp;gt; mengatur &#039;&#039;&#039;ketergantungan&#039;&#039;&#039;. Hanya &amp;lt;code&amp;gt;After=&amp;lt;/code&amp;gt; tidak membuat Redis ikut dijalankan.&lt;br /&gt;
* &amp;lt;code&amp;gt;EnvironmentFile=-...&amp;lt;/code&amp;gt;: tanda &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt; artinya &amp;quot;jangan gagal kalau file tidak ada&amp;quot;. Variabel dari file &#039;&#039;&#039;meng-override&#039;&#039;&#039; &amp;lt;code&amp;gt;Environment=&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Format env file systemd: &amp;lt;code&amp;gt;KEY=value&amp;lt;/code&amp;gt; per baris, &#039;&#039;&#039;tanpa&#039;&#039;&#039; &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;ExecStart&amp;lt;/code&amp;gt; harus path absolut. Panggil binary venv langsung, bukan &amp;lt;code&amp;gt;uv run&amp;lt;/code&amp;gt;, karena &amp;lt;code&amp;gt;uv run&amp;lt;/code&amp;gt; bisa mencoba sync dependency saat start.&lt;br /&gt;
* Worker sebaiknya &amp;lt;code&amp;gt;Restart=always&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;TimeoutStopSec=120&amp;lt;/code&amp;gt; supaya job yang sedang jalan sempat selesai saat restart (systemd mengirim SIGTERM dulu, baru SIGKILL setelah timeout).&lt;br /&gt;
&lt;br /&gt;
=== Directive hardening ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Directive !! Efek&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NoNewPrivileges=true&amp;lt;/code&amp;gt; || proses dan turunannya tidak bisa naik hak akses (setuid, file capabilities tidak berlaku)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ProtectSystem=strict&amp;lt;/code&amp;gt; || seluruh filesystem read-only bagi service&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ReadWritePaths=&amp;lt;/code&amp;gt; || pengecualian: path yang tetap boleh ditulis&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ProtectHome=true&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/home&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/root&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/run/user&amp;lt;/code&amp;gt; tidak terlihat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PrivateTmp=true&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;/tmp&amp;lt;/code&amp;gt; privat per service, tidak berbagi dengan proses lain&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ukur tingkat keamanan unit:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemd-analyze security transcribe-api&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Output-nya memberi skor dan daftar directive lain yang bisa ditambahkan (misalnya &amp;lt;code&amp;gt;ProtectKernelTunables&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RestrictAddressFamilies&amp;lt;/code&amp;gt;). Tambahkan bertahap dan tes, karena hardening yang terlalu ketat bisa mematahkan app (misalnya akses GPU butuh device yang tidak diblokir &amp;lt;code&amp;gt;PrivateDevices&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Operasional harian ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl daemon-reload                     # wajib setelah edit file unit&lt;br /&gt;
sudo systemctl enable --now transcribe-api       # aktif saat boot + jalan sekarang&lt;br /&gt;
systemctl status transcribe-api transcribe-api-worker&lt;br /&gt;
journalctl -u transcribe-api -u transcribe-api-worker -f    # follow log&lt;br /&gt;
journalctl -u transcribe-api --since &amp;quot;1 hour ago&amp;quot; -p err    # hanya error&lt;br /&gt;
systemctl cat transcribe-api                      # lihat unit final yang dipakai&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exit code systemd yang sering muncul ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Status !! Penyebab umum&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=203/EXEC&amp;lt;/code&amp;gt; || path di &amp;lt;code&amp;gt;ExecStart&amp;lt;/code&amp;gt; salah, file tidak executable, atau venv rusak (interpreter yang di-symlink tidak bisa diakses)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=217/USER&amp;lt;/code&amp;gt; || user di &amp;lt;code&amp;gt;User=&amp;lt;/code&amp;gt; tidak ada&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=200/CHDIR&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WorkingDirectory&amp;lt;/code&amp;gt; tidak ada atau tidak bisa dimasuki user app&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;status=226/NAMESPACE&amp;lt;/code&amp;gt; || path di &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; belum dibuat&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Permission denied&amp;lt;/code&amp;gt; di log app || app menulis di luar &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; (cache model, file upload); arahkan ke &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Pola release + symlink ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/opt/transcribe-api/&lt;br /&gt;
├── releases/&lt;br /&gt;
│   ├── 3f2a9c1d7e0b/&lt;br /&gt;
│   └── 9be41c0a22f1/&lt;br /&gt;
└── current -&amp;gt; releases/3f2a9c1d7e0b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alur deploy:&lt;br /&gt;
# Clone versi baru ke &amp;lt;code&amp;gt;releases/&amp;amp;lt;sha&amp;amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Build (&amp;lt;code&amp;gt;uv sync --locked --no-dev&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cargo build --release --locked&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;npm ci &amp;amp;&amp;amp; npm run build&amp;lt;/code&amp;gt;).&lt;br /&gt;
# Jalankan migrasi database kalau ada.&lt;br /&gt;
# Arahkan &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt; ke release baru, restart service.&lt;br /&gt;
# Health check. Gagal → arahkan kembali ke release lama.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Soal atomik:&#039;&#039;&#039; &amp;lt;code&amp;gt;ln -sfn&amp;lt;/code&amp;gt; sebenarnya menghapus symlink lalu membuat ulang, sehingga ada jeda sangat singkat tanpa &amp;lt;code&amp;gt;current&amp;lt;/code&amp;gt;. Cara yang benar-benar atomik:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ln -s /opt/app/releases/NEW /opt/app/current.tmp&lt;br /&gt;
mv -T /opt/app/current.tmp /opt/app/current     # rename(2) atomik&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Venv tidak bisa dipindah.&#039;&#039;&#039; Path absolut tertanam di script dalam &amp;lt;code&amp;gt;.venv/bin&amp;lt;/code&amp;gt;, jadi selalu build venv langsung di folder release, jangan build di tempat lain lalu di-copy.&lt;br /&gt;
&lt;br /&gt;
== Python dengan uv ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;uv sync --locked&amp;lt;/code&amp;gt; gagal kalau &amp;lt;code&amp;gt;uv.lock&amp;lt;/code&amp;gt; tidak sinkron dengan &amp;lt;code&amp;gt;pyproject.toml&amp;lt;/code&amp;gt;. Ini yang diinginkan di produksi: server tidak pernah mengubah lock file.&lt;br /&gt;
* &amp;lt;code&amp;gt;--no-dev&amp;lt;/code&amp;gt; melewati dependency development/test.&lt;br /&gt;
* &amp;lt;code&amp;gt;UV_PYTHON_DOWNLOADS=never&amp;lt;/code&amp;gt; mencegah uv diam-diam mengunduh Python saat build.&lt;br /&gt;
* Update dependency dilakukan di laptop: &amp;lt;code&amp;gt;uv lock --upgrade&amp;lt;/code&amp;gt;, commit, lalu deploy.&lt;br /&gt;
* Cache uv memakai hardlink ke venv selama berada di filesystem yang sama, sehingga deploy berikutnya cepat dan hemat disk.&lt;br /&gt;
&lt;br /&gt;
== Redis lokal ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install -y redis-server&lt;br /&gt;
sudo sed -i &#039;s/^appendonly no/appendonly yes/&#039; /etc/redis/redis.conf   # persistence&lt;br /&gt;
grep -E &#039;^(bind|appendonly)&#039; /etc/redis/redis.conf                     # bind 127.0.0.1 -::1&lt;br /&gt;
sudo systemctl enable --now redis-server&lt;br /&gt;
redis-cli ping&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Redis tanpa password &#039;&#039;&#039;wajib&#039;&#039;&#039; hanya listen di localhost. Di Docker, hostname-nya &amp;lt;code&amp;gt;redis&amp;lt;/code&amp;gt;; di bare metal jadi &amp;lt;code&amp;gt;redis://127.0.0.1:6379/0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Jaringan ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;--host 127.0.0.1&amp;lt;/code&amp;gt;: app hanya bisa diakses dari server itu sendiri (cocok kalau nginx ada di server yang sama).&lt;br /&gt;
* &amp;lt;code&amp;gt;--host 0.0.0.0&amp;lt;/code&amp;gt;: app bisa diakses dari luar. Wajib dibarengi firewall.&lt;br /&gt;
* Kalau nginx publik ada di VM proxy terpisah, buka port app &#039;&#039;&#039;hanya untuk IP VM proxy&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo ufw allow OpenSSH&lt;br /&gt;
sudo ufw allow from 192.168.88.10 to any port 6969 proto tcp comment &#039;transcribe-api&#039;&lt;br /&gt;
sudo ufw enable&lt;br /&gt;
sudo ufw status numbered&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu memakai &#039;&#039;&#039;AppArmor&#039;&#039;&#039;, bukan SELinux seperti AlmaLinux/RHEL. Untuk app di &amp;lt;code&amp;gt;/opt&amp;lt;/code&amp;gt; biasanya tidak perlu konfigurasi tambahan.&lt;br /&gt;
&lt;br /&gt;
== Otomasi dengan Ansible ==&lt;br /&gt;
&lt;br /&gt;
=== Kenapa Ansible ===&lt;br /&gt;
* &#039;&#039;&#039;Agentless&#039;&#039;&#039;: cukup SSH + Python di server.&lt;br /&gt;
* &#039;&#039;&#039;Idempotent&#039;&#039;&#039;: dijalankan berkali-kali hasilnya sama; hanya yang berubah yang diubah.&lt;br /&gt;
* Semua langkah manual di atas terdokumentasi sebagai kode, sehingga server bisa dibangun ulang kapan saja.&lt;br /&gt;
&lt;br /&gt;
=== Struktur project ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ansible-apps/&lt;br /&gt;
├── inventory.ini            daftar server&lt;br /&gt;
├── apps.yml                 daftar app (repo, port, worker)&lt;br /&gt;
├── deploy.yml               playbook utama&lt;br /&gt;
├── group_vars/all/main.yml  setting global&lt;br /&gt;
├── group_vars/all/vault.yml secret terenkripsi&lt;br /&gt;
├── scripts/new-app.sh       tambah app interaktif&lt;br /&gt;
└── roles/&lt;br /&gt;
    ├── base/                paket dasar&lt;br /&gt;
    ├── redis/&lt;br /&gt;
    ├── python_toolchain/    uv + Python di /opt/uv/python&lt;br /&gt;
    ├── rust_toolchain/      rustup di /opt/rust&lt;br /&gt;
    ├── node_toolchain/      NodeSource&lt;br /&gt;
    └── app/                 clone, deteksi tipe, build, systemd/nginx, health check, rollback&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Entry app ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
apps:&lt;br /&gt;
  - name: transcribe-api&lt;br /&gt;
    repo: git@github.com:org/transcribe-api.git&lt;br /&gt;
    version: main&lt;br /&gt;
    port: 6969&lt;br /&gt;
    user: transcribe&lt;br /&gt;
    worker: true          # bikin service transcribe-api-worker&lt;br /&gt;
    redis: true&lt;br /&gt;
    apt_packages: [ffmpeg]&lt;br /&gt;
    extra_groups: [video]&lt;br /&gt;
    health_path: /health&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tipe app dideteksi dari isi repo: &amp;lt;code&amp;gt;pyproject.toml&amp;lt;/code&amp;gt; → Python, &amp;lt;code&amp;gt;Cargo.toml&amp;lt;/code&amp;gt; → Rust, &amp;lt;code&amp;gt;package.json&amp;lt;/code&amp;gt; → Node (Vite/React jadi static di-serve nginx, Next/Nuxt jadi service).&lt;br /&gt;
&lt;br /&gt;
=== Perintah ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ansible-playbook deploy.yml                                   # semua app&lt;br /&gt;
ansible-playbook deploy.yml -e only=transcribe-api            # satu app&lt;br /&gt;
ansible-playbook deploy.yml -e only=core-api -e rev=v1.2.0    # versi tertentu / rollback&lt;br /&gt;
ansible-playbook deploy.yml --syntax-check&lt;br /&gt;
ansible-vault encrypt group_vars/all/vault.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Konsep Ansible yang terkait permission ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;become: true&amp;lt;/code&amp;gt;: task dijalankan sebagai root lewat sudo.&lt;br /&gt;
* &amp;lt;code&amp;gt;become_user: transcribe&amp;lt;/code&amp;gt;: task dijalankan sebagai user app (clone, build), sehingga file yang dihasilkan langsung dimiliki user yang benar tanpa &amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt; belakangan.&lt;br /&gt;
* Paket &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; wajib terpasang. Saat &amp;lt;code&amp;gt;become_user&amp;lt;/code&amp;gt; ke user non-root, Ansible menulis file modul sementara lalu memakai ACL (&amp;lt;code&amp;gt;setfacl&amp;lt;/code&amp;gt;) agar user tujuan bisa membacanya.&lt;br /&gt;
* Modul &amp;lt;code&amp;gt;file&amp;lt;/code&amp;gt; dengan &amp;lt;code&amp;gt;owner&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;group&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mode&amp;lt;/code&amp;gt; menggantikan rangkaian &amp;lt;code&amp;gt;mkdir&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;chown&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;chmod&amp;lt;/code&amp;gt; dan idempotent.&lt;br /&gt;
* Secret di &#039;&#039;&#039;ansible-vault&#039;&#039;&#039;, dirender ke env file lewat modul &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; dengan mode &amp;lt;code&amp;gt;0640&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Deploy key untuk repo private ===&lt;br /&gt;
&lt;br /&gt;
* Satu key per app, disimpan di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;/.ssh/id_ed25519&amp;lt;/code&amp;gt; (mode &amp;lt;code&amp;gt;0600&amp;lt;/code&amp;gt;, folder &amp;lt;code&amp;gt;0700&amp;lt;/code&amp;gt;).&lt;br /&gt;
* Didaftarkan sebagai &#039;&#039;&#039;Deploy Key read-only&#039;&#039;&#039; di repo. Kalau server bocor, yang terekspos hanya akses baca ke satu repo, bukan akun GitHub pribadi.&lt;br /&gt;
* &amp;lt;code&amp;gt;StrictHostKeyChecking=accept-new&amp;lt;/code&amp;gt;: host key disimpan saat pertama kali, dan koneksi ditolak kalau host key berubah (proteksi MITM).&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Gejala !! Penyebab !! Solusi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;chown: invalid group&amp;lt;/code&amp;gt; || group sudah di-rename/dihapus || &amp;lt;code&amp;gt;getent group&amp;lt;/code&amp;gt;, pakai nama baru&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;useradd&amp;lt;/code&amp;gt; menghasilkan shell aneh || sisa &amp;lt;code&amp;gt;\&amp;lt;/code&amp;gt; line-continuation ikut diketik dalam satu baris || cek &amp;lt;code&amp;gt;getent passwd&amp;lt;/code&amp;gt;, bikin ulang user&lt;br /&gt;
|-&lt;br /&gt;
| Service &amp;lt;code&amp;gt;203/EXEC&amp;lt;/code&amp;gt; padahal file ada || venv menunjuk ke Python di home user lain || install Python di &amp;lt;code&amp;gt;/opt/uv/python&amp;lt;/code&amp;gt;, buat ulang venv&lt;br /&gt;
|-&lt;br /&gt;
| Model Whisper gagal diunduh || cache di luar &amp;lt;code&amp;gt;ReadWritePaths&amp;lt;/code&amp;gt; || set &amp;lt;code&amp;gt;WHISPER_CACHE_DIR&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;HF_HOME&amp;lt;/code&amp;gt; ke &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;libcudnn&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;libcublas&amp;lt;/code&amp;gt; not found || di Docker library datang dari image || install paket pip &amp;lt;code&amp;gt;nvidia-cudnn-cu12&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;nvidia-cublas-cu12&amp;lt;/code&amp;gt; atau CUDA toolkit di host&lt;br /&gt;
|-&lt;br /&gt;
| Worker restart terus || error di job pertama atau Redis belum jalan || &amp;lt;code&amp;gt;journalctl -u app-worker -n 100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;redis-cli ping&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Ansible gagal &amp;lt;code&amp;gt;become_user&amp;lt;/code&amp;gt; || paket &amp;lt;code&amp;gt;acl&amp;lt;/code&amp;gt; belum terpasang || &amp;lt;code&amp;gt;apt install acl&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Checklist server baru ==&lt;br /&gt;
&lt;br /&gt;
* [ ] User admin pakai SSH key, login password dimatikan&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;ufw&amp;lt;/code&amp;gt; aktif, hanya SSH + port yang perlu&lt;br /&gt;
* [ ] Driver NVIDIA terpasang, &amp;lt;code&amp;gt;nvidia-smi&amp;lt;/code&amp;gt; jalan (kalau ada GPU)&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;unattended-upgrades&amp;lt;/code&amp;gt; aktif untuk patch keamanan&lt;br /&gt;
* [ ] Jalankan &amp;lt;code&amp;gt;ansible-playbook deploy.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
* [ ] &amp;lt;code&amp;gt;systemd-analyze security &amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; untuk tiap service&lt;br /&gt;
* [ ] Backup data di &amp;lt;code&amp;gt;/var/lib/&amp;amp;lt;app&amp;amp;gt;&amp;lt;/code&amp;gt; dan database, &#039;&#039;&#039;tes restore&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
* [https://docs.astral.sh/uv/ Dokumentasi uv]&lt;br /&gt;
* [https://www.freedesktop.org/software/systemd/man/latest/systemd.exec.html systemd.exec (directive hardening)]&lt;br /&gt;
* [https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html Filesystem Hierarchy Standard 3.0]&lt;br /&gt;
* [https://docs.ansible.com/ Dokumentasi Ansible]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=872</id>
		<title>DevOps</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=DevOps&amp;diff=872"/>
		<updated>2026-10-20T06:41:50Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[Setup Jenkins]]&lt;br /&gt;
* [[Docker Registry &amp;amp; Rootless Docker]]&lt;br /&gt;
* [[Elasticsearch]]&lt;br /&gt;
* [[Postgres master &amp;amp; slave]]&lt;br /&gt;
* [[Cara buat monitoring server pake Grafana &amp;amp; Prometheus]]&lt;br /&gt;
* [[Deploy app bare-metal]]&lt;br /&gt;
&lt;br /&gt;
== Microk8s == &lt;br /&gt;
* [[Microk8s: setup awal]] &lt;br /&gt;
* [[Microk8s: setup registry]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=871</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=871"/>
		<updated>2026-10-19T01:47:44Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Riyadhussholihiin Islamic Boarding School ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin (OSRIY) &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=SRAM_%26_DRAM&amp;diff=870</id>
		<title>SRAM &amp; DRAM</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=SRAM_%26_DRAM&amp;diff=870"/>
		<updated>2026-10-12T04:01:04Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Pendahuluan ==  Pada model sederhana, sistem komputer terdiri dari &amp;#039;&amp;#039;&amp;#039;CPU&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;memory system&amp;#039;&amp;#039;&amp;#039; yang berupa array linear byte, dengan waktu akses konstan untuk setiap lokasi. Model ini efektif sampai batas tertentu, tetapi &amp;#039;&amp;#039;&amp;#039;tidak mencerminkan cara kerja sistem modern&amp;#039;&amp;#039;&amp;#039;.  Dalam praktiknya, memory system adalah &amp;#039;&amp;#039;&amp;#039;hierarki perangkat penyimpanan&amp;#039;&amp;#039;&amp;#039; dengan kapasitas, biaya, dan waktu akses yang berbeda-beda.  === Level hierarki (atas ke bawah) ===  # &amp;#039;&amp;#039;&amp;#039;Register C...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pendahuluan ==&lt;br /&gt;
&lt;br /&gt;
Pada model sederhana, sistem komputer terdiri dari &#039;&#039;&#039;CPU&#039;&#039;&#039; dan &#039;&#039;&#039;memory system&#039;&#039;&#039; yang berupa array linear byte, dengan waktu akses konstan untuk setiap lokasi. Model ini efektif sampai batas tertentu, tetapi &#039;&#039;&#039;tidak mencerminkan cara kerja sistem modern&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dalam praktiknya, memory system adalah &#039;&#039;&#039;hierarki perangkat penyimpanan&#039;&#039;&#039; dengan kapasitas, biaya, dan waktu akses yang berbeda-beda.&lt;br /&gt;
&lt;br /&gt;
=== Level hierarki (atas ke bawah) ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Register CPU&#039;&#039;&#039;: menyimpan data yang paling sering dipakai&lt;br /&gt;
# &#039;&#039;&#039;Cache memory (SRAM)&#039;&#039;&#039;: kecil dan cepat, menjadi &#039;&#039;staging area&#039;&#039; untuk subset data/instruksi di main memory&lt;br /&gt;
# &#039;&#039;&#039;Main memory (DRAM)&#039;&#039;&#039;: lebih besar tetapi lambat, menjadi staging area untuk data di disk&lt;br /&gt;
# &#039;&#039;&#039;Disk&#039;&#039;&#039;: sangat besar dan sangat lambat, bisa menjadi staging area untuk data di disk/tape mesin lain lewat jaringan&lt;br /&gt;
&lt;br /&gt;
Semakin ke bawah: &#039;&#039;&#039;makin besar, makin murah per bit, makin lambat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kenapa hierarki ini bekerja? ===&lt;br /&gt;
&lt;br /&gt;
Program yang ditulis dengan baik cenderung mengakses level atas lebih sering daripada level di bawahnya. Akibatnya level bawah boleh lambat (sehingga besar dan murah). Efek akhirnya: &#039;&#039;&#039;kapasitas dan biaya seperti storage paling bawah, tetapi kecepatan seperti storage paling atas&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Waktu akses ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Lokasi data !! Waktu akses&lt;br /&gt;
|-&lt;br /&gt;
| Register || 0 cycle&lt;br /&gt;
|-&lt;br /&gt;
| Cache || 4 sampai 75 cycle&lt;br /&gt;
|-&lt;br /&gt;
| Main memory || ratusan cycle&lt;br /&gt;
|-&lt;br /&gt;
| Disk || puluhan juta cycle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Locality ===&lt;br /&gt;
&lt;br /&gt;
Ide sentral bab ini. Program dengan &#039;&#039;&#039;good locality&#039;&#039;&#039;:&lt;br /&gt;
* mengakses data yang &#039;&#039;&#039;sama&#039;&#039;&#039; berulang-ulang (&#039;&#039;&#039;temporal locality&#039;&#039;&#039;), atau&lt;br /&gt;
* mengakses data yang &#039;&#039;&#039;berdekatan&#039;&#039;&#039; (&#039;&#039;&#039;spatial locality&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Program dengan locality bagus lebih banyak dilayani level atas, sehingga lebih cepat. Contoh: pada sistem Core i7, beberapa kernel perkalian matriks dengan jumlah operasi aritmetika yang sama bisa berbeda kecepatan hampir &#039;&#039;&#039;40x&#039;&#039;&#039; hanya karena locality-nya.&lt;br /&gt;
&lt;br /&gt;
=== Roadmap bab ===&lt;br /&gt;
&lt;br /&gt;
* Teknologi penyimpanan dasar: SRAM, DRAM, ROM, rotating disk, SSD&lt;br /&gt;
* Organisasi menjadi hierarki, dengan fokus pada &#039;&#039;&#039;cache&#039;&#039;&#039; (paling berdampak ke performa aplikasi)&lt;br /&gt;
* Menganalisis dan memperbaiki locality program C&lt;br /&gt;
* &#039;&#039;&#039;Memory mountain&#039;&#039;&#039;: karakterisasi performa hierarki memori sebagai fungsi dari locality&lt;br /&gt;
&lt;br /&gt;
== 6.1 Storage Technologies ==&lt;br /&gt;
&lt;br /&gt;
Kemajuan teknologi komputer sangat dipengaruhi kemajuan teknologi storage. IBM PC-XT (1982) memiliki disk 10 MB. Pada 2015, mesin tipikal punya kapasitas disk sekitar 300.000x lebih besar, dan kapasitas naik 2x tiap dua tahun.&lt;br /&gt;
&lt;br /&gt;
=== 6.1.1 Random Access Memory (RAM) ===&lt;br /&gt;
&lt;br /&gt;
RAM terdiri dari dua varian:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;SRAM&#039;&#039;&#039; (Static RAM): lebih cepat dan jauh lebih mahal. Dipakai untuk &#039;&#039;&#039;cache memory&#039;&#039;&#039; (di dalam maupun di luar chip CPU).&lt;br /&gt;
* &#039;&#039;&#039;DRAM&#039;&#039;&#039; (Dynamic RAM): lebih lambat dan murah. Dipakai untuk &#039;&#039;&#039;main memory&#039;&#039;&#039; dan &#039;&#039;&#039;frame buffer&#039;&#039;&#039; sistem grafis.&lt;br /&gt;
&lt;br /&gt;
==== Static RAM (SRAM) ====&lt;br /&gt;
&lt;br /&gt;
* Menyimpan tiap bit dalam sel &#039;&#039;&#039;bistable&#039;&#039;&#039; yang terdiri dari &#039;&#039;&#039;6 transistor&#039;&#039;&#039;.&lt;br /&gt;
* Sirkuit punya dua konfigurasi tegangan stabil (dua &#039;&#039;state&#039;&#039;). State lain bersifat tidak stabil dan akan bergerak cepat ke salah satu state stabil.&lt;br /&gt;
* Analogi: &#039;&#039;&#039;inverted pendulum&#039;&#039;&#039; (pendulum terbalik)&lt;br /&gt;
** Miring penuh ke kiri: stabil&lt;br /&gt;
** Miring penuh ke kanan: stabil&lt;br /&gt;
** Tegak lurus: &#039;&#039;&#039;metastable&#039;&#039;&#039;. Secara teori bisa bertahan, tetapi gangguan sekecil apa pun membuatnya jatuh dan tidak kembali ke posisi tegak.&lt;br /&gt;
* Selama ada daya (power), nilai SRAM bertahan tanpa batas. Gangguan seperti noise listrik akan hilang dengan sendirinya: sirkuit kembali ke nilai stabil.&lt;br /&gt;
&lt;br /&gt;
==== Perbandingan SRAM vs DRAM (Figure 6.2) ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Transistor per bit !! Waktu akses relatif !! Persistent? !! Sensitive? !! Biaya relatif !! Pemakaian&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SRAM&#039;&#039;&#039; || 6 || 1x || Ya || Tidak || 1.000x || Cache memory&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;DRAM&#039;&#039;&#039; || 1 || 10x || Tidak || Ya || 1x || Main memory, frame buffer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Catatan istilah:&lt;br /&gt;
* &#039;&#039;&#039;Biaya&#039;&#039;&#039; = biaya per bit penyimpanan. Sebagian besar ditentukan oleh luas area silikon, sehingga SRAM (6 transistor/bit) jauh lebih mahal daripada DRAM (1 transistor/bit).&lt;br /&gt;
* &#039;&#039;&#039;Persistent&#039;&#039;&#039; = nilai bertahan selama chip dialiri daya, tanpa perlu di-refresh. Bukan berarti data bertahan saat listrik mati (SRAM dan DRAM keduanya &#039;&#039;volatile&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Sensitive&#039;&#039;&#039; = rentan terhadap gangguan (noise). DRAM menyimpan bit sebagai muatan di kapasitor yang bocor pelan-pelan, sehingga perlu di-refresh berkala.&lt;br /&gt;
&lt;br /&gt;
==== Conventional DRAMs ====&lt;br /&gt;
&lt;br /&gt;
Sel (bit) dalam chip DRAM dibagi menjadi &#039;&#039;&#039;d supercell&#039;&#039;&#039;, masing-masing terdiri dari &#039;&#039;&#039;w sel DRAM&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Chip &#039;&#039;&#039;d × w&#039;&#039;&#039; menyimpan total &#039;&#039;&#039;d·w bit&#039;&#039;&#039;.&lt;br /&gt;
* Supercell disusun sebagai array persegi panjang dengan &#039;&#039;&#039;r baris&#039;&#039;&#039; dan &#039;&#039;&#039;c kolom&#039;&#039;&#039;, dengan &#039;&#039;&#039;r·c = d&#039;&#039;&#039;.&lt;br /&gt;
* Alamat supercell berbentuk &#039;&#039;&#039;(i, j)&#039;&#039;&#039;: i = baris, j = kolom.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Catatan terminologi&#039;&#039;: komunitas storage tidak punya nama baku untuk elemen array DRAM. Arsitek komputer menyebutnya &amp;quot;cell&amp;quot;, perancang sirkuit menyebutnya &amp;quot;word&amp;quot;. Buku ini memakai istilah netral &#039;&#039;&#039;supercell&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===== Contoh: DRAM 16 × 8 (Figure 6.3) =====&lt;br /&gt;
&lt;br /&gt;
* d = 16 supercell, w = 8 bit per supercell, total &#039;&#039;&#039;128 bit&#039;&#039;&#039;&lt;br /&gt;
* r = 4 baris, c = 4 kolom&lt;br /&gt;
* Supercell berwarna pada alamat &#039;&#039;&#039;(2, 1)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Informasi keluar-masuk chip lewat &#039;&#039;&#039;pin&#039;&#039;&#039; (konektor eksternal), dan tiap pin membawa sinyal 1 bit:&lt;br /&gt;
* &#039;&#039;&#039;Pin data&#039;&#039;&#039;: 8 pin, mentransfer 1 byte sekaligus&lt;br /&gt;
* &#039;&#039;&#039;Pin addr&#039;&#039;&#039;: 2 pin, membawa alamat baris atau kolom (2 bit)&lt;br /&gt;
* (Pin kontrol tidak ditampilkan)&lt;br /&gt;
&lt;br /&gt;
Chip DRAM dihubungkan ke &#039;&#039;&#039;memory controller&#039;&#039;&#039;, yaitu sirkuit yang dapat mentransfer w bit sekaligus ke/dari chip, lalu terhubung ke CPU.&lt;br /&gt;
&lt;br /&gt;
===== Membaca supercell (i, j) =====&lt;br /&gt;
&lt;br /&gt;
Dilakukan dalam dua langkah (Figure 6.4):&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;RAS (Row Access Strobe)&#039;&#039;&#039;: controller mengirim alamat baris &#039;&#039;&#039;i&#039;&#039;&#039;. DRAM menyalin &#039;&#039;&#039;seluruh isi baris i&#039;&#039;&#039; ke &#039;&#039;&#039;internal row buffer&#039;&#039;&#039;.&lt;br /&gt;
# &#039;&#039;&#039;CAS (Column Access Strobe)&#039;&#039;&#039;: controller mengirim alamat kolom &#039;&#039;&#039;j&#039;&#039;&#039;. DRAM mengambil supercell (i, j) dari row buffer, lalu mengirim w bit-nya ke controller.&lt;br /&gt;
&lt;br /&gt;
RAS dan CAS &#039;&#039;&#039;berbagi pin addr yang sama&#039;&#039;&#039;, sehingga alamat harus dikirim berurutan.&lt;br /&gt;
&lt;br /&gt;
Contoh membaca supercell (2, 1) pada chip 16 × 8:&lt;br /&gt;
# Controller kirim &#039;&#039;&#039;RAS = 2&#039;&#039;&#039;, maka seluruh baris 2 disalin ke row buffer&lt;br /&gt;
# Controller kirim &#039;&#039;&#039;CAS = 1&#039;&#039;&#039;, maka 8 bit di supercell (2, 1) dikirim ke controller&lt;br /&gt;
&lt;br /&gt;
===== Internal row buffer =====&lt;br /&gt;
&lt;br /&gt;
Penyimpanan kecil di dalam chip DRAM yang muat &#039;&#039;&#039;satu baris penuh&#039;&#039;&#039; supercell. Fungsinya sebagai tempat penampung baris yang sedang diakses. Supercell yang diminta dipilih dari row buffer, bukan langsung dari array utama.&lt;br /&gt;
&lt;br /&gt;
===== Kenapa array 2D, bukan linear? =====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Keuntungan&#039;&#039;&#039;: jumlah pin addr berkurang. Contoh: 16 supercell linear (alamat 0 sampai 15) butuh 4 pin addr, sedangkan susunan 4 × 4 cukup 2 pin.&lt;br /&gt;
* &#039;&#039;&#039;Kerugian&#039;&#039;&#039;: alamat dikirim dalam dua tahap (RAS lalu CAS), sehingga &#039;&#039;&#039;waktu akses bertambah&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Rumus Ringkas ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Yang ditanya !! Rumus&lt;br /&gt;
|-&lt;br /&gt;
| Total bit || d × w&lt;br /&gt;
|-&lt;br /&gt;
| Jumlah pin data || w&lt;br /&gt;
|-&lt;br /&gt;
| Jumlah pin addr || log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;(max(r, c))&lt;br /&gt;
|-&lt;br /&gt;
| Supercell disalin saat RAS || c (satu baris penuh)&lt;br /&gt;
|-&lt;br /&gt;
| Ukuran row buffer || c × w bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Contoh Soal ==&lt;br /&gt;
&lt;br /&gt;
=== Contoh 1: DRAM 64 × 4 (8 baris × 8 kolom) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = 64 × 4 = &#039;&#039;&#039;256 bit&#039;&#039;&#039;&lt;br /&gt;
* Pin data = &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
* Pin addr: 8 baris butuh 3 bit, maka &#039;&#039;&#039;3 pin&#039;&#039;&#039;&lt;br /&gt;
* Baca (5, 3): RAS = 5 (baris 5 ke row buffer), lalu CAS = 3 (kirim 4 bit)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 2: DRAM 256 × 8 (16 × 16) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = 256 × 8 = &#039;&#039;&#039;2048 bit&#039;&#039;&#039;&lt;br /&gt;
* Pin data = &#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
* Pin addr = log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;16 = &#039;&#039;&#039;4 pin&#039;&#039;&#039; (jika linear: log&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;256 = 8 pin)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 3: DRAM 64 × 16 (8 × 8) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = &#039;&#039;&#039;1024 bit&#039;&#039;&#039;&lt;br /&gt;
* Pin data = &#039;&#039;&#039;16&#039;&#039;&#039; (ditentukan oleh w, bukan selalu 8)&lt;br /&gt;
* Pin addr = &#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
* Baca (6, 2): RAS = 6 (8 supercell masuk row buffer), lalu CAS = 2 (kirim 16 bit)&lt;br /&gt;
&lt;br /&gt;
=== Contoh 4: DRAM 128 × 4 (16 baris × 8 kolom) ===&lt;br /&gt;
&lt;br /&gt;
* Total bit = &#039;&#039;&#039;512 bit&#039;&#039;&#039;&lt;br /&gt;
* Pin data = &#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
* Pin addr = &#039;&#039;&#039;4&#039;&#039;&#039; (baris butuh 4 bit, kolom butuh 3 bit, ambil yang terbesar karena pin dibagi)&lt;br /&gt;
* Supercell disalin saat RAS = &#039;&#039;&#039;8&#039;&#039;&#039; (row buffer = 8 × 4 = 32 bit)&lt;br /&gt;
&lt;br /&gt;
== Poin Penting ==&lt;br /&gt;
&lt;br /&gt;
* Hierarki memori bekerja karena &#039;&#039;&#039;locality&#039;&#039;&#039;.&lt;br /&gt;
* SRAM: cepat, stabil, mahal, untuk cache. DRAM: lambat, sensitif, murah, untuk main memory.&lt;br /&gt;
* Pin data ditentukan oleh &#039;&#039;&#039;w&#039;&#039;&#039;, pin addr ditentukan oleh &#039;&#039;&#039;dimensi terbesar&#039;&#039;&#039; array.&lt;br /&gt;
* Pembacaan DRAM: &#039;&#039;&#039;RAS (baris ke row buffer) lalu CAS (kolom dari row buffer)&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=869</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=869"/>
		<updated>2026-10-12T04:00:49Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
* [[Unsigned Encodings]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
* [[Accessing Information]]&lt;br /&gt;
&lt;br /&gt;
=== temp ===&lt;br /&gt;
* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;br /&gt;
* [[SRAM &amp;amp; DRAM]]&lt;br /&gt;
&lt;br /&gt;
== gem5 ==&lt;br /&gt;
* [[gem5: hello world]]&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Gem5:_hello_world&amp;diff=868</id>
		<title>Gem5: hello world</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Gem5:_hello_world&amp;diff=868"/>
		<updated>2026-10-11T08:43:05Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;gem5&amp;#039;&amp;#039;&amp;#039; adalah simulator arsitektur komputer open-source yang dipakai untuk riset dan pembelajaran. Dengan gem5, sebuah komputer virtual (CPU, cache, bus, memori) dirakit lewat script Python, lalu sebuah program dijalankan di atasnya dan gem5 melaporkan statistik detail seperti jumlah cycle, jumlah instruksi, dan cache miss.  Catatan ini mencakup pemasangan gem5 sampai menjalankan program &amp;quot;Hello World&amp;quot; pertama.  == Persiapan ==  Catatan ini memakai Linux (Ubuntu/Debia...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;gem5&#039;&#039;&#039; adalah simulator arsitektur komputer open-source yang dipakai untuk riset dan pembelajaran. Dengan gem5, sebuah komputer virtual (CPU, cache, bus, memori) dirakit lewat script Python, lalu sebuah program dijalankan di atasnya dan gem5 melaporkan statistik detail seperti jumlah cycle, jumlah instruksi, dan cache miss.&lt;br /&gt;
&lt;br /&gt;
Catatan ini mencakup pemasangan gem5 sampai menjalankan program &amp;quot;Hello World&amp;quot; pertama.&lt;br /&gt;
&lt;br /&gt;
== Persiapan ==&lt;br /&gt;
&lt;br /&gt;
Catatan ini memakai Linux (Ubuntu/Debian). Paket yang dibutuhkan (mengikuti dokumentasi gem5; cek [https://www.gem5.org/documentation/general_docs/building dokumentasi resmi] kalau versinya berbeda):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install build-essential scons python3-dev git pre-commit \&lt;br /&gt;
    zlib1g zlib1g-dev libprotobuf-dev protobuf-compiler libprotoc-dev \&lt;br /&gt;
    libgoogle-perftools-dev libboost-all-dev libhdf5-serial-dev \&lt;br /&gt;
    python3-pydot python3-venv python3-tk mypy m4 libcapstone-dev \&lt;br /&gt;
    libpng-dev libelf-dev pkg-config wget cmake doxygen&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Clone dan build ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/gem5/gem5&lt;br /&gt;
cd gem5&lt;br /&gt;
scons build/ALL/gem5.opt -j &amp;lt;JUMLAH CPU&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keterangan:&lt;br /&gt;
* &amp;lt;code&amp;gt;build/ALL&amp;lt;/code&amp;gt; artinya build mencakup semua ISA (x86, ARM, RISC-V, dan lainnya). Alternatifnya &amp;lt;code&amp;gt;build/X86/gem5.opt&amp;lt;/code&amp;gt; kalau hanya butuh x86, build-nya lebih ringan.&lt;br /&gt;
* &amp;lt;code&amp;gt;gem5.opt&amp;lt;/code&amp;gt; adalah varian dengan optimasi dan debug info secukupnya. Untuk debugging dengan gdb, pakai &amp;lt;code&amp;gt;gem5.debug&amp;lt;/code&amp;gt; (lebih lambat, build lebih lama).&lt;br /&gt;
* &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt; menentukan jumlah proses paralel. Isi dengan hasil &amp;lt;code&amp;gt;nproc&amp;lt;/code&amp;gt;. Build pertama memakan waktu lama dan banyak RAM; kalau RAM kurang, kecilkan nilai &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Hello World pertama ==&lt;br /&gt;
&lt;br /&gt;
gem5 menyertakan script contoh untuk menjalankan program sederhana:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
build/ALL/gem5.opt configs/learning_gem5/part1/simple.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Script ini merakit satu CPU sederhana dengan memori, lalu menjalankan program &amp;quot;Hello World&amp;quot; di dalamnya (mode &#039;&#039;Syscall Emulation&#039;&#039;). Kalau berhasil, di terminal muncul tulisan &amp;lt;code&amp;gt;Hello world!&amp;lt;/code&amp;gt; dan baris penutup yang menyebut tick terakhir simulasi. Angka tick bisa berbeda antarversi gem5.&lt;br /&gt;
&lt;br /&gt;
=== Isi folder &amp;lt;code&amp;gt;m5out/&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Setiap simulasi menghasilkan folder &amp;lt;code&amp;gt;m5out/&amp;lt;/code&amp;gt; di direktori tempat gem5 dijalankan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! File !! Isi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;stats.txt&amp;lt;/code&amp;gt; || Semua statistik simulasi (cycle, instruksi, cache miss, dan lainnya)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;config.ini&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;config.json&amp;lt;/code&amp;gt; || Konfigurasi sistem yang disimulasikan, lengkap dengan semua parameter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;config.dot.svg&amp;lt;/code&amp;gt; || Diagram blok sistem&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nilai yang pertama kali layak dilihat di &amp;lt;code&amp;gt;stats.txt&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;simSeconds&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;simInsts&amp;lt;/code&amp;gt;, dan &amp;lt;code&amp;gt;system.cpu.numCycles&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Merakit sistem sendiri ==&lt;br /&gt;
&lt;br /&gt;
Script berikut melakukan hal yang sama dengan &amp;lt;code&amp;gt;simple.py&amp;lt;/code&amp;gt;, tetapi ditulis manual agar terlihat tiap komponennya.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import m5&lt;br /&gt;
from m5.objects import *&lt;br /&gt;
from gem5.resources.resource import obtain_resource&lt;br /&gt;
&lt;br /&gt;
system = System()&lt;br /&gt;
system.clk_domain = SrcClockDomain()&lt;br /&gt;
system.clk_domain.clock = &amp;quot;1GHz&amp;quot;&lt;br /&gt;
system.clk_domain.voltage_domain = VoltageDomain()&lt;br /&gt;
&lt;br /&gt;
system.mem_mode = &amp;quot;timing&amp;quot;&lt;br /&gt;
system.mem_ranges = [AddrRange(&amp;quot;512MB&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
system.cpu = X86TimingSimpleCPU()&lt;br /&gt;
&lt;br /&gt;
system.membus = SystemXBar()&lt;br /&gt;
&lt;br /&gt;
# Tanpa cache: CPU langsung ke membus&lt;br /&gt;
system.cpu.icache_port = system.membus.cpu_side_ports&lt;br /&gt;
system.cpu.dcache_port = system.membus.cpu_side_ports&lt;br /&gt;
&lt;br /&gt;
# Khusus x86: interrupt controller disambung manual&lt;br /&gt;
system.cpu.createInterruptController()&lt;br /&gt;
system.cpu.interrupts[0].pio = system.membus.mem_side_ports&lt;br /&gt;
system.cpu.interrupts[0].int_requestor = system.membus.cpu_side_ports&lt;br /&gt;
system.cpu.interrupts[0].int_responder = system.membus.mem_side_ports&lt;br /&gt;
&lt;br /&gt;
system.system_port = system.membus.cpu_side_ports&lt;br /&gt;
&lt;br /&gt;
system.mem_ctrl = MemCtrl()&lt;br /&gt;
system.mem_ctrl.dram = DDR3_1600_8x8()&lt;br /&gt;
system.mem_ctrl.dram.range = system.mem_ranges[0]&lt;br /&gt;
system.mem_ctrl.port = system.membus.mem_side_ports&lt;br /&gt;
&lt;br /&gt;
# Workload: program Hello World (SE mode)&lt;br /&gt;
binary = obtain_resource(&amp;quot;x86-hello64-static&amp;quot;).get_local_path()&lt;br /&gt;
system.workload = SEWorkload.init_compatible(binary)&lt;br /&gt;
&lt;br /&gt;
process = Process()&lt;br /&gt;
process.cmd = [binary]&lt;br /&gt;
system.cpu.workload = process&lt;br /&gt;
system.cpu.createThreads()&lt;br /&gt;
&lt;br /&gt;
root = Root(full_system=False, system=system)&lt;br /&gt;
m5.instantiate()&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Beginning simulation!&amp;quot;)&lt;br /&gt;
exit_event = m5.simulate()&lt;br /&gt;
print(f&amp;quot;Exiting @ tick {m5.curTick()} because {exit_event.getCause()}&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jalankan dengan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
build/ALL/gem5.opt my_simple.py&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Catatan: kalau resource &amp;lt;code&amp;gt;x86-hello64-static&amp;lt;/code&amp;gt; tidak ditemukan di versi gem5 yang dipakai, ganti &amp;lt;code&amp;gt;binary&amp;lt;/code&amp;gt; dengan path ke binary hello di source tree (&amp;lt;code&amp;gt;tests/test-progs/hello/bin/x86/linux/hello&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=== Komponen yang dirakit ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Komponen !! Fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;clk_domain&amp;lt;/code&amp;gt; || Kerangka sistem dan clock (1 GHz)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mem_mode = &amp;quot;timing&amp;quot;&amp;lt;/code&amp;gt; || Akses memori dimodelkan dengan latency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X86TimingSimpleCPU&amp;lt;/code&amp;gt; || Satu core x86 sederhana yang menunggu respons memori&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SystemXBar&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;membus&amp;lt;/code&amp;gt;) || Bus penghubung. &amp;lt;code&amp;gt;cpu_side_ports&amp;lt;/code&amp;gt; untuk pihak yang meminta data (CPU), &amp;lt;code&amp;gt;mem_side_ports&amp;lt;/code&amp;gt; untuk pihak yang menyediakan data (memori, device)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;interrupts[0]&amp;lt;/code&amp;gt; || Interrupt controller x86, wajib disambung manual&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;system_port&amp;lt;/code&amp;gt; || Jalur khusus gem5 (misalnya untuk memuat binary ke memori sebelum simulasi)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MemCtrl&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;DDR3_1600_8x8&amp;lt;/code&amp;gt; || Memory controller dan DRAM&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Tips: Makefile ==&lt;br /&gt;
&lt;br /&gt;
Agar tidak mengetik path panjang berulang kali:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;make&amp;quot;&amp;gt;&lt;br /&gt;
GEM5   ?= /home/haidhi/gem5/build/ALL/gem5.opt&lt;br /&gt;
SCRIPT ?= simple.py&lt;br /&gt;
OUTDIR ?= m5out&lt;br /&gt;
FLAGS  ?= Exec&lt;br /&gt;
&lt;br /&gt;
.PHONY: run stats debug clean&lt;br /&gt;
&lt;br /&gt;
run:&lt;br /&gt;
	$(GEM5) --outdir=$(OUTDIR) $(SCRIPT)&lt;br /&gt;
&lt;br /&gt;
stats:&lt;br /&gt;
	@grep -E &amp;quot;simSeconds|simInsts|numCycles|hostSeconds&amp;quot; $(OUTDIR)/stats.txt&lt;br /&gt;
&lt;br /&gt;
debug:&lt;br /&gt;
	$(GEM5) --debug-flags=$(FLAGS) --debug-file=debug.out --outdir=$(OUTDIR) $(SCRIPT)&lt;br /&gt;
&lt;br /&gt;
clean:&lt;br /&gt;
	rm -rf $(OUTDIR)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Baris perintah di Makefile harus diawali karakter &#039;&#039;&#039;tab&#039;&#039;&#039;, bukan spasi.&lt;br /&gt;
&lt;br /&gt;
== Masalah umum ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;No module named &#039;_m5&#039;&amp;lt;/code&amp;gt;&#039;&#039;&#039;: script gem5 tidak bisa dijalankan dengan &amp;lt;code&amp;gt;python3 script.py&amp;lt;/code&amp;gt;. Modul &amp;lt;code&amp;gt;_m5&amp;lt;/code&amp;gt; ditanam di dalam binary, jadi script harus dijalankan lewat &amp;lt;code&amp;gt;gem5.opt&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Garis bawah merah di VSCode untuk &amp;lt;code&amp;gt;System&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SrcClockDomain&amp;lt;/code&amp;gt;, dll&#039;&#039;&#039;: modul &amp;lt;code&amp;gt;m5.objects&amp;lt;/code&amp;gt; dibangkitkan saat build dan source-nya di-embed ke binary, sehingga IDE tidak menemukannya. Script tetap berjalan normal. Garis bawahnya bisa dimatikan lewat setting &amp;lt;code&amp;gt;python.analysis.diagnosticSeverityOverrides&amp;lt;/code&amp;gt; atau komentar &amp;lt;code&amp;gt;# pyright: reportUndefinedVariable=false&amp;lt;/code&amp;gt; di baris atas script.&lt;br /&gt;
* &#039;&#039;&#039;Build gagal karena kehabisan memori&#039;&#039;&#039;: kecilkan nilai &amp;lt;code&amp;gt;-j&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=867</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=867"/>
		<updated>2026-10-11T08:42:36Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
* [[Unsigned Encodings]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
* [[Accessing Information]]&lt;br /&gt;
&lt;br /&gt;
=== temp ===&lt;br /&gt;
* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;br /&gt;
&lt;br /&gt;
== gem5 ==&lt;br /&gt;
* [[gem5: hello world]]&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=866</id>
		<title>Accessing Information</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=866"/>
		<updated>2026-10-09T06:46:15Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CPU x86-64 punya &#039;&#039;&#039;16 general-purpose register&#039;&#039;&#039; berukuran 64-bit. Register ini menyimpan data integer dan pointer.&lt;br /&gt;
&lt;br /&gt;
== Sejarah penamaan ==&lt;br /&gt;
Penamaan register berlapis karena evolusi instruction set:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Generasi !! Lebar !! Nama register !! Catatan&lt;br /&gt;
|-&lt;br /&gt;
| 8086 || 16-bit || &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%sp&amp;lt;/code&amp;gt; || Nama mencerminkan fungsi (accumulator, counter, source/destination index, stack pointer)&lt;br /&gt;
|-&lt;br /&gt;
| IA32 || 32-bit || &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%ebp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; = &#039;&#039;extended&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 || 64-bit || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 (baru) || 64-bit || &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || Konvensi baru, suffix &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; untuk 32/16/8-bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sub-register (nested boxes) ==&lt;br /&gt;
&amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; &#039;&#039;&#039;bukan&#039;&#039;&#039; empat register berbeda, melainkan satu register fisik yang diakses dengan lebar berbeda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&amp;lt;------------------- %rax (64 bit) -------------------&amp;gt;|&lt;br /&gt;
                           |&amp;lt;------ %eax (32 bit) -----&amp;gt;|&lt;br /&gt;
                                         |&amp;lt;- %ax (16) -&amp;gt;|&lt;br /&gt;
                                                 |%al(8)|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Operasi byte → least significant byte&lt;br /&gt;
* Operasi 16-bit → 2 byte terbawah&lt;br /&gt;
* Operasi 32-bit → 4 byte terbawah&lt;br /&gt;
* Operasi 64-bit → seluruh register&lt;br /&gt;
&lt;br /&gt;
== Aturan sisa byte saat menulis ke register ==&lt;br /&gt;
Ketika instruksi menghasilkan nilai kurang dari 8 byte ke register:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ukuran tulis !! Efek ke byte sisanya&lt;br /&gt;
|-&lt;br /&gt;
| 1 byte / 2 byte || &#039;&#039;&#039;Tidak berubah&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 byte || 4 byte atas &#039;&#039;&#039;di-nol-kan&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Contoh, dengan &amp;lt;code&amp;gt;%rax = 0x1122334455667788&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movb $0xAA, %al      # %rax = 0x11223344556677AA  (sisanya utuh)&lt;br /&gt;
movw $0xAAAA, %ax    # %rax = 0x112233445566AAAA  (sisanya utuh)&lt;br /&gt;
movl $0xAAAA, %eax   # %rax = 0x000000000000AAAA  (4 byte atas = 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa?&#039;&#039;&#039; Aturan zero-upper diadopsi saat ekspansi IA32 → x86-64 supaya hasil tulisan tidak bergantung pada isi lama register (menghindari &#039;&#039;partial register dependency&#039;&#039;), sehingga eksekusi out-of-order lebih lancar. Compiler memanfaatkannya, misalnya &amp;lt;code&amp;gt;mov $0x0,%eax&amp;lt;/code&amp;gt; untuk &amp;lt;code&amp;gt;return 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Peran register (System V ABI) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Return value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-1 sampai ke-6 (urut)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || Stack pointer (spesial, dipakai otomatis oleh &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Callee saved&#039;&#039;&#039;: fungsi yang dipanggil wajib mengembalikan nilainya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; (+ register argumen &amp;amp; &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;) || &#039;&#039;&#039;Caller saved&#039;&#039;&#039;: boleh dirusak oleh fungsi yang dipanggil&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jembatan keledai urutan argumen: &#039;&#039;&#039;&amp;quot;Diane&#039;s Silk Dress Costs $89&amp;quot;&#039;&#039;&#039; → &amp;lt;code&amp;gt;di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Contoh: &amp;lt;code&amp;gt;multstore&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
push %rbx          # rbx callee-saved → simpan nilai lama&lt;br /&gt;
mov  %rdx,%rbx     # rdx = argumen ke-3 (dest), amankan di rbx&lt;br /&gt;
call mult2         # x, y masih di rdi &amp;amp; rsi&lt;br /&gt;
mov  %rax,(%rbx)   # *dest = hasil mult2 (rax)&lt;br /&gt;
pop  %rbx          # pulihkan rbx&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;dest&amp;lt;/code&amp;gt; dipindah ke &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; karena &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; caller-saved (bisa dirusak &amp;lt;code&amp;gt;mult2&amp;lt;/code&amp;gt;), sedangkan &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; dijamin selamat melewati &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= 3.4.1 Operand Specifiers =&lt;br /&gt;
&lt;br /&gt;
== Tiga jenis operand ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jenis !! Contoh !! Arti&lt;br /&gt;
|-&lt;br /&gt;
| Immediate || &amp;lt;code&amp;gt;$-577&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$0x1F&amp;lt;/code&amp;gt; || Konstanta, nilai tertanam di instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; || Isi register, notasi &amp;lt;code&amp;gt;R[r&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Memory || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8(%rax)&amp;lt;/code&amp;gt; || Isi memori di &#039;&#039;effective address&#039;&#039;, notasi &amp;lt;code&amp;gt;M[Addr]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Perhatian:&#039;&#039;&#039; &amp;lt;code&amp;gt;$0x10&amp;lt;/code&amp;gt; = angka 16, sedangkan &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt; (tanpa &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;) = isi memori di alamat 16.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; ==&lt;br /&gt;
* &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; → isi register itu sendiri (seperti &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
* &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; → isi register dipakai sebagai alamat, lalu baca memori di alamat itu (seperti &amp;lt;code&amp;gt;*p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
&lt;br /&gt;
Kurung &amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; di AT&amp;amp;T = dereference. Di AT&amp;amp;T, register &#039;&#039;&#039;wajib&#039;&#039;&#039; pakai &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt; tanpa &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; akan dianggap nama simbol.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Maksud !! AT&amp;amp;T (gcc, CS:APP) !! Intel (NASM, MASM)&lt;br /&gt;
|-&lt;br /&gt;
| Isi register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Isi memori di alamat rax || &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[rax]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || &amp;lt;code&amp;gt;$5&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bentuk umum memory reference ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imm(rb, ri, s)   →   alamat = Imm + R[rb] + R[ri] · s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;: displacement konstanta&lt;br /&gt;
* &amp;lt;code&amp;gt;rb&amp;lt;/code&amp;gt;: base register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;ri&amp;lt;/code&amp;gt;: index register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;: skala, hanya &#039;&#039;&#039;1, 2, 4, atau 8&#039;&#039;&#039; (ukuran &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;/pointer)&lt;br /&gt;
&lt;br /&gt;
Semua mode lain adalah kasus khusus dengan komponen yang dihilangkan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Effective address !! Nama&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || Absolute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb]&amp;lt;/code&amp;gt; || Indirect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb]&amp;lt;/code&amp;gt; || Base + displacement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Tambahan x86-64 yang tidak ada di tabel: &#039;&#039;&#039;RIP-relative&#039;&#039;&#039;, misalnya &amp;lt;code&amp;gt;lea 0x0(%rip),%rdi&amp;lt;/code&amp;gt;, alamat dihitung relatif terhadap instruksi berikutnya (dipakai untuk data global/string literal).&lt;br /&gt;
&lt;br /&gt;
== Kegunaan: akses array dan struct ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
long a[100];&lt;br /&gt;
x = a[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dengan &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movq (%rdx,%rcx,8), %rax     # alamat = a + i*8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Satu instruksi tanpa perkalian terpisah. Untuk &amp;lt;code&amp;gt;arr[i].field&amp;lt;/code&amp;gt;, offset field masuk ke &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Cara menghitung nilai operand ==&lt;br /&gt;
Untuk memory operand selalu dua langkah:&lt;br /&gt;
# Hitung alamat: &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt;&lt;br /&gt;
# Baca isi memori di alamat tersebut&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jebakan umum:&#039;&#039;&#039;&lt;br /&gt;
* Displacement tanpa &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; adalah &#039;&#039;&#039;desimal&#039;&#039;&#039;: &amp;lt;code&amp;gt;260&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Koma di depan (&amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt;) berarti &#039;&#039;&#039;tanpa base register&#039;&#039;&#039;&lt;br /&gt;
* Perhatikan carry saat menjumlah hex: &amp;lt;code&amp;gt;0xFC + 4 = 0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Jangan berhenti di alamat; jawaban adalah &#039;&#039;&#039;isi&#039;&#039;&#039; memorinya&lt;br /&gt;
&lt;br /&gt;
=== Contoh (Practice Problem 3.1) ===&lt;br /&gt;
Data: &amp;lt;code&amp;gt;%rax = 0x100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx = 0x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx = 0x3&amp;lt;/code&amp;gt;; memori &amp;lt;code&amp;gt;0x100→0xFF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x104→0xAB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x108→0x13&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x10C→0x11&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operand !! Jenis !! Alamat !! Nilai&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Register || — || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || Absolute || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$0x108&amp;lt;/code&amp;gt; || Immediate || — || &amp;lt;code&amp;gt;0x108&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || Indirect || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4(%rax)&amp;lt;/code&amp;gt; || Base + displacement || &amp;lt;code&amp;gt;4 + 0x100 = 0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;9(%rax,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;9 + 0x100 + 3 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;260(%rcx,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;0x104 + 1 + 3 = 0x108&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x13&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0xFC + 1·4 = 0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax,%rdx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0x100 + 3·4 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=865</id>
		<title>Accessing Information</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Accessing_Information&amp;diff=865"/>
		<updated>2026-10-09T06:45:45Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;CPU x86-64 punya &amp;#039;&amp;#039;&amp;#039;16 general-purpose register&amp;#039;&amp;#039;&amp;#039; berukuran 64-bit. Register ini menyimpan data integer dan pointer.  == Sejarah penamaan == Penamaan register berlapis karena evolusi instruction set:  {| class=&amp;quot;wikitable&amp;quot; ! Generasi !! Lebar !! Nama register !! Catatan |- | 8086 || 16-bit || &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%sp&amp;lt;/code&amp;gt; || Nama mencerminkan fungsi (accumulat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;CPU x86-64 punya &#039;&#039;&#039;16 general-purpose register&#039;&#039;&#039; berukuran 64-bit. Register ini menyimpan data integer dan pointer.&lt;br /&gt;
&lt;br /&gt;
== Sejarah penamaan ==&lt;br /&gt;
Penamaan register berlapis karena evolusi instruction set:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Generasi !! Lebar !! Nama register !! Catatan&lt;br /&gt;
|-&lt;br /&gt;
| 8086 || 16-bit || &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%bp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%sp&amp;lt;/code&amp;gt; || Nama mencerminkan fungsi (accumulator, counter, source/destination index, stack pointer)&lt;br /&gt;
|-&lt;br /&gt;
| IA32 || 32-bit || &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%ebp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;e&amp;lt;/code&amp;gt; = &#039;&#039;extended&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 || 64-bit || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || Prefix &amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| x86-64 (baru) || 64-bit || &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; … &amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || Konvensi baru, suffix &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; untuk 32/16/8-bit&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Sub-register (nested boxes) ==&lt;br /&gt;
&amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%eax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%ax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; &#039;&#039;&#039;bukan&#039;&#039;&#039; empat register berbeda, melainkan satu register fisik yang diakses dengan lebar berbeda:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
|&amp;lt;------------------- %rax (64 bit) -------------------&amp;gt;|&lt;br /&gt;
                           |&amp;lt;------ %eax (32 bit) -----&amp;gt;|&lt;br /&gt;
                                          |&amp;lt;- %ax (16) -&amp;gt;|&lt;br /&gt;
                                                 |%al(8)|&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Operasi byte → least significant byte&lt;br /&gt;
* Operasi 16-bit → 2 byte terbawah&lt;br /&gt;
* Operasi 32-bit → 4 byte terbawah&lt;br /&gt;
* Operasi 64-bit → seluruh register&lt;br /&gt;
&lt;br /&gt;
== Aturan sisa byte saat menulis ke register ==&lt;br /&gt;
Ketika instruksi menghasilkan nilai kurang dari 8 byte ke register:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ukuran tulis !! Efek ke byte sisanya&lt;br /&gt;
|-&lt;br /&gt;
| 1 byte / 2 byte || &#039;&#039;&#039;Tidak berubah&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 4 byte || 4 byte atas &#039;&#039;&#039;di-nol-kan&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Contoh, dengan &amp;lt;code&amp;gt;%rax = 0x1122334455667788&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movb $0xAA, %al      # %rax = 0x11223344556677AA  (sisanya utuh)&lt;br /&gt;
movw $0xAAAA, %ax    # %rax = 0x112233445566AAAA  (sisanya utuh)&lt;br /&gt;
movl $0xAAAA, %eax   # %rax = 0x000000000000AAAA  (4 byte atas = 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Kenapa?&#039;&#039;&#039; Aturan zero-upper diadopsi saat ekspansi IA32 → x86-64 supaya hasil tulisan tidak bergantung pada isi lama register (menghindari &#039;&#039;partial register dependency&#039;&#039;), sehingga eksekusi out-of-order lebih lancar. Compiler memanfaatkannya, misalnya &amp;lt;code&amp;gt;mov $0x0,%eax&amp;lt;/code&amp;gt; untuk &amp;lt;code&amp;gt;return 0&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Peran register (System V ABI) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Return value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-1 sampai ke-6 (urut)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || Stack pointer (spesial, dipakai otomatis oleh &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;pop&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;ret&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &#039;&#039;&#039;Callee saved&#039;&#039;&#039;: fungsi yang dipanggil wajib mengembalikan nilainya&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; (+ register argumen &amp;amp; &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;) || &#039;&#039;&#039;Caller saved&#039;&#039;&#039;: boleh dirusak oleh fungsi yang dipanggil&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Jembatan keledai urutan argumen: &#039;&#039;&#039;&amp;quot;Diane&#039;s Silk Dress Costs $89&amp;quot;&#039;&#039;&#039; → &amp;lt;code&amp;gt;di&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;si&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;dx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cx&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;9&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Contoh: &amp;lt;code&amp;gt;multstore&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
push %rbx          # rbx callee-saved → simpan nilai lama&lt;br /&gt;
mov  %rdx,%rbx     # rdx = argumen ke-3 (dest), amankan di rbx&lt;br /&gt;
call mult2         # x, y masih di rdi &amp;amp; rsi&lt;br /&gt;
mov  %rax,(%rbx)   # *dest = hasil mult2 (rax)&lt;br /&gt;
pop  %rbx          # pulihkan rbx&lt;br /&gt;
ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;dest&amp;lt;/code&amp;gt; dipindah ke &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; karena &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; caller-saved (bisa dirusak &amp;lt;code&amp;gt;mult2&amp;lt;/code&amp;gt;), sedangkan &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; dijamin selamat melewati &amp;lt;code&amp;gt;call&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= 3.4.1 Operand Specifiers =&lt;br /&gt;
&lt;br /&gt;
== Tiga jenis operand ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Jenis !! Contoh !! Arti&lt;br /&gt;
|-&lt;br /&gt;
| Immediate || &amp;lt;code&amp;gt;$-577&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;$0x1F&amp;lt;/code&amp;gt; || Konstanta, nilai tertanam di instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%al&amp;lt;/code&amp;gt; || Isi register, notasi &amp;lt;code&amp;gt;R[r&amp;lt;sub&amp;gt;a&amp;lt;/sub&amp;gt;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Memory || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;8(%rax)&amp;lt;/code&amp;gt; || Isi memori di &#039;&#039;effective address&#039;&#039;, notasi &amp;lt;code&amp;gt;M[Addr]&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Perhatian:&#039;&#039;&#039; &amp;lt;code&amp;gt;$0x10&amp;lt;/code&amp;gt; = angka 16, sedangkan &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt; (tanpa &amp;lt;code&amp;gt;$&amp;lt;/code&amp;gt;) = isi memori di alamat 16.&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; vs &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; ==&lt;br /&gt;
* &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; → isi register itu sendiri (seperti &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
* &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; → isi register dipakai sebagai alamat, lalu baca memori di alamat itu (seperti &amp;lt;code&amp;gt;*p&amp;lt;/code&amp;gt; di C)&lt;br /&gt;
&lt;br /&gt;
Kurung &amp;lt;code&amp;gt;( )&amp;lt;/code&amp;gt; di AT&amp;amp;T = dereference. Di AT&amp;amp;T, register &#039;&#039;&#039;wajib&#039;&#039;&#039; pakai &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt; tanpa &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; akan dianggap nama simbol.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Maksud !! AT&amp;amp;T (gcc, CS:APP) !! Intel (NASM, MASM)&lt;br /&gt;
|-&lt;br /&gt;
| Isi register || &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;rax&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Isi memori di alamat rax || &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;[rax]&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Konstanta || &amp;lt;code&amp;gt;$5&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Bentuk umum memory reference ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imm(rb, ri, s)   →   alamat = Imm + R[rb] + R[ri] · s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;: displacement konstanta&lt;br /&gt;
* &amp;lt;code&amp;gt;rb&amp;lt;/code&amp;gt;: base register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;ri&amp;lt;/code&amp;gt;: index register (64-bit)&lt;br /&gt;
* &amp;lt;code&amp;gt;s&amp;lt;/code&amp;gt;: skala, hanya &#039;&#039;&#039;1, 2, 4, atau 8&#039;&#039;&#039; (ukuran &amp;lt;code&amp;gt;char&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;short&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;long&amp;lt;/code&amp;gt;/pointer)&lt;br /&gt;
&lt;br /&gt;
Semua mode lain adalah kasus khusus dengan komponen yang dihilangkan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Form !! Effective address !! Nama&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt; || Absolute&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb]&amp;lt;/code&amp;gt; || Indirect&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb]&amp;lt;/code&amp;gt; || Base + displacement&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]&amp;lt;/code&amp;gt; || Indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Imm(rb,ri,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt; || Scaled indexed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Tambahan x86-64 yang tidak ada di tabel: &#039;&#039;&#039;RIP-relative&#039;&#039;&#039;, misalnya &amp;lt;code&amp;gt;lea 0x0(%rip),%rdi&amp;lt;/code&amp;gt;, alamat dihitung relatif terhadap instruksi berikutnya (dipakai untuk data global/string literal).&lt;br /&gt;
&lt;br /&gt;
== Kegunaan: akses array dan struct ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
long a[100];&lt;br /&gt;
x = a[i];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dengan &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; di &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;gas&amp;quot;&amp;gt;&lt;br /&gt;
movq (%rdx,%rcx,8), %rax     # alamat = a + i*8&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Satu instruksi tanpa perkalian terpisah. Untuk &amp;lt;code&amp;gt;arr[i].field&amp;lt;/code&amp;gt;, offset field masuk ke &amp;lt;code&amp;gt;Imm&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Cara menghitung nilai operand ==&lt;br /&gt;
Untuk memory operand selalu dua langkah:&lt;br /&gt;
# Hitung alamat: &amp;lt;code&amp;gt;Imm + R[rb] + R[ri]·s&amp;lt;/code&amp;gt;&lt;br /&gt;
# Baca isi memori di alamat tersebut&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Jebakan umum:&#039;&#039;&#039;&lt;br /&gt;
* Displacement tanpa &amp;lt;code&amp;gt;0x&amp;lt;/code&amp;gt; adalah &#039;&#039;&#039;desimal&#039;&#039;&#039;: &amp;lt;code&amp;gt;260&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;16&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
* Koma di depan (&amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt;) berarti &#039;&#039;&#039;tanpa base register&#039;&#039;&#039;&lt;br /&gt;
* Perhatikan carry saat menjumlah hex: &amp;lt;code&amp;gt;0xFC + 4 = 0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
* Jangan berhenti di alamat; jawaban adalah &#039;&#039;&#039;isi&#039;&#039;&#039; memorinya&lt;br /&gt;
&lt;br /&gt;
=== Contoh (Practice Problem 3.1) ===&lt;br /&gt;
Data: &amp;lt;code&amp;gt;%rax = 0x100&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rcx = 0x1&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%rdx = 0x3&amp;lt;/code&amp;gt;; memori &amp;lt;code&amp;gt;0x100→0xFF&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x104→0xAB&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x108→0x13&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;0x10C→0x11&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operand !! Jenis !! Alamat !! Nilai&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Register || — || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || Absolute || &amp;lt;code&amp;gt;0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;$0x108&amp;lt;/code&amp;gt; || Immediate || — || &amp;lt;code&amp;gt;0x108&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax)&amp;lt;/code&amp;gt; || Indirect || &amp;lt;code&amp;gt;0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4(%rax)&amp;lt;/code&amp;gt; || Base + displacement || &amp;lt;code&amp;gt;4 + 0x100 = 0x104&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xAB&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;9(%rax,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;9 + 0x100 + 3 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;260(%rcx,%rdx)&amp;lt;/code&amp;gt; || Indexed || &amp;lt;code&amp;gt;0x104 + 1 + 3 = 0x108&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x13&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFC(,%rcx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0xFC + 1·4 = 0x100&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0xFF&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(%rax,%rdx,4)&amp;lt;/code&amp;gt; || Scaled indexed || &amp;lt;code&amp;gt;0x100 + 3·4 = 0x10C&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0x11&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=864</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=864"/>
		<updated>2026-10-09T06:45:18Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
* [[Unsigned Encodings]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
* [[Accessing Information]]&lt;br /&gt;
&lt;br /&gt;
=== temp ===&lt;br /&gt;
* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=863</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=863"/>
		<updated>2026-10-09T01:50:09Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Riyadhussholihiin Islamic Boarding School ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin (OSRIY) &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862</id>
		<title>Intro Compiler &amp; Machine Abstraction</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Intro_Compiler_%26_Machine_Abstraction&amp;diff=862"/>
		<updated>2026-10-06T07:07:14Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &amp;#039;&amp;#039;&amp;#039;optimisasi compiler&amp;#039;&amp;#039;&amp;#039; dan &amp;#039;&amp;#039;&amp;#039;abstraksi level mesin&amp;#039;&amp;#039;&amp;#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}  == Compiler Optimization ==  &amp;#039;&amp;#039;&amp;#039;Optimisasi&amp;#039;&amp;#039;&amp;#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &amp;#039;&amp;#039;&amp;#039;tanpa mengubah perilaku program yang teramati dari luar&amp;#039;&amp;#039;&amp;#039;.  Programmer menulis kode y...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Catatan|Catatan ini merangkum dua topik yang saling berkaitan: &#039;&#039;&#039;optimisasi compiler&#039;&#039;&#039; dan &#039;&#039;&#039;abstraksi level mesin&#039;&#039;&#039; (ISA, virtual address, processor state x86-64). Materi mengikuti alur pembukaan Bab 3 CS:APP.}}&lt;br /&gt;
&lt;br /&gt;
== Compiler Optimization ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Optimisasi&#039;&#039;&#039; adalah proses compiler mengubah kode sumber menjadi bentuk yang lebih cepat, lebih kecil, atau lebih hemat sumber daya, &#039;&#039;&#039;tanpa mengubah perilaku program yang teramati dari luar&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Programmer menulis kode yang mudah dibaca manusia; compiler menerjemahkannya menjadi kode mesin yang efisien.&lt;br /&gt;
&lt;br /&gt;
=== Aturan dasar: &#039;&#039;as-if rule&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
Compiler boleh melakukan transformasi apa pun selama program berperilaku &#039;&#039;&#039;seolah-olah&#039;&#039;&#039; tidak diubah. Output akhir harus tetap sama.&lt;br /&gt;
&lt;br /&gt;
{{Warning|&#039;&#039;Undefined behavior&#039;&#039; (UB) di C/C++ dapat menghasilkan perilaku yang tampak aneh justru karena aturan ini. Compiler berasumsi UB &#039;&#039;&#039;tidak pernah terjadi&#039;&#039;&#039;, lalu melakukan optimisasi berdasarkan asumsi tersebut. Kode yang &amp;quot;kelihatannya benar&amp;quot; bisa dihapus atau diubah total.}}&lt;br /&gt;
&lt;br /&gt;
=== Jenis-jenis optimisasi ===&lt;br /&gt;
&lt;br /&gt;
; Constant folding&lt;br /&gt;
: Ekspresi konstan dihitung saat kompilasi. &amp;lt;code&amp;gt;x = 2 * 3 + 4&amp;lt;/code&amp;gt; menjadi &amp;lt;code&amp;gt;x = 10&amp;lt;/code&amp;gt;.&lt;br /&gt;
; Dead code elimination&lt;br /&gt;
: Kode yang tidak pernah dieksekusi, atau yang hasilnya tidak pernah dipakai, dibuang.&lt;br /&gt;
; Inlining&lt;br /&gt;
: Pemanggilan fungsi kecil diganti langsung dengan isi fungsinya, menghilangkan overhead &#039;&#039;call&#039;&#039;.&lt;br /&gt;
; Loop unrolling&lt;br /&gt;
: Badan loop &amp;quot;dibentangkan&amp;quot; untuk mengurangi overhead pengecekan kondisi dan lompatan.&lt;br /&gt;
; Common subexpression elimination&lt;br /&gt;
: Ekspresi yang dihitung berulang cukup dihitung satu kali.&lt;br /&gt;
; Vectorization (SIMD)&lt;br /&gt;
: Beberapa operasi data diproses sekaligus dalam satu instruksi, memanfaatkan &#039;&#039;vector register&#039;&#039;.&lt;br /&gt;
; Register allocation&lt;br /&gt;
: Variabel yang sering dipakai ditempatkan di register CPU, bukan di memori.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Register x86-64 hanya ada &#039;&#039;&#039;16 buah&#039;&#039;&#039;. Keterbatasan inilah yang membuat &#039;&#039;register allocation&#039;&#039; menjadi salah satu masalah tersulit dalam desain compiler. Variabel yang tidak kebagian register harus di-&#039;&#039;spill&#039;&#039; ke stack, dan itu jauh lebih lambat.}}&lt;br /&gt;
&lt;br /&gt;
=== Flag optimisasi ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Flag !! Keterangan&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt; || Tanpa optimisasi. Paling nyaman untuk &#039;&#039;debugging&#039;&#039; karena kode mesin masih memetakan rapi ke kode sumber.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O1&amp;lt;/code&amp;gt; || Optimisasi dasar.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O2&amp;lt;/code&amp;gt; || Standar untuk produksi.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-O3&amp;lt;/code&amp;gt; || Lebih agresif, termasuk vectorization dan inlining yang lebih luas.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-Os&amp;lt;/code&amp;gt; || Mengutamakan ukuran biner yang kecil.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Di Rust, mode optimisasi diaktifkan dengan &amp;lt;code&amp;gt;cargo build --release&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Saat &#039;&#039;debugging&#039;&#039;, gunakan &amp;lt;code&amp;gt;-O0&amp;lt;/code&amp;gt;. Pada level optimisasi tinggi, variabel bisa hilang dari &#039;&#039;debugger&#039;&#039;, urutan eksekusi berubah, dan &#039;&#039;breakpoint&#039;&#039; tidak mendarat di tempat yang diharapkan.}}&lt;br /&gt;
&lt;br /&gt;
== Abstraksi dalam Sistem Komputer ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Abstraksi&#039;&#039;&#039; adalah menyembunyikan detail implementasi di balik model yang lebih sederhana. Untuk pemrograman level mesin, ada dua abstraksi yang paling penting.&lt;br /&gt;
&lt;br /&gt;
=== 1. Instruction Set Architecture (ISA) ===&lt;br /&gt;
&lt;br /&gt;
ISA adalah &amp;quot;kontrak&amp;quot; antara perangkat keras dan perangkat lunak. ISA mendefinisikan:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Processor state&#039;&#039;&#039; — apa saja yang disimpan prosesor (register, program counter, condition flag)&lt;br /&gt;
* &#039;&#039;&#039;Format instruksi&#039;&#039;&#039; — bagaimana instruksi dikodekan&lt;br /&gt;
* &#039;&#039;&#039;Efek tiap instruksi&#039;&#039;&#039; terhadap state tersebut&lt;br /&gt;
&lt;br /&gt;
Sebagian besar ISA, termasuk &#039;&#039;&#039;x86-64&#039;&#039;&#039;, mendeskripsikan perilaku program &#039;&#039;&#039;seolah-olah&#039;&#039;&#039; setiap instruksi dieksekusi berurutan: satu instruksi selesai sebelum instruksi berikutnya dimulai.&lt;br /&gt;
&lt;br /&gt;
==== Kenyataan di perangkat keras ====&lt;br /&gt;
&lt;br /&gt;
Prosesor nyata jauh lebih rumit dan mengeksekusi banyak instruksi secara &#039;&#039;&#039;konkuren&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Pipelining&#039;&#039;&#039; — beberapa tahap instruksi tumpang tindih&lt;br /&gt;
* &#039;&#039;&#039;Superscalar&#039;&#039;&#039; — beberapa instruksi dieksekusi bersamaan&lt;br /&gt;
* &#039;&#039;&#039;Out-of-order execution&#039;&#039;&#039; — urutan eksekusi disusun ulang sesuai kesiapan data&lt;br /&gt;
* &#039;&#039;&#039;Speculative execution&#039;&#039;&#039; — prosesor menebak hasil percabangan sebelum diketahui&lt;br /&gt;
&lt;br /&gt;
Prosesor menggunakan &#039;&#039;&#039;pengaman&#039;&#039;&#039; (&#039;&#039;dependency checking&#039;&#039;, &#039;&#039;reorder buffer&#039;&#039;, &#039;&#039;in-order commit&#039;&#039;) untuk memastikan hasil akhirnya tetap identik dengan model sekuensial yang dijanjikan ISA.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Pola yang sama muncul di dua lapisan berbeda. Compiler boleh mengubah urutan kode (&#039;&#039;as-if rule&#039;&#039;), hardware boleh mengubah urutan eksekusi — keduanya sah &#039;&#039;&#039;selama perilaku yang teramati tidak berubah&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== 2. Virtual Address ===&lt;br /&gt;
&lt;br /&gt;
Alamat memori yang dipakai program level mesin adalah &#039;&#039;&#039;alamat virtual&#039;&#039;&#039;, yang menyajikan memori sebagai &#039;&#039;&#039;satu array byte yang sangat besar dan berurutan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Implementasi sebenarnya jauh lebih kompleks:&lt;br /&gt;
&lt;br /&gt;
* Hierarki perangkat keras: register → cache L1/L2/L3 → DRAM → disk&lt;br /&gt;
* Perangkat lunak sistem operasi: &#039;&#039;page table&#039;&#039;, MMU, TLB, penanganan &#039;&#039;page fault&#039;&#039;, &#039;&#039;swapping&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Sistem operasi mengelola ruang alamat virtual dan menerjemahkan alamat virtual menjadi alamat fisik.&lt;br /&gt;
&lt;br /&gt;
==== Ukuran ruang alamat x86-64 ====&lt;br /&gt;
&lt;br /&gt;
* Alamat direpresentasikan sebagai word &#039;&#039;&#039;64-bit&#039;&#039;&#039;&lt;br /&gt;
* Pada implementasi saat ini, &#039;&#039;&#039;16 bit teratas harus bernilai nol&#039;&#039;&#039;&lt;br /&gt;
* Ruang alamat efektif = 2&amp;lt;sup&amp;gt;48&amp;lt;/sup&amp;gt; byte ≈ &#039;&#039;&#039;64 terabyte&#039;&#039;&#039;&lt;br /&gt;
* Program biasa hanya memakai beberapa megabyte sampai beberapa gigabyte&lt;br /&gt;
&lt;br /&gt;
{{Warning|Pada satu waktu, hanya sebagian kecil rentang alamat virtual yang dianggap &#039;&#039;&#039;valid&#039;&#039;&#039;. Akses ke alamat yang tidak valid inilah yang memunculkan &#039;&#039;segmentation fault&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
=== Abstraksi yang bocor (&#039;&#039;leaky abstraction&#039;&#039;) ===&lt;br /&gt;
&lt;br /&gt;
Kedua abstraksi di atas membuat assembly bisa dipelajari sama sekali. Namun abstraksi tersebut &#039;&#039;&#039;bocor&#039;&#039;&#039; dalam beberapa situasi:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Performa&#039;&#039;&#039; — ISA menjanjikan urutan, tetapi &#039;&#039;cache miss&#039;&#039; dan &#039;&#039;branch misprediction&#039;&#039; tetap memengaruhi kecepatan nyata&lt;br /&gt;
* &#039;&#039;&#039;Konkurensi&#039;&#039;&#039; — model sekuensial tidak lagi cukup ketika beberapa thread berinteraksi, sehingga diperlukan &#039;&#039;memory barrier&#039;&#039; dan operasi atomik&lt;br /&gt;
* &#039;&#039;&#039;Keamanan&#039;&#039;&#039; — Spectre dan Meltdown adalah kasus di mana pengaman ternyata tidak sempurna: &#039;&#039;speculative execution&#039;&#039; meninggalkan jejak di cache yang bisa dibaca penyerang&lt;br /&gt;
&lt;br /&gt;
== Representasi Level Mesin ==&lt;br /&gt;
&lt;br /&gt;
Compiler mengerjakan bagian terberat: menerjemahkan model eksekusi C yang relatif abstrak menjadi instruksi prosesor yang sangat elementer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Assembly&#039;&#039;&#039; dan &#039;&#039;&#039;machine code&#039;&#039;&#039; pada dasarnya sama; perbedaannya hanya representasi. Assembly berbentuk teks yang bisa dibaca manusia, machine code berbentuk biner. Hubungan keduanya nyaris satu-ke-satu.&lt;br /&gt;
&lt;br /&gt;
=== Processor state yang terlihat ===&lt;br /&gt;
&lt;br /&gt;
Bagian-bagian state prosesor berikut tersembunyi dari programmer C, tetapi terlihat jelas di level mesin.&lt;br /&gt;
&lt;br /&gt;
==== Program counter (&amp;lt;code&amp;gt;%rip&amp;lt;/code&amp;gt;) ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan &#039;&#039;&#039;alamat memori instruksi berikutnya&#039;&#039;&#039; yang akan dieksekusi. Di C, posisi eksekusi adalah konsep implisit; di level mesin, ini register konkret yang dapat diubah lewat instruksi lompat dan pemanggilan fungsi.&lt;br /&gt;
&lt;br /&gt;
==== Integer register file ====&lt;br /&gt;
&lt;br /&gt;
16 lokasi bernama, masing-masing menyimpan nilai &#039;&#039;&#039;64-bit&#039;&#039;&#039;. Isinya dapat berupa alamat (setara pointer di C) atau data integer.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Register !! Peran umum (System V AMD64 ABI)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rax&amp;lt;/code&amp;gt; || Nilai kembalian fungsi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbx&amp;lt;/code&amp;gt; || &#039;&#039;Callee-saved&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rcx&amp;lt;/code&amp;gt; || Argumen ke-4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdx&amp;lt;/code&amp;gt; || Argumen ke-3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsi&amp;lt;/code&amp;gt; || Argumen ke-2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rdi&amp;lt;/code&amp;gt; || Argumen ke-1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rbp&amp;lt;/code&amp;gt; || &#039;&#039;Callee-saved&#039;&#039; / &#039;&#039;frame pointer&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%rsp&amp;lt;/code&amp;gt; || &#039;&#039;Stack pointer&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r8&amp;lt;/code&amp;gt; || Argumen ke-5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r9&amp;lt;/code&amp;gt; || Argumen ke-6&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;%r11&amp;lt;/code&amp;gt; || &#039;&#039;Caller-saved&#039;&#039;, data sementara&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;%r12&amp;lt;/code&amp;gt;–&amp;lt;code&amp;gt;%r15&amp;lt;/code&amp;gt; || &#039;&#039;Callee-saved&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Sebagian register melacak bagian penting dari state program, sebagian lain menampung data sementara seperti argumen, variabel lokal, dan nilai kembalian.&lt;br /&gt;
&lt;br /&gt;
==== Condition code register ====&lt;br /&gt;
&lt;br /&gt;
Menyimpan informasi status hasil operasi aritmetika atau logika &#039;&#039;&#039;yang terakhir dieksekusi&#039;&#039;&#039; (&#039;&#039;zero flag&#039;&#039;, &#039;&#039;sign flag&#039;&#039;, &#039;&#039;carry&#039;&#039;, &#039;&#039;overflow&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Register inilah yang dipakai untuk mengimplementasikan perubahan alur kontrol bersyarat seperti &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# Instruksi pembanding dieksekusi → flag berubah&lt;br /&gt;
# Instruksi lompat bersyarat membaca flag → alur program bercabang&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Satu pernyataan &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; di C selalu &amp;quot;dicicil&amp;quot; menjadi minimal dua langkah terpisah di level mesin: penetapan flag, lalu pembacaan flag.}}&lt;br /&gt;
&lt;br /&gt;
==== Vector register ====&lt;br /&gt;
&lt;br /&gt;
Setiap register dapat menampung &#039;&#039;&#039;satu atau lebih&#039;&#039;&#039; nilai integer atau floating-point sekaligus. Inilah dasar perangkat keras untuk SIMD dan &#039;&#039;vectorization&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Memori: tipe data adalah ilusi ===&lt;br /&gt;
&lt;br /&gt;
C menyediakan model di mana objek dengan tipe berbeda dideklarasikan dan dialokasikan di memori. Kode mesin memandang memori &#039;&#039;&#039;semata-mata sebagai array byte besar yang dapat dialamati&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya:&lt;br /&gt;
&lt;br /&gt;
* Tipe agregat seperti &#039;&#039;array&#039;&#039; dan &#039;&#039;struct&#039;&#039; direpresentasikan sebagai &#039;&#039;&#039;kumpulan byte yang bersebelahan&#039;&#039;&#039;&lt;br /&gt;
* Assembly &#039;&#039;&#039;tidak membedakan&#039;&#039;&#039; integer &#039;&#039;signed&#039;&#039; dan &#039;&#039;unsigned&#039;&#039;&lt;br /&gt;
* Assembly tidak membedakan jenis pointer satu sama lain&lt;br /&gt;
* Assembly bahkan &#039;&#039;&#039;tidak membedakan pointer dari integer&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Warning|Yang membedakan &#039;&#039;signed&#039;&#039; dan &#039;&#039;unsigned&#039;&#039; bukan datanya, melainkan &#039;&#039;&#039;instruksi mana yang dipilih&#039;&#039;&#039; untuk mengolahnya. Pola bit-nya identik. Inilah sebabnya kesalahan tipe data di C bisa lolos tanpa gejala sampai jauh di kemudian hari.}}&lt;br /&gt;
&lt;br /&gt;
{{Tip|Hal ini juga menjelaskan mengapa &#039;&#039;casting&#039;&#039; pointer di C praktis &amp;quot;gratis&amp;quot; di level mesin — tidak ada data yang berubah, hanya cara compiler memperlakukannya.}}&lt;br /&gt;
&lt;br /&gt;
=== Isi program memory ===&lt;br /&gt;
&lt;br /&gt;
Ruang memori program berisi:&lt;br /&gt;
&lt;br /&gt;
* Kode mesin yang dapat dieksekusi&lt;br /&gt;
* Informasi yang dibutuhkan sistem operasi&lt;br /&gt;
* &#039;&#039;&#039;Run-time stack&#039;&#039;&#039; untuk mengelola pemanggilan dan pengembalian prosedur&lt;br /&gt;
* Blok memori yang dialokasikan pengguna, misalnya melalui &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Seluruhnya dialamati menggunakan alamat virtual.&lt;br /&gt;
&lt;br /&gt;
=== Satu instruksi = satu operasi elementer ===&lt;br /&gt;
&lt;br /&gt;
Satu instruksi mesin hanya melakukan operasi yang sangat sederhana, misalnya:&lt;br /&gt;
&lt;br /&gt;
* Menjumlahkan dua angka yang tersimpan di register&lt;br /&gt;
* Memindahkan data antara memori dan register&lt;br /&gt;
* Melompat ke alamat instruksi lain secara bersyarat&lt;br /&gt;
&lt;br /&gt;
Compiler harus &#039;&#039;&#039;menyusun rangkaian&#039;&#039;&#039; instruksi semacam itu untuk mengimplementasikan konstruksi program seperti evaluasi ekspresi aritmetika, loop, serta pemanggilan dan pengembalian prosedur.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Inilah gambaran besarnya. C menyediakan objek bertipe, variabel bernama, dan struktur kontrol. Mesin hanya punya 16 register, array byte, flag, dan instruksi sederhana. &#039;&#039;&#039;Jarak antara keduanya diisi oleh compiler&#039;&#039;&#039; — dan membaca hasil pengisian jarak itulah inti dari Bab 3 CS:APP.}}&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=861</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=861"/>
		<updated>2026-10-06T07:07:07Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
* [[Unsigned Encodings]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
&lt;br /&gt;
=== temp ===&lt;br /&gt;
* [[Intro Compiler &amp;amp; Machine Abstraction]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=860</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=860"/>
		<updated>2026-09-18T03:09:56Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Riyadhussholihiin Islamic Boarding School ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin (OSRIY) &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Tahfidz Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=859</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=859"/>
		<updated>2026-09-09T01:37:26Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Riyadhussholihiin Islamic Boarding School ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin (OSRIY) &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Tahfidz Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Ringkasan Buku]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Unsigned_Encodings&amp;diff=858</id>
		<title>Unsigned Encodings</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Unsigned_Encodings&amp;diff=858"/>
		<updated>2026-09-08T02:57:00Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;Section ini menjawab satu pertanyaan: &amp;#039;&amp;#039;&amp;#039;kalau kita punya deretan angka 0 dan 1, bagaimana cara membacanya sebagai satu bilangan biasa?&amp;#039;&amp;#039;&amp;#039;  Plus satu jaminan tambahan: &amp;#039;&amp;#039;&amp;#039;pembacaan itu unik dan bisa dibalik&amp;#039;&amp;#039;&amp;#039;.  Itu saja isinya. Sisanya cuma cara menuliskannya secara rapi.  = Bagian 1: Membangun idenya dari nol =  == Langkah 0: Ingat dulu cara kerja angka desimal ==  Sebelum masuk biner, kita ulang dulu sesuatu yang sudah kita pakai sejak kecil tanpa sadar.  Ambil angka...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Section ini menjawab satu pertanyaan: &#039;&#039;&#039;kalau kita punya deretan angka 0 dan 1, bagaimana cara membacanya sebagai satu bilangan biasa?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Plus satu jaminan tambahan: &#039;&#039;&#039;pembacaan itu unik dan bisa dibalik&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Itu saja isinya. Sisanya cuma cara menuliskannya secara rapi.&lt;br /&gt;
&lt;br /&gt;
= Bagian 1: Membangun idenya dari nol =&lt;br /&gt;
&lt;br /&gt;
== Langkah 0: Ingat dulu cara kerja angka desimal ==&lt;br /&gt;
&lt;br /&gt;
Sebelum masuk biner, kita ulang dulu sesuatu yang sudah kita pakai sejak kecil tanpa sadar.&lt;br /&gt;
&lt;br /&gt;
Ambil angka &#039;&#039;&#039;507&#039;&#039;&#039;. Kenapa dia bernilai lima ratus tujuh?&lt;br /&gt;
&lt;br /&gt;
Karena tiap posisi digit punya &#039;&#039;&#039;nilai tempat&#039;&#039;&#039; sendiri:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    5     0     7&lt;br /&gt;
    |     |     |&lt;br /&gt;
   100   10     1     &amp;lt;- nilai tempat tiap posisi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lalu kita kalikan dan jumlahkan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  5 x 100  =  500&lt;br /&gt;
  0 x  10  =    0&lt;br /&gt;
  7 x   1  =    7&lt;br /&gt;
             -----&lt;br /&gt;
               507&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan pola nilai tempatnya: 1, 10, 100, 1000 — &#039;&#039;&#039;naik sepuluh kali lipat&#039;&#039;&#039; tiap geser satu posisi ke kiri. Karena itu namanya sistem &#039;&#039;&#039;basis 10&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Inti yang perlu dibawa ke langkah berikutnya: angka itu bukan sekadar deretan simbol. Tiap posisi punya bobot, dan nilai totalnya adalah jumlah dari digit dikali bobotnya.}}&lt;br /&gt;
&lt;br /&gt;
== Langkah 1: Biner memakai ide yang sama persis ==&lt;br /&gt;
&lt;br /&gt;
Biner bekerja dengan cara yang sama. Yang berubah cuma dua hal:&lt;br /&gt;
&lt;br /&gt;
# Digitnya cuma boleh &#039;&#039;&#039;0 atau 1&#039;&#039;&#039; (bukan 0 sampai 9)&lt;br /&gt;
# Nilai tempatnya &#039;&#039;&#039;naik dua kali lipat&#039;&#039;&#039;, bukan sepuluh kali lipat&lt;br /&gt;
&lt;br /&gt;
Jadi nilai tempatnya jadi seperti ini:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ... 8     4     2     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Atau kalau ditulis sebagai pangkat dua:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   ... 2^3   2^2   2^1   2^0&lt;br /&gt;
   ...  8     4     2     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Tip|Kalau lupa, tinggal mulai dari 1 di paling kanan lalu kalikan dua terus ke kiri: 1, 2, 4, 8, 16, 32, 64, 128, ...}}&lt;br /&gt;
&lt;br /&gt;
== Langkah 2: Cara menomori posisi bit ==&lt;br /&gt;
&lt;br /&gt;
Ini bagian yang bikin orang tersesat kalau kelewat, jadi pelan-pelan.&lt;br /&gt;
&lt;br /&gt;
Buku menomori bit &#039;&#039;&#039;dari kanan, dimulai dari nol&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  posisi:    3     2     1     0&lt;br /&gt;
             |     |     |     |&lt;br /&gt;
  bit:     [ 1     0     1     1 ]&lt;br /&gt;
             |                 |&lt;br /&gt;
             |                 +--- ini x_0, bit paling kanan&lt;br /&gt;
             +--------------------- ini x_3, bit paling kiri&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jadi untuk vektor bit selebar &#039;&#039;&#039;w&#039;&#039;&#039; bit, penulisannya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [ x_(w-1),  x_(w-2),  ... ,  x_1,  x_0 ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buku juga memakai lambang &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; bertanda panah di atasnya untuk menyebut &#039;&#039;&#039;seluruh vektor sekaligus&#039;&#039;&#039;, sementara &amp;lt;code&amp;gt;x_i&amp;lt;/code&amp;gt; menyebut &#039;&#039;&#039;satu bit tertentu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Jangan sampai kebalik|Nomor posisi dihitung &#039;&#039;&#039;dari kanan&#039;&#039;&#039; dan &#039;&#039;&#039;dimulai dari 0&#039;&#039;&#039;, bukan dari kiri dan bukan dimulai dari 1. Kalau ini kebalik, semua rumus di sisa bab akan menghasilkan angka yang salah. Alasan penomorannya begitu: supaya nomor posisi langsung sama dengan pangkat duanya — posisi 3 bernilai 2 pangkat 3.}}&lt;br /&gt;
&lt;br /&gt;
== Langkah 3: Aturannya cuma satu kalimat ==&lt;br /&gt;
&lt;br /&gt;
Sekarang aturan intinya:&lt;br /&gt;
&lt;br /&gt;
; &#039;&#039;&#039;Kalau sebuah bit bernilai 1, dia menyumbang nilai tempatnya. Kalau bernilai 0, dia tidak menyumbang apa-apa.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bayangkan tiap posisi bit sebagai &#039;&#039;&#039;saklar lampu&#039;&#039;&#039; yang punya harga tetap:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  saklar 8   saklar 4   saklar 2   saklar 1&lt;br /&gt;
     [ ]        [ ]        [ ]        [ ]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Menyalakan saklar berarti membayar harganya. Nilai akhirnya adalah &#039;&#039;&#039;total harga saklar yang menyala&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= Bagian 2: Rumus resminya =&lt;br /&gt;
&lt;br /&gt;
== Langkah 4: Membongkar rumus 2.1 ==&lt;br /&gt;
&lt;br /&gt;
Buku menuliskan aturan tadi seperti ini:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                w-1&lt;br /&gt;
   B2U (x)  =   SUM   x  . 2^i&lt;br /&gt;
      w         i=0    i&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kelihatan menakutkan, padahal isinya persis kalimat di Langkah 3. Kita bongkar potongan demi potongan:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Potongan !! Artinya dalam bahasa sehari-hari&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B2U&amp;lt;/code&amp;gt; || Singkatan dari &#039;&#039;binary to unsigned&#039;&#039; — &amp;quot;dari biner ke tak bertanda&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;w&amp;lt;/code&amp;gt; di bawah || Lebarnya berapa bit&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt; (lambang sigma) || &amp;quot;Jumlahkan semuanya&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;i=0&amp;lt;/code&amp;gt; sampai &amp;lt;code&amp;gt;w-1&amp;lt;/code&amp;gt; || &amp;quot;Untuk tiap posisi, mulai dari posisi 0 sampai posisi terakhir&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x_i&amp;lt;/code&amp;gt; || Nilai bit di posisi itu, 0 atau 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2^i&amp;lt;/code&amp;gt; || Nilai tempat posisi itu&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x_i . 2^i&amp;lt;/code&amp;gt; || Bit dikali nilai tempatnya — inilah &amp;quot;sumbangan&amp;quot; posisi itu&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Dibaca utuh: &#039;&#039;&#039;untuk tiap posisi bit, kalikan nilai bitnya dengan nilai tempatnya, lalu jumlahkan semuanya.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Soal lambang titik-sama-dengan|Buku memakai lambang &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; dengan titik di atasnya. Artinya &amp;quot;ruas kiri &#039;&#039;&#039;didefinisikan&#039;&#039;&#039; sama dengan ruas kanan&amp;quot;. Jadi ini bukan hasil hitungan yang diturunkan dari mana-mana, melainkan kesepakatan tentang apa arti B2U. Mirip seperti mengatakan &amp;quot;yang kami maksud dengan ini adalah itu&amp;quot;.}}&lt;br /&gt;
&lt;br /&gt;
== Langkah 5: Empat contoh, dikerjakan pelan-pelan ==&lt;br /&gt;
&lt;br /&gt;
Semua contoh di bawah memakai &#039;&#039;&#039;w = 4&#039;&#039;&#039;, jadi nilai tempatnya: 8, 4, 2, 1.&lt;br /&gt;
&lt;br /&gt;
=== Contoh 1: [0001] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  posisi:     3     2     1     0&lt;br /&gt;
  bit:        0     0     0     1&lt;br /&gt;
  nilai tempat: 8     4     2     1&lt;br /&gt;
  sumbangan:  0     0     0     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hitung: 0 + 0 + 0 + 1 = &#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Contoh 2: [0101] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  posisi:     3     2     1     0&lt;br /&gt;
  bit:        0     1     0     1&lt;br /&gt;
  nilai tempat: 8     4     2     1&lt;br /&gt;
  sumbangan:  0     4     0     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hitung: 0 + 4 + 0 + 1 = &#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Contoh 3: [1011] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  posisi:     3     2     1     0&lt;br /&gt;
  bit:        1     0     1     1&lt;br /&gt;
  nilai tempat: 8     4     2     1&lt;br /&gt;
  sumbangan:  8     0     2     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hitung: 8 + 0 + 2 + 1 = &#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Contoh 4: [1111] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  posisi:     3     2     1     0&lt;br /&gt;
  bit:        1     1     1     1&lt;br /&gt;
  nilai tempat: 8     4     2     1&lt;br /&gt;
  sumbangan:  8     4     2     1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hitung: 8 + 4 + 2 + 1 = &#039;&#039;&#039;15&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Ringkasan keempatnya ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Vektor bit !! Perhitungan !! Hasil&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0001]&amp;lt;/code&amp;gt; || 0 + 0 + 0 + 1 || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[0101]&amp;lt;/code&amp;gt; || 0 + 4 + 0 + 1 || 5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[1011]&amp;lt;/code&amp;gt; || 8 + 0 + 2 + 1 || 11&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[1111]&amp;lt;/code&amp;gt; || 8 + 4 + 2 + 1 || 15&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Langkah 6: Cara membaca Figure 2.12 ==&lt;br /&gt;
&lt;br /&gt;
Gambar di buku itu sebenarnya cuma cara lain menyajikan tabel di atas.&lt;br /&gt;
&lt;br /&gt;
Tiap posisi bit digambar sebagai &#039;&#039;&#039;batang biru&#039;&#039;&#039; yang panjangnya sesuai nilai tempatnya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  2^3 = 8   |========================|&lt;br /&gt;
  2^2 = 4   |============|&lt;br /&gt;
  2^1 = 2   |======|&lt;br /&gt;
  2^0 = 1   |===|&lt;br /&gt;
&lt;br /&gt;
            0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Lalu tiap vektor bit digambar dengan &#039;&#039;&#039;menyambung batang-batang yang bitnya bernilai 1&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [0001]    |===|                                        -&amp;gt; 1&lt;br /&gt;
  [0101]    |============|===|                           -&amp;gt; 5&lt;br /&gt;
  [1011]    |========================|======|===|        -&amp;gt; 11&lt;br /&gt;
  [1111]    |========================|============|======|===|  -&amp;gt; 15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jadi nilai sebuah vektor bit sama dengan &#039;&#039;&#039;total panjang batang yang tersambung&#039;&#039;&#039;. Gambar itu adalah cara menunjukkan penjumlahan tanpa menulis penjumlahan.&lt;br /&gt;
&lt;br /&gt;
= Bagian 3: Rentang nilainya =&lt;br /&gt;
&lt;br /&gt;
== Langkah 7: Yang terkecil dan yang terbesar ==&lt;br /&gt;
&lt;br /&gt;
=== Nilai terkecil ===&lt;br /&gt;
&lt;br /&gt;
Semua saklar mati:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [0000]  -&amp;gt;  0 + 0 + 0 + 0  =  0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jadi nilai terkecil selalu &#039;&#039;&#039;0&#039;&#039;&#039;. Tidak ada cara membuatnya lebih kecil, karena tidak ada bit yang bisa menyumbang nilai negatif.&lt;br /&gt;
&lt;br /&gt;
=== Nilai terbesar ===&lt;br /&gt;
&lt;br /&gt;
Semua saklar menyala:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [1111]  -&amp;gt;  8 + 4 + 2 + 1  =  15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Buku memberi nama untuk nilai terbesar ini: &#039;&#039;&#039;UMax_w&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Untuk w = 4:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  UMax_4  =  2^4 - 1  =  16 - 1  =  15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rumus umumnya:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  UMax_w  =  2^w - 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kenapa dikurangi satu ===&lt;br /&gt;
&lt;br /&gt;
Ini pertanyaan yang wajar dan jawabannya sederhana.&lt;br /&gt;
&lt;br /&gt;
Dengan w bit, ada &#039;&#039;&#039;2^w pola bit&#039;&#039;&#039; yang mungkin. Untuk w = 4 berarti ada 16 pola: dari &amp;lt;code&amp;gt;[0000]&amp;lt;/code&amp;gt; sampai &amp;lt;code&amp;gt;[1111]&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Tapi kita mulai menghitung dari &#039;&#039;&#039;0&#039;&#039;&#039;, bukan dari 1. Jadi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  pola ke-1  -&amp;gt;  0&lt;br /&gt;
  pola ke-2  -&amp;gt;  1&lt;br /&gt;
  pola ke-3  -&amp;gt;  2&lt;br /&gt;
   ...&lt;br /&gt;
  pola ke-16 -&amp;gt;  15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enam belas pola, tapi angka terbesarnya 15. Karena satu jatah terpakai untuk angka nol.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Analogi: kalau ada 16 kursi bernomor dan penomoran dimulai dari 0, kursi terakhir bernomor 15, bukan 16. Jumlah kursi dan nomor kursi terakhir memang selalu beda satu.}}&lt;br /&gt;
&lt;br /&gt;
=== Tabel untuk lebar yang umum dipakai ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! w !! Banyak pola (2^w) !! UMax_w !! Tipe C yang biasa&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 16 || 15 || (nibble)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 256 || 255 || &amp;lt;code&amp;gt;unsigned char&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;uint8_t&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 16 || 65.536 || 65.535 || &amp;lt;code&amp;gt;uint16_t&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 32 || 4.294.967.296 || 4.294.967.295 || &amp;lt;code&amp;gt;unsigned int&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;uint32_t&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 64 || sekitar 1,8 x 10^19 || 2^64 - 1 || &amp;lt;code&amp;gt;uint64_t&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Cara menuliskannya secara formal ===&lt;br /&gt;
&lt;br /&gt;
Dengan kedua batas itu, fungsi B2U bisa dinyatakan sebagai pemetaan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  B2U :  {0,1}^w  -&amp;gt;  {0, 1, 2, ... , UMax_w}&lt;br /&gt;
     w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dibaca: &amp;quot;B2U mengambil masukan berupa deretan w buah angka 0-atau-1, dan menghasilkan keluaran berupa satu bilangan antara 0 sampai UMax_w.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Bagian 4: Arah sebaliknya dan sifat bijection =&lt;br /&gt;
&lt;br /&gt;
== Langkah 8: Dari angka kembali ke bit ==&lt;br /&gt;
&lt;br /&gt;
Kita sudah bisa jalan dari bit ke angka. Sekarang arah baliknya.&lt;br /&gt;
&lt;br /&gt;
Fungsi kebalikan ini dinamai &#039;&#039;&#039;U2B_w&#039;&#039;&#039; (&#039;&#039;unsigned to binary&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== Cara mengerjakannya: metode kurangi dari yang terbesar ===&lt;br /&gt;
&lt;br /&gt;
Misal kita mau menulis &#039;&#039;&#039;11&#039;&#039;&#039; dalam 4 bit.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah A.&#039;&#039;&#039; Tulis nilai tempatnya: 8, 4, 2, 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah B.&#039;&#039;&#039; Mulai dari yang terbesar. Tanya: &amp;quot;apakah 8 muat di dalam 11?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  8 muat di 11?  Ya.   -&amp;gt; bit posisi 3 = 1&lt;br /&gt;
  Sisa: 11 - 8 = 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah C.&#039;&#039;&#039; Lanjut ke 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  4 muat di 3?   Tidak. -&amp;gt; bit posisi 2 = 0&lt;br /&gt;
  Sisa tetap: 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah D.&#039;&#039;&#039; Lanjut ke 2.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  2 muat di 3?   Ya.   -&amp;gt; bit posisi 1 = 1&lt;br /&gt;
  Sisa: 3 - 2 = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Langkah E.&#039;&#039;&#039; Lanjut ke 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  1 muat di 1?   Ya.   -&amp;gt; bit posisi 0 = 1&lt;br /&gt;
  Sisa: 1 - 1 = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hasil:&#039;&#039;&#039; &amp;lt;code&amp;gt;[1011]&amp;lt;/code&amp;gt;. Sisanya nol, berarti pas.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Cek balik:&#039;&#039;&#039; 8 + 0 + 2 + 1 = 11 ✓&lt;br /&gt;
&lt;br /&gt;
== Langkah 9: Sifat bijection ==&lt;br /&gt;
&lt;br /&gt;
Sekarang bagian yang paling penting di section ini — dan yang paling gampang dilewat karena kelihatannya cuma teori.&lt;br /&gt;
&lt;br /&gt;
Buku menyatakan sebuah prinsip: &#039;&#039;&#039;fungsi B2U_w adalah bijection&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Apa itu bijection ===&lt;br /&gt;
&lt;br /&gt;
Istilah matematika untuk fungsi yang &#039;&#039;&#039;jalan dua arah dengan rapi&#039;&#039;&#039;. Definisi dari buku: fungsi f yang memetakan nilai x ke nilai y, dan bisa juga bekerja terbalik, karena untuk setiap y ada tepat satu x yang menghasilkannya.&lt;br /&gt;
&lt;br /&gt;
Dalam konteks kita, artinya dua jaminan sekaligus:&lt;br /&gt;
&lt;br /&gt;
; Jaminan 1: Tidak ada angka yang punya dua penulisan&lt;br /&gt;
: Angka 11 dalam 4 bit hanya bisa ditulis satu cara: &amp;lt;code&amp;gt;[1011]&amp;lt;/code&amp;gt;. Tidak ada pola bit lain yang juga berarti 11.&lt;br /&gt;
&lt;br /&gt;
; Jaminan 2: Tidak ada pola bit yang tidak berarti apa-apa&lt;br /&gt;
: Semua 16 pola pada w = 4 adalah angka yang sah. Tidak ada pola yang terbuang, ilegal, atau tanpa makna.&lt;br /&gt;
&lt;br /&gt;
=== Analogi sederhana ===&lt;br /&gt;
&lt;br /&gt;
Bayangkan sebuah kamus dua bahasa yang sempurna:&lt;br /&gt;
&lt;br /&gt;
* tiap kata di bahasa A punya &#039;&#039;&#039;tepat satu&#039;&#039;&#039; terjemahan di bahasa B&lt;br /&gt;
* tiap kata di bahasa B punya &#039;&#039;&#039;tepat satu&#039;&#039;&#039; terjemahan balik di bahasa A&lt;br /&gt;
* &#039;&#039;&#039;tidak ada&#039;&#039;&#039; kata yang tidak kebagian pasangan&lt;br /&gt;
* &#039;&#039;&#039;tidak ada&#039;&#039;&#039; kata yang punya dua arti&lt;br /&gt;
&lt;br /&gt;
Kamus semacam itulah yang disebut bijection. Dan itulah hubungan antara pola bit dan bilangan tak-negatif.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Pola bit                    Bilangan&lt;br /&gt;
   (16 pola)                   (0 sampai 15)&lt;br /&gt;
&lt;br /&gt;
    [0000]  &amp;lt;------------------&amp;gt;  0&lt;br /&gt;
    [0001]  &amp;lt;------------------&amp;gt;  1&lt;br /&gt;
    [0010]  &amp;lt;------------------&amp;gt;  2&lt;br /&gt;
      ...                        ...&lt;br /&gt;
    [1111]  &amp;lt;------------------&amp;gt; 15&lt;br /&gt;
&lt;br /&gt;
   Tidak ada yang menyilang, tidak ada yang menggantung.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kenapa jaminan ini perlu disebut ===&lt;br /&gt;
&lt;br /&gt;
Karena sifat ini &#039;&#039;&#039;tidak otomatis&#039;&#039;&#039;. Ada cara pengkodean lain yang justru gagal memenuhinya.&lt;br /&gt;
&lt;br /&gt;
Contohnya &#039;&#039;&#039;sign-magnitude&#039;&#039;&#039;, yaitu skema di mana bit paling kiri dipakai sebagai tanda. Di skema itu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  [0000]  -&amp;gt;  +0&lt;br /&gt;
  [1000]  -&amp;gt;  -0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dua pola bit yang berbeda, tapi artinya sama-sama nol. Jaminan 1 langsung gugur. Akibatnya membandingkan dua angka jadi rumit, karena harus ada penanganan khusus untuk kasus nol ganda.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Ini foreshadowing|Buku sengaja menegaskan sifat bijection di sini, karena pertanyaan yang sama akan diajukan lagi untuk &#039;&#039;&#039;two&#039;s-complement&#039;&#039;&#039; di §2.2.3. Polanya: setiap kali sebuah encoding baru diperkenalkan, pertanyaan pertamanya selalu &amp;quot;apakah ini bijection?&amp;quot; Kalau ya, encoding itu bersih dan bisa dipakai. Kalau tidak, akan ada kasus khusus yang merepotkan selamanya.}}&lt;br /&gt;
&lt;br /&gt;
= Bagian 5: Latihan mandiri =&lt;br /&gt;
&lt;br /&gt;
Kerjakan dulu tanpa melihat jawaban. Semua memakai w = 4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  1.  [0110]  = ?&lt;br /&gt;
  2.  [1100]  = ?&lt;br /&gt;
  3.  [1010]  = ?&lt;br /&gt;
  4.  [0111]  = ?&lt;br /&gt;
  5.  Tulis 13 dalam 4 bit&lt;br /&gt;
  6.  Tulis  9 dalam 4 bit&lt;br /&gt;
  7.  Berapa UMax untuk w = 6?&lt;br /&gt;
  8.  Ada berapa pola bit yang mungkin untuk w = 6?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jawaban ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  1.  [0110]  =  0 + 4 + 2 + 0  =  6&lt;br /&gt;
  2.  [1100]  =  8 + 4 + 0 + 0  = 12&lt;br /&gt;
  3.  [1010]  =  8 + 0 + 2 + 0  = 10&lt;br /&gt;
  4.  [0111]  =  0 + 4 + 2 + 1  =  7&lt;br /&gt;
  5.  13 = 8 + 4 + 1        -&amp;gt;  [1101]&lt;br /&gt;
  6.   9 = 8 + 1            -&amp;gt;  [1001]&lt;br /&gt;
  7.  UMax_6 = 2^6 - 1 = 63&lt;br /&gt;
  8.  2^6 = 64 pola&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Catatan untuk kerja systems =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sifat &amp;quot;tidak ada pola ilegal&amp;quot; adalah alasan overflow unsigned di C terdefinisi.&#039;&#039;&#039; Karena setiap hasil setelah dipotong ke w bit pasti jatuh ke pola bit yang sah, standar C bisa menyatakan dengan tegas bahwa hasilnya membungkus (&#039;&#039;wrap&#039;&#039;) secara modulo 2^w. Bandingkan dengan integer bertanda, yang overflow-nya justru dinyatakan sebagai &#039;&#039;undefined behavior&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;UMax muncul terus di kode nyata.&#039;&#039;&#039; Nilai 255, 65535, dan 4294967295 bukan angka acak — semuanya UMax untuk lebar 8, 16, dan 32 bit. Begitu melihat angka-angka itu di log atau di debugger, biasanya ada operasi unsigned yang membungkus.&lt;br /&gt;
* &#039;&#039;&#039;Pengurangan unsigned adalah sumber bug klasik.&#039;&#039;&#039; Karena tidak ada nilai negatif dalam encoding ini, ekspresi seperti &amp;lt;code&amp;gt;0u - 1u&amp;lt;/code&amp;gt; tidak menghasilkan minus satu melainkan UMax. Bug perbandingan seperti &amp;lt;code&amp;gt;for (unsigned i = n-1; i &amp;gt;= 0; i--)&amp;lt;/code&amp;gt; tidak pernah berhenti, karena kondisi &amp;lt;code&amp;gt;i &amp;gt;= 0&amp;lt;/code&amp;gt; selalu benar untuk tipe unsigned.&lt;br /&gt;
* &#039;&#039;&#039;Relevansi ke quantization.&#039;&#039;&#039; Rentang uint8 adalah 0 sampai UMax_8 = 255, tepat 256 level. Sifat bijection itulah yang membuat pemetaan bolak-balik antara nilai real dan level kuantisasi bersih: setiap level punya satu pola bit, dan setiap pola bit adalah level yang sah. Tidak ada pola terbuang yang perlu ditangani khusus.&lt;br /&gt;
* &#039;&#039;&#039;Lebar bit adalah parameter, bukan konstanta.&#039;&#039;&#039; Semua rumus di section ini memakai w. Kebiasaan berpikir dalam w, bukan dalam angka 32 atau 64, sangat membantu saat berpindah antara uint8, fp16, dan format kustom di pekerjaan akselerator.&lt;br /&gt;
&lt;br /&gt;
= Istilah kunci =&lt;br /&gt;
&lt;br /&gt;
; Bit vector&lt;br /&gt;
: Deretan bit; ditulis &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; bertanda panah untuk keseluruhan, atau &amp;lt;code&amp;gt;x_i&amp;lt;/code&amp;gt; untuk bit di posisi ke-i.&lt;br /&gt;
; w&lt;br /&gt;
: Lebar, yaitu banyaknya bit dalam vektor.&lt;br /&gt;
; Nilai tempat&lt;br /&gt;
: Bobot sebuah posisi bit, yaitu 2 pangkat nomor posisinya.&lt;br /&gt;
; B2U_w&lt;br /&gt;
: Fungsi yang memetakan vektor bit selebar w menjadi bilangan tak-negatif.&lt;br /&gt;
; U2B_w&lt;br /&gt;
: Fungsi kebalikannya, memetakan bilangan menjadi pola bit.&lt;br /&gt;
; UMax_w&lt;br /&gt;
: Nilai terbesar yang bisa direpresentasikan, yaitu 2^w - 1.&lt;br /&gt;
; Bijection&lt;br /&gt;
: Fungsi yang berpasangan satu-satu dua arah; tidak ada nilai ganda dan tidak ada yang tidak terpasangkan.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=857</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=857"/>
		<updated>2026-09-08T02:56:15Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
* [[Unsigned Encodings]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=CS:APP_2_Intro&amp;diff=856</id>
		<title>CS:APP 2 Intro</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=CS:APP_2_Intro&amp;diff=856"/>
		<updated>2026-09-05T03:48:51Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Kenapa biner ==  Komputer modern menyimpan dan memproses informasi yang direpresentasikan sebagai &amp;#039;&amp;#039;&amp;#039;sinyal bernilai dua&amp;#039;&amp;#039;&amp;#039;. Digit biner sederhana inilah — &amp;#039;&amp;#039;&amp;#039;bit&amp;#039;&amp;#039;&amp;#039; — yang jadi dasar revolusi digital.  === Sedikit sejarah desimal ===  Notasi desimal (basis 10) sudah dipakai lebih dari &amp;#039;&amp;#039;&amp;#039;1.000 tahun&amp;#039;&amp;#039;&amp;#039;:  * &amp;#039;&amp;#039;&amp;#039;dikembangkan di India&amp;#039;&amp;#039;&amp;#039; * &amp;#039;&amp;#039;&amp;#039;disempurnakan matematikawan Arab&amp;#039;&amp;#039;&amp;#039; pada abad ke-12 * &amp;#039;&amp;#039;&amp;#039;dibawa ke Barat&amp;#039;&amp;#039;&amp;#039; pada abad ke-13 oleh matematikawan Italia &amp;#039;&amp;#039;&amp;#039;Leona...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Kenapa biner ==&lt;br /&gt;
&lt;br /&gt;
Komputer modern menyimpan dan memproses informasi yang direpresentasikan sebagai &#039;&#039;&#039;sinyal bernilai dua&#039;&#039;&#039;. Digit biner sederhana inilah — &#039;&#039;&#039;bit&#039;&#039;&#039; — yang jadi dasar revolusi digital.&lt;br /&gt;
&lt;br /&gt;
=== Sedikit sejarah desimal ===&lt;br /&gt;
&lt;br /&gt;
Notasi desimal (basis 10) sudah dipakai lebih dari &#039;&#039;&#039;1.000 tahun&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;dikembangkan di India&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;disempurnakan matematikawan Arab&#039;&#039;&#039; pada abad ke-12&lt;br /&gt;
* &#039;&#039;&#039;dibawa ke Barat&#039;&#039;&#039; pada abad ke-13 oleh matematikawan Italia &#039;&#039;&#039;Leonardo Pisano&#039;&#039;&#039; (ca. 1170–1250), yang lebih dikenal sebagai &#039;&#039;&#039;Fibonacci&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Notasi desimal terasa alami untuk manusia yang berjari sepuluh. Tapi &#039;&#039;&#039;nilai biner bekerja lebih baik untuk membangun mesin&#039;&#039;&#039; yang menyimpan dan memproses informasi.&lt;br /&gt;
&lt;br /&gt;
=== Kenapa dua nilai lebih mudah dibuat ===&lt;br /&gt;
&lt;br /&gt;
Sinyal bernilai dua gampang direpresentasikan, disimpan, dan ditransmisikan. Contoh dari buku:&lt;br /&gt;
&lt;br /&gt;
* ada atau tidak adanya lubang pada kartu berlubang&lt;br /&gt;
* tegangan tinggi atau rendah pada sebuah kawat&lt;br /&gt;
* domain magnetik yang berorientasi searah atau berlawanan jarum jam&lt;br /&gt;
&lt;br /&gt;
Rangkaian elektronik untuk menyimpan dan menghitung sinyal bernilai dua &#039;&#039;&#039;sangat sederhana dan andal&#039;&#039;&#039;. Karena itulah produsen bisa mengintegrasikan &#039;&#039;&#039;jutaan bahkan miliaran&#039;&#039;&#039; rangkaian semacam itu ke satu keping silikon.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Poin yang sering terlewat|Biner dipilih bukan karena lebih &amp;quot;benar&amp;quot; secara matematis, tapi karena &#039;&#039;&#039;lebih gampang dibikin dan lebih tahan derau&#039;&#039;&#039;. Membedakan dua level tegangan jauh lebih andal daripada membedakan sepuluh level. Ini keputusan rekayasa, bukan keputusan matematika.}}&lt;br /&gt;
&lt;br /&gt;
== Bit sendirian tidak berguna ==&lt;br /&gt;
&lt;br /&gt;
Sebuah bit tunggal, berdiri sendiri, tidak banyak gunanya. Kekuatannya baru muncul ketika kita:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;mengelompokkan bit&#039;&#039;&#039;, lalu&lt;br /&gt;
# &#039;&#039;&#039;menerapkan suatu penafsiran&#039;&#039;&#039; yang memberi makna pada pola-pola bit yang mungkin&lt;br /&gt;
&lt;br /&gt;
Dengan dua langkah itu, kita bisa merepresentasikan &#039;&#039;&#039;elemen dari himpunan berhingga apa pun&#039;&#039;&#039;. Misalnya sistem bilangan biner untuk mengkodekan bilangan tak-negatif, atau kode karakter standar untuk mengkodekan huruf dan simbol.&lt;br /&gt;
&lt;br /&gt;
Perhatikan bahwa &#039;&#039;&#039;maknanya tidak ada di dalam bit itu sendiri&#039;&#039;&#039; — makna datang dari penafsiran yang kita tempelkan. Pola bit yang sama persis bisa berarti bilangan, huruf, atau instruksi, tergantung cara kita membacanya.&lt;br /&gt;
&lt;br /&gt;
== Tiga representasi bilangan ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Representasi !! Dasar !! Untuk apa&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unsigned&#039;&#039;&#039; || Notasi biner tradisional || Bilangan lebih besar atau sama dengan 0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Two&#039;s-complement&#039;&#039;&#039; || — || Cara paling umum merepresentasikan integer bertanda (positif maupun negatif)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Floating-point&#039;&#039;&#039; || Versi basis 2 dari notasi ilmiah || Bilangan real (secara aproksimasi)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Komputer mengimplementasikan operasi aritmetika seperti penjumlahan dan perkalian pada ketiga representasi ini, mirip dengan operasi yang bersesuaian pada integer dan bilangan real.&lt;br /&gt;
&lt;br /&gt;
== Overflow dan kejutannya ==&lt;br /&gt;
&lt;br /&gt;
Representasi komputer memakai &#039;&#039;&#039;jumlah bit yang terbatas&#039;&#039;&#039;, sehingga sebagian operasi bisa &#039;&#039;&#039;overflow&#039;&#039;&#039; ketika hasilnya terlalu besar untuk direpresentasikan. Ini bisa memberi hasil yang mengejutkan.&lt;br /&gt;
&lt;br /&gt;
=== Contoh integer ===&lt;br /&gt;
&lt;br /&gt;
Di kebanyakan komputer sekarang (yang memakai representasi 32-bit untuk tipe &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
200 * 300 * 400 * 500   =   -884.901.888&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perkalian sekumpulan bilangan &#039;&#039;&#039;positif&#039;&#039;&#039; menghasilkan bilangan &#039;&#039;&#039;negatif&#039;&#039;&#039;. Ini bertentangan dengan sifat aritmetika integer yang kita kenal.&lt;br /&gt;
&lt;br /&gt;
=== Tapi konsisten ===&lt;br /&gt;
&lt;br /&gt;
Meski begitu, aritmetika integer komputer &#039;&#039;&#039;tetap memenuhi banyak sifat&#039;&#039;&#039; aritmetika integer sejati. Perkalian tetap &#039;&#039;&#039;asosiatif dan komutatif&#039;&#039;&#039;, sehingga semua ekspresi berikut menghasilkan angka yang sama, −884.901.888:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(500 * 400) * (300 * 200)&lt;br /&gt;
((500 * 400) * 300) * 200&lt;br /&gt;
((200 * 500) * 300) * 400&lt;br /&gt;
400 * (200 * (300 * 500))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kalimat penutup bukunya pantas dikutip: komputer mungkin tidak menghasilkan hasil yang diharapkan, &#039;&#039;&#039;tapi setidaknya konsisten&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Floating point punya penyakit yang berbeda ==&lt;br /&gt;
&lt;br /&gt;
Aritmetika floating-point punya sifat matematis yang &#039;&#039;&#039;sama sekali berbeda&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Hasil kali sekumpulan bilangan positif &#039;&#039;&#039;selalu positif&#039;&#039;&#039; — meski overflow akan menghasilkan nilai khusus &#039;&#039;&#039;+∞&#039;&#039;&#039;.&lt;br /&gt;
* Tapi aritmetika floating-point &#039;&#039;&#039;tidak asosiatif&#039;&#039;&#039;, akibat presisi representasinya yang terbatas.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(3.14 + 1e20) - 1e20   -&amp;gt;   0.0     di kebanyakan mesin&lt;br /&gt;
3.14 + (1e20 - 1e20)   -&amp;gt;   3.14&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cuma letak kurungnya yang dipindah, hasilnya berbeda total. Penyebabnya: saat 3.14 dijumlahkan ke 1e20, nilainya terlalu kecil untuk memengaruhi digit-digit signifikan yang tersedia, sehingga hilang dibulatkan.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Dua penyakit yang berbeda|Integer bisa memberi hasil &#039;&#039;&#039;salah tapi konsisten&#039;&#039;&#039; — urutan operasi tidak mengubah apa pun. Floating point memberi hasil &#039;&#039;&#039;hampir benar tapi bergantung urutan&#039;&#039;&#039;. Jangan menyamakan strategi menghadapi keduanya.}}&lt;br /&gt;
&lt;br /&gt;
== Akar dari semua perbedaan itu ==&lt;br /&gt;
&lt;br /&gt;
Sifat matematis integer dan floating-point berbeda karena &#039;&#039;&#039;cara keduanya menangani keterbatasan representasinya&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! Rentang !! Ketepatan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Integer&#039;&#039;&#039; || relatif &#039;&#039;&#039;kecil&#039;&#039;&#039; || &#039;&#039;&#039;presisi&#039;&#039;&#039; (tepat)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Floating-point&#039;&#039;&#039; || &#039;&#039;&#039;luas&#039;&#039;&#039; || hanya &#039;&#039;&#039;aproksimasi&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Satu kalimat ini adalah inti seluruh Bab 2. Semua keanehan di sisa bab — overflow, pembulatan, kehilangan presisi — adalah konsekuensi dari trade-off ini.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Relevansi ke quantization|Trade-off rentang lawan presisi inilah keputusan inti setiap kali memilih format numerik untuk inferensi model. fp32 punya rentang luas dan presisi memadai tapi mahal; fp16 mempersempit rentang; bf16 mempertahankan rentang fp32 tapi memangkas presisi; int8 membuang rentang dinamis sepenuhnya demi ketepatan pada skala tetap. Semuanya adalah titik-titik berbeda pada tabel di atas.}}&lt;br /&gt;
&lt;br /&gt;
== Kenapa ini penting dipelajari ==&lt;br /&gt;
&lt;br /&gt;
Buku menyebut beberapa alasan:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kebenaran program.&#039;&#039;&#039; Memahami rentang nilai yang bisa direpresentasikan dan sifat operasinya penting untuk menulis program yang bekerja benar &#039;&#039;&#039;pada seluruh rentang nilai numerik&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Portabilitas.&#039;&#039;&#039; Agar program tetap benar di berbagai kombinasi mesin, operating system, dan compiler.&lt;br /&gt;
* &#039;&#039;&#039;Keamanan.&#039;&#039;&#039; Sejumlah kerentanan keamanan komputer &#039;&#039;&#039;muncul dari kehalusan aritmetika komputer&#039;&#039;&#039;. Dulu bug program cuma merepotkan orang saat kebetulan terpicu; sekarang ada banyak sekali penyerang yang mencoba mengeksploitasi bug apa pun untuk mendapat akses tak sah ke sistem orang lain. Ini menaruh kewajiban lebih tinggi pada programmer untuk memahami cara programnya bekerja &#039;&#039;&#039;dan cara program itu bisa dibuat berperilaku tidak diinginkan&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Prasyarat Bab 3.&#039;&#039;&#039; Representasi ini harus dikenal sebelum masuk pemrograman tingkat mesin.&lt;br /&gt;
* &#039;&#039;&#039;Memahami output compiler.&#039;&#039;&#039; Buku menurunkan beberapa cara melakukan operasi aritmetika dengan langsung memanipulasi representasi tingkat bit. Teknik ini penting untuk memahami kode tingkat mesin yang dihasilkan compiler saat berusaha mengoptimalkan evaluasi ekspresi aritmetika.&lt;br /&gt;
&lt;br /&gt;
== Pendekatan buku ==&lt;br /&gt;
&lt;br /&gt;
Pembahasan bab ini berbasis &#039;&#039;&#039;seperangkat prinsip matematis inti&#039;&#039;&#039;. Alurnya:&lt;br /&gt;
&lt;br /&gt;
# mulai dari &#039;&#039;&#039;definisi dasar&#039;&#039;&#039; encoding&lt;br /&gt;
# turunkan sifat-sifatnya: &#039;&#039;&#039;rentang bilangan&#039;&#039;&#039; yang bisa direpresentasikan, &#039;&#039;&#039;representasi tingkat bit&#039;&#039;&#039;-nya, dan &#039;&#039;&#039;sifat operasi aritmetika&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Buku sengaja memakai sudut pandang abstrak ini, karena programmer perlu punya pemahaman jelas tentang bagaimana aritmetika komputer berhubungan dengan aritmetika integer dan real yang lebih familiar.&lt;br /&gt;
&lt;br /&gt;
== Catatan tentang bahasa lain ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bahasa !! Hubungannya&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;C++&#039;&#039;&#039; || Dibangun di atas C, memakai &#039;&#039;&#039;representasi dan operasi numerik yang persis sama&#039;&#039;&#039;. Semua yang dikatakan tentang C di bab ini berlaku juga untuk C++.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Java&#039;&#039;&#039; || Membuat &#039;&#039;&#039;seperangkat standar baru&#039;&#039;&#039;. Standar C dirancang untuk memungkinkan &#039;&#039;&#039;rentang implementasi yang luas&#039;&#039;&#039;, sedangkan standar Java &#039;&#039;&#039;sangat spesifik&#039;&#039;&#039; soal format dan encoding data.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Konsisten&amp;quot; itu benar di level hardware, tapi bukan jaminan di level bahasa C.&#039;&#039;&#039; Standar C menyatakan overflow pada integer &#039;&#039;&#039;bertanda&#039;&#039;&#039; sebagai &#039;&#039;undefined behavior&#039;&#039;, sehingga compiler boleh mengasumsikan hal itu tidak pernah terjadi dan mengoptimalkan berdasarkan asumsi itu. Overflow pada integer &#039;&#039;&#039;tak bertanda&#039;&#039;&#039; terdefinisi dan membungkus (&#039;&#039;wrap&#039;&#039;). Gunakan &amp;lt;code&amp;gt;-fwrapv&amp;lt;/code&amp;gt; bila memang menginginkan perilaku membungkus, atau &amp;lt;code&amp;gt;-fsanitize=undefined&amp;lt;/code&amp;gt; untuk mendeteksinya saat pengujian.&lt;br /&gt;
* &#039;&#039;&#039;Rust memilih sikap berbeda.&#039;&#039;&#039; Overflow integer memicu panic pada build debug dan membungkus pada build release. Kalau perilakunya ingin eksplisit, tersedia &amp;lt;code&amp;gt;wrapping_mul&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;checked_mul&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;saturating_mul&amp;lt;/code&amp;gt;, dan &amp;lt;code&amp;gt;overflowing_mul&amp;lt;/code&amp;gt;. Pilihan eksplisit ini menghilangkan seluruh kelas ambiguitas yang ada di C.&lt;br /&gt;
* &#039;&#039;&#039;Non-asosiativitas floating point punya konsekuensi langsung pada komputasi paralel.&#039;&#039;&#039; Reduksi penjumlahan yang dipecah ke sejumlah thread menjumlahkan dalam urutan berbeda, sehingga hasilnya bisa berbeda saat jumlah thread diubah. Inilah sebabnya hasil pelatihan model bisa tidak reproducible antar konfigurasi, dan sebabnya ada mode reduksi deterministik di banyak pustaka.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;-ffast-math&amp;lt;/code&amp;gt; mengizinkan compiler menganggap floating point asosiatif.&#039;&#039;&#039; Itu memang membuka peluang vektorisasi dan penyusunan ulang, tapi sekaligus melanggar jaminan IEEE 754. Berguna untuk sebagian beban kerja, berbahaya untuk kode numerik yang sensitif — dan keputusan ini sebaiknya diambil sadar, bukan diwarisi dari &amp;lt;code&amp;gt;-Ofast&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Overflow integer adalah pintu masuk klasik kerentanan keamanan.&#039;&#039;&#039; Pola paling umum: menghitung ukuran buffer lewat perkalian, hasilnya overflow menjadi angka kecil, alokasi jadi terlalu kecil, lalu penulisan berikutnya meluber. Ini persis &amp;quot;kehalusan aritmetika komputer&amp;quot; yang disinggung buku.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Cara cepat membuktikan sendiri contoh di atas: kompilasi program kecil berisi &amp;lt;code&amp;gt;printf(&amp;quot;%d\n&amp;quot;, 200*300*400*500);&amp;lt;/code&amp;gt; lalu bandingkan dengan &amp;lt;code&amp;gt;printf(&amp;quot;%f\n&amp;quot;, (3.14+1e20)-1e20);&amp;lt;/code&amp;gt;. Dua baris itu meringkas seluruh pengantar bab ini.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Bit&lt;br /&gt;
: Digit biner; sinyal bernilai dua yang jadi dasar penyimpanan dan pemrosesan informasi.&lt;br /&gt;
; Encoding&lt;br /&gt;
: Penafsiran yang diterapkan pada sekelompok bit sehingga pola bit punya makna.&lt;br /&gt;
; Unsigned encoding&lt;br /&gt;
: Representasi berbasis notasi biner tradisional untuk bilangan tak-negatif.&lt;br /&gt;
; Two&#039;s-complement encoding&lt;br /&gt;
: Cara paling umum merepresentasikan integer bertanda.&lt;br /&gt;
; Floating-point encoding&lt;br /&gt;
: Versi basis 2 dari notasi ilmiah untuk merepresentasikan bilangan real secara aproksimasi.&lt;br /&gt;
; Overflow&lt;br /&gt;
: Keadaan ketika hasil operasi terlalu besar untuk direpresentasikan oleh jumlah bit yang tersedia.&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=855</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=855"/>
		<updated>2026-09-05T03:48:18Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
&lt;br /&gt;
=== Representing and Manipulating Information ===&lt;br /&gt;
* [[CS:APP 2 Intro]]&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=854</id>
		<title>Concurrency &amp; Parallelism</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=854"/>
		<updated>2026-09-05T02:54:25Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dua tuntutan abadi ==&lt;br /&gt;
&lt;br /&gt;
Sepanjang sejarah komputer digital, ada dua tuntutan yang jadi pendorong tetap perbaikan:&lt;br /&gt;
&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;melakukan lebih banyak&#039;&#039;&#039;&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;berjalan lebih cepat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Keduanya membaik ketika processor &#039;&#039;&#039;mengerjakan lebih banyak hal sekaligus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Concurrency vs parallelism ==&lt;br /&gt;
&lt;br /&gt;
Ini definisi yang wajib dipegang, dan bukunya memisahkan keduanya dengan tegas:&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum tentang &#039;&#039;&#039;sistem dengan banyak aktivitas yang simultan&#039;&#039;&#039;.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: &#039;&#039;&#039;Penggunaan concurrency untuk membuat sistem berjalan lebih cepat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Bukan sinonim, bukan juga lawan|Parallelism adalah &#039;&#039;bagian dari&#039;&#039; concurrency, bukan istilah sejajar. Concurrency menjawab pertanyaan &amp;quot;apakah sistem mengurus banyak hal sekaligus&amp;quot;, parallelism menjawab &amp;quot;apakah keserentakan itu dipakai untuk mempercepat&amp;quot;. Sistem bisa concurrent tanpa parallel — misalnya uniprocessor yang bergantian antar process.}}&lt;br /&gt;
&lt;br /&gt;
Parallelism bisa dimanfaatkan pada &#039;&#039;&#039;beberapa tingkat abstraksi&#039;&#039;&#039;. Buku menyoroti tiga, dari yang tertinggi ke terendah:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tingkat !! Siapa yang mengatur&lt;br /&gt;
|-&lt;br /&gt;
| Thread-level concurrency || Programmer dan OS&lt;br /&gt;
|-&lt;br /&gt;
| Instruction-level parallelism || Hardware, otomatis&lt;br /&gt;
|-&lt;br /&gt;
| SIMD parallelism || Programmer dan compiler ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Thread-Level Concurrency =&lt;br /&gt;
&lt;br /&gt;
== Dari process ke thread ==&lt;br /&gt;
&lt;br /&gt;
Berdiri di atas abstraksi [[process|process]], kita bisa merancang sistem tempat &#039;&#039;&#039;beberapa program berjalan pada saat yang sama&#039;&#039;&#039;. Dengan [[Threads|thread]], kita bahkan bisa punya &#039;&#039;&#039;beberapa alur kontrol di dalam satu process&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dukungan untuk eksekusi concurrent sudah ada sejak munculnya &#039;&#039;&#039;time-sharing di awal 1960-an&#039;&#039;&#039;. Secara tradisional, eksekusi concurrent itu cuma &#039;&#039;&#039;disimulasikan&#039;&#039;&#039; — satu komputer berpindah cepat di antara process-process yang sedang berjalan, seperti pemain sulap yang menjaga beberapa bola tetap melayang di udara.&lt;br /&gt;
&lt;br /&gt;
Bentuk concurrency ini memungkinkan:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;banyak user berinteraksi dengan satu sistem sekaligus&#039;&#039;&#039; — misalnya banyak orang meminta halaman dari satu Web server&lt;br /&gt;
* &#039;&#039;&#039;satu user mengerjakan banyak tugas sekaligus&#039;&#039;&#039; — browser di satu jendela, word processor di jendela lain, sambil memutar musik&lt;br /&gt;
&lt;br /&gt;
== Uniprocessor dan multiprocessor ==&lt;br /&gt;
&lt;br /&gt;
Sampai belum lama ini, sebagian besar komputasi nyata dikerjakan &#039;&#039;&#039;satu processor&#039;&#039;&#039;, meski processor itu harus bergantian antar tugas. Konfigurasi ini disebut &#039;&#039;&#039;uniprocessor system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ketika kita membangun sistem yang terdiri dari &#039;&#039;&#039;beberapa processor, semuanya di bawah kendali satu kernel operating system&#039;&#039;&#039;, itu disebut &#039;&#039;&#039;multiprocessor system&#039;&#039;&#039;. Sistem seperti ini sudah tersedia untuk komputasi skala besar sejak &#039;&#039;&#039;1980-an&#039;&#039;&#039;, tapi baru jadi umum belakangan berkat multi-core dan hyperthreading.&lt;br /&gt;
&lt;br /&gt;
=== Taksonomi (Figure 1.16) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
| All processors                                        |&lt;br /&gt;
|                                                       |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
| |                  |  | Multiprocessors             | |&lt;br /&gt;
| | Uniprocessors    |  |                             | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| |                  |  |  | Multi-core | | Hyper-  | | |&lt;br /&gt;
| |                  |  |  |            | | threaded| | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bahwa multi-core dan hyperthreaded &#039;&#039;&#039;dua-duanya masuk kategori multiprocessor&#039;&#039;&#039; — dan keduanya bisa ada bersamaan di satu chip.&lt;br /&gt;
&lt;br /&gt;
== Multi-core processor ==&lt;br /&gt;
&lt;br /&gt;
Multi-core processor punya &#039;&#039;&#039;beberapa CPU (disebut &amp;quot;core&amp;quot;) yang diintegrasikan ke satu chip sirkuit terpadu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Organisasi (Figure 1.17) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Processor package&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
|  Core 0                              Core 3             |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|  |       Regs        |               |      Regs      | |&lt;br /&gt;
|  +---------+---------+     . . .     +--------+-------+ |&lt;br /&gt;
|  | L1 d-$  | L1 i-$  |               | L1 d-$ | L1 i-$| |&lt;br /&gt;
|  +---------+---------+               +--------+-------+ |&lt;br /&gt;
|  |  L2 unified cache |               | L2 unified $   | |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|                                                         |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
|  |   L3 unified cache (dibagi semua core)            |  |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
                          |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
                 |   Main memory    |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang perlu dibaca dari gambar ini:&lt;br /&gt;
&lt;br /&gt;
* Chip contohnya punya &#039;&#039;&#039;empat core&#039;&#039;&#039;.&lt;br /&gt;
* Tiap core punya &#039;&#039;&#039;L1 dan L2 cache sendiri&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;L1 dipecah dua&#039;&#039;&#039;: satu menampung instruksi yang baru diambil, satu menampung data.&lt;br /&gt;
* Core &#039;&#039;&#039;berbagi level cache yang lebih tinggi&#039;&#039;&#039; (L3) serta &#039;&#039;&#039;antarmuka ke main memory&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pakar industri memperkirakan akan ada &#039;&#039;&#039;puluhan, dan akhirnya ratusan core&#039;&#039;&#039; dalam satu chip.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Kenapa L1 dipecah, L2 tidak|L1 dipisah instruksi dan data supaya processor bisa mengambil instruksi dan mengakses data dalam siklus yang sama tanpa saling menunggu. Di level L2 ke atas tekanannya sudah tidak sebesar itu, jadi cukup satu cache terpadu (&#039;&#039;unified&#039;&#039;).}}&lt;br /&gt;
&lt;br /&gt;
== Hyperthreading ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hyperthreading&#039;&#039;&#039;, kadang disebut &#039;&#039;&#039;simultaneous multi-threading (SMT)&#039;&#039;&#039;, adalah teknik yang memungkinkan &#039;&#039;&#039;satu CPU mengeksekusi beberapa alur kontrol&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caranya: &#039;&#039;&#039;menduplikasi sebagian hardware CPU&#039;&#039;&#039; sambil tetap &#039;&#039;&#039;menyisakan satu salinan untuk bagian lainnya&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Diduplikasi !! Tetap satu salinan&lt;br /&gt;
|-&lt;br /&gt;
| Program counter || Unit aritmetika floating-point&lt;br /&gt;
|-&lt;br /&gt;
| Register file || (dan unit eksekusi lain)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perbedaan kecepatannya dramatis:&lt;br /&gt;
&lt;br /&gt;
* Processor konvensional butuh sekitar &#039;&#039;&#039;20.000 clock cycle&#039;&#039;&#039; untuk berpindah antar thread.&lt;br /&gt;
* Processor hyperthreaded memutuskan thread mana yang dieksekusi &#039;&#039;&#039;pada basis siklus per siklus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ini memungkinkan CPU memanfaatkan sumber daya pemrosesannya lebih baik. Contohnya: kalau satu thread harus menunggu data dimuat ke cache, CPU bisa lanjut mengeksekusi thread lain.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: &#039;&#039;&#039;Intel Core i7&#039;&#039;&#039; bisa menjalankan dua thread per core, sehingga sistem empat core sebenarnya mengeksekusi &#039;&#039;&#039;delapan thread secara paralel&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Thread software vs thread hardware|Kata &amp;quot;thread&amp;quot; di sini berbeda makna dengan thread di [[Threads|§1.7.2]]. Thread di §1.7.2 adalah konsep OS yang dibuat programmer dan jumlahnya dinamis. Thread di hyperthreading adalah konsep hardware — set register dan PC yang diduplikasi di silikon, jumlahnya tetap dari pabrik. Analoginya: thread hardware adalah &#039;&#039;kursi&#039;&#039;, thread software adalah &#039;&#039;orang yang duduk&#039;&#039;. Inilah kenapa &amp;lt;code&amp;gt;nproc&amp;lt;/code&amp;gt; di mesin 8 core melaporkan 16.}}&lt;br /&gt;
&lt;br /&gt;
== Dua cara multiprocessing meningkatkan performa ==&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Mengurangi kebutuhan menyimulasikan concurrency&#039;&#039;&#039; saat mengerjakan banyak tugas. Bahkan komputer pribadi dengan satu pengguna tetap diharapkan melakukan banyak aktivitas sekaligus.&lt;br /&gt;
# &#039;&#039;&#039;Menjalankan satu program aplikasi lebih cepat&#039;&#039;&#039; — &#039;&#039;&#039;tapi hanya jika&#039;&#039;&#039; program itu dinyatakan dalam bentuk beberapa thread yang bisa benar-benar dieksekusi secara paralel.&lt;br /&gt;
&lt;br /&gt;
Syarat pada poin kedua itu penting. Menambah core &#039;&#039;&#039;tidak otomatis&#039;&#039;&#039; mempercepat program yang ditulis single-threaded.&lt;br /&gt;
&lt;br /&gt;
Prinsip concurrency sudah dirumuskan dan dipelajari lebih dari &#039;&#039;&#039;50 tahun&#039;&#039;&#039;, tapi kehadiran sistem multi-core dan hyperthreaded sangat meningkatkan kebutuhan menemukan cara menulis program yang bisa memanfaatkan &#039;&#039;&#039;thread-level parallelism&#039;&#039;&#039; yang disediakan hardware.&lt;br /&gt;
&lt;br /&gt;
= Instruction-Level Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat abstraksi yang jauh lebih rendah, processor modern bisa &#039;&#039;&#039;mengeksekusi beberapa instruksi sekaligus&#039;&#039;&#039;. Sifat ini disebut &#039;&#039;&#039;instruction-level parallelism (ILP)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perbandingan angkanya:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Processor !! Laju eksekusi&lt;br /&gt;
|-&lt;br /&gt;
| Intel 8086 (1978) || butuh &#039;&#039;&#039;3–10 clock cycle&#039;&#039;&#039; untuk &#039;&#039;&#039;satu&#039;&#039;&#039; instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Processor modern || mempertahankan &#039;&#039;&#039;2–4 instruksi per clock cycle&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Yang mengejutkan: instruksi mana pun tetap butuh &#039;&#039;&#039;20 siklus atau lebih&#039;&#039;&#039; dari awal sampai selesai. Processor cuma memakai berbagai trik cerdas untuk &#039;&#039;&#039;memproses sampai 100 instruksi sekaligus&#039;&#039;&#039; dalam berbagai tahap penyelesaian.&lt;br /&gt;
&lt;br /&gt;
== Pipelining ==&lt;br /&gt;
&lt;br /&gt;
Dibahas di &#039;&#039;&#039;Bab 4&#039;&#039;&#039;. Idenya: tindakan yang dibutuhkan untuk mengeksekusi sebuah instruksi &#039;&#039;&#039;dipartisi jadi beberapa langkah&#039;&#039;&#039;, dan hardware processor disusun sebagai &#039;&#039;&#039;rangkaian stage&#039;&#039;&#039;, masing-masing mengerjakan satu langkah.&lt;br /&gt;
&lt;br /&gt;
Stage-stage itu bisa &#039;&#039;&#039;beroperasi paralel&#039;&#039;&#039;, mengerjakan bagian berbeda dari instruksi yang berbeda. Desain hardware yang cukup sederhana pun bisa mempertahankan laju eksekusi mendekati &#039;&#039;&#039;1 instruksi per clock cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Superscalar ==&lt;br /&gt;
&lt;br /&gt;
Processor yang bisa mempertahankan laju eksekusi &#039;&#039;&#039;lebih cepat dari 1 instruksi per siklus&#039;&#039;&#039; disebut &#039;&#039;&#039;superscalar&#039;&#039;&#039;. Sebagian besar processor modern mendukung operasi superscalar.&lt;br /&gt;
&lt;br /&gt;
Bab 5 menjelaskan model tingkat tinggi processor semacam ini — dan poin pentingnya: &#039;&#039;&#039;programmer aplikasi bisa memakai model itu untuk memahami performa programnya&#039;&#039;&#039;, lalu menulis program supaya kode yang dihasilkan mencapai ILP lebih tinggi dan berjalan lebih cepat.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|ILP berjalan &#039;&#039;&#039;otomatis tanpa diminta&#039;&#039;&#039;. Programmer tidak menulis kode khusus untuk mengaktifkannya. Tapi programmer &#039;&#039;bisa&#039;&#039; menulis kode yang menghalanginya — misalnya rantai ketergantungan data yang panjang atau cabang yang sulit diprediksi.}}&lt;br /&gt;
&lt;br /&gt;
= SIMD Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat terendah, banyak processor modern punya hardware khusus yang memungkinkan &#039;&#039;&#039;satu instruksi menyebabkan beberapa operasi dilakukan secara paralel&#039;&#039;&#039;. Mode ini disebut &#039;&#039;&#039;single-instruction, multiple-data (SIMD) parallelism&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: generasi terbaru processor Intel dan AMD punya instruksi yang bisa &#039;&#039;&#039;menjumlahkan 8 pasang bilangan floating-point presisi tunggal&#039;&#039;&#039; (tipe data C &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;) secara paralel.&lt;br /&gt;
&lt;br /&gt;
Instruksi SIMD ini &#039;&#039;&#039;terutama disediakan untuk mempercepat aplikasi yang memproses data gambar, suara, dan video&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Cara memakainya ==&lt;br /&gt;
&lt;br /&gt;
* Sebagian compiler &#039;&#039;&#039;berusaha mengekstrak SIMD secara otomatis&#039;&#039;&#039; dari program C.&lt;br /&gt;
* Metode yang &#039;&#039;&#039;lebih andal&#039;&#039;&#039; adalah menulis program memakai &#039;&#039;&#039;tipe data vector khusus&#039;&#039;&#039; yang didukung compiler seperti &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Gaya pemrograman ini dijelaskan di Web Aside &amp;lt;code&amp;gt;opt:simd&amp;lt;/code&amp;gt;, sebagai pelengkap pembahasan optimasi program di Bab 5.&lt;br /&gt;
&lt;br /&gt;
= Catatan untuk kerja systems =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tiga level itu berlipat, bukan bergantian.&#039;&#039;&#039; Program yang dioptimalkan baik memanfaatkan ketiganya sekaligus: beberapa thread di beberapa core, tiap thread memanfaatkan superscalar, tiap instruksi memproses banyak elemen lewat SIMD. Faktor percepatannya berkalian.&lt;br /&gt;
* &#039;&#039;&#039;Auto-vectorization butuh diverifikasi, jangan diasumsikan.&#039;&#039;&#039; Di GCC dan Clang, &amp;lt;code&amp;gt;-O3 -march=native&amp;lt;/code&amp;gt; mengaktifkan vektorisasi otomatis, tapi hasilnya sering gagal karena &#039;&#039;pointer aliasing&#039;&#039; atau alur kontrol di dalam loop. Cek dengan &amp;lt;code&amp;gt;-fopt-info-vec-missed&amp;lt;/code&amp;gt; untuk melihat loop mana yang ditolak dan alasannya. Ini alasan buku menyebut menulis eksplisit lebih andal.&lt;br /&gt;
* &#039;&#039;&#039;SIMD sekarang jauh lebih lebar dari contoh di buku.&#039;&#039;&#039; Contoh &amp;quot;8 float sekaligus&amp;quot; itu setara AVX (256-bit). AVX-512 memproses 16 float sekaligus, dan ARM punya NEON serta SVE. Lebar vektor jadi parameter yang harus dipertimbangkan, bukan konstanta.&lt;br /&gt;
* &#039;&#039;&#039;Ukur IPC sebelum mengoptimalkan.&#039;&#039;&#039; &amp;lt;code&amp;gt;perf stat ./program&amp;lt;/code&amp;gt; menampilkan &#039;&#039;instructions per cycle&#039;&#039;. Angka di bawah 1 biasanya menandakan program terhambat memory atau salah prediksi cabang, bukan kekurangan compute — dan menambahkan SIMD ke program yang &#039;&#039;memory-bound&#039;&#039; tidak akan menolong.&lt;br /&gt;
* &#039;&#039;&#039;SMT bukan percepatan gratis.&#039;&#039;&#039; Dua thread hardware pada satu core berbagi unit eksekusi, L1, dan L2. Untuk beban kerja yang sering menunggu memory, SMT menguntungkan. Untuk beban kerja compute-bound padat seperti loop AVX, keduanya justru berebut sumber daya yang sama. Ini alasan SMT sering dimatikan di lingkungan HPC — keputusannya berdasarkan pengukuran, bukan preferensi.&lt;br /&gt;
* &#039;&#039;&#039;Hati-hati saat melakukan pinning.&#039;&#039;&#039; Karena satu core fisik menyumbang dua logical CPU, mem-&#039;&#039;pin&#039;&#039; dua thread compute-heavy ke CPU 0 dan CPU 1 bisa saja berarti mengunci keduanya ke core fisik yang sama. Periksa topologi lebih dulu dengan &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; atau &amp;lt;code&amp;gt;hwloc-ls&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Syarat pada poin kedua multiprocessing adalah inti Amdahl.&#039;&#039;&#039; Percepatan hanya datang dari bagian yang bisa diparalelkan. Bagian serial program menjadi batas atas yang tidak bisa dilewati berapa pun jumlah core yang ditambahkan.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Tiga perintah untuk melihat ketiga level sekaligus: &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; untuk topologi thread-level, &amp;lt;code&amp;gt;perf stat -e instructions,cycles ./prog&amp;lt;/code&amp;gt; untuk ILP, dan &amp;lt;code&amp;gt;objdump -d ./prog {{!}} grep -E &#039;vadd{{!}}vmul&#039;&amp;lt;/code&amp;gt; untuk memastikan instruksi SIMD benar-benar dihasilkan.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum sistem dengan banyak aktivitas simultan.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: Penggunaan concurrency untuk membuat sistem berjalan lebih cepat.&lt;br /&gt;
; Uniprocessor system&lt;br /&gt;
: Sistem dengan satu processor yang bergantian antar tugas.&lt;br /&gt;
; Multiprocessor system&lt;br /&gt;
: Sistem dengan beberapa processor di bawah kendali satu kernel OS.&lt;br /&gt;
; Multi-core processor&lt;br /&gt;
: Beberapa CPU (core) yang diintegrasikan ke satu chip sirkuit terpadu.&lt;br /&gt;
; Hyperthreading&lt;br /&gt;
: Teknik yang memungkinkan satu CPU mengeksekusi beberapa alur kontrol dengan menduplikasi sebagian hardware seperti PC dan register file; disebut juga simultaneous multi-threading.&lt;br /&gt;
; Instruction-level parallelism&lt;br /&gt;
: Kemampuan processor mengeksekusi beberapa instruksi sekaligus.&lt;br /&gt;
; Pipelining&lt;br /&gt;
: Pembagian eksekusi instruksi jadi beberapa stage yang bisa beroperasi paralel.&lt;br /&gt;
; Superscalar&lt;br /&gt;
: Processor yang mempertahankan laju eksekusi lebih dari 1 instruksi per siklus.&lt;br /&gt;
; SIMD parallelism&lt;br /&gt;
: Mode ketika satu instruksi menyebabkan beberapa operasi dilakukan paralel.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[Files]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=853</id>
		<title>Concurrency &amp; Parallelism</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=853"/>
		<updated>2026-09-05T02:52:09Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dua tuntutan abadi ==&lt;br /&gt;
&lt;br /&gt;
Sepanjang sejarah komputer digital, ada dua tuntutan yang jadi pendorong tetap perbaikan:&lt;br /&gt;
&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;melakukan lebih banyak&#039;&#039;&#039;&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;berjalan lebih cepat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Keduanya membaik ketika processor &#039;&#039;&#039;mengerjakan lebih banyak hal sekaligus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Concurrency vs parallelism ==&lt;br /&gt;
&lt;br /&gt;
Ini definisi yang wajib dipegang, dan bukunya memisahkan keduanya dengan tegas:&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum tentang &#039;&#039;&#039;sistem dengan banyak aktivitas yang simultan&#039;&#039;&#039;.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: &#039;&#039;&#039;Penggunaan concurrency untuk membuat sistem berjalan lebih cepat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Bukan sinonim, bukan juga lawan|Parallelism adalah &#039;&#039;bagian dari&#039;&#039; concurrency, bukan istilah sejajar. Concurrency menjawab pertanyaan &amp;quot;apakah sistem mengurus banyak hal sekaligus&amp;quot;, parallelism menjawab &amp;quot;apakah keserentakan itu dipakai untuk mempercepat&amp;quot;. Sistem bisa concurrent tanpa parallel — misalnya uniprocessor yang bergantian antar process.}}&lt;br /&gt;
&lt;br /&gt;
Parallelism bisa dimanfaatkan pada &#039;&#039;&#039;beberapa tingkat abstraksi&#039;&#039;&#039;. Buku menyoroti tiga, dari yang tertinggi ke terendah:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tingkat !! Siapa yang mengatur&lt;br /&gt;
|-&lt;br /&gt;
| Thread-level concurrency || Programmer dan OS&lt;br /&gt;
|-&lt;br /&gt;
| Instruction-level parallelism || Hardware, otomatis&lt;br /&gt;
|-&lt;br /&gt;
| SIMD parallelism || Programmer dan compiler ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Thread-Level Concurrency =&lt;br /&gt;
&lt;br /&gt;
== Dari process ke thread ==&lt;br /&gt;
&lt;br /&gt;
Berdiri di atas abstraksi [[process|process]], kita bisa merancang sistem tempat &#039;&#039;&#039;beberapa program berjalan pada saat yang sama&#039;&#039;&#039;. Dengan [[Threads|thread]], kita bahkan bisa punya &#039;&#039;&#039;beberapa alur kontrol di dalam satu process&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dukungan untuk eksekusi concurrent sudah ada sejak munculnya &#039;&#039;&#039;time-sharing di awal 1960-an&#039;&#039;&#039;. Secara tradisional, eksekusi concurrent itu cuma &#039;&#039;&#039;disimulasikan&#039;&#039;&#039; — satu komputer berpindah cepat di antara process-process yang sedang berjalan, seperti pemain sulap yang menjaga beberapa bola tetap melayang di udara.&lt;br /&gt;
&lt;br /&gt;
Bentuk concurrency ini memungkinkan:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;banyak user berinteraksi dengan satu sistem sekaligus&#039;&#039;&#039; — misalnya banyak orang meminta halaman dari satu Web server&lt;br /&gt;
* &#039;&#039;&#039;satu user mengerjakan banyak tugas sekaligus&#039;&#039;&#039; — browser di satu jendela, word processor di jendela lain, sambil memutar musik&lt;br /&gt;
&lt;br /&gt;
== Uniprocessor dan multiprocessor ==&lt;br /&gt;
&lt;br /&gt;
Sampai belum lama ini, sebagian besar komputasi nyata dikerjakan &#039;&#039;&#039;satu processor&#039;&#039;&#039;, meski processor itu harus bergantian antar tugas. Konfigurasi ini disebut &#039;&#039;&#039;uniprocessor system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ketika kita membangun sistem yang terdiri dari &#039;&#039;&#039;beberapa processor, semuanya di bawah kendali satu kernel operating system&#039;&#039;&#039;, itu disebut &#039;&#039;&#039;multiprocessor system&#039;&#039;&#039;. Sistem seperti ini sudah tersedia untuk komputasi skala besar sejak &#039;&#039;&#039;1980-an&#039;&#039;&#039;, tapi baru jadi umum belakangan berkat multi-core dan hyperthreading.&lt;br /&gt;
&lt;br /&gt;
=== Taksonomi (Figure 1.16) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
| All processors                                        |&lt;br /&gt;
|                                                       |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
| |                  |  | Multiprocessors             | |&lt;br /&gt;
| | Uniprocessors    |  |                             | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| |                  |  |  | Multi-core | | Hyper-  | | |&lt;br /&gt;
| |                  |  |  |            | | threaded| | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bahwa multi-core dan hyperthreaded &#039;&#039;&#039;dua-duanya masuk kategori multiprocessor&#039;&#039;&#039; — dan keduanya bisa ada bersamaan di satu chip.&lt;br /&gt;
&lt;br /&gt;
== Multi-core processor ==&lt;br /&gt;
&lt;br /&gt;
Multi-core processor punya &#039;&#039;&#039;beberapa CPU (disebut &amp;quot;core&amp;quot;) yang diintegrasikan ke satu chip sirkuit terpadu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Organisasi (Figure 1.17) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Processor package&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
|  Core 0                              Core 3             |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|  |       Regs        |               |      Regs      | |&lt;br /&gt;
|  +---------+---------+     . . .     +--------+-------+ |&lt;br /&gt;
|  | L1 d-$  | L1 i-$  |               | L1 d-$ | L1 i-$| |&lt;br /&gt;
|  +---------+---------+               +--------+-------+ |&lt;br /&gt;
|  |  L2 unified cache |               | L2 unified $   | |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|                                                         |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
|  |   L3 unified cache (dibagi semua core)            |  |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
                          |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
                 |   Main memory    |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang perlu dibaca dari gambar ini:&lt;br /&gt;
&lt;br /&gt;
* Chip contohnya punya &#039;&#039;&#039;empat core&#039;&#039;&#039;.&lt;br /&gt;
* Tiap core punya &#039;&#039;&#039;L1 dan L2 cache sendiri&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;L1 dipecah dua&#039;&#039;&#039;: satu menampung instruksi yang baru diambil, satu menampung data.&lt;br /&gt;
* Core &#039;&#039;&#039;berbagi level cache yang lebih tinggi&#039;&#039;&#039; (L3) serta &#039;&#039;&#039;antarmuka ke main memory&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pakar industri memperkirakan akan ada &#039;&#039;&#039;puluhan, dan akhirnya ratusan core&#039;&#039;&#039; dalam satu chip.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Kenapa L1 dipecah, L2 tidak|L1 dipisah instruksi dan data supaya processor bisa mengambil instruksi dan mengakses data dalam siklus yang sama tanpa saling menunggu. Di level L2 ke atas tekanannya sudah tidak sebesar itu, jadi cukup satu cache terpadu (&#039;&#039;unified&#039;&#039;).}}&lt;br /&gt;
&lt;br /&gt;
== Hyperthreading ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hyperthreading&#039;&#039;&#039;, kadang disebut &#039;&#039;&#039;simultaneous multi-threading (SMT)&#039;&#039;&#039;, adalah teknik yang memungkinkan &#039;&#039;&#039;satu CPU mengeksekusi beberapa alur kontrol&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caranya: &#039;&#039;&#039;menduplikasi sebagian hardware CPU&#039;&#039;&#039; sambil tetap &#039;&#039;&#039;menyisakan satu salinan untuk bagian lainnya&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Diduplikasi !! Tetap satu salinan&lt;br /&gt;
|-&lt;br /&gt;
| Program counter || Unit aritmetika floating-point&lt;br /&gt;
|-&lt;br /&gt;
| Register file || (dan unit eksekusi lain)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perbedaan kecepatannya dramatis:&lt;br /&gt;
&lt;br /&gt;
* Processor konvensional butuh sekitar &#039;&#039;&#039;20.000 clock cycle&#039;&#039;&#039; untuk berpindah antar thread.&lt;br /&gt;
* Processor hyperthreaded memutuskan thread mana yang dieksekusi &#039;&#039;&#039;pada basis siklus per siklus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ini memungkinkan CPU memanfaatkan sumber daya pemrosesannya lebih baik. Contohnya: kalau satu thread harus menunggu data dimuat ke cache, CPU bisa lanjut mengeksekusi thread lain.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: &#039;&#039;&#039;Intel Core i7&#039;&#039;&#039; bisa menjalankan dua thread per core, sehingga sistem empat core sebenarnya mengeksekusi &#039;&#039;&#039;delapan thread secara paralel&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Thread software vs thread hardware|Kata &amp;quot;thread&amp;quot; di sini berbeda makna dengan thread di [[Threads|§1.7.2]]. Thread di §1.7.2 adalah konsep OS yang dibuat programmer dan jumlahnya dinamis. Thread di hyperthreading adalah konsep hardware — set register dan PC yang diduplikasi di silikon, jumlahnya tetap dari pabrik. Analoginya: thread hardware adalah &#039;&#039;kursi&#039;&#039;, thread software adalah &#039;&#039;orang yang duduk&#039;&#039;. Inilah kenapa &amp;lt;code&amp;gt;nproc&amp;lt;/code&amp;gt; di mesin 8 core melaporkan 16.}}&lt;br /&gt;
&lt;br /&gt;
== Dua cara multiprocessing meningkatkan performa ==&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Mengurangi kebutuhan menyimulasikan concurrency&#039;&#039;&#039; saat mengerjakan banyak tugas. Bahkan komputer pribadi dengan satu pengguna tetap diharapkan melakukan banyak aktivitas sekaligus.&lt;br /&gt;
# &#039;&#039;&#039;Menjalankan satu program aplikasi lebih cepat&#039;&#039;&#039; — &#039;&#039;&#039;tapi hanya jika&#039;&#039;&#039; program itu dinyatakan dalam bentuk beberapa thread yang bisa benar-benar dieksekusi secara paralel.&lt;br /&gt;
&lt;br /&gt;
Syarat pada poin kedua itu penting. Menambah core &#039;&#039;&#039;tidak otomatis&#039;&#039;&#039; mempercepat program yang ditulis single-threaded.&lt;br /&gt;
&lt;br /&gt;
Prinsip concurrency sudah dirumuskan dan dipelajari lebih dari &#039;&#039;&#039;50 tahun&#039;&#039;&#039;, tapi kehadiran sistem multi-core dan hyperthreaded sangat meningkatkan kebutuhan menemukan cara menulis program yang bisa memanfaatkan &#039;&#039;&#039;thread-level parallelism&#039;&#039;&#039; yang disediakan hardware.&lt;br /&gt;
&lt;br /&gt;
= Instruction-Level Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat abstraksi yang jauh lebih rendah, processor modern bisa &#039;&#039;&#039;mengeksekusi beberapa instruksi sekaligus&#039;&#039;&#039;. Sifat ini disebut &#039;&#039;&#039;instruction-level parallelism (ILP)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perbandingan angkanya:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Processor !! Laju eksekusi&lt;br /&gt;
|-&lt;br /&gt;
| Intel 8086 (1978) || butuh &#039;&#039;&#039;3–10 clock cycle&#039;&#039;&#039; untuk &#039;&#039;&#039;satu&#039;&#039;&#039; instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Processor modern || mempertahankan &#039;&#039;&#039;2–4 instruksi per clock cycle&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Yang mengejutkan: instruksi mana pun tetap butuh &#039;&#039;&#039;20 siklus atau lebih&#039;&#039;&#039; dari awal sampai selesai. Processor cuma memakai berbagai trik cerdas untuk &#039;&#039;&#039;memproses sampai 100 instruksi sekaligus&#039;&#039;&#039; dalam berbagai tahap penyelesaian.&lt;br /&gt;
&lt;br /&gt;
== Pipelining ==&lt;br /&gt;
&lt;br /&gt;
Dibahas di &#039;&#039;&#039;Bab 4&#039;&#039;&#039;. Idenya: tindakan yang dibutuhkan untuk mengeksekusi sebuah instruksi &#039;&#039;&#039;dipartisi jadi beberapa langkah&#039;&#039;&#039;, dan hardware processor disusun sebagai &#039;&#039;&#039;rangkaian stage&#039;&#039;&#039;, masing-masing mengerjakan satu langkah.&lt;br /&gt;
&lt;br /&gt;
Stage-stage itu bisa &#039;&#039;&#039;beroperasi paralel&#039;&#039;&#039;, mengerjakan bagian berbeda dari instruksi yang berbeda. Desain hardware yang cukup sederhana pun bisa mempertahankan laju eksekusi mendekati &#039;&#039;&#039;1 instruksi per clock cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Superscalar ==&lt;br /&gt;
&lt;br /&gt;
Processor yang bisa mempertahankan laju eksekusi &#039;&#039;&#039;lebih cepat dari 1 instruksi per siklus&#039;&#039;&#039; disebut &#039;&#039;&#039;superscalar&#039;&#039;&#039;. Sebagian besar processor modern mendukung operasi superscalar.&lt;br /&gt;
&lt;br /&gt;
Bab 5 menjelaskan model tingkat tinggi processor semacam ini — dan poin pentingnya: &#039;&#039;&#039;programmer aplikasi bisa memakai model itu untuk memahami performa programnya&#039;&#039;&#039;, lalu menulis program supaya kode yang dihasilkan mencapai ILP lebih tinggi dan berjalan lebih cepat.&lt;br /&gt;
&lt;br /&gt;
{{Note|ILP berjalan &#039;&#039;&#039;otomatis tanpa diminta&#039;&#039;&#039;. Programmer tidak menulis kode khusus untuk mengaktifkannya. Tapi programmer &#039;&#039;bisa&#039;&#039; menulis kode yang menghalanginya — misalnya rantai ketergantungan data yang panjang atau cabang yang sulit diprediksi.}}&lt;br /&gt;
&lt;br /&gt;
= SIMD Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat terendah, banyak processor modern punya hardware khusus yang memungkinkan &#039;&#039;&#039;satu instruksi menyebabkan beberapa operasi dilakukan secara paralel&#039;&#039;&#039;. Mode ini disebut &#039;&#039;&#039;single-instruction, multiple-data (SIMD) parallelism&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: generasi terbaru processor Intel dan AMD punya instruksi yang bisa &#039;&#039;&#039;menjumlahkan 8 pasang bilangan floating-point presisi tunggal&#039;&#039;&#039; (tipe data C &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;) secara paralel.&lt;br /&gt;
&lt;br /&gt;
Instruksi SIMD ini &#039;&#039;&#039;terutama disediakan untuk mempercepat aplikasi yang memproses data gambar, suara, dan video&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Cara memakainya ==&lt;br /&gt;
&lt;br /&gt;
* Sebagian compiler &#039;&#039;&#039;berusaha mengekstrak SIMD secara otomatis&#039;&#039;&#039; dari program C.&lt;br /&gt;
* Metode yang &#039;&#039;&#039;lebih andal&#039;&#039;&#039; adalah menulis program memakai &#039;&#039;&#039;tipe data vector khusus&#039;&#039;&#039; yang didukung compiler seperti &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Gaya pemrograman ini dijelaskan di Web Aside &amp;lt;code&amp;gt;opt:simd&amp;lt;/code&amp;gt;, sebagai pelengkap pembahasan optimasi program di Bab 5.&lt;br /&gt;
&lt;br /&gt;
= Catatan untuk kerja systems =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tiga level itu berlipat, bukan bergantian.&#039;&#039;&#039; Program yang dioptimalkan baik memanfaatkan ketiganya sekaligus: beberapa thread di beberapa core, tiap thread memanfaatkan superscalar, tiap instruksi memproses banyak elemen lewat SIMD. Faktor percepatannya berkalian.&lt;br /&gt;
* &#039;&#039;&#039;Auto-vectorization butuh diverifikasi, jangan diasumsikan.&#039;&#039;&#039; Di GCC dan Clang, &amp;lt;code&amp;gt;-O3 -march=native&amp;lt;/code&amp;gt; mengaktifkan vektorisasi otomatis, tapi hasilnya sering gagal karena &#039;&#039;pointer aliasing&#039;&#039; atau alur kontrol di dalam loop. Cek dengan &amp;lt;code&amp;gt;-fopt-info-vec-missed&amp;lt;/code&amp;gt; untuk melihat loop mana yang ditolak dan alasannya. Ini alasan buku menyebut menulis eksplisit lebih andal.&lt;br /&gt;
* &#039;&#039;&#039;SIMD sekarang jauh lebih lebar dari contoh di buku.&#039;&#039;&#039; Contoh &amp;quot;8 float sekaligus&amp;quot; itu setara AVX (256-bit). AVX-512 memproses 16 float sekaligus, dan ARM punya NEON serta SVE. Lebar vektor jadi parameter yang harus dipertimbangkan, bukan konstanta.&lt;br /&gt;
* &#039;&#039;&#039;Ukur IPC sebelum mengoptimalkan.&#039;&#039;&#039; &amp;lt;code&amp;gt;perf stat ./program&amp;lt;/code&amp;gt; menampilkan &#039;&#039;instructions per cycle&#039;&#039;. Angka di bawah 1 biasanya menandakan program terhambat memory atau salah prediksi cabang, bukan kekurangan compute — dan menambahkan SIMD ke program yang &#039;&#039;memory-bound&#039;&#039; tidak akan menolong.&lt;br /&gt;
* &#039;&#039;&#039;SMT bukan percepatan gratis.&#039;&#039;&#039; Dua thread hardware pada satu core berbagi unit eksekusi, L1, dan L2. Untuk beban kerja yang sering menunggu memory, SMT menguntungkan. Untuk beban kerja compute-bound padat seperti loop AVX, keduanya justru berebut sumber daya yang sama. Ini alasan SMT sering dimatikan di lingkungan HPC — keputusannya berdasarkan pengukuran, bukan preferensi.&lt;br /&gt;
* &#039;&#039;&#039;Hati-hati saat melakukan pinning.&#039;&#039;&#039; Karena satu core fisik menyumbang dua logical CPU, mem-&#039;&#039;pin&#039;&#039; dua thread compute-heavy ke CPU 0 dan CPU 1 bisa saja berarti mengunci keduanya ke core fisik yang sama. Periksa topologi lebih dulu dengan &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; atau &amp;lt;code&amp;gt;hwloc-ls&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Syarat pada poin kedua multiprocessing adalah inti Amdahl.&#039;&#039;&#039; Percepatan hanya datang dari bagian yang bisa diparalelkan. Bagian serial program menjadi batas atas yang tidak bisa dilewati berapa pun jumlah core yang ditambahkan.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Tiga perintah untuk melihat ketiga level sekaligus: &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; untuk topologi thread-level, &amp;lt;code&amp;gt;perf stat -e instructions,cycles ./prog&amp;lt;/code&amp;gt; untuk ILP, dan &amp;lt;code&amp;gt;objdump -d ./prog {{!}} grep -E &#039;vadd{{!}}vmul&#039;&amp;lt;/code&amp;gt; untuk memastikan instruksi SIMD benar-benar dihasilkan.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum sistem dengan banyak aktivitas simultan.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: Penggunaan concurrency untuk membuat sistem berjalan lebih cepat.&lt;br /&gt;
; Uniprocessor system&lt;br /&gt;
: Sistem dengan satu processor yang bergantian antar tugas.&lt;br /&gt;
; Multiprocessor system&lt;br /&gt;
: Sistem dengan beberapa processor di bawah kendali satu kernel OS.&lt;br /&gt;
; Multi-core processor&lt;br /&gt;
: Beberapa CPU (core) yang diintegrasikan ke satu chip sirkuit terpadu.&lt;br /&gt;
; Hyperthreading&lt;br /&gt;
: Teknik yang memungkinkan satu CPU mengeksekusi beberapa alur kontrol dengan menduplikasi sebagian hardware seperti PC dan register file; disebut juga simultaneous multi-threading.&lt;br /&gt;
; Instruction-level parallelism&lt;br /&gt;
: Kemampuan processor mengeksekusi beberapa instruksi sekaligus.&lt;br /&gt;
; Pipelining&lt;br /&gt;
: Pembagian eksekusi instruksi jadi beberapa stage yang bisa beroperasi paralel.&lt;br /&gt;
; Superscalar&lt;br /&gt;
: Processor yang mempertahankan laju eksekusi lebih dari 1 instruksi per siklus.&lt;br /&gt;
; SIMD parallelism&lt;br /&gt;
: Mode ketika satu instruksi menyebabkan beberapa operasi dilakukan paralel.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[Files]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=852</id>
		<title>Concurrency &amp; Parallelism</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Concurrency_%26_Parallelism&amp;diff=852"/>
		<updated>2026-09-05T02:50:31Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Dua tuntutan abadi ==  Sepanjang sejarah komputer digital, ada dua tuntutan yang jadi pendorong tetap perbaikan:  # kita ingin komputer &amp;#039;&amp;#039;&amp;#039;melakukan lebih banyak&amp;#039;&amp;#039;&amp;#039; # kita ingin komputer &amp;#039;&amp;#039;&amp;#039;berjalan lebih cepat&amp;#039;&amp;#039;&amp;#039;  Keduanya membaik ketika processor &amp;#039;&amp;#039;&amp;#039;mengerjakan lebih banyak hal sekaligus&amp;#039;&amp;#039;&amp;#039;.  == Concurrency vs parallelism ==  Ini definisi yang wajib dipegang, dan bukunya memisahkan keduanya dengan tegas:  ; Concurrency : Konsep umum tentang &amp;#039;&amp;#039;&amp;#039;sistem dengan banyak a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Dua tuntutan abadi ==&lt;br /&gt;
&lt;br /&gt;
Sepanjang sejarah komputer digital, ada dua tuntutan yang jadi pendorong tetap perbaikan:&lt;br /&gt;
&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;melakukan lebih banyak&#039;&#039;&#039;&lt;br /&gt;
# kita ingin komputer &#039;&#039;&#039;berjalan lebih cepat&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Keduanya membaik ketika processor &#039;&#039;&#039;mengerjakan lebih banyak hal sekaligus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Concurrency vs parallelism ==&lt;br /&gt;
&lt;br /&gt;
Ini definisi yang wajib dipegang, dan bukunya memisahkan keduanya dengan tegas:&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum tentang &#039;&#039;&#039;sistem dengan banyak aktivitas yang simultan&#039;&#039;&#039;.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: &#039;&#039;&#039;Penggunaan concurrency untuk membuat sistem berjalan lebih cepat&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Bukan sinonim, bukan juga lawan|Parallelism adalah &#039;&#039;bagian dari&#039;&#039; concurrency, bukan istilah sejajar. Concurrency menjawab pertanyaan &amp;quot;apakah sistem mengurus banyak hal sekaligus&amp;quot;, parallelism menjawab &amp;quot;apakah keserentakan itu dipakai untuk mempercepat&amp;quot;. Sistem bisa concurrent tanpa parallel — misalnya uniprocessor yang bergantian antar process.}}&lt;br /&gt;
&lt;br /&gt;
Parallelism bisa dimanfaatkan pada &#039;&#039;&#039;beberapa tingkat abstraksi&#039;&#039;&#039;. Buku menyoroti tiga, dari yang tertinggi ke terendah:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tingkat !! Siapa yang mengatur !! Dibahas di&lt;br /&gt;
|-&lt;br /&gt;
| Thread-level concurrency || Programmer dan OS || Bab 12&lt;br /&gt;
|-&lt;br /&gt;
| Instruction-level parallelism || Hardware, otomatis || Bab 4 dan 5&lt;br /&gt;
|-&lt;br /&gt;
| SIMD parallelism || Programmer dan compiler || Bab 5 dan Web Aside&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Thread-Level Concurrency =&lt;br /&gt;
&lt;br /&gt;
== Dari process ke thread ==&lt;br /&gt;
&lt;br /&gt;
Berdiri di atas abstraksi [[Processes|process]], kita bisa merancang sistem tempat &#039;&#039;&#039;beberapa program berjalan pada saat yang sama&#039;&#039;&#039;. Dengan [[Threads|thread]], kita bahkan bisa punya &#039;&#039;&#039;beberapa alur kontrol di dalam satu process&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dukungan untuk eksekusi concurrent sudah ada sejak munculnya &#039;&#039;&#039;time-sharing di awal 1960-an&#039;&#039;&#039;. Secara tradisional, eksekusi concurrent itu cuma &#039;&#039;&#039;disimulasikan&#039;&#039;&#039; — satu komputer berpindah cepat di antara process-process yang sedang berjalan, seperti pemain sulap yang menjaga beberapa bola tetap melayang di udara.&lt;br /&gt;
&lt;br /&gt;
Bentuk concurrency ini memungkinkan:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;banyak user berinteraksi dengan satu sistem sekaligus&#039;&#039;&#039; — misalnya banyak orang meminta halaman dari satu Web server&lt;br /&gt;
* &#039;&#039;&#039;satu user mengerjakan banyak tugas sekaligus&#039;&#039;&#039; — browser di satu jendela, word processor di jendela lain, sambil memutar musik&lt;br /&gt;
&lt;br /&gt;
== Uniprocessor dan multiprocessor ==&lt;br /&gt;
&lt;br /&gt;
Sampai belum lama ini, sebagian besar komputasi nyata dikerjakan &#039;&#039;&#039;satu processor&#039;&#039;&#039;, meski processor itu harus bergantian antar tugas. Konfigurasi ini disebut &#039;&#039;&#039;uniprocessor system&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ketika kita membangun sistem yang terdiri dari &#039;&#039;&#039;beberapa processor, semuanya di bawah kendali satu kernel operating system&#039;&#039;&#039;, itu disebut &#039;&#039;&#039;multiprocessor system&#039;&#039;&#039;. Sistem seperti ini sudah tersedia untuk komputasi skala besar sejak &#039;&#039;&#039;1980-an&#039;&#039;&#039;, tapi baru jadi umum belakangan berkat multi-core dan hyperthreading.&lt;br /&gt;
&lt;br /&gt;
=== Taksonomi (Figure 1.16) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
| All processors                                        |&lt;br /&gt;
|                                                       |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
| |                  |  | Multiprocessors             | |&lt;br /&gt;
| | Uniprocessors    |  |                             | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| |                  |  |  | Multi-core | | Hyper-  | | |&lt;br /&gt;
| |                  |  |  |            | | threaded| | |&lt;br /&gt;
| |                  |  |  +------------+ +---------+ | |&lt;br /&gt;
| +------------------+  +-----------------------------+ |&lt;br /&gt;
+-------------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bahwa multi-core dan hyperthreaded &#039;&#039;&#039;dua-duanya masuk kategori multiprocessor&#039;&#039;&#039; — dan keduanya bisa ada bersamaan di satu chip.&lt;br /&gt;
&lt;br /&gt;
== Multi-core processor ==&lt;br /&gt;
&lt;br /&gt;
Multi-core processor punya &#039;&#039;&#039;beberapa CPU (disebut &amp;quot;core&amp;quot;) yang diintegrasikan ke satu chip sirkuit terpadu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Organisasi (Figure 1.17) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 Processor package&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
|  Core 0                              Core 3             |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|  |       Regs        |               |      Regs      | |&lt;br /&gt;
|  +---------+---------+     . . .     +--------+-------+ |&lt;br /&gt;
|  | L1 d-$  | L1 i-$  |               | L1 d-$ | L1 i-$| |&lt;br /&gt;
|  +---------+---------+               +--------+-------+ |&lt;br /&gt;
|  |  L2 unified cache |               | L2 unified $   | |&lt;br /&gt;
|  +-------------------+               +----------------+ |&lt;br /&gt;
|                                                         |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
|  |   L3 unified cache (dibagi semua core)            |  |&lt;br /&gt;
|  +---------------------------------------------------+  |&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
                          |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
                 |   Main memory    |&lt;br /&gt;
                 +------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yang perlu dibaca dari gambar ini:&lt;br /&gt;
&lt;br /&gt;
* Chip contohnya punya &#039;&#039;&#039;empat core&#039;&#039;&#039;.&lt;br /&gt;
* Tiap core punya &#039;&#039;&#039;L1 dan L2 cache sendiri&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;L1 dipecah dua&#039;&#039;&#039;: satu menampung instruksi yang baru diambil, satu menampung data.&lt;br /&gt;
* Core &#039;&#039;&#039;berbagi level cache yang lebih tinggi&#039;&#039;&#039; (L3) serta &#039;&#039;&#039;antarmuka ke main memory&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pakar industri memperkirakan akan ada &#039;&#039;&#039;puluhan, dan akhirnya ratusan core&#039;&#039;&#039; dalam satu chip.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Kenapa L1 dipecah, L2 tidak|L1 dipisah instruksi dan data supaya processor bisa mengambil instruksi dan mengakses data dalam siklus yang sama tanpa saling menunggu. Di level L2 ke atas tekanannya sudah tidak sebesar itu, jadi cukup satu cache terpadu (&#039;&#039;unified&#039;&#039;).}}&lt;br /&gt;
&lt;br /&gt;
== Hyperthreading ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Hyperthreading&#039;&#039;&#039;, kadang disebut &#039;&#039;&#039;simultaneous multi-threading (SMT)&#039;&#039;&#039;, adalah teknik yang memungkinkan &#039;&#039;&#039;satu CPU mengeksekusi beberapa alur kontrol&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Caranya: &#039;&#039;&#039;menduplikasi sebagian hardware CPU&#039;&#039;&#039; sambil tetap &#039;&#039;&#039;menyisakan satu salinan untuk bagian lainnya&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Diduplikasi !! Tetap satu salinan&lt;br /&gt;
|-&lt;br /&gt;
| Program counter || Unit aritmetika floating-point&lt;br /&gt;
|-&lt;br /&gt;
| Register file || (dan unit eksekusi lain)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Perbedaan kecepatannya dramatis:&lt;br /&gt;
&lt;br /&gt;
* Processor konvensional butuh sekitar &#039;&#039;&#039;20.000 clock cycle&#039;&#039;&#039; untuk berpindah antar thread.&lt;br /&gt;
* Processor hyperthreaded memutuskan thread mana yang dieksekusi &#039;&#039;&#039;pada basis siklus per siklus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ini memungkinkan CPU memanfaatkan sumber daya pemrosesannya lebih baik. Contohnya: kalau satu thread harus menunggu data dimuat ke cache, CPU bisa lanjut mengeksekusi thread lain.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: &#039;&#039;&#039;Intel Core i7&#039;&#039;&#039; bisa menjalankan dua thread per core, sehingga sistem empat core sebenarnya mengeksekusi &#039;&#039;&#039;delapan thread secara paralel&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Thread software vs thread hardware|Kata &amp;quot;thread&amp;quot; di sini berbeda makna dengan thread di [[Threads|§1.7.2]]. Thread di §1.7.2 adalah konsep OS yang dibuat programmer dan jumlahnya dinamis. Thread di hyperthreading adalah konsep hardware — set register dan PC yang diduplikasi di silikon, jumlahnya tetap dari pabrik. Analoginya: thread hardware adalah &#039;&#039;kursi&#039;&#039;, thread software adalah &#039;&#039;orang yang duduk&#039;&#039;. Inilah kenapa &amp;lt;code&amp;gt;nproc&amp;lt;/code&amp;gt; di mesin 8 core melaporkan 16.}}&lt;br /&gt;
&lt;br /&gt;
== Dua cara multiprocessing meningkatkan performa ==&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Mengurangi kebutuhan menyimulasikan concurrency&#039;&#039;&#039; saat mengerjakan banyak tugas. Bahkan komputer pribadi dengan satu pengguna tetap diharapkan melakukan banyak aktivitas sekaligus.&lt;br /&gt;
# &#039;&#039;&#039;Menjalankan satu program aplikasi lebih cepat&#039;&#039;&#039; — &#039;&#039;&#039;tapi hanya jika&#039;&#039;&#039; program itu dinyatakan dalam bentuk beberapa thread yang bisa benar-benar dieksekusi secara paralel.&lt;br /&gt;
&lt;br /&gt;
Syarat pada poin kedua itu penting. Menambah core &#039;&#039;&#039;tidak otomatis&#039;&#039;&#039; mempercepat program yang ditulis single-threaded.&lt;br /&gt;
&lt;br /&gt;
Prinsip concurrency sudah dirumuskan dan dipelajari lebih dari &#039;&#039;&#039;50 tahun&#039;&#039;&#039;, tapi kehadiran sistem multi-core dan hyperthreaded sangat meningkatkan kebutuhan menemukan cara menulis program yang bisa memanfaatkan &#039;&#039;&#039;thread-level parallelism&#039;&#039;&#039; yang disediakan hardware.&lt;br /&gt;
&lt;br /&gt;
= Instruction-Level Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat abstraksi yang jauh lebih rendah, processor modern bisa &#039;&#039;&#039;mengeksekusi beberapa instruksi sekaligus&#039;&#039;&#039;. Sifat ini disebut &#039;&#039;&#039;instruction-level parallelism (ILP)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perbandingan angkanya:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Processor !! Laju eksekusi&lt;br /&gt;
|-&lt;br /&gt;
| Intel 8086 (1978) || butuh &#039;&#039;&#039;3–10 clock cycle&#039;&#039;&#039; untuk &#039;&#039;&#039;satu&#039;&#039;&#039; instruksi&lt;br /&gt;
|-&lt;br /&gt;
| Processor modern || mempertahankan &#039;&#039;&#039;2–4 instruksi per clock cycle&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Yang mengejutkan: instruksi mana pun tetap butuh &#039;&#039;&#039;20 siklus atau lebih&#039;&#039;&#039; dari awal sampai selesai. Processor cuma memakai berbagai trik cerdas untuk &#039;&#039;&#039;memproses sampai 100 instruksi sekaligus&#039;&#039;&#039; dalam berbagai tahap penyelesaian.&lt;br /&gt;
&lt;br /&gt;
== Pipelining ==&lt;br /&gt;
&lt;br /&gt;
Dibahas di &#039;&#039;&#039;Bab 4&#039;&#039;&#039;. Idenya: tindakan yang dibutuhkan untuk mengeksekusi sebuah instruksi &#039;&#039;&#039;dipartisi jadi beberapa langkah&#039;&#039;&#039;, dan hardware processor disusun sebagai &#039;&#039;&#039;rangkaian stage&#039;&#039;&#039;, masing-masing mengerjakan satu langkah.&lt;br /&gt;
&lt;br /&gt;
Stage-stage itu bisa &#039;&#039;&#039;beroperasi paralel&#039;&#039;&#039;, mengerjakan bagian berbeda dari instruksi yang berbeda. Desain hardware yang cukup sederhana pun bisa mempertahankan laju eksekusi mendekati &#039;&#039;&#039;1 instruksi per clock cycle&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Superscalar ==&lt;br /&gt;
&lt;br /&gt;
Processor yang bisa mempertahankan laju eksekusi &#039;&#039;&#039;lebih cepat dari 1 instruksi per siklus&#039;&#039;&#039; disebut &#039;&#039;&#039;superscalar&#039;&#039;&#039;. Sebagian besar processor modern mendukung operasi superscalar.&lt;br /&gt;
&lt;br /&gt;
Bab 5 menjelaskan model tingkat tinggi processor semacam ini — dan poin pentingnya: &#039;&#039;&#039;programmer aplikasi bisa memakai model itu untuk memahami performa programnya&#039;&#039;&#039;, lalu menulis program supaya kode yang dihasilkan mencapai ILP lebih tinggi dan berjalan lebih cepat.&lt;br /&gt;
&lt;br /&gt;
{{Note|ILP berjalan &#039;&#039;&#039;otomatis tanpa diminta&#039;&#039;&#039;. Programmer tidak menulis kode khusus untuk mengaktifkannya. Tapi programmer &#039;&#039;bisa&#039;&#039; menulis kode yang menghalanginya — misalnya rantai ketergantungan data yang panjang atau cabang yang sulit diprediksi.}}&lt;br /&gt;
&lt;br /&gt;
= SIMD Parallelism =&lt;br /&gt;
&lt;br /&gt;
Pada tingkat terendah, banyak processor modern punya hardware khusus yang memungkinkan &#039;&#039;&#039;satu instruksi menyebabkan beberapa operasi dilakukan secara paralel&#039;&#039;&#039;. Mode ini disebut &#039;&#039;&#039;single-instruction, multiple-data (SIMD) parallelism&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Contoh dari buku: generasi terbaru processor Intel dan AMD punya instruksi yang bisa &#039;&#039;&#039;menjumlahkan 8 pasang bilangan floating-point presisi tunggal&#039;&#039;&#039; (tipe data C &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;) secara paralel.&lt;br /&gt;
&lt;br /&gt;
Instruksi SIMD ini &#039;&#039;&#039;terutama disediakan untuk mempercepat aplikasi yang memproses data gambar, suara, dan video&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Cara memakainya ==&lt;br /&gt;
&lt;br /&gt;
* Sebagian compiler &#039;&#039;&#039;berusaha mengekstrak SIMD secara otomatis&#039;&#039;&#039; dari program C.&lt;br /&gt;
* Metode yang &#039;&#039;&#039;lebih andal&#039;&#039;&#039; adalah menulis program memakai &#039;&#039;&#039;tipe data vector khusus&#039;&#039;&#039; yang didukung compiler seperti &amp;lt;code&amp;gt;gcc&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Gaya pemrograman ini dijelaskan di Web Aside &amp;lt;code&amp;gt;opt:simd&amp;lt;/code&amp;gt;, sebagai pelengkap pembahasan optimasi program di Bab 5.&lt;br /&gt;
&lt;br /&gt;
= Catatan untuk kerja systems =&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tiga level itu berlipat, bukan bergantian.&#039;&#039;&#039; Program yang dioptimalkan baik memanfaatkan ketiganya sekaligus: beberapa thread di beberapa core, tiap thread memanfaatkan superscalar, tiap instruksi memproses banyak elemen lewat SIMD. Faktor percepatannya berkalian.&lt;br /&gt;
* &#039;&#039;&#039;Auto-vectorization butuh diverifikasi, jangan diasumsikan.&#039;&#039;&#039; Di GCC dan Clang, &amp;lt;code&amp;gt;-O3 -march=native&amp;lt;/code&amp;gt; mengaktifkan vektorisasi otomatis, tapi hasilnya sering gagal karena &#039;&#039;pointer aliasing&#039;&#039; atau alur kontrol di dalam loop. Cek dengan &amp;lt;code&amp;gt;-fopt-info-vec-missed&amp;lt;/code&amp;gt; untuk melihat loop mana yang ditolak dan alasannya. Ini alasan buku menyebut menulis eksplisit lebih andal.&lt;br /&gt;
* &#039;&#039;&#039;SIMD sekarang jauh lebih lebar dari contoh di buku.&#039;&#039;&#039; Contoh &amp;quot;8 float sekaligus&amp;quot; itu setara AVX (256-bit). AVX-512 memproses 16 float sekaligus, dan ARM punya NEON serta SVE. Lebar vektor jadi parameter yang harus dipertimbangkan, bukan konstanta.&lt;br /&gt;
* &#039;&#039;&#039;Ukur IPC sebelum mengoptimalkan.&#039;&#039;&#039; &amp;lt;code&amp;gt;perf stat ./program&amp;lt;/code&amp;gt; menampilkan &#039;&#039;instructions per cycle&#039;&#039;. Angka di bawah 1 biasanya menandakan program terhambat memory atau salah prediksi cabang, bukan kekurangan compute — dan menambahkan SIMD ke program yang &#039;&#039;memory-bound&#039;&#039; tidak akan menolong.&lt;br /&gt;
* &#039;&#039;&#039;SMT bukan percepatan gratis.&#039;&#039;&#039; Dua thread hardware pada satu core berbagi unit eksekusi, L1, dan L2. Untuk beban kerja yang sering menunggu memory, SMT menguntungkan. Untuk beban kerja compute-bound padat seperti loop AVX, keduanya justru berebut sumber daya yang sama. Ini alasan SMT sering dimatikan di lingkungan HPC — keputusannya berdasarkan pengukuran, bukan preferensi.&lt;br /&gt;
* &#039;&#039;&#039;Hati-hati saat melakukan pinning.&#039;&#039;&#039; Karena satu core fisik menyumbang dua logical CPU, mem-&#039;&#039;pin&#039;&#039; dua thread compute-heavy ke CPU 0 dan CPU 1 bisa saja berarti mengunci keduanya ke core fisik yang sama. Periksa topologi lebih dulu dengan &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; atau &amp;lt;code&amp;gt;hwloc-ls&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Syarat pada poin kedua multiprocessing adalah inti Amdahl.&#039;&#039;&#039; Percepatan hanya datang dari bagian yang bisa diparalelkan. Bagian serial program menjadi batas atas yang tidak bisa dilewati berapa pun jumlah core yang ditambahkan.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Tiga perintah untuk melihat ketiga level sekaligus: &amp;lt;code&amp;gt;lscpu -e&amp;lt;/code&amp;gt; untuk topologi thread-level, &amp;lt;code&amp;gt;perf stat -e instructions,cycles ./prog&amp;lt;/code&amp;gt; untuk ILP, dan &amp;lt;code&amp;gt;objdump -d ./prog {{!}} grep -E &#039;vadd{{!}}vmul&#039;&amp;lt;/code&amp;gt; untuk memastikan instruksi SIMD benar-benar dihasilkan.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Concurrency&lt;br /&gt;
: Konsep umum sistem dengan banyak aktivitas simultan.&lt;br /&gt;
; Parallelism&lt;br /&gt;
: Penggunaan concurrency untuk membuat sistem berjalan lebih cepat.&lt;br /&gt;
; Uniprocessor system&lt;br /&gt;
: Sistem dengan satu processor yang bergantian antar tugas.&lt;br /&gt;
; Multiprocessor system&lt;br /&gt;
: Sistem dengan beberapa processor di bawah kendali satu kernel OS.&lt;br /&gt;
; Multi-core processor&lt;br /&gt;
: Beberapa CPU (core) yang diintegrasikan ke satu chip sirkuit terpadu.&lt;br /&gt;
; Hyperthreading&lt;br /&gt;
: Teknik yang memungkinkan satu CPU mengeksekusi beberapa alur kontrol dengan menduplikasi sebagian hardware seperti PC dan register file; disebut juga simultaneous multi-threading.&lt;br /&gt;
; Instruction-level parallelism&lt;br /&gt;
: Kemampuan processor mengeksekusi beberapa instruksi sekaligus.&lt;br /&gt;
; Pipelining&lt;br /&gt;
: Pembagian eksekusi instruksi jadi beberapa stage yang bisa beroperasi paralel.&lt;br /&gt;
; Superscalar&lt;br /&gt;
: Processor yang mempertahankan laju eksekusi lebih dari 1 instruksi per siklus.&lt;br /&gt;
; SIMD parallelism&lt;br /&gt;
: Mode ketika satu instruksi menyebabkan beberapa operasi dilakukan paralel.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[Files]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=851</id>
		<title>Linux &amp; Operating System</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Linux_%26_Operating_System&amp;diff=851"/>
		<updated>2026-09-05T02:49:11Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Linux ==&lt;br /&gt;
* [[Cara install Arch Linux]]&lt;br /&gt;
* [[Linux from Scratch]]&lt;br /&gt;
* [[Install Arch Linux ARM di QEMU]]&lt;br /&gt;
* [[Bluetooth di Arch Linux (Pairing TWS)]]&lt;br /&gt;
* [[CUE 1.0]]&lt;br /&gt;
&lt;br /&gt;
== Computer Systems ==&lt;br /&gt;
* [[Cara Kerja Floating Point]]&lt;br /&gt;
* [[Introduction to Assembly|Assembly Course]]&lt;br /&gt;
* [[Tahap-tahap dari source code menjadi executable file]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Concurrency &amp;amp; Parallelism]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LLVM ==&lt;br /&gt;
* [[llvm: cara install]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=850</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=850"/>
		<updated>2026-09-01T13:02:43Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Pondok Pesantren Riyadhussholihiin ===&lt;br /&gt;
&#039;&#039;2016 - 2021&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Tahfidz Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Ringkasan Buku]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=849</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=849"/>
		<updated>2026-09-01T03:30:26Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learn&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
=== Pondok Pesantren Riyadhussholihiin ===&lt;br /&gt;
&#039;&#039;&#039; 2016 - 2021 &#039;&#039;&#039;&lt;br /&gt;
* Language Class (Arabic)&lt;br /&gt;
* Organisasi Santri Riyadhussholihin &amp;amp; Baitul Qur&#039;an&lt;br /&gt;
* Grade: Mumtaz (excellent)&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
* Riyadhussholihiin Islamic Boarding School, Pandeglang — Tahfidz Teacher &#039;&#039;(July 2020 - July 2021)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Ringkasan Buku]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=848</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=848"/>
		<updated>2026-09-01T02:39:44Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
I write everything that I learnt&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [https://id.wikipedia.org/wiki/Onno_W._Purbo Onno W. Purbo]&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [https://drive.google.com/file/d/1y4H7s0E_N3XzCqi9o1iVPRj-KdLHOlEJ/view?usp=sharing CV_Haidhi_Angkawijana_Tedja.pdf]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Ringkasan Buku]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=847</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Main_Page&amp;diff=847"/>
		<updated>2026-09-01T02:33:03Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Haidhi Angkawijana Tedja&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
Software Engineer @ Telkom Indonesia&lt;br /&gt;
&lt;br /&gt;
[https://github.com/haidhiSkuy GitHub] • [https://www.linkedin.com/in/haidhi-angkawijana-tedja/ LinkedIn] • haidhiangkawijana@gmail.com&lt;br /&gt;
&lt;br /&gt;
== Research Interests ==&lt;br /&gt;
* Heterogeneous Computing&lt;br /&gt;
* High-Performance Computing (HPC)&lt;br /&gt;
* GPU/Accelerator Architectures&lt;br /&gt;
* Edge Computing&lt;br /&gt;
* Hardware-Software Co-design for AI Systems&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
=== South Tangerang Institute of Technology (ITTS) ===&lt;br /&gt;
&#039;&#039;2021 – 2025&#039;&#039;&lt;br /&gt;
* B.Sc. in Computer Science, GPA 3.96/4.00&lt;br /&gt;
* Undergraduate Thesis: &amp;quot;Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization&amp;quot;&lt;br /&gt;
* Advised by [[Onno W. Purbo|Dr. Onno W. Purbo]]&lt;br /&gt;
&lt;br /&gt;
== Work Experience ==&lt;br /&gt;
* Telkom Indonesia — AI &amp;amp; Backend Engineer &#039;&#039;(July 2024 – Present)&#039;&#039;&lt;br /&gt;
* Meister Sinergi Indonesia (AERY) — ML/AI Engineer &#039;&#039;(October 2023 – Present)&#039;&#039;&lt;br /&gt;
* Widya Robotics — AI Engineer, Internship &#039;&#039;(February 2024 – June 2024)&#039;&#039;&lt;br /&gt;
* Exylotech, Jakarta — Data Scientist, Internship &#039;&#039;(November 2022 – April 2023)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Publication == &lt;br /&gt;
* Tedja, H. A., &amp;amp; Onno W. Purbo. (2024). Performance and Efficiency Comparison of U-Net and Ghost U-Net in Road Crack Segmentation with Floating Point and Quantization Optimization. Jurnal RESTI (Rekayasa Sistem Dan Teknologi Informasi), 8(6), 779 - 787. https://doi.org/10.29207/resti.v8i6.6089&lt;br /&gt;
* Angkawijana Tedja, H. (2026). A Smartphone Is a Better Compute Node Than a Legacy Laptop: A Feasibility Study of an MPI × OpenCL Cluster Across x86 Laptops and an Android Phone. Zenodo. https://doi.org/10.5281/zenodo.21351608&lt;br /&gt;
&lt;br /&gt;
== Technical Skills ==&lt;br /&gt;
* &#039;&#039;&#039;Languages &amp;amp; Frameworks:&#039;&#039;&#039; Python, Rust, C++, FastAPI, Actix Web&lt;br /&gt;
* &#039;&#039;&#039;ML/DL:&#039;&#039;&#039; PyTorch, scikit-learn, Pandas, NumPy, OpenCV&lt;br /&gt;
* &#039;&#039;&#039;HPC &amp;amp; Systems:&#039;&#039;&#039; MPI, OpenCL, CUDA (basic), Linux, OpenShift, CI/CD&lt;br /&gt;
&lt;br /&gt;
== CV ==&lt;br /&gt;
* [[File:CV_Haidhi_Angkawijana_Tedja.pdf|CV_Haidhi_Angkawijana_Tedja.pdf]]&lt;br /&gt;
&lt;br /&gt;
== Categories == &lt;br /&gt;
* [[Daftar Isi AI/ML|Artificial Intelligence, Machine Learning, &amp;amp; Data Science]]&lt;br /&gt;
* [[Daftar Isi Cybersecurity|Cybersecurity]]&lt;br /&gt;
* [[Linux &amp;amp; Operating System]]&lt;br /&gt;
* [[DevOps]]&lt;br /&gt;
* [[Web Assembly]]&lt;br /&gt;
* [[High-performance computing]]&lt;br /&gt;
* [[Programming, Software Engineering, etc]]&lt;br /&gt;
* [[Aerospace Engineering]]&lt;br /&gt;
* [[Ringkasan Buku]]&lt;br /&gt;
* [[Istilah Penting]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Imam Syafi&#039;i رحمه الله:&lt;br /&gt;
&lt;br /&gt;
الْعِلْمُ صَيْدٌ وَالْكِتَابَةُ قَيْدُهُ * قَيِّدْ صُيُوْدَكَ بِالْحِبَالِ الْوَاثِقَهْ&lt;br /&gt;
فَمِنَ الْحَمَاقَةِ أَنْ تَصِيْدَ غَزَالَةً وَتَتْرُكَهَا بَيْنَ الْخَلاَئِقِ طَالِقَهْ &lt;br /&gt;
&lt;br /&gt;
Knowledge is a quarry, and the written word its chain.&lt;br /&gt;
Bind thy quarry fast with cords unyielding.&lt;br /&gt;
For folly it is to hunt the stag,&lt;br /&gt;
Only to loose it once more among the wilds.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=846</id>
		<title>Files</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=846"/>
		<updated>2026-08-24T06:35:00Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Definisi ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File adalah urutan byte. Tidak lebih, tidak kurang.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kalimat itu ditulis persis begitu di buku, dan penekanannya bukan sekadar gaya bahasa. Frasa &#039;&#039;&amp;quot;tidak lebih, tidak kurang&amp;quot;&#039;&#039; menegaskan bahwa operating system &#039;&#039;&#039;sengaja menolak tahu&#039;&#039;&#039; apa isi sebuah file:&lt;br /&gt;
&lt;br /&gt;
* tidak ada tipe data&lt;br /&gt;
* tidak ada struktur internal&lt;br /&gt;
* tidak ada konsep record atau baris&lt;br /&gt;
&lt;br /&gt;
Cuma deretan byte, dan penafsirannya sepenuhnya urusan aplikasi.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Kenapa justru itu kekuatannya|Karena model file tidak mengasumsikan apa pun tentang isinya, semua jenis device bisa dimuat ke dalam model yang sama. Andai OS memaksakan struktur tertentu, keyboard dan socket jaringan tidak akan pernah muat ke dalamnya.}}&lt;br /&gt;
&lt;br /&gt;
== Semua device adalah file ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setiap I/O device dimodelkan sebagai file&#039;&#039;&#039; — termasuk:&lt;br /&gt;
&lt;br /&gt;
* disk&lt;br /&gt;
* keyboard&lt;br /&gt;
* display&lt;br /&gt;
* bahkan &#039;&#039;&#039;jaringan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya menyeluruh: &#039;&#039;&#039;seluruh input dan output di sistem dilakukan dengan membaca dan menulis file&#039;&#039;&#039;, menggunakan sekumpulan kecil system call yang dikenal sebagai &#039;&#039;&#039;Unix I/O&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    Aplikasi&lt;br /&gt;
                        |&lt;br /&gt;
        open / read / write / close      &amp;lt;- Unix I/O&lt;br /&gt;
                        |&lt;br /&gt;
     +---------+--------+--------+----------+&lt;br /&gt;
     |         |        |        |          |&lt;br /&gt;
   Disk    Keyboard   Display  Network    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bentuk corongnya: banyak device yang bentuk fisiknya sangat berbeda, tapi semuanya masuk lewat antarmuka yang sama dan jumlah system call-nya sedikit.&lt;br /&gt;
&lt;br /&gt;
== Kenapa ini powerful ==&lt;br /&gt;
&lt;br /&gt;
Gagasan file yang &#039;&#039;&#039;sederhana dan elegan&#039;&#039;&#039; ini ternyata sangat kuat, karena memberi aplikasi &#039;&#039;&#039;tampilan yang seragam atas semua I/O device&#039;&#039;&#039; yang mungkin ada di sistem.&lt;br /&gt;
&lt;br /&gt;
Dua konsekuensi yang disebut buku:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Programmer tidak perlu tahu teknologi device-nya.&#039;&#039;&#039; Yang memanipulasi isi file di disk, dalam istilah buku, &#039;&#039;blissfully unaware&#039;&#039; soal teknologi disk yang dipakai. Mau NVMe, SATA, atau apa pun, kodenya sama.&lt;br /&gt;
# &#039;&#039;&#039;Program yang sama jalan di sistem berbeda.&#039;&#039;&#039; Program itu tetap berjalan di sistem yang memakai teknologi disk yang berbeda, tanpa perlu diubah.&lt;br /&gt;
&lt;br /&gt;
Ini contoh konkret dari tujuan kedua operating system yang dibahas di [[Operating System Mengelola Hardware]]: menyediakan mekanisme yang sederhana dan seragam untuk hardware low-level yang bentuknya beda-beda.&lt;br /&gt;
&lt;br /&gt;
Unix I/O dibahas di &#039;&#039;&#039;Bab 10&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;File descriptor adalah wujud praktis abstraksi ini.&#039;&#039;&#039; Setelah &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, sebuah file diwakili integer kecil. Tiga di antaranya sudah disiapkan sejak process lahir: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; stdin, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; stdout, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; stderr. Karena semuanya cuma integer yang menunjuk ke urutan byte, &#039;&#039;pipe&#039;&#039; dan &#039;&#039;redirection&#039;&#039; di shell jadi mungkin tanpa program perlu tahu apa-apa.&lt;br /&gt;
* &#039;&#039;&#039;Device benar-benar muncul sebagai file di filesystem.&#039;&#039;&#039; Lihat isi &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt;. Ada &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/zero&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/random&amp;lt;/code&amp;gt;, sampai disk mentah seperti &amp;lt;code&amp;gt;/dev/nvme0n1&amp;lt;/code&amp;gt;. Bahkan state kernel dipaparkan sebagai file lewat &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;/sys&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;/proc/[pid]/maps&amp;lt;/code&amp;gt; yang dipakai di catatan [[Virtual Memory]] adalah contohnya.&lt;br /&gt;
* &#039;&#039;&#039;Socket adalah pengecualian sebagian.&#039;&#039;&#039; Setelah terhubung, socket bisa dibaca dan ditulis seperti file biasa. Tapi untuk membuatnya tetap butuh system call khusus: &amp;lt;code&amp;gt;socket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;accept&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt;. Jadi model file tidak menutupi seluruh siklus hidupnya.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pintu darurat abstraksi ini.&#039;&#039;&#039; Begitu ada operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte — mengatur baud rate serial, mengeluarkan tray CD, mengubah mode terminal — semuanya ditumpuk ke &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt;. Keberadaan &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pengakuan jujur bahwa abstraksi file tidak sempurna.&lt;br /&gt;
* &#039;&#039;&#039;Plan 9 mendorong ide ini sampai ujung.&#039;&#039;&#039; Sistem operasi penerus Unix dari Bell Labs itu membuat hampir segalanya benar-benar file, termasuk antarmuka jaringan dan window grafis. Sering disebut sebagai versi &amp;quot;Unix yang konsisten sepenuhnya&amp;quot;, dan berguna sebagai pembanding untuk melihat di mana Unix sendiri berkompromi.&lt;br /&gt;
* &#039;&#039;&#039;Keseragaman punya harga performa.&#039;&#039;&#039; Karena semua I/O lewat jalur yang sama, tiap operasi berarti satu system call dan penyalinan data antara kernel dan user space. Di sistem berthroughput tinggi, biaya itu dikurangi lewat &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sendfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;O_DIRECT&amp;lt;/code&amp;gt;, atau &amp;lt;code&amp;gt;io_uring&amp;lt;/code&amp;gt; yang membatch banyak operasi jadi satu perjalanan ke kernel.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Cara cepat merasakan abstraksi ini: jalankan &amp;lt;code&amp;gt;ls -l /proc/self/fd&amp;lt;/code&amp;gt; untuk melihat file descriptor milik process yang sedang berjalan, atau &amp;lt;code&amp;gt;strace -e trace=openat,read,write ./program&amp;lt;/code&amp;gt; untuk melihat setiap operasi Unix I/O yang benar-benar terjadi.}}&lt;br /&gt;
&lt;br /&gt;
== Ringkasan tiga abstraksi ==&lt;br /&gt;
&lt;br /&gt;
Dengan bagian ini, tiga abstraksi fundamental dari Figure 1.11 sudah lengkap:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Abstraksi !! Menutupi !! Dibahas di&lt;br /&gt;
|-&lt;br /&gt;
| [[Process|Process]] || Processor, main memory, I/O devices || Bab 8&lt;br /&gt;
|-&lt;br /&gt;
| [[Virtual Memory|Virtual memory]] || Main memory dan disk I/O devices || Bab 9&lt;br /&gt;
|-&lt;br /&gt;
| File || I/O devices || Bab 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; File&lt;br /&gt;
: Urutan byte, tidak lebih dan tidak kurang; model OS untuk semua I/O device.&lt;br /&gt;
; Unix I/O&lt;br /&gt;
: Sekumpulan kecil system call untuk melakukan seluruh input dan output di sistem.&lt;br /&gt;
; File descriptor&lt;br /&gt;
: Integer kecil yang mewakili file terbuka di dalam sebuah process.&lt;br /&gt;
; ioctl&lt;br /&gt;
: System call serbaguna untuk operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[System Call]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=845</id>
		<title>Files</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=845"/>
		<updated>2026-08-24T06:32:56Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Definisi ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File adalah urutan byte. Tidak lebih, tidak kurang.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kalimat itu ditulis persis begitu di buku, dan penekanannya bukan sekadar gaya bahasa. Frasa &#039;&#039;&amp;quot;tidak lebih, tidak kurang&amp;quot;&#039;&#039; menegaskan bahwa operating system &#039;&#039;&#039;sengaja menolak tahu&#039;&#039;&#039; apa isi sebuah file:&lt;br /&gt;
&lt;br /&gt;
* tidak ada tipe data&lt;br /&gt;
* tidak ada struktur internal&lt;br /&gt;
* tidak ada konsep record atau baris&lt;br /&gt;
&lt;br /&gt;
Cuma deretan byte, dan penafsirannya sepenuhnya urusan aplikasi.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Kenapa justru itu kekuatannya|Karena model file tidak mengasumsikan apa pun tentang isinya, semua jenis device bisa dimuat ke dalam model yang sama. Andai OS memaksakan struktur tertentu, keyboard dan socket jaringan tidak akan pernah muat ke dalamnya.}}&lt;br /&gt;
&lt;br /&gt;
== Semua device adalah file ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setiap I/O device dimodelkan sebagai file&#039;&#039;&#039; — termasuk:&lt;br /&gt;
&lt;br /&gt;
* disk&lt;br /&gt;
* keyboard&lt;br /&gt;
* display&lt;br /&gt;
* bahkan &#039;&#039;&#039;jaringan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya menyeluruh: &#039;&#039;&#039;seluruh input dan output di sistem dilakukan dengan membaca dan menulis file&#039;&#039;&#039;, menggunakan sekumpulan kecil system call yang dikenal sebagai &#039;&#039;&#039;Unix I/O&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    Aplikasi&lt;br /&gt;
                        |&lt;br /&gt;
        open / read / write / close      &amp;lt;- Unix I/O&lt;br /&gt;
                        |&lt;br /&gt;
     +---------+--------+--------+----------+&lt;br /&gt;
     |         |        |        |          |&lt;br /&gt;
   Disk    Keyboard   Display  Network    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bentuk corongnya: banyak device yang bentuk fisiknya sangat berbeda, tapi semuanya masuk lewat antarmuka yang sama dan jumlah system call-nya sedikit.&lt;br /&gt;
&lt;br /&gt;
== Kenapa ini powerful ==&lt;br /&gt;
&lt;br /&gt;
Gagasan file yang &#039;&#039;&#039;sederhana dan elegan&#039;&#039;&#039; ini ternyata sangat kuat, karena memberi aplikasi &#039;&#039;&#039;tampilan yang seragam atas semua I/O device&#039;&#039;&#039; yang mungkin ada di sistem.&lt;br /&gt;
&lt;br /&gt;
Dua konsekuensi yang disebut buku:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Programmer tidak perlu tahu teknologi device-nya.&#039;&#039;&#039; Yang memanipulasi isi file di disk, dalam istilah buku, &#039;&#039;blissfully unaware&#039;&#039; soal teknologi disk yang dipakai. Mau NVMe, SATA, atau apa pun, kodenya sama.&lt;br /&gt;
# &#039;&#039;&#039;Program yang sama jalan di sistem berbeda.&#039;&#039;&#039; Program itu tetap berjalan di sistem yang memakai teknologi disk yang berbeda, tanpa perlu diubah.&lt;br /&gt;
&lt;br /&gt;
Ini contoh konkret dari tujuan kedua operating system yang dibahas di [[Operating System Mengelola Hardware]]: menyediakan mekanisme yang sederhana dan seragam untuk hardware low-level yang bentuknya beda-beda.&lt;br /&gt;
&lt;br /&gt;
Unix I/O dibahas di &#039;&#039;&#039;Bab 10&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;File descriptor adalah wujud praktis abstraksi ini.&#039;&#039;&#039; Setelah &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, sebuah file diwakili integer kecil. Tiga di antaranya sudah disiapkan sejak process lahir: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; stdin, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; stdout, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; stderr. Karena semuanya cuma integer yang menunjuk ke urutan byte, &#039;&#039;pipe&#039;&#039; dan &#039;&#039;redirection&#039;&#039; di shell jadi mungkin tanpa program perlu tahu apa-apa.&lt;br /&gt;
* &#039;&#039;&#039;Device benar-benar muncul sebagai file di filesystem.&#039;&#039;&#039; Lihat isi &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt;. Ada &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/zero&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/random&amp;lt;/code&amp;gt;, sampai disk mentah seperti &amp;lt;code&amp;gt;/dev/nvme0n1&amp;lt;/code&amp;gt;. Bahkan state kernel dipaparkan sebagai file lewat &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;/sys&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;/proc/[pid]/maps&amp;lt;/code&amp;gt; yang dipakai di catatan [[Virtual Memory]] adalah contohnya.&lt;br /&gt;
* &#039;&#039;&#039;Socket adalah pengecualian sebagian.&#039;&#039;&#039; Setelah terhubung, socket bisa dibaca dan ditulis seperti file biasa. Tapi untuk membuatnya tetap butuh system call khusus: &amp;lt;code&amp;gt;socket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;accept&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt;. Jadi model file tidak menutupi seluruh siklus hidupnya.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pintu darurat abstraksi ini.&#039;&#039;&#039; Begitu ada operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte — mengatur baud rate serial, mengeluarkan tray CD, mengubah mode terminal — semuanya ditumpuk ke &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt;. Keberadaan &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pengakuan jujur bahwa abstraksi file tidak sempurna.&lt;br /&gt;
* &#039;&#039;&#039;Plan 9 mendorong ide ini sampai ujung.&#039;&#039;&#039; Sistem operasi penerus Unix dari Bell Labs itu membuat hampir segalanya benar-benar file, termasuk antarmuka jaringan dan window grafis. Sering disebut sebagai versi &amp;quot;Unix yang konsisten sepenuhnya&amp;quot;, dan berguna sebagai pembanding untuk melihat di mana Unix sendiri berkompromi.&lt;br /&gt;
* &#039;&#039;&#039;Keseragaman punya harga performa.&#039;&#039;&#039; Karena semua I/O lewat jalur yang sama, tiap operasi berarti satu system call dan penyalinan data antara kernel dan user space. Di sistem berthroughput tinggi, biaya itu dikurangi lewat &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sendfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;O_DIRECT&amp;lt;/code&amp;gt;, atau &amp;lt;code&amp;gt;io_uring&amp;lt;/code&amp;gt; yang membatch banyak operasi jadi satu perjalanan ke kernel.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Cara cepat merasakan abstraksi ini: jalankan &amp;lt;code&amp;gt;ls -l /proc/self/fd&amp;lt;/code&amp;gt; untuk melihat file descriptor milik process yang sedang berjalan, atau &amp;lt;code&amp;gt;strace -e trace=openat,read,write ./program&amp;lt;/code&amp;gt; untuk melihat setiap operasi Unix I/O yang benar-benar terjadi.}}&lt;br /&gt;
&lt;br /&gt;
== Ringkasan tiga abstraksi ==&lt;br /&gt;
&lt;br /&gt;
Dengan bagian ini, tiga abstraksi fundamental dari Figure 1.11 sudah lengkap:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Abstraksi !! Menutupi !! Dibahas di&lt;br /&gt;
|-&lt;br /&gt;
| [[Processes|Process]] || Processor, main memory, I/O devices || Bab 8&lt;br /&gt;
|-&lt;br /&gt;
| [[Virtual Memory|Virtual memory]] || Main memory dan disk I/O devices || Bab 9&lt;br /&gt;
|-&lt;br /&gt;
| File || I/O devices || Bab 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; File&lt;br /&gt;
: Urutan byte, tidak lebih dan tidak kurang; model OS untuk semua I/O device.&lt;br /&gt;
; Unix I/O&lt;br /&gt;
: Sekumpulan kecil system call untuk melakukan seluruh input dan output di sistem.&lt;br /&gt;
; File descriptor&lt;br /&gt;
: Integer kecil yang mewakili file terbuka di dalam sebuah process.&lt;br /&gt;
; ioctl&lt;br /&gt;
: System call serbaguna untuk operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[System Call]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=844</id>
		<title>Files</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Files&amp;diff=844"/>
		<updated>2026-08-24T06:32:40Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Definisi ==  &amp;#039;&amp;#039;&amp;#039;File adalah urutan byte. Tidak lebih, tidak kurang.&amp;#039;&amp;#039;&amp;#039;  Kalimat itu ditulis persis begitu di buku, dan penekanannya bukan sekadar gaya bahasa. Frasa &amp;#039;&amp;#039;&amp;quot;tidak lebih, tidak kurang&amp;quot;&amp;#039;&amp;#039; menegaskan bahwa operating system &amp;#039;&amp;#039;&amp;#039;sengaja menolak tahu&amp;#039;&amp;#039;&amp;#039; apa isi sebuah file:  * tidak ada tipe data * tidak ada struktur internal * tidak ada konsep record atau baris  Cuma deretan byte, dan penafsirannya sepenuhnya urusan aplikasi.  {{Catatan|title=Kenapa justru itu ke...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Definisi ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;File adalah urutan byte. Tidak lebih, tidak kurang.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Kalimat itu ditulis persis begitu di buku, dan penekanannya bukan sekadar gaya bahasa. Frasa &#039;&#039;&amp;quot;tidak lebih, tidak kurang&amp;quot;&#039;&#039; menegaskan bahwa operating system &#039;&#039;&#039;sengaja menolak tahu&#039;&#039;&#039; apa isi sebuah file:&lt;br /&gt;
&lt;br /&gt;
* tidak ada tipe data&lt;br /&gt;
* tidak ada struktur internal&lt;br /&gt;
* tidak ada konsep record atau baris&lt;br /&gt;
&lt;br /&gt;
Cuma deretan byte, dan penafsirannya sepenuhnya urusan aplikasi.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Kenapa justru itu kekuatannya|Karena model file tidak mengasumsikan apa pun tentang isinya, semua jenis device bisa dimuat ke dalam model yang sama. Andai OS memaksakan struktur tertentu, keyboard dan socket jaringan tidak akan pernah muat ke dalamnya.}}&lt;br /&gt;
&lt;br /&gt;
== Semua device adalah file ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Setiap I/O device dimodelkan sebagai file&#039;&#039;&#039; — termasuk:&lt;br /&gt;
&lt;br /&gt;
* disk&lt;br /&gt;
* keyboard&lt;br /&gt;
* display&lt;br /&gt;
* bahkan &#039;&#039;&#039;jaringan&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Konsekuensinya menyeluruh: &#039;&#039;&#039;seluruh input dan output di sistem dilakukan dengan membaca dan menulis file&#039;&#039;&#039;, menggunakan sekumpulan kecil system call yang dikenal sebagai &#039;&#039;&#039;Unix I/O&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                    Aplikasi&lt;br /&gt;
                        |&lt;br /&gt;
        open / read / write / close      &amp;lt;- Unix I/O&lt;br /&gt;
                        |&lt;br /&gt;
     +---------+--------+--------+----------+&lt;br /&gt;
     |         |        |        |          |&lt;br /&gt;
   Disk    Keyboard   Display  Network    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatikan bentuk corongnya: banyak device yang bentuk fisiknya sangat berbeda, tapi semuanya masuk lewat antarmuka yang sama dan jumlah system call-nya sedikit.&lt;br /&gt;
&lt;br /&gt;
== Kenapa ini powerful ==&lt;br /&gt;
&lt;br /&gt;
Gagasan file yang &#039;&#039;&#039;sederhana dan elegan&#039;&#039;&#039; ini ternyata sangat kuat, karena memberi aplikasi &#039;&#039;&#039;tampilan yang seragam atas semua I/O device&#039;&#039;&#039; yang mungkin ada di sistem.&lt;br /&gt;
&lt;br /&gt;
Dua konsekuensi yang disebut buku:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Programmer tidak perlu tahu teknologi device-nya.&#039;&#039;&#039; Yang memanipulasi isi file di disk, dalam istilah buku, &#039;&#039;blissfully unaware&#039;&#039; soal teknologi disk yang dipakai. Mau NVMe, SATA, atau apa pun, kodenya sama.&lt;br /&gt;
# &#039;&#039;&#039;Program yang sama jalan di sistem berbeda.&#039;&#039;&#039; Program itu tetap berjalan di sistem yang memakai teknologi disk yang berbeda, tanpa perlu diubah.&lt;br /&gt;
&lt;br /&gt;
Ini contoh konkret dari tujuan kedua operating system yang dibahas di [[Operating System Mengelola Hardware]]: menyediakan mekanisme yang sederhana dan seragam untuk hardware low-level yang bentuknya beda-beda.&lt;br /&gt;
&lt;br /&gt;
Unix I/O dibahas di &#039;&#039;&#039;Bab 10&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;File descriptor adalah wujud praktis abstraksi ini.&#039;&#039;&#039; Setelah &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;, sebuah file diwakili integer kecil. Tiga di antaranya sudah disiapkan sejak process lahir: &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; stdin, &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; stdout, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; stderr. Karena semuanya cuma integer yang menunjuk ke urutan byte, &#039;&#039;pipe&#039;&#039; dan &#039;&#039;redirection&#039;&#039; di shell jadi mungkin tanpa program perlu tahu apa-apa.&lt;br /&gt;
* &#039;&#039;&#039;Device benar-benar muncul sebagai file di filesystem.&#039;&#039;&#039; Lihat isi &amp;lt;code&amp;gt;/dev&amp;lt;/code&amp;gt;. Ada &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/zero&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;/dev/random&amp;lt;/code&amp;gt;, sampai disk mentah seperti &amp;lt;code&amp;gt;/dev/nvme0n1&amp;lt;/code&amp;gt;. Bahkan state kernel dipaparkan sebagai file lewat &amp;lt;code&amp;gt;/proc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;/sys&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;/proc/[pid]/maps&amp;lt;/code&amp;gt; yang dipakai di catatan [[Virtual Memory]] adalah contohnya.&lt;br /&gt;
* &#039;&#039;&#039;Socket adalah pengecualian sebagian.&#039;&#039;&#039; Setelah terhubung, socket bisa dibaca dan ditulis seperti file biasa. Tapi untuk membuatnya tetap butuh system call khusus: &amp;lt;code&amp;gt;socket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bind&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;listen&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;accept&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;connect&amp;lt;/code&amp;gt;. Jadi model file tidak menutupi seluruh siklus hidupnya.&lt;br /&gt;
* &#039;&#039;&#039;&amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pintu darurat abstraksi ini.&#039;&#039;&#039; Begitu ada operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte — mengatur baud rate serial, mengeluarkan tray CD, mengubah mode terminal — semuanya ditumpuk ke &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt;. Keberadaan &amp;lt;code&amp;gt;ioctl&amp;lt;/code&amp;gt; adalah pengakuan jujur bahwa abstraksi file tidak sempurna.&lt;br /&gt;
* &#039;&#039;&#039;Plan 9 mendorong ide ini sampai ujung.&#039;&#039;&#039; Sistem operasi penerus Unix dari Bell Labs itu membuat hampir segalanya benar-benar file, termasuk antarmuka jaringan dan window grafis. Sering disebut sebagai versi &amp;quot;Unix yang konsisten sepenuhnya&amp;quot;, dan berguna sebagai pembanding untuk melihat di mana Unix sendiri berkompromi.&lt;br /&gt;
* &#039;&#039;&#039;Keseragaman punya harga performa.&#039;&#039;&#039; Karena semua I/O lewat jalur yang sama, tiap operasi berarti satu system call dan penyalinan data antara kernel dan user space. Di sistem berthroughput tinggi, biaya itu dikurangi lewat &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sendfile&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;O_DIRECT&amp;lt;/code&amp;gt;, atau &amp;lt;code&amp;gt;io_uring&amp;lt;/code&amp;gt; yang membatch banyak operasi jadi satu perjalanan ke kernel.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Cara cepat merasakan abstraksi ini: jalankan &amp;lt;code&amp;gt;ls -l /proc/self/fd&amp;lt;/code&amp;gt; untuk melihat file descriptor milik process yang sedang berjalan, atau &amp;lt;code&amp;gt;strace -e trace=openat,read,write ./program&amp;lt;/code&amp;gt; untuk melihat setiap operasi Unix I/O yang benar-benar terjadi.}}&lt;br /&gt;
&lt;br /&gt;
== Ringkasan tiga abstraksi ==&lt;br /&gt;
&lt;br /&gt;
Dengan bagian ini, tiga abstraksi fundamental dari Figure 1.11 sudah lengkap:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Abstraksi !! Menutupi !! Dibahas di&lt;br /&gt;
|-&lt;br /&gt;
| [[Processes|Process]] || Processor, main memory, I/O devices || Bab 8&lt;br /&gt;
|-&lt;br /&gt;
| [[Virtual Memory|Virtual memory]] || Main memory dan disk I/O devices || Bab 9&lt;br /&gt;
|-&lt;br /&gt;
| File || I/O devices || Bab 10&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; File&lt;br /&gt;
: Urutan byte, tidak lebih dan tidak kurang; model OS untuk semua I/O device.&lt;br /&gt;
; Unix I/O&lt;br /&gt;
: Sekumpulan kecil system call untuk melakukan seluruh input dan output di sistem.&lt;br /&gt;
; File descriptor&lt;br /&gt;
: Integer kecil yang mewakili file terbuka di dalam sebuah process.&lt;br /&gt;
; ioctl&lt;br /&gt;
: System call serbaguna untuk operasi device yang tidak bisa dinyatakan sebagai baca atau tulis byte.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Processes]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[System Call]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=OS_Manages_Hardware&amp;diff=843</id>
		<title>OS Manages Hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=OS_Manages_Hardware&amp;diff=843"/>
		<updated>2026-08-24T04:38:35Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Catatan dari &#039;&#039;&#039;CS:APP&#039;&#039;&#039; (&#039;&#039;Computer Systems: A Programmer&#039;s Perspective&#039;&#039;) §1.7 — tentang bagaimana operating system menjadi perantara tunggal antara aplikasi dan hardware.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Kenapa bab ini penting ==&lt;br /&gt;
&lt;br /&gt;
Balik ke contoh &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;. Waktu shell nge-load dan menjalankan program &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;, terus &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt; nge-print pesannya ke layar — &#039;&#039;&#039;nggak ada satu pun dari dua program itu yang nyentuh keyboard, display, disk, atau main memory secara langsung&#039;&#039;&#039;. Semuanya numpang layanan yang disediakan operating system.&lt;br /&gt;
&lt;br /&gt;
Ini bukan detail sepele. Ini fondasi kenapa kita bisa nulis &amp;lt;code&amp;gt;printf(&amp;quot;hello\n&amp;quot;)&amp;lt;/code&amp;gt; tanpa perlu tahu merek monitor atau protokol bus yang dipakai.&lt;br /&gt;
&lt;br /&gt;
== Layered view ==&lt;br /&gt;
&lt;br /&gt;
Model mentalnya: OS itu &#039;&#039;&#039;lapisan software yang disisipkan di antara aplikasi dan hardware&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+-----------------------------------------+&lt;br /&gt;
|         Application programs            |  &amp;lt;- Software&lt;br /&gt;
+-----------------------------------------+&lt;br /&gt;
|          Operating system               |  &amp;lt;- Software&lt;br /&gt;
+-----------+--------------+--------------+&lt;br /&gt;
| Processor | Main memory  | I/O devices  |  &amp;lt;- Hardware&lt;br /&gt;
+-----------+--------------+--------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aturannya keras: &#039;&#039;&#039;semua usaha aplikasi buat memanipulasi hardware harus lewat OS&#039;&#039;&#039;. Nggak ada jalan tikus. Kalau ada program yang mau nulis ke disk, dia harus minta ke OS.&lt;br /&gt;
&lt;br /&gt;
Konsekuensi praktisnya: batas antara aplikasi dan OS itu adalah &#039;&#039;&#039;system call interface&#039;&#039;&#039;. Setiap kali kode kita nyebrang garis itu, ada biaya (&#039;&#039;mode switch&#039;&#039;), dan itu jadi salah satu sumber overhead yang paling sering muncul di profiling.&lt;br /&gt;
&lt;br /&gt;
== Dua tujuan utama OS ==&lt;br /&gt;
&lt;br /&gt;
=== Proteksi — melindungi hardware dari penyalahgunaan ===&lt;br /&gt;
&lt;br /&gt;
Aplikasi yang &#039;&#039;runaway&#039;&#039; (bug, infinite loop, pointer liar) nggak boleh:&lt;br /&gt;
&lt;br /&gt;
* nimpa memory milik proses lain&lt;br /&gt;
* monopoli CPU selamanya&lt;br /&gt;
* ngerusak state device&lt;br /&gt;
&lt;br /&gt;
Mekanismenya nanti: privilege level (user mode vs kernel mode), MMU + page table buat isolasi memory, timer interrupt buat preemption.&lt;br /&gt;
&lt;br /&gt;
=== Abstraksi — menyediakan mekanisme yang sederhana dan seragam ===&lt;br /&gt;
&lt;br /&gt;
Hardware level rendah itu bentuknya &#039;&#039;&#039;beda-beda dan sering liar banget&#039;&#039;&#039;. Register controller SSD beda total sama register UART, beda lagi sama NIC. Kalau tiap aplikasi harus tahu detail tiap device, nulis program jadi mimpi buruk dan nggak portable.&lt;br /&gt;
&lt;br /&gt;
OS nyediain satu antarmuka seragam supaya aplikasi cukup belajar satu cara.&lt;br /&gt;
&lt;br /&gt;
== Tiga abstraksi fundamental ==&lt;br /&gt;
&lt;br /&gt;
OS mencapai &#039;&#039;&#039;dua&#039;&#039;&#039; tujuan di atas lewat &#039;&#039;&#039;tiga&#039;&#039;&#039; abstraksi yang saling bertumpuk:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+------------------------------------ Processes ----------+&lt;br /&gt;
|              +-------------------- Virtual memory ------+|&lt;br /&gt;
|              |                 +------ Files ----------+||&lt;br /&gt;
|  +-----------+-+---------------+--+--------------------+||&lt;br /&gt;
|  |  Processor  |   Main memory    |    I/O devices     |||&lt;br /&gt;
|  +-------------+------------------+--------------------+||&lt;br /&gt;
+---------------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Perhatiin &#039;&#039;&#039;cakupan&#039;&#039;&#039; tiap abstraksi — ini bagian yang sering ketuker:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Abstraksi !! Hardware yang diabstraksikan&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Files&#039;&#039;&#039; || I/O devices&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Virtual memory&#039;&#039;&#039; || Main memory &#039;&#039;&#039;+&#039;&#039;&#039; disk I/O devices&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Processes&#039;&#039;&#039; || Processor &#039;&#039;&#039;+&#039;&#039;&#039; main memory &#039;&#039;&#039;+&#039;&#039;&#039; I/O devices&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Files — abstraksi untuk I/O devices ===&lt;br /&gt;
&lt;br /&gt;
Semua device dibungkus jadi &amp;quot;urutan byte&amp;quot;. Disk, keyboard, terminal, socket jaringan — semuanya bisa dibuka, dibaca, ditulis, ditutup lewat API yang sama. Ini filosofi &#039;&#039;&amp;quot;everything is a file&amp;quot;&#039;&#039; yang khas Unix.&lt;br /&gt;
&lt;br /&gt;
Efeknya: program yang nulis ke file bisa di-&#039;&#039;pipe&#039;&#039; ke program lain tanpa modifikasi apa pun.&lt;br /&gt;
&lt;br /&gt;
=== Virtual memory — abstraksi untuk main memory + disk ===&lt;br /&gt;
&lt;br /&gt;
Tiap proses seolah-olah punya &#039;&#039;&#039;memory sendiri yang utuh dan kontinu&#039;&#039;&#039;, mulai dari alamat 0 sampai batas atas ruang alamat. Padahal fisiknya memory itu dibagi-bagi dan sebagian bisa lagi &amp;quot;nginep&amp;quot; di disk.&lt;br /&gt;
&lt;br /&gt;
Kenapa disk ikut masuk? Karena isi memory bisa di-&#039;&#039;page out&#039;&#039; ke disk saat RAM sesak. Jadi virtual memory sebenarnya adalah abstraksi gabungan dari dua tingkat hierarki penyimpanan sekaligus.&lt;br /&gt;
&lt;br /&gt;
Ini juga yang bikin proteksi jadi mungkin: kalau dua proses pakai alamat &amp;lt;code&amp;gt;0x400000&amp;lt;/code&amp;gt;, itu merujuk ke halaman fisik yang beda.&lt;br /&gt;
&lt;br /&gt;
=== Processes — abstraksi untuk seluruh mesin ===&lt;br /&gt;
&lt;br /&gt;
Proses adalah ilusi bahwa &#039;&#039;&#039;program kita satu-satunya yang jalan di mesin ini&#039;&#039;&#039;, dengan CPU-nya sendiri, memory-nya sendiri, dan device-nya sendiri.&lt;br /&gt;
&lt;br /&gt;
Padahal aslinya puluhan sampai ratusan proses gantian pakai CPU yang jumlahnya jauh lebih sedikit. OS ngelakuin &#039;&#039;context switch&#039;&#039; — nyimpen state satu proses, restore state proses lain — cukup cepat sampai ilusinya nggak ketahuan.&lt;br /&gt;
&lt;br /&gt;
Jadi processes itu abstraksi paling &amp;quot;atas&amp;quot;: dia membungkus processor, main memory, &#039;&#039;&#039;dan&#039;&#039;&#039; I/O devices sekaligus.&lt;br /&gt;
&lt;br /&gt;
== Cara ngingetnya ==&lt;br /&gt;
&lt;br /&gt;
Tiga abstraksi itu tersusun kayak boneka matryoshka, makin ke atas makin banyak hardware yang dibungkus:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Files&#039;&#039;&#039; → paling sempit, cuma I/O&lt;br /&gt;
# &#039;&#039;&#039;Virtual memory&#039;&#039;&#039; → nambah main memory ke dalamnya&lt;br /&gt;
# &#039;&#039;&#039;Processes&#039;&#039;&#039; → nambah processor, jadi lengkap&lt;br /&gt;
&lt;br /&gt;
Dan dua tujuan (proteksi + antarmuka seragam) itu &#039;&#039;&#039;dicapai lewat&#039;&#039;&#039; tiga abstraksi ini, bukan hal yang terpisah.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
Beberapa hal yang nyambung ke topik performance:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;System call itu nggak gratis.&#039;&#039;&#039; Karena semua akses hardware wajib lewat OS, jalur kritis yang sering nge-hit syscall bakal kena overhead &#039;&#039;mode switch&#039;&#039;. Ini alasan kenapa ada teknik kayak batching I/O, &amp;lt;code&amp;gt;io_uring&amp;lt;/code&amp;gt;, atau kernel bypass (DPDK, RDMA) di sistem yang butuh throughput tinggi.&lt;br /&gt;
* &#039;&#039;&#039;Virtual memory bukan cuma soal kapasitas.&#039;&#039;&#039; Page fault, TLB miss, dan NUMA placement semuanya lahir dari abstraksi ini. Program yang secara aritmetika identik bisa beda performanya berkali-kali lipat cuma gara-gara pola akses memory-nya beda.&lt;br /&gt;
* &#039;&#039;&#039;Context switch punya harga.&#039;&#039;&#039; Selain nyimpen register, cache dan TLB ikut &amp;quot;dingin&amp;quot; setelah switch. Ini salah satu alasan kenapa di HPC orang sering nge-&#039;&#039;pin&#039;&#039; thread ke core tertentu.&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Operating system&lt;br /&gt;
: Lapisan software antara aplikasi dan hardware.&lt;br /&gt;
; Abstraction&lt;br /&gt;
: Antarmuka sederhana yang menyembunyikan kompleksitas di bawahnya.&lt;br /&gt;
; Process&lt;br /&gt;
: Abstraksi untuk processor, main memory, dan I/O devices.&lt;br /&gt;
; Virtual memory&lt;br /&gt;
: Abstraksi untuk main memory dan disk I/O devices.&lt;br /&gt;
; File&lt;br /&gt;
: Abstraksi untuk I/O devices, dilihat sebagai urutan byte.&lt;br /&gt;
; Context switch&lt;br /&gt;
: Proses menyimpan dan memulihkan state saat CPU berpindah proses.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[Files]]&lt;br /&gt;
* [[System Call]]&lt;br /&gt;
* [[Context Switch]]&lt;br /&gt;
* [[CS:APP]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Computer Systems]]&lt;br /&gt;
[[Category:Operating System]]&lt;br /&gt;
[[Category:CS:APP]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Virtual_Memory&amp;diff=842</id>
		<title>Virtual Memory</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Virtual_Memory&amp;diff=842"/>
		<updated>2026-08-24T04:38:24Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ilusi yang dijual ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtual memory&#039;&#039;&#039; adalah abstraksi yang memberi tiap process ilusi bahwa dia &#039;&#039;&#039;punya akses eksklusif ke main memory&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tiap process melihat memory dengan &#039;&#039;&#039;tampilan yang seragam&#039;&#039;&#039;, dan tampilan itu disebut &#039;&#039;&#039;virtual address space&#039;&#039;&#039;. Seragam artinya: process apa pun, sekecil atau sebesar apa pun, melihat peta memory dengan struktur yang sama persis.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Struktur pada Figure 1.13 adalah tata letak untuk process Linux. Sistem Unix lain memakai layout yang mirip.}}&lt;br /&gt;
&lt;br /&gt;
== Tata letak ruang alamat ==&lt;br /&gt;
&lt;br /&gt;
Pembagian besarnya cuma dua:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Region paling atas&#039;&#039;&#039; — disediakan untuk code dan data operating system, dan ini &#039;&#039;&#039;sama untuk semua process&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Region bawah&#039;&#039;&#039; — menampung code dan data yang didefinisikan oleh process milik user.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Arah alamat|Pada Figure 1.13, &#039;&#039;&#039;alamat bertambah dari bawah ke atas&#039;&#039;&#039;. Angka 0 ada di dasar gambar. Jadi &amp;quot;stack di atas&amp;quot; berarti alamatnya tinggi, dan &amp;quot;heap di bawah&amp;quot; berarti alamatnya rendah. Salah baca arah ini bikin seluruh diagram jadi terbalik maknanya.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                              alamat tinggi&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Kernel virtual memory           |   &amp;lt;- tidak terlihat oleh user code&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | User stack                      |&lt;br /&gt;
        | (dibuat saat run time)          |&lt;br /&gt;
        |              |                  |&lt;br /&gt;
        |              v   tumbuh turun   |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        |          (ruang kosong)         |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Memory-mapped region            |&lt;br /&gt;
        | untuk shared libraries          |   &amp;lt;- di sini fungsi printf berada&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        |          (ruang kosong)         |&lt;br /&gt;
        |              ^   tumbuh naik    |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Run-time heap                   |&lt;br /&gt;
        | (dibuat oleh malloc)            |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Read/write data                 |  \&lt;br /&gt;
        +---------------------------------+   &amp;gt;  dimuat dari file&lt;br /&gt;
        | Read-only code and data         |  /   executable hello&lt;br /&gt;
        +---------------------------------+   &amp;lt;- program start&lt;br /&gt;
        |                                 |&lt;br /&gt;
        +---------------------------------+ 0&lt;br /&gt;
                                              alamat rendah&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Area-area penting ==&lt;br /&gt;
&lt;br /&gt;
Dibahas dari alamat terendah naik ke atas.&lt;br /&gt;
&lt;br /&gt;
=== Program code and data ===&lt;br /&gt;
&lt;br /&gt;
Code dimulai pada &#039;&#039;&#039;alamat tetap yang sama untuk semua process&#039;&#039;&#039;, diikuti lokasi data yang berkorespondensi dengan variabel global C.&lt;br /&gt;
&lt;br /&gt;
Yang khas dari area ini: isinya &#039;&#039;&#039;diinisialisasi langsung dari isi file executable object&#039;&#039;&#039; — dalam contoh kita, file &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;. Jadi area ini bukan dibangun saat runtime, tapi disalin dari file di disk.&lt;br /&gt;
&lt;br /&gt;
Ukurannya &#039;&#039;&#039;tetap begitu process mulai jalan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dibahas lebih lanjut di &#039;&#039;&#039;Bab 7&#039;&#039;&#039; (linking dan loading).&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
&lt;br /&gt;
Langsung menyusul area code dan data. Berbeda dari code dan data yang ukurannya tetap, heap &#039;&#039;&#039;memuai dan menyusut secara dinamis saat run time&#039;&#039;&#039; sebagai akibat pemanggilan rutin pustaka standar C seperti &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dibahas detail di &#039;&#039;&#039;Bab 9&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Shared libraries ===&lt;br /&gt;
&lt;br /&gt;
Berada di &#039;&#039;&#039;sekitar tengah&#039;&#039;&#039; ruang alamat. Menampung code dan data untuk shared library seperti pustaka standar C dan pustaka matematika.&lt;br /&gt;
&lt;br /&gt;
Inilah tempat fungsi &amp;lt;code&amp;gt;printf&amp;lt;/code&amp;gt; yang dipanggil &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt; sebenarnya berada — bukan di dalam executable-nya sendiri.&lt;br /&gt;
&lt;br /&gt;
CS:APP sendiri menyebut konsep shared library ini &#039;&#039;&#039;powerful tapi agak sulit&#039;&#039;&#039;. Mekanismenya dibahas di &#039;&#039;&#039;Bab 7&#039;&#039;&#039; (dynamic linking).&lt;br /&gt;
&lt;br /&gt;
=== User stack ===&lt;br /&gt;
&lt;br /&gt;
Berada di &#039;&#039;&#039;puncak ruang alamat user&#039;&#039;&#039;. Dipakai &#039;&#039;&#039;compiler untuk mengimplementasikan pemanggilan fungsi&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Seperti heap, stack juga memuai dan menyusut secara dinamis selama program berjalan:&lt;br /&gt;
&lt;br /&gt;
* tiap kali kita &#039;&#039;&#039;memanggil&#039;&#039;&#039; fungsi → stack &#039;&#039;&#039;tumbuh&#039;&#039;&#039;&lt;br /&gt;
* tiap kali kita &#039;&#039;&#039;return&#039;&#039;&#039; dari fungsi → stack &#039;&#039;&#039;menyusut&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cara compiler memakai stack dibahas di &#039;&#039;&#039;Bab 3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kernel virtual memory ===&lt;br /&gt;
&lt;br /&gt;
Region paling atas, disediakan untuk kernel. Aturannya tegas — program aplikasi &#039;&#039;&#039;tidak diizinkan&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* membaca isi area ini&lt;br /&gt;
* menulis ke area ini&lt;br /&gt;
* memanggil langsung fungsi yang didefinisikan di kode kernel&lt;br /&gt;
&lt;br /&gt;
Sebagai gantinya, aplikasi harus &#039;&#039;&#039;meminta kernel&#039;&#039;&#039; untuk melakukan operasi tersebut, yaitu lewat system call. Ini menyambung langsung ke pembahasan di [[Processes]].&lt;br /&gt;
&lt;br /&gt;
== Cara kerjanya ==&lt;br /&gt;
&lt;br /&gt;
Supaya virtual memory bisa bekerja, dibutuhkan &#039;&#039;&#039;interaksi yang rumit antara hardware dan software operating system&#039;&#039;&#039;, termasuk &#039;&#039;&#039;penerjemahan alamat oleh hardware untuk setiap alamat yang dihasilkan processor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perhatikan kata &#039;&#039;&#039;setiap&#039;&#039;&#039;. Ini bukan operasi sesekali — tiap kali instruksi menyentuh memory, ada terjemahan alamat virtual ke alamat fisik yang terjadi di hardware.&lt;br /&gt;
&lt;br /&gt;
Ide dasarnya:&lt;br /&gt;
&lt;br /&gt;
# Simpan isi virtual memory sebuah process &#039;&#039;&#039;di disk&#039;&#039;&#039;.&lt;br /&gt;
# Gunakan &#039;&#039;&#039;main memory sebagai cache untuk disk&#039;&#039;&#039; itu.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Model mental yang terbalik|Poin kedua ini biasanya yang paling mengejutkan. Kita terbiasa berpikir RAM sebagai tempat penyimpanan utama dan disk sebagai cadangan. Virtual memory membalik posisinya: disk adalah tempat data sebenarnya berada, dan RAM cuma lapisan cache yang cepat di depannya. Sudut pandang ini yang bikin konsep page fault jadi masuk akal.}}&lt;br /&gt;
&lt;br /&gt;
Penjelasan lengkapnya, dan kenapa ini begitu penting untuk sistem modern, ada di &#039;&#039;&#039;Bab 9&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Code dimulai pada alamat tetap yang sama&amp;quot; sudah tidak sepenuhnya berlaku.&#039;&#039;&#039; Pernyataan itu benar untuk binary non-PIE. Linux modern mengompilasi binary sebagai PIE dan mengaktifkan &#039;&#039;&#039;ASLR&#039;&#039;&#039;, sehingga alamat basis code, heap, stack, dan shared library diacak tiap kali process dijalankan — sebagai pertahanan terhadap eksploitasi. Cek dengan menjalankan &amp;lt;code&amp;gt;cat /proc/self/maps&amp;lt;/code&amp;gt; dua kali dan bandingkan hasilnya. Untuk debugging bisa dimatikan sementara dengan &amp;lt;code&amp;gt;setarch -R&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Peta ini bisa dilihat langsung.&#039;&#039;&#039; &amp;lt;code&amp;gt;/proc/[pid]/maps&amp;lt;/code&amp;gt; menampilkan seluruh region beserta permission dan file pendukungnya. Ini cara tercepat memverifikasi bahwa Figure 1.13 memang benar-benar ada, bukan sekadar model.&lt;br /&gt;
* &#039;&#039;&#039;Heap besar tidak selalu lewat heap.&#039;&#039;&#039; &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; di glibc memakai &amp;lt;code&amp;gt;brk&amp;lt;/code&amp;gt; untuk alokasi kecil, tapi beralih ke &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; untuk alokasi di atas ambang tertentu (&amp;lt;code&amp;gt;M_MMAP_THRESHOLD&amp;lt;/code&amp;gt;, default sekitar 128 KB). Jadi alokasi besar sebenarnya mendarat di region memory-mapped, bukan di run-time heap.&lt;br /&gt;
* &#039;&#039;&#039;Stack punya batas keras.&#039;&#039;&#039; Stack memang tumbuh otomatis, tapi hanya sampai &amp;lt;code&amp;gt;RLIMIT_STACK&amp;lt;/code&amp;gt; (umumnya 8 MB). Di bawahnya ada &#039;&#039;guard page&#039;&#039; — menyentuhnya memicu SIGSEGV. Inilah yang terjadi pada rekursi tanpa henti.&lt;br /&gt;
* &#039;&#039;&#039;Alokasi tidak sama dengan memory fisik.&#039;&#039;&#039; Linux melakukan &#039;&#039;overcommit&#039;&#039;: &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; yang sukses cuma berarti ruang alamat sudah dicadangkan, halaman fisiknya baru diberikan saat benar-benar disentuh (&#039;&#039;demand paging&#039;&#039;). Konsekuensinya, program bisa mati kena OOM killer di titik penulisan, bukan di titik alokasi.&lt;br /&gt;
* &#039;&#039;&#039;Terjemahan setiap alamat itu mahal, makanya ada TLB.&#039;&#039;&#039; Karena tiap akses memory butuh penerjemahan, hasil terjemahan di-cache di &#039;&#039;Translation Lookaside Buffer&#039;&#039;. TLB miss adalah biaya nyata di workload dengan pola akses acak, dan itulah alasan &#039;&#039;huge pages&#039;&#039; bisa memberi percepatan besar di aplikasi seperti database dan HPC.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Kalau ingin melihat semua ini bekerja sekaligus: jalankan &amp;lt;code&amp;gt;perf stat -e dTLB-load-misses,page-faults ./program&amp;lt;/code&amp;gt;. Dua angka itu adalah harga langsung dari abstraksi virtual memory.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Virtual memory&lt;br /&gt;
: Abstraksi yang memberi tiap process ilusi penggunaan eksklusif atas main memory.&lt;br /&gt;
; Virtual address space&lt;br /&gt;
: Tampilan memory yang seragam yang dilihat tiap process.&lt;br /&gt;
; Heap&lt;br /&gt;
: Area yang memuai dan menyusut dinamis saat run time akibat &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;.&lt;br /&gt;
; User stack&lt;br /&gt;
: Area di puncak ruang alamat user, dipakai compiler untuk mengimplementasikan pemanggilan fungsi.&lt;br /&gt;
; Shared library&lt;br /&gt;
: Code dan data pustaka bersama seperti libc dan libm, dipetakan di sekitar tengah ruang alamat.&lt;br /&gt;
; Kernel virtual memory&lt;br /&gt;
: Region teratas yang disediakan untuk kernel; tidak boleh dibaca, ditulis, atau dipanggil langsung oleh aplikasi.&lt;br /&gt;
; ASLR&lt;br /&gt;
: Pengacakan alamat basis region saat process dijalankan, sebagai pertahanan keamanan.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[Files]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[System Call]]&lt;br /&gt;
* [[CS:APP]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Virtual_Memory&amp;diff=841</id>
		<title>Virtual Memory</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Virtual_Memory&amp;diff=841"/>
		<updated>2026-08-24T04:26:59Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: Created page with &amp;quot;== Ilusi yang dijual ==  &amp;#039;&amp;#039;&amp;#039;Virtual memory&amp;#039;&amp;#039;&amp;#039; adalah abstraksi yang memberi tiap process ilusi bahwa dia &amp;#039;&amp;#039;&amp;#039;punya akses eksklusif ke main memory&amp;#039;&amp;#039;&amp;#039;.  Tiap process melihat memory dengan &amp;#039;&amp;#039;&amp;#039;tampilan yang seragam&amp;#039;&amp;#039;&amp;#039;, dan tampilan itu disebut &amp;#039;&amp;#039;&amp;#039;virtual address space&amp;#039;&amp;#039;&amp;#039;. Seragam artinya: process apa pun, sekecil atau sebesar apa pun, melihat peta memory dengan struktur yang sama persis.  {{Catatan|Struktur pada Figure 1.13 adalah tata letak untuk process Linux. Sistem Unix l...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ilusi yang dijual ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Virtual memory&#039;&#039;&#039; adalah abstraksi yang memberi tiap process ilusi bahwa dia &#039;&#039;&#039;punya akses eksklusif ke main memory&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Tiap process melihat memory dengan &#039;&#039;&#039;tampilan yang seragam&#039;&#039;&#039;, dan tampilan itu disebut &#039;&#039;&#039;virtual address space&#039;&#039;&#039;. Seragam artinya: process apa pun, sekecil atau sebesar apa pun, melihat peta memory dengan struktur yang sama persis.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|Struktur pada Figure 1.13 adalah tata letak untuk process Linux. Sistem Unix lain memakai layout yang mirip.}}&lt;br /&gt;
&lt;br /&gt;
== Tata letak ruang alamat ==&lt;br /&gt;
&lt;br /&gt;
Pembagian besarnya cuma dua:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Region paling atas&#039;&#039;&#039; — disediakan untuk code dan data operating system, dan ini &#039;&#039;&#039;sama untuk semua process&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Region bawah&#039;&#039;&#039; — menampung code dan data yang didefinisikan oleh process milik user.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Arah alamat|Pada Figure 1.13, &#039;&#039;&#039;alamat bertambah dari bawah ke atas&#039;&#039;&#039;. Angka 0 ada di dasar gambar. Jadi &amp;quot;stack di atas&amp;quot; berarti alamatnya tinggi, dan &amp;quot;heap di bawah&amp;quot; berarti alamatnya rendah. Salah baca arah ini bikin seluruh diagram jadi terbalik maknanya.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                                              alamat tinggi&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Kernel virtual memory           |   &amp;lt;- tidak terlihat oleh user code&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | User stack                      |&lt;br /&gt;
        | (dibuat saat run time)          |&lt;br /&gt;
        |              |                  |&lt;br /&gt;
        |              v   tumbuh turun   |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        |          (ruang kosong)         |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Memory-mapped region            |&lt;br /&gt;
        | untuk shared libraries          |   &amp;lt;- di sini fungsi printf berada&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        |          (ruang kosong)         |&lt;br /&gt;
        |              ^   tumbuh naik    |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Run-time heap                   |&lt;br /&gt;
        | (dibuat oleh malloc)            |&lt;br /&gt;
        +---------------------------------+&lt;br /&gt;
        | Read/write data                 |  \&lt;br /&gt;
        +---------------------------------+   &amp;gt;  dimuat dari file&lt;br /&gt;
        | Read-only code and data         |  /   executable hello&lt;br /&gt;
        +---------------------------------+   &amp;lt;- program start&lt;br /&gt;
        |                                 |&lt;br /&gt;
        +---------------------------------+ 0&lt;br /&gt;
                                              alamat rendah&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Area-area penting ==&lt;br /&gt;
&lt;br /&gt;
Dibahas dari alamat terendah naik ke atas.&lt;br /&gt;
&lt;br /&gt;
=== Program code and data ===&lt;br /&gt;
&lt;br /&gt;
Code dimulai pada &#039;&#039;&#039;alamat tetap yang sama untuk semua process&#039;&#039;&#039;, diikuti lokasi data yang berkorespondensi dengan variabel global C.&lt;br /&gt;
&lt;br /&gt;
Yang khas dari area ini: isinya &#039;&#039;&#039;diinisialisasi langsung dari isi file executable object&#039;&#039;&#039; — dalam contoh kita, file &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt;. Jadi area ini bukan dibangun saat runtime, tapi disalin dari file di disk.&lt;br /&gt;
&lt;br /&gt;
Ukurannya &#039;&#039;&#039;tetap begitu process mulai jalan&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Dibahas lebih lanjut di &#039;&#039;&#039;Bab 7&#039;&#039;&#039; (linking dan loading).&lt;br /&gt;
&lt;br /&gt;
=== Heap ===&lt;br /&gt;
&lt;br /&gt;
Langsung menyusul area code dan data. Berbeda dari code dan data yang ukurannya tetap, heap &#039;&#039;&#039;memuai dan menyusut secara dinamis saat run time&#039;&#039;&#039; sebagai akibat pemanggilan rutin pustaka standar C seperti &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Dibahas detail di &#039;&#039;&#039;Bab 9&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Shared libraries ===&lt;br /&gt;
&lt;br /&gt;
Berada di &#039;&#039;&#039;sekitar tengah&#039;&#039;&#039; ruang alamat. Menampung code dan data untuk shared library seperti pustaka standar C dan pustaka matematika.&lt;br /&gt;
&lt;br /&gt;
Inilah tempat fungsi &amp;lt;code&amp;gt;printf&amp;lt;/code&amp;gt; yang dipanggil &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt; sebenarnya berada — bukan di dalam executable-nya sendiri.&lt;br /&gt;
&lt;br /&gt;
CS:APP sendiri menyebut konsep shared library ini &#039;&#039;&#039;powerful tapi agak sulit&#039;&#039;&#039;. Mekanismenya dibahas di &#039;&#039;&#039;Bab 7&#039;&#039;&#039; (dynamic linking).&lt;br /&gt;
&lt;br /&gt;
=== User stack ===&lt;br /&gt;
&lt;br /&gt;
Berada di &#039;&#039;&#039;puncak ruang alamat user&#039;&#039;&#039;. Dipakai &#039;&#039;&#039;compiler untuk mengimplementasikan pemanggilan fungsi&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Seperti heap, stack juga memuai dan menyusut secara dinamis selama program berjalan:&lt;br /&gt;
&lt;br /&gt;
* tiap kali kita &#039;&#039;&#039;memanggil&#039;&#039;&#039; fungsi → stack &#039;&#039;&#039;tumbuh&#039;&#039;&#039;&lt;br /&gt;
* tiap kali kita &#039;&#039;&#039;return&#039;&#039;&#039; dari fungsi → stack &#039;&#039;&#039;menyusut&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cara compiler memakai stack dibahas di &#039;&#039;&#039;Bab 3&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Kernel virtual memory ===&lt;br /&gt;
&lt;br /&gt;
Region paling atas, disediakan untuk kernel. Aturannya tegas — program aplikasi &#039;&#039;&#039;tidak diizinkan&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* membaca isi area ini&lt;br /&gt;
* menulis ke area ini&lt;br /&gt;
* memanggil langsung fungsi yang didefinisikan di kode kernel&lt;br /&gt;
&lt;br /&gt;
Sebagai gantinya, aplikasi harus &#039;&#039;&#039;meminta kernel&#039;&#039;&#039; untuk melakukan operasi tersebut, yaitu lewat system call. Ini menyambung langsung ke pembahasan di [[Processes]].&lt;br /&gt;
&lt;br /&gt;
== Cara kerjanya ==&lt;br /&gt;
&lt;br /&gt;
Supaya virtual memory bisa bekerja, dibutuhkan &#039;&#039;&#039;interaksi yang rumit antara hardware dan software operating system&#039;&#039;&#039;, termasuk &#039;&#039;&#039;penerjemahan alamat oleh hardware untuk setiap alamat yang dihasilkan processor&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Perhatikan kata &#039;&#039;&#039;setiap&#039;&#039;&#039;. Ini bukan operasi sesekali — tiap kali instruksi menyentuh memory, ada terjemahan alamat virtual ke alamat fisik yang terjadi di hardware.&lt;br /&gt;
&lt;br /&gt;
Ide dasarnya:&lt;br /&gt;
&lt;br /&gt;
# Simpan isi virtual memory sebuah process &#039;&#039;&#039;di disk&#039;&#039;&#039;.&lt;br /&gt;
# Gunakan &#039;&#039;&#039;main memory sebagai cache untuk disk&#039;&#039;&#039; itu.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Model mental yang terbalik|Poin kedua ini biasanya yang paling mengejutkan. Kita terbiasa berpikir RAM sebagai tempat penyimpanan utama dan disk sebagai cadangan. Virtual memory membalik posisinya: disk adalah tempat data sebenarnya berada, dan RAM cuma lapisan cache yang cepat di depannya. Sudut pandang ini yang bikin konsep page fault jadi masuk akal.}}&lt;br /&gt;
&lt;br /&gt;
Penjelasan lengkapnya, dan kenapa ini begitu penting untuk sistem modern, ada di &#039;&#039;&#039;Bab 9&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Code dimulai pada alamat tetap yang sama&amp;quot; sudah tidak sepenuhnya berlaku.&#039;&#039;&#039; Pernyataan itu benar untuk binary non-PIE. Linux modern mengompilasi binary sebagai PIE dan mengaktifkan &#039;&#039;&#039;ASLR&#039;&#039;&#039;, sehingga alamat basis code, heap, stack, dan shared library diacak tiap kali process dijalankan — sebagai pertahanan terhadap eksploitasi. Cek dengan menjalankan &amp;lt;code&amp;gt;cat /proc/self/maps&amp;lt;/code&amp;gt; dua kali dan bandingkan hasilnya. Untuk debugging bisa dimatikan sementara dengan &amp;lt;code&amp;gt;setarch -R&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;Peta ini bisa dilihat langsung.&#039;&#039;&#039; &amp;lt;code&amp;gt;/proc/[pid]/maps&amp;lt;/code&amp;gt; menampilkan seluruh region beserta permission dan file pendukungnya. Ini cara tercepat memverifikasi bahwa Figure 1.13 memang benar-benar ada, bukan sekadar model.&lt;br /&gt;
* &#039;&#039;&#039;Heap besar tidak selalu lewat heap.&#039;&#039;&#039; &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; di glibc memakai &amp;lt;code&amp;gt;brk&amp;lt;/code&amp;gt; untuk alokasi kecil, tapi beralih ke &amp;lt;code&amp;gt;mmap&amp;lt;/code&amp;gt; untuk alokasi di atas ambang tertentu (&amp;lt;code&amp;gt;M_MMAP_THRESHOLD&amp;lt;/code&amp;gt;, default sekitar 128 KB). Jadi alokasi besar sebenarnya mendarat di region memory-mapped, bukan di run-time heap.&lt;br /&gt;
* &#039;&#039;&#039;Stack punya batas keras.&#039;&#039;&#039; Stack memang tumbuh otomatis, tapi hanya sampai &amp;lt;code&amp;gt;RLIMIT_STACK&amp;lt;/code&amp;gt; (umumnya 8 MB). Di bawahnya ada &#039;&#039;guard page&#039;&#039; — menyentuhnya memicu SIGSEGV. Inilah yang terjadi pada rekursi tanpa henti.&lt;br /&gt;
* &#039;&#039;&#039;Alokasi tidak sama dengan memory fisik.&#039;&#039;&#039; Linux melakukan &#039;&#039;overcommit&#039;&#039;: &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; yang sukses cuma berarti ruang alamat sudah dicadangkan, halaman fisiknya baru diberikan saat benar-benar disentuh (&#039;&#039;demand paging&#039;&#039;). Konsekuensinya, program bisa mati kena OOM killer di titik penulisan, bukan di titik alokasi.&lt;br /&gt;
* &#039;&#039;&#039;Terjemahan setiap alamat itu mahal, makanya ada TLB.&#039;&#039;&#039; Karena tiap akses memory butuh penerjemahan, hasil terjemahan di-cache di &#039;&#039;Translation Lookaside Buffer&#039;&#039;. TLB miss adalah biaya nyata di workload dengan pola akses acak, dan itulah alasan &#039;&#039;huge pages&#039;&#039; bisa memberi percepatan besar di aplikasi seperti database dan HPC.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Kalau ingin melihat semua ini bekerja sekaligus: jalankan &amp;lt;code&amp;gt;perf stat -e dTLB-load-misses,page-faults ./program&amp;lt;/code&amp;gt;. Dua angka itu adalah harga langsung dari abstraksi virtual memory.}}&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Virtual memory&lt;br /&gt;
: Abstraksi yang memberi tiap process ilusi penggunaan eksklusif atas main memory.&lt;br /&gt;
; Virtual address space&lt;br /&gt;
: Tampilan memory yang seragam yang dilihat tiap process.&lt;br /&gt;
; Heap&lt;br /&gt;
: Area yang memuai dan menyusut dinamis saat run time akibat &amp;lt;code&amp;gt;malloc&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;free&amp;lt;/code&amp;gt;.&lt;br /&gt;
; User stack&lt;br /&gt;
: Area di puncak ruang alamat user, dipakai compiler untuk mengimplementasikan pemanggilan fungsi.&lt;br /&gt;
; Shared library&lt;br /&gt;
: Code dan data pustaka bersama seperti libc dan libm, dipetakan di sekitar tengah ruang alamat.&lt;br /&gt;
; Kernel virtual memory&lt;br /&gt;
: Region teratas yang disediakan untuk kernel; tidak boleh dibaca, ditulis, atau dipanggil langsung oleh aplikasi.&lt;br /&gt;
; ASLR&lt;br /&gt;
: Pengacakan alamat basis region saat process dijalankan, sebagai pertahanan keamanan.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[Threads]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[System Call]]&lt;br /&gt;
* [[CS:APP]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Threads&amp;diff=840</id>
		<title>Threads</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Threads&amp;diff=840"/>
		<updated>2026-08-24T04:10:35Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pergeseran model mental ==&lt;br /&gt;
&lt;br /&gt;
Sampai sini kita biasanya membayangkan process punya &#039;&#039;&#039;satu alur kontrol tunggal&#039;&#039;&#039; — satu PC yang bergerak dari instruksi ke instruksi.&lt;br /&gt;
&lt;br /&gt;
Di sistem modern, kenyataannya lebih luas: sebuah process bisa terdiri dari &#039;&#039;&#039;beberapa unit eksekusi&#039;&#039;&#039; yang disebut &#039;&#039;&#039;thread&#039;&#039;&#039;. Masing-masing thread:&lt;br /&gt;
&lt;br /&gt;
* jalan &#039;&#039;&#039;di dalam context process&#039;&#039;&#039; yang sama&lt;br /&gt;
* &#039;&#039;&#039;berbagi code dan global data&#039;&#039;&#039; yang sama&lt;br /&gt;
&lt;br /&gt;
Jadi hubungannya bertingkat: OS punya banyak process, dan tiap process bisa punya banyak thread di dalamnya.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+---------------------- Process ----------------------+&lt;br /&gt;
|                                                     |&lt;br /&gt;
|   Code  +  Global data       &amp;lt;- dibagi bersama      |&lt;br /&gt;
|                                                     |&lt;br /&gt;
|   +-----------+  +-----------+  +-----------+       |&lt;br /&gt;
|   | Thread 1  |  | Thread 2  |  | Thread 3  |       |&lt;br /&gt;
|   |  PC       |  |  PC       |  |  PC       |       |&lt;br /&gt;
|   |  Register |  |  Register |  |  Register |       |&lt;br /&gt;
|   |  Stack    |  |  Stack    |  |  Stack    |       |&lt;br /&gt;
|   +-----------+  +-----------+  +-----------+       |&lt;br /&gt;
|                                                     |&lt;br /&gt;
+-----------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kenapa thread makin penting ==&lt;br /&gt;
&lt;br /&gt;
CS:APP menyebut tiga alasan thread jadi model pemrograman yang makin sentral:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Kebutuhan concurrency di network server.&#039;&#039;&#039; Server harus melayani banyak koneksi sekaligus. Model satu-thread-per-koneksi jauh lebih natural daripada memaksa semuanya masuk satu alur kontrol.&lt;br /&gt;
# &#039;&#039;&#039;Berbagi data antar thread lebih mudah daripada antar process.&#039;&#039;&#039; Karena thread satu process sudah otomatis berbagi ruang alamat, nggak perlu mekanisme IPC seperti pipe, shared memory segment, atau socket.&lt;br /&gt;
# &#039;&#039;&#039;Thread biasanya lebih efisien daripada process.&#039;&#039;&#039; Membuat thread lebih murah daripada membuat process, dan switching antar thread dalam satu process juga lebih ringan.&lt;br /&gt;
&lt;br /&gt;
Selain itu, &#039;&#039;&#039;multi-threading adalah salah satu cara membuat program berjalan lebih cepat ketika tersedia beberapa processor&#039;&#039;&#039; — dibahas lebih jauh di §1.9.2.&lt;br /&gt;
&lt;br /&gt;
{{Catatan|title=Dua motivasi yang berbeda|Perhatikan bahwa ada dua alasan berbeda untuk pakai thread. Yang pertama soal &#039;&#039;struktur program&#039;&#039; (concurrency: mengurus banyak hal yang saling menunggu), yang kedua soal &#039;&#039;kecepatan&#039;&#039; (parallelism: memakai lebih dari satu core). Program bisa butuh yang satu tanpa butuh yang lain.}}&lt;br /&gt;
&lt;br /&gt;
== Sisi lain dari kemudahan berbagi ==&lt;br /&gt;
&lt;br /&gt;
Poin nomor 2 di atas adalah pisau bermata dua, dan ini penting banget dipahami sejak awal.&lt;br /&gt;
&lt;br /&gt;
Karena thread berbagi ruang alamat yang sama, dua thread bisa menulis ke variabel yang sama &#039;&#039;&#039;pada saat yang sama&#039;&#039;&#039; tanpa ada yang menghalangi. Hasilnya bergantung urutan eksekusi yang tidak kita kendalikan.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Harga dari sharing|Kemudahan berbagi data itu sekaligus sumber kelas bug paling sulit di pemrograman sistem: &#039;&#039;data race&#039;&#039;, &#039;&#039;deadlock&#039;&#039;, dan bug yang cuma muncul satu dari sejuta eksekusi. Isolasi antar process yang tadinya terasa merepotkan itu ternyata juga bentuk perlindungan.}}&lt;br /&gt;
&lt;br /&gt;
Antar process, isolasi memory bikin bug semacam ini secara struktural mustahil terjadi. Antar thread, perlindungan itu hilang dan harus digantikan disiplin programmer plus mekanisme sinkronisasi.&lt;br /&gt;
&lt;br /&gt;
== Apa yang dibagi, apa yang privat ==&lt;br /&gt;
&lt;br /&gt;
Ringkasan pembagiannya (detailnya di Bab 12):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Dibagi bersama seluruh thread !! Privat per thread&lt;br /&gt;
|-&lt;br /&gt;
| Code (text segment) || Program counter&lt;br /&gt;
|-&lt;br /&gt;
| Global data || Register file&lt;br /&gt;
|-&lt;br /&gt;
| Heap || Stack sendiri&lt;br /&gt;
|-&lt;br /&gt;
| File descriptor yang terbuka || Thread ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aturan praktisnya: &#039;&#039;&#039;kalau datanya di stack, biasanya aman; kalau global atau di heap, hati-hati.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Thread lebih efisien&amp;quot; itu benar tapi ada batasnya.&#039;&#039;&#039; Membuat thread memang jauh lebih murah daripada membuat process, tapi tiap thread tetap butuh stack sendiri. Ribuan thread berarti ribuan stack — ini salah satu alasan model async/event-driven muncul untuk kasus koneksi sangat banyak.&lt;br /&gt;
* &#039;&#039;&#039;Switch antar thread satu process lebih murah karena page table-nya sama.&#039;&#039;&#039; Nggak ada penggantian CR3, jadi TLB nggak perlu di-flush total. Tapi cache tetap bisa terganggu.&lt;br /&gt;
* &#039;&#039;&#039;False sharing adalah jebakan performa klasik.&#039;&#039;&#039; Dua thread menulis ke variabel berbeda yang kebetulan berada di &#039;&#039;cache line&#039;&#039; yang sama akan saling membatalkan cache satu sama lain. Secara logika nggak ada konflik, secara hardware ada. Solusinya biasanya &#039;&#039;padding&#039;&#039; sampai batas cache line.&lt;br /&gt;
* &#039;&#039;&#039;Di HPC, thread biasanya di-pin ke core.&#039;&#039;&#039; OpenMP lewat &amp;lt;code&amp;gt;OMP_PROC_BIND&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;OMP_PLACES&amp;lt;/code&amp;gt;, atau &amp;lt;code&amp;gt;numactl&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt; di level proses, supaya thread nggak berpindah core dan kehilangan lokalitas cache.&lt;br /&gt;
* &#039;&#039;&#039;Bahasa punya sikap berbeda soal ini.&#039;&#039;&#039; Rust memindahkan pengecekan keamanan thread ke &#039;&#039;compile time&#039;&#039; lewat trait &amp;lt;code&amp;gt;Send&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;Sync&amp;lt;/code&amp;gt;, sehingga banyak data race ditolak sebelum program jalan. Python sebaliknya membatasi eksekusi bytecode dengan GIL, sehingga thread bagus untuk I/O-bound tapi tidak memberi speedup untuk CPU-bound.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Kalau tujuannya cuma &#039;&#039;concurrency&#039;&#039; (banyak hal saling menunggu I/O), thread bukan satu-satunya jawaban — async runtime sering lebih hemat. Thread jadi wajib kalau tujuannya &#039;&#039;parallelism&#039;&#039; untuk kerja CPU-bound.}}&lt;br /&gt;
&lt;br /&gt;
== Yang akan datang ==&lt;br /&gt;
&lt;br /&gt;
Konsep dasar concurrency, termasuk cara menulis program ber-thread, dibahas di &#039;&#039;&#039;Bab 12&#039;&#039;&#039;. Diskusi soal memanfaatkan beberapa processor ada di &#039;&#039;&#039;§1.9.2&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Thread&lt;br /&gt;
: Unit eksekusi di dalam sebuah process; berjalan dalam context process itu dan berbagi code serta global data dengan thread lain.&lt;br /&gt;
; Multi-threading&lt;br /&gt;
: Menjalankan beberapa thread dalam satu process, salah satunya untuk memanfaatkan beberapa processor.&lt;br /&gt;
; Data race&lt;br /&gt;
: Kondisi ketika dua thread mengakses data yang sama tanpa sinkronisasi dan minimal satu di antaranya menulis.&lt;br /&gt;
; False sharing&lt;br /&gt;
: Penurunan performa akibat dua thread menulis ke variabel berbeda yang berada di cache line yang sama.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[CS:APP]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
	<entry>
		<id>https://wiki.haidhi.my.id/wiki/index.php?title=Threads&amp;diff=839</id>
		<title>Threads</title>
		<link rel="alternate" type="text/html" href="https://wiki.haidhi.my.id/wiki/index.php?title=Threads&amp;diff=839"/>
		<updated>2026-08-24T04:07:45Z</updated>

		<summary type="html">&lt;p&gt;SanzSkuy: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pergeseran model mental ==&lt;br /&gt;
&lt;br /&gt;
Sampai sini kita biasanya membayangkan process punya &#039;&#039;&#039;satu alur kontrol tunggal&#039;&#039;&#039; — satu PC yang bergerak dari instruksi ke instruksi.&lt;br /&gt;
&lt;br /&gt;
Di sistem modern, kenyataannya lebih luas: sebuah process bisa terdiri dari &#039;&#039;&#039;beberapa unit eksekusi&#039;&#039;&#039; yang disebut &#039;&#039;&#039;thread&#039;&#039;&#039;. Masing-masing thread:&lt;br /&gt;
&lt;br /&gt;
* jalan &#039;&#039;&#039;di dalam context process&#039;&#039;&#039; yang sama&lt;br /&gt;
* &#039;&#039;&#039;berbagi code dan global data&#039;&#039;&#039; yang sama&lt;br /&gt;
&lt;br /&gt;
Jadi hubungannya bertingkat: OS punya banyak process, dan tiap process bisa punya banyak thread di dalamnya.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
+---------------------- Process ----------------------+&lt;br /&gt;
|                                                     |&lt;br /&gt;
|   Code  +  Global data       &amp;lt;- dibagi bersama      |&lt;br /&gt;
|                                                     |&lt;br /&gt;
|   +-----------+  +-----------+  +-----------+       |&lt;br /&gt;
|   | Thread 1  |  | Thread 2  |  | Thread 3  |       |&lt;br /&gt;
|   |  PC       |  |  PC       |  |  PC       |       |&lt;br /&gt;
|   |  Register |  |  Register |  |  Register |       |&lt;br /&gt;
|   |  Stack    |  |  Stack    |  |  Stack    |       |&lt;br /&gt;
|   +-----------+  +-----------+  +-----------+       |&lt;br /&gt;
|                                                     |&lt;br /&gt;
+-----------------------------------------------------+&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Kenapa thread makin penting ==&lt;br /&gt;
&lt;br /&gt;
CS:APP menyebut tiga alasan thread jadi model pemrograman yang makin sentral:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Kebutuhan concurrency di network server.&#039;&#039;&#039; Server harus melayani banyak koneksi sekaligus. Model satu-thread-per-koneksi jauh lebih natural daripada memaksa semuanya masuk satu alur kontrol.&lt;br /&gt;
# &#039;&#039;&#039;Berbagi data antar thread lebih mudah daripada antar process.&#039;&#039;&#039; Karena thread satu process sudah otomatis berbagi ruang alamat, nggak perlu mekanisme IPC seperti pipe, shared memory segment, atau socket.&lt;br /&gt;
# &#039;&#039;&#039;Thread biasanya lebih efisien daripada process.&#039;&#039;&#039; Membuat thread lebih murah daripada membuat process, dan switching antar thread dalam satu process juga lebih ringan.&lt;br /&gt;
&lt;br /&gt;
Selain itu, &#039;&#039;&#039;multi-threading adalah salah satu cara membuat program berjalan lebih cepat ketika tersedia beberapa processor&#039;&#039;&#039; — dibahas lebih jauh di §1.9.2.&lt;br /&gt;
&lt;br /&gt;
{{Note|title=Dua motivasi yang berbeda|Perhatikan bahwa ada dua alasan berbeda untuk pakai thread. Yang pertama soal &#039;&#039;struktur program&#039;&#039; (concurrency: mengurus banyak hal yang saling menunggu), yang kedua soal &#039;&#039;kecepatan&#039;&#039; (parallelism: memakai lebih dari satu core). Program bisa butuh yang satu tanpa butuh yang lain.}}&lt;br /&gt;
&lt;br /&gt;
== Sisi lain dari kemudahan berbagi ==&lt;br /&gt;
&lt;br /&gt;
Poin nomor 2 di atas adalah pisau bermata dua, dan ini penting banget dipahami sejak awal.&lt;br /&gt;
&lt;br /&gt;
Karena thread berbagi ruang alamat yang sama, dua thread bisa menulis ke variabel yang sama &#039;&#039;&#039;pada saat yang sama&#039;&#039;&#039; tanpa ada yang menghalangi. Hasilnya bergantung urutan eksekusi yang tidak kita kendalikan.&lt;br /&gt;
&lt;br /&gt;
{{Warning|title=Harga dari sharing|Kemudahan berbagi data itu sekaligus sumber kelas bug paling sulit di pemrograman sistem: &#039;&#039;data race&#039;&#039;, &#039;&#039;deadlock&#039;&#039;, dan bug yang cuma muncul satu dari sejuta eksekusi. Isolasi antar process yang tadinya terasa merepotkan itu ternyata juga bentuk perlindungan.}}&lt;br /&gt;
&lt;br /&gt;
Antar process, isolasi memory bikin bug semacam ini secara struktural mustahil terjadi. Antar thread, perlindungan itu hilang dan harus digantikan disiplin programmer plus mekanisme sinkronisasi.&lt;br /&gt;
&lt;br /&gt;
== Apa yang dibagi, apa yang privat ==&lt;br /&gt;
&lt;br /&gt;
Ringkasan pembagiannya (detailnya di Bab 12):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Dibagi bersama seluruh thread !! Privat per thread&lt;br /&gt;
|-&lt;br /&gt;
| Code (text segment) || Program counter&lt;br /&gt;
|-&lt;br /&gt;
| Global data || Register file&lt;br /&gt;
|-&lt;br /&gt;
| Heap || Stack sendiri&lt;br /&gt;
|-&lt;br /&gt;
| File descriptor yang terbuka || Thread ID&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aturan praktisnya: &#039;&#039;&#039;kalau datanya di stack, biasanya aman; kalau global atau di heap, hati-hati.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Catatan untuk kerja systems ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&amp;quot;Thread lebih efisien&amp;quot; itu benar tapi ada batasnya.&#039;&#039;&#039; Membuat thread memang jauh lebih murah daripada membuat process, tapi tiap thread tetap butuh stack sendiri. Ribuan thread berarti ribuan stack — ini salah satu alasan model async/event-driven muncul untuk kasus koneksi sangat banyak.&lt;br /&gt;
* &#039;&#039;&#039;Switch antar thread satu process lebih murah karena page table-nya sama.&#039;&#039;&#039; Nggak ada penggantian CR3, jadi TLB nggak perlu di-flush total. Tapi cache tetap bisa terganggu.&lt;br /&gt;
* &#039;&#039;&#039;False sharing adalah jebakan performa klasik.&#039;&#039;&#039; Dua thread menulis ke variabel berbeda yang kebetulan berada di &#039;&#039;cache line&#039;&#039; yang sama akan saling membatalkan cache satu sama lain. Secara logika nggak ada konflik, secara hardware ada. Solusinya biasanya &#039;&#039;padding&#039;&#039; sampai batas cache line.&lt;br /&gt;
* &#039;&#039;&#039;Di HPC, thread biasanya di-pin ke core.&#039;&#039;&#039; OpenMP lewat &amp;lt;code&amp;gt;OMP_PROC_BIND&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;OMP_PLACES&amp;lt;/code&amp;gt;, atau &amp;lt;code&amp;gt;numactl&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;taskset&amp;lt;/code&amp;gt; di level proses, supaya thread nggak berpindah core dan kehilangan lokalitas cache.&lt;br /&gt;
* &#039;&#039;&#039;Bahasa punya sikap berbeda soal ini.&#039;&#039;&#039; Rust memindahkan pengecekan keamanan thread ke &#039;&#039;compile time&#039;&#039; lewat trait &amp;lt;code&amp;gt;Send&amp;lt;/code&amp;gt; dan &amp;lt;code&amp;gt;Sync&amp;lt;/code&amp;gt;, sehingga banyak data race ditolak sebelum program jalan. Python sebaliknya membatasi eksekusi bytecode dengan GIL, sehingga thread bagus untuk I/O-bound tapi tidak memberi speedup untuk CPU-bound.&lt;br /&gt;
&lt;br /&gt;
{{Tip|Kalau tujuannya cuma &#039;&#039;concurrency&#039;&#039; (banyak hal saling menunggu I/O), thread bukan satu-satunya jawaban — async runtime sering lebih hemat. Thread jadi wajib kalau tujuannya &#039;&#039;parallelism&#039;&#039; untuk kerja CPU-bound.}}&lt;br /&gt;
&lt;br /&gt;
== Yang akan datang ==&lt;br /&gt;
&lt;br /&gt;
Konsep dasar concurrency, termasuk cara menulis program ber-thread, dibahas di &#039;&#039;&#039;Bab 12&#039;&#039;&#039;. Diskusi soal memanfaatkan beberapa processor ada di &#039;&#039;&#039;§1.9.2&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Istilah kunci ==&lt;br /&gt;
&lt;br /&gt;
; Thread&lt;br /&gt;
: Unit eksekusi di dalam sebuah process; berjalan dalam context process itu dan berbagi code serta global data dengan thread lain.&lt;br /&gt;
; Multi-threading&lt;br /&gt;
: Menjalankan beberapa thread dalam satu process, salah satunya untuk memanfaatkan beberapa processor.&lt;br /&gt;
; Data race&lt;br /&gt;
: Kondisi ketika dua thread mengakses data yang sama tanpa sinkronisasi dan minimal satu di antaranya menulis.&lt;br /&gt;
; False sharing&lt;br /&gt;
: Penurunan performa akibat dua thread menulis ke variabel berbeda yang berada di cache line yang sama.&lt;br /&gt;
&lt;br /&gt;
== Lihat juga ==&lt;br /&gt;
&lt;br /&gt;
* [[Process]]&lt;br /&gt;
* [[OS Manages Hardware]]&lt;br /&gt;
* [[Virtual Memory]]&lt;br /&gt;
* [[CS:APP]]&lt;/div&gt;</summary>
		<author><name>SanzSkuy</name></author>
	</entry>
</feed>