LAPORAN PRAKTIKUM 7 : Unix System Cell dan Manajemen Memory
LAPORAN PRAKTIKUM 7
UNIX SYSTEM CALL dan
MANAJEMEN MEMORY
Aulia
Wahyuni |
(1903421035) |
BM 5B |
BROADBAND
MULTIMEDIA
TEKNIK
ELEKTRO
POLITEKNIK
NEGERI JAKARTA
TAHUN
AJARAN 2021/2022
I.
Pokok Bahasan
ü
Unix
System Call
ü
Manajemen
Memory
II.
Tujuan Praktikum
Adapun
tujuan dalam Praktikum ini, sebagai berikut :
1.
Menggunakan
system call fork, wait, dan exel pada Linux
2.
Menggunakan
perintah-perintah untuk manajemen memory
III.
Dasar Teori
1. UNIX
SYSTEM CALL
Pada
praktikum ini akan dilakukan percobaan menggunakan system call yang berhubungan
dengan proses pada system operasi UNIX yang biasa disebut UNIX System Call,
yaitu system call fork, excel dan wait.
Pada percobaan yang dilakukan akan dibuat program yang didalamnya
terdapat fungsi system call. Untuk menjalankannya pada Linux gunakan g++
v
System Call Fork
System call
fork adalah suatu system call yang membuat suatu proses baru
pada system operasi UNIX. Pada percobaan ini menggunakan mesin
Linux dan beberapa program yang
berisi system call fork().
Bila suatu program berisi sebuah fungsi fork(),
eksekusi dari program menghasilkan eksekusi dua proses. Satu proses dibuat
untuk memulai eksekusi program. Bila system call fork() dieksekusi, proses lain
dibuat. Proses asal disebut proses parend dan proses kedua disebut proses
child. Proses child merupakan duplikat dari proses parent. Kedua proses
melanjutkan eksekusi dari titik dimana system call fork() menghasilkan eksekusi
pada program utama. Karena UNIX adalah system operasi time sharing, dua proses
tersebut dapat mengeksekusi secara konkuren.
Nilai yang dihasilkan oleh fork() disimpan dalam
variable bertipe pid_t, yang berupa nilai integer. Karena nilai dari variable
ini tidak digunakan, maka hasil fork() dapat diabaikan.
·
Untuk
kill proses gunakan Ctrl+C
·
Untuk
dokumentasi fork() dapat dilihat dengan ketikan man 2 fork
·
Untuk
terlihat id dari proses, gunakan system call getpid()
·
Untuk
melihat dokumentasi dari getpid(), ketikkan man 2 getpid :
Perbedaan antara proses
parent dan proses child adalah :
·
Mempunyai
pid yang berbeda
·
Pada
proses parent , fork() menghasilkan pid dari proses child jika sebuah proses child dibuat.
·
Pada
proses child, fork() selalu menghasilkan 0
·
Membedakan
copy dari semua data, termasuk variable dengan current value dan stack
·
Membedakan
program counter (PC) yang menunjukkan eksekusi berikutnya meskipun awalnya
keduanya mempunyai nilai yang sama teta pi setelah itu berbeda.
·
Setelah
fork, kedua proses tersebut tidak menggunakan variable bersama.
System call fork
menghasilkan :
·
Pid proses
child yang baru
ke proses parent,
hal ini sama dengan memberitahukan proses parent
nama dari child-nya
·
0 : menunjukkan proses child
·
-1
: 1 jika terjadi error, fork() gagal
karena proses baru tidak dapat dibuat.
v
System Call Wait
System call wait menyebabkan proses menunggu sinyal
(menunggu sampai sembarang tipe sinyal diterima dari sembarang proses).
Biasanya digunakan oleh proses parent untuk menunggu sinyal dari system operasi
ke parent bila
child diterminasi. System call wait menghasilkan pid dari proses
yang mengirimi sinyal. Untuk melihat dokumentasi wait gunakan perintah man 2
wait.
v
System Call Excel
Misalnya kita ingin proses baru mengerjakan sesuatu
yang berbeda dari proses parent, sebutlah menjalankan program yang berbeda.
Sistem call execl meletakkan program executable baru ke memory dan
mengasosiasikannya dengan proses saat itu. Dengan kata lain, mengubah segala
sesuatunya sehingga program mulai mengeksekusi dari file yang berbeda.
2. MANAJEMEN
MEMORY
Linux mengimplementasikan sistem virtual memory
demand-paged. Proses mempunyai besar memory virtual yang besar (4 gigabyte).
Pada virtual memory dilakukan transfer page antara disk
dan memory fisik.
Jika tidak terdapat cukup memory fisik, kernel
melakukan swapping beberapa page lama ke disk. Disk drive adalah perangkat
mekanik yang membaca dan menulis ke disk yang lebih lambat dibandingkan
mengakses memory fisik. Jika memory total page lebih dari memory fisik yang
tersedia, kernel lebih banyak melakukan swapping dibandingkan eksekusi kode
program, sehingga terjadi thrashing dan
mengurangi utilitas.
Jika memory fisik ekstra tidak digunakan, kernel
meletakkan kode program sebagai disk buffer cache. Disk buffer menyimpan data
disk yang diakses di memory; jika data yang
sama dibutuhkan lagi dapat dengan cepat diambil dari cache.
Pertama kali sistem melakukan booting, ROM BIOS
membentuk memory test seperti terlihat berikut :
ROM BIOS (C) 1990
008192 KB OK WAIT......
Kemudian
informasi penting ditampilkan selama proses booting pada linux seperti terlihat berikut :
Memory: 7100k/8192k available (464k
kernel code, 384k reserved, 244k data) ...
Adding Swap: 19464k swap-space
Informasi
diatas menampilkan jumlah RAM tersedia setelah kernel di-load ke memory (dalam
hal ini 7100K dari 8192K). Jika ingin melihat
pesan saat booting
kernel yang terlalu cepat dibaca
dapat dilihat kembali dengan perintah dmesg.
Setiap
Linux dijalankan, perintah free digunakan untuk
menampilkan total memory yang tersedia. Atau menggunakan cat /proc/meminfo. Memory fisik dan ruang swap ditampilkan disini. Contoh output pada
sistem :
total used free
shared buffers
Mem: 7096 5216 1880
2328 2800
Swap: 19464 0 19464
Informasi
ditampilkan dalam kilobyte (1024 byte). Memory ”total” adalah jumlah tersedia setelah load kernel. Memory
digunakan untuk proses atau disk bufferring sebagai “used”. Memory yang sedang tidak digunakan ditampilkan
pada kolom “free”.
Memory total sama dengan jumlah kolom ”used” dan ”free”.
Memory
diindikasikan “shared”
yaitu berapa banyak memory yang digunakan lebih dari satu proses. Program seperti shell
mempunyai lebih dari satu proses yang berjalan. Kode executable read-only dan
dapat disharing oleh semua proses yang berjalan pada shell. Kolom “buffers” menampilkan berapa banyak memory
digunakan untuk disk buffering.
Perintah free juga
menunjukkan dengan jelas bagaimana swap space dilakukan dan berpa banyak
swapping yang terjadi.
Percobaan
berikut untuk mengetahui manajemen memory :
1.
Pada
saat bootup, dengan satu user log in, dengan perintah free sistem melaporkan
berikut:
Terdapat
free memory (4.4MB) dan sedikit disk buffer (1.1MB).
2.
Situasi
berubah setelah menjalankan perintah yang membaca data dari disk (command ls –lR /.)
Disk
buffer bertambah menjadi 2 MB. Hal ini
berakibat pula pada
kolom ”used” dan memory ”free” juga berkurang.
Perintah top dan ps -u juga sangat berguna untuk
menunjukkan bagaimana penggunaan memory berubah secara dinamis dan
bagaimana proses individu
menggunakan memory. Contoh tampilannya :
IV.
Langkah-langkah Praktikum
1.
Login
sebagai user
2.
Bukalah
Console Terminal dan lakukan percobaan-percobaan yang sudah ada dalam jobsheet
3.
Selesaikan
soal-soal latihan
V.
Tugas Pendahuluan
Jawablah
pertanyaan-pertanyaan berikut ini :
1. Apa
yang dimaksud dengan system call?
2.
Apa yang dimaksud dengan
system call fork(), excel() dan
wait(). Jawablah dengan menggunakan perintah
man (Contoh : man 2 fork man 2 excel dan man 2 wait)?
3. Apa
yang dimaksud sistem virtual memory, proses swapping dan buffer cache pada
manajemen memory?
4. Apa
yang dimaksud perintah free
dan cat /proc/meminfo?
5. Apa
yang dimaksud perintah ps?
Percobaan
1 : Melihat proses parent dan proses child
1.
Dengan menggunakan editor vi,
buatlah file fork1.cpp dan ketikkan program berikut:
Hasil :
2.
Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 1 fork 1.cpp
$ ./fork 1
Hasil :
3.
Amati
output yang dihasilkan
Analisa
: Program di atas adalah program yang bertujuan untuk melihat proses parent dan
proses child. Salah satu caranya yaitu dengan melihat PID (Process Identifier)
dan PPID (Parent Process Identifier) dari proses. Untuk mendapatkan nilai PID
dan PPID dapat dilakukan dengan fungsi getpid() dan getppid() yang
dideklarasikan pada unistd.h. kedua fungsi tersebut akan mengembalikan nilai
bertipe pid_t yang merupakan sebuah signed integer yang menunjukkan PID. Dapat
dilihat dengan menggunakan perintah ps bahwa proses ./fork1 memiliki PID 35154 dan PPID adalah 1000 yang merupakan proses bash. Selain itu, pada program ini
juga digunakan fungsi getuid() untuk mendapatkan id dari user yang menjalankan
dan fungsi sleep() yang menghentikan proses dalam detik.
Percobaan
2 : Membuat dua proses terus menerus dengan sebuah system call fork()
1.
Dengan menggunakan editor vi, buatlah file
fork2.cpp dan ketikkan program berikut:
Hasil :
2.
Gunakan g++ compiler untuk menjalankan program
di ats. Pada saat dijalankan, program tidak akan pernah berhenti. Untuk
menghentikan program tekan Ctrl+C.
$ g++ -o fork 2 fork 2.cpp
$ ./fork 2
Hasil :
3.
Amati output yang dihasilkan
Analisa : Program di atas bertujuan untuk
membuat dua proses secara terus menerus menggunakan system call fork(). Fork
adalah suatu system call yang dapat membuat proses baru. Proses asal yang
melakukan fork disebut dengan parent process, sedangkan proses baru yang dibuat
setelah melakukan fork disebut dengan child process. Nilai yang dikembalikan
oleh fork adalah PID dari child process. Dapat dilihat bahwa pada percobaan
ini, yang merupakan child process adalah proses dengan PID 10461, sedangkan
yang merupakan parent process adalah process dengan PID 10460. x berfungsi
untuk menghitung berapa kali loop telah terjadi. Jika dilihat dari urutan
cetakannya, dapat dilihat bahwa walaupun mereka melakukan proses yang sama,
parent process selalu berjalan terlebih dahulu sebelum child process. Program
ini akan melakukan loop secara terus menerus tanpa henti. Untuk
memberhentikannya, maka harus dihentikan secara paksa dengan interupsi
menggunakan Ctrl+C.
Percobaan
3 : Membuat dua proses sebanyak lima kali
1. Dengan menggunakan editor vi, buatlah file fork3.cpp dan ketikkan program berikut:
Hasil :
2.
Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 3 fork 3.cpp
$ ./fork 3
3.
Amati
output yang dihasilkan
Analisa
: Program ini hampir sama dengan program fork2, hanya saja bedanya pada program
ini loop yang dilakukan dibatasi hingga 5 kali saja, tidak infinite. Pada
percobaan ini, dapat dilihat bahwa yang merupakan child process adalah proses
dengan PID 36488, sedangkan yang merupakan parent process adalah proses dengan
PID 36487. Selain itu, disini terbukti kembali bahwa walaupun mereka melakukan
proses yang sama, parent process selalu berjalan terlebih dahulu sebelum
process jika dilihat dari urutan cetakannya.
Percobaan
4 : Proses parent menunggu sinyal dari proses child dengan sistem call wait
1. Dengan menggunakan editor vi, buatlah fork4.cpp dan ketikkan program berikut:
Hasil :
2.
Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 4 fork 4.cpp
$ ./fork 4
3.
Amati
output yang dihasilkan
Analisa
: Jika pada program-program sebelumnya proses child dan parent menjalankan
baris yang sama, maka pada program ini kedua proses tersebut menjalankan baris
yang berbeda. Hal ini dapat dilakukan dengan pengkondisian if..else pada hasil
pengembalian system call fork. Pada child process, fork akan mengembalikan
nilai 0, sedangkan pada parent process, fork akan mengembalikan nilai bilangan
positif berupa PID dari process child. Namun, jika process child gagal
terbentuk, fork akan mengembalikan nilai -1. Dengan mengetahui return value
dari fork, maka kita bisa membagi pengerjaan proses parent dan child
menggunakan pengkondisian if..else. Karena kita tahu bahwa parent process akan
berjalan terlebih dahulu sebelum child process, maka kita harus membuat parent
process untuk berhenti sementara hingga child process selesai berjalan.
Disitulah kegunaan system call wait() dibutuhkan. System call wait akan membuat
proses parent berhenti sementara dan menunggu hingga proses child selesai dan
diterminasi. Setelah proses child diterminasi system call wait akan
mengembalikan nilai berupa PID dari proses child yang diterminasi tersebut.
Itulah mengapa pada program diatas, wait dilakukan di dalam loop do..while,
selama hasil return value dari wait tidak sama dengan PID proses child, maka
proses parent akan terus melakukan waiting.
Percobaan
5 : Sistenm call fork/exec dan wait mengeksekusi program bernama ls,
menggunakan file executable /bin/ls dengan satu parameter -l yang ekuivalen
dengan ls –l
1.
Dengan
menggunakan editor vi, buatlah fork5.cpp dan ketikkan program berikut:
2.
Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 5 fork 5.cpp
$ ./fork 5
3.
Amati output yang dihasilkan
Analisa : Program ini akan melakukan forking
dan proses child akan menjalankan perintah ls -l. Hal ini dapat dilakukan
dengan menjalankan system call execl pada proses child. Execl merupakan system
call yang berfungsi untuk mengeksekusi file. Pada kasus ini, child process
mengeksekusi perintah ls yang filenya berada di /bin/ls dengan argument -l dan
/home. Fungsi execl dapat dimasukkan banyak parameter. Namun, parameter utama
yang harus dimasukkan ada 3, yaitu path dari file yang akan dieksekusi,
argument perintah (bisa lebih dari satu), dan NULL (sebagai penanda akhiran
dari argument). System call execl akan mengganti process image sebelumnya
dengan process image yang baru. Sehingga jika execl berhasil dijalankan, maka
setelah execl selesai dijalankan oleh process child dan diterminasi, proses
child akan tetap berjalan. Itulah mengapa baris proses child dibawah execl pada
percobaan diatas tidak dijalankan.
Percobaan
6 : Sistem call fork/exec dan wait mengeksekusi program lain
1. Dengan menggunakan editor vi, buatlah fork6.cpp dan ketikkan program berikut:
Hasil
:
2.
Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 6 fork 6.cpp
$ ./fork 6
3.
Amati
Output yang dihasilkan
Analisa
: Pada program ini, proses child mengeksekusi program lain (fork3) dengan
menggunakan system call execl. Pada percobaan diatas, proses dengan PID 2105 adalah proses parent, sedangkan proses dengan PID 2106 adalah process child.
Namun, saat proses child menjalankan execl dan mengeksekusi fork3, proses
dengan PID 2106 pada program fork3 akan menjadi proses parent dan ia akan
membuat proses child baru dengan PID 2107.
Percobaan
7 : Melihat Manajemen Memory
1.
Perhatikan
dengan perintah dmesg jumlah memori tersedia dan proses swapping
$ dmesg | more
Hasil :
Analisa : Perintah dmesg digunakan untuk mencetak
dan mengontrol buffer ring kernel. Di dalam informasi yang dicetak oleh dmesg,
terdapat pula jumlah memori yang tersedia. Dapat dilihat di atas bahwa jumlah
memori yang tersedia ada 1978444 KB dari total memori 2096696 KB.
2.
Dengan
perintah free perhatikan jumlah memory “free”, “used”, “share”, dan “buffer”
$ free
Hasil :
Analisa
:
3.
Dengan
perintah dibawah ini apakah hasilnya sama dengan no 2?
$ cat /proc/meminfo
Hasil :
Analisa
: Hasil yang ditampilak oleh cat /proc/meminfo hampir sama dengan hasil pada
free. Hanya saja bedanya cat /proc/meminfo menampilkan lebih banyak informasi
daripada free.
4.
Gunakan
perintah di bawah ini
$ ls –lR /,
Hasil :
Analisa
: Perintah ls -lR /. menampilkan semua direktori dan file yang ada pada system
informasi. Karena banyaknya file yang ditampilkan, perintah tersebut akan
berjalan secara terus menerus tanpa henti.
5.
Perhatikan
perubahan manajemen memory
$ free
Hasil :
Analisa : Dapat dilihat bahwa memori yang “free” menjadi
berkurang, memori yang “available”
berkurang, dan penggunaan memori shared dan buff/cache bertambah, sedangkan
besar swap “used”
bertambah dan swap “free” menjadi
berkurang.
6.
Jalankan sebuah program, misalnya open Office.
Perhatikan perubahan manajemen memori.
$ free
Hasil :
Analisa : Setelah dijalankan open Office,
memori yang digunakan dan shared memori menjadi lebih besar dan memori
available berkurang juga. Selain itu, beberapa swap mulai digunakan.
7.
Dengan perintah ps bagaimana penggunaan memory
untuk setiap proses diatas?
$ ps -uax
Hasil :
Analisa : Perintah ini sangat berguna untuk
menunjukkan bagaimana penggunaan memori berubah secara dinamis dan bagaimana
proses individu menggunakan memori.
VI.
Latihan
1.
Ubahlah
program fork5.cpp pada percobaan 5 untuk mengeksekusi perintah yang ekuivalen dengan
a. ls –al /etc.
b. cat fork2.
c. ./fork2
2.
Informasi
apa saja mengenai manajemen memory yang ditampilkan pada perintah dmesg pada percobaan anda ?
3.
Bagaimana
informasi yang ditampilkan dengan perintah free pada percobaan anda ?
4.
Apa
isi file /proc/meminfo pada percobaan yang Anda lakukan?
5.
Berapa
besar memory yang digunakan setelah percobaan 7 dengan perintah ps –uax?
6.
Lakukan
hal yang sama dengan percobaan 7 untuk melihat perubahan memory setelah
dilakukan beberapa proses pada shell. Tentukan perintah yang dilakukan misalnya
membuka browser danperhatikan hal-hal berikut :
a.
Informasi
apa saja yang ditampilkan dengan perintah free?
b.
Informasi
apa saja yang disimpan file /proc/meminfo?
c.
Berapa
besar kapasitas memory total?
d.
Berapa
kapasitas memory yang sudah terpakai?
e.
Berapa
kapasitas memory yang belum terpakai?
f.
Berapa
kapasitas memory yang digunakan sharing beberapa proses?
g.
Berapa
kapasitas buffer cache?
Hasil setelah membuka web browser, terjadi ada perubahan ketika menjalankan perintah free.
VII.
Kesimpulan
Comments
Post a Comment