Praktikum 7. Unix System Call dan Manajemen Memory
Praktikum
7
Unix
System Call dan Manajemen Memory
POKOK
BAHASAN:
ü Unix
System Call
ü Manajemen
Memory
TUJUAN
BELAJAR:
Setelah
mempelajari materi dalam bab ini, mahasiswa diharapkan mampu:
ü Menggunakan
system call fork, wait, dan excel pada Linux.
ü Menggunakan
perintah-perintah untuk menajemen memory.
TEORI
SINGKAT:
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++.
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 ketikkan man 2 fork.
·
Untuk melihat 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.
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.
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:
total used |
free |
shared buffers cached |
Mem: 247184 145772 |
101412 |
0 10872 57564 |
-/+ buffers/cache: 77336 |
169848 |
|
Swap: 522072 0 |
522072 |
|
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 /.)
total used |
free shared |
buffers cached |
Mem: 247184 230604 |
16580 0 |
45260 59748 |
-/+ buffers/cache: 125596 |
121588 |
|
Swap: 522072 308 |
522072 |
|
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 :
USER |
PID %CPU %MEM VSZ |
RSS TTY STAT |
START |
TIME
COMMAND |
student |
4581 0.0 0.3 4316 |
856
pts/0 S |
10:25 |
0:00
bash |
student |
4699 0.0 0.2 2604 |
656
pts/0 R |
10.39 |
0:00
ps -u |
TUGAS
PENDAHULUAN:
Jawablah
pertanyaan-pertanyaan berikut ini :
1.
Apa yang dimaksud dengan system call?
Jawab:
Sistem call adalah sebuah
sistem yang menyediakan interface antara program dan bagian OS. Sistem call
menjadi jembatan antara proses dan OS. Sistem call biasanya tersedia dalam
bentuk instruksi bahasa assembly.
2.
Apa yang dimaksud dengan sistem call
fork(), execl() dan wait(). Jawablah dengan menggunakan perintah man
(contoh: man 2 fork, man 2 execl dan
man 2 wait)?
Jawab:
Sistem
call fork adalah suatu sistem call yang membuat suatu proses baru pada sistem
operasi UNIX. Nilai yang dihasilkan fork() disimpan dalam variabel bertipe
pid_t, yang berupa nilai integer, karena tidak digunakan, maka hasil fork()
dapat diabaikan. Sistem call execl() adalah suatu sistem call yang meletakkan
program executable baru ke memori dan mengasosiasikannya dengan proses saat
itu. Sistem call wait() adalah suatu sistem call yang menyebabkan proses
menunggu sinyal (menunggu sampai sembarang tipe sinyal dari sembarang proses).
Biasanya digunakan oleh proses parent untuk menunggu sinyal dari sistem operasi
ke parent bila child diterminasi.
3.
Apa yang dimaksud sistem virtual memory,
proses swapping dan buffer cache pada manajemen memory?
Jawab:
Virtual
memori adalah sebuah mekanisme yang digunakan oleh aplikasi untuk menggunakan
sebagian dari memori sekunder seolah-olah ia menggunakannya sebagai RAM fisik
yang terinstal di dalam sebuah sistem.
Swap merupakan memori backup atau cadangan apabila memori utama sudah
kewalahan menangani operasi di computer kita, dan biasanya swap ini ditemukan
pada waktu instalasi Linux dengan alokasi hard disk. Pada Linux, swap merupakan
partisi yang berbeda untuk selanjutnya juga digunakan sebagai virtual memori
dan menyimpan file-file sementara (temporary).
Buffer
cache adalah buffer yang dipakai di kernel. Buffer cache dapat dianggap sebagai
sumber daya memori, terutama sumber daya I/O karena penggunaannya dalam mediasi
transfer.
4.
Apa yang dimaksud
perintah free dan cat /proc/meminfo?
Jawab:
Free digunakan untuk
mengetahui total memori yang digunakan dalam proses. Dalam perintah free ditampilkan
total kapasitas memori, memori yang terpakai, yang tidak sedang dipakai, yang
dibagi, buffer, cache, dan juga swap.
Perintah cat/proc/meminfo
digunakan untuk mengetahui isi dari meminfo kemudian ditampilkan.
5.
Apa yang
dimaksud perintah ps?
Jawab:
Perintah ps digunakan
untuk menampilkan informasi proses yang sedang berjalan termasuk nomor PID dari
proses tersebut.
PERCOBAAN:
1. Login sebagai user.
2. Bukalah
Console Terminal dan lakukan percobaan-percobaan di
bawah ini kemudian analisa hasil percobaan.
3. Selesaikan
soal-soal latiha n.
Percobaan
1: Melihat proses parent dan proses child
1. Dengan
menggunakan editor vi, buatlah file fork1.cpp dan ketikkan program berikut:
#include <iostream>
using namespace std;
#include <sys/types.h> #include
<unistd.h>
/*
getpid() adalah system call yg dideklarasikan pada unistd.h.
Menghasilkan
suatu nilai dengan type pid_t.
pid_t
adalah type khusus untuk process id yg ekuivalen dg int
*/
int main(void) {
pid_t mypid;
uid_t myuid;
for (int i = 0; i < 3; i++)
{
mypid = getpid();
cout << "I am process "
<< mypid << endl;
cout << "My parent is process "
<< getppid() << endl; cout << "The owner of this process has uid "
<< getuid()
<<
endl;
/* sleep adalah
system call atau fungsi library yang menghentikan proses ini
dalam detik
*/
sleep(1);
}
return 0;
}
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 9930 dan PPID adalah 2952 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:
#include <iostream>
using namespace std; #include
<sys/types.h> #include <unistd.h>
/* getpid() dan fork() adalah
system call yg dideklarasikan pada unistd.h.
Menghasilkan suatu nilai
dengan type pid_t.
pid_t
adalah type khusus untuk process id yg ekuivalen dg int
*/
int main(void)
{
pid_t
childpid;
int
x = 5;
childpid
= fork();
while
(1) {
cout <<
"This is process
" << getpid()
<< endl;
cout <<
"x is "
<< x << endl;
sleep(1);
x++;
}
return 0;
}
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:
#include <iostream>
using namespace std; #include
<sys/types.h> #include <unistd.h>
/* getpid() dan fork() adalah
system call yg dideklarasikan pada unistd.h.
Menghasilkan suatu nilai dengan type pid_t.
pid_t adalah type khusus
untuk process id yg ekuivalen dg int
*/
int main(void)
{ pid_t
childpid; childpid = fork();
for
(int i = 0; i < 5; i++) {
cout <<
"This
is process
" << getpid()
<< endl; sleep(2);
}
return
0;
}
Hasil:
2. Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 3
fork 3.cpp
$ ./fork 3
Hasil:
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 27843, sedangkan
yang merupakan parent process adalah proses dengan PID 27842. 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:
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
/*
pid_t fork() dideklarasikan pada unistd.h.
pid_t adalah type khusus
untuk process id yg ekuivalen dg int
*/
int main(void) { pid_t
child_pid; int status;
pid_t
wait_result;
child_pid = fork();
if (child_pid == 0) {
/*
kode ini hanya dieksekusi proses child */
cout << "I am a child and
my pid = " << getpid() << endl; cout << "My parent is " << getppid() << endl;
/*
keluar if akan menghentikan hanya proses child */
}
else if (child_pid > 0) {
/* kode ini hanya mengeksekusi
proses parent */
cout << "I am the parent
and my pid = " << getpid()
<<
endl;
cout
<< "My child has pid = " << child_pid << endl;
}
else
{
cout << "The fork system call failed to create
a new process" << endl;
exit(1);
}
/* kode ini dieksekusi baik
oleh proses parent dan child */ cout <<
"I am a happy, healthy process and
my pid = "
<<
getpid() << endl;
if (child_pid == 0) {
/* kode ini hanya dieksekusi
oleh proses child */ cout << "I am a child and
I am quitting work now!"
<<
endl;
}
else {
/* kode ini hanya dieksekusi
oleh proses parent */ cout <<
"I am a parent and I am going to wait
for my
child"
<< endl;
do
{
/* parent menunggu sinyal SIGCHLD mengirim
tanda bahwa proses child diterminasi
*/
wait_result = wait(&status);
} while (wait_result !=
child_pid);
cout
<< "I am a parent and I am quitting." << endl;
}
return 0;
}
Hasil:
2. Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 4
fork 4.cpp
$ ./fork 4
Hasil:
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:
#include <iostream>
using namespace std;
#include <sys/types.h> #include <unistd.h>
#include <sys/wait.h>
/* pid_t fork()
dideklarasikan pada unistd.h.
pid_t
adalah type khusus untuk process id yg ekuivalen dg int
*/
int main(void) {
pid_t
child_pid;
int
status;
pid_t wait_result;
child_pid = fork();
if (child_pid == 0) {
/*
kode ini hanya dieksekusi proses child */
cout << "I am a child and my pid = " << getpid() << endl; execl("/bin/ls", "ls", "-l", "/home", NULL);
/* jika execl berhasil kode ini tidak
pernah digunakan */ cout <<
"Could not execl file /bin/ls"
<< endl;
exit(1);
/*
exit menghentikan hanya proses child */
}
else
if (child_pid > 0) {
/* kode ini hanya mengeksekusi
proses parent */ cout << "I am the parent and my pid = " << getpid()
<<
endl;
cout
<< "My child has pid = " << child_pid << endl;
}
else {
cout << "The fork
system call failed to create a new process" << endl;
exit(1);
}
/* kode ini hanya
dieksekusi oleh proses parent karena child
mengeksekusi dari “/bin/ls”
atau keluar */
cout << "I am a happy, healthy process and my pid = "
<< getpid() <<
endl;
if (child_pid == 0) {
/* kode ini tidak
pernah dieksekusi */ printf("This code will never be executed!\n");
}
else
{
/* kode ini hanya dieksekusi
oleh proses parent */ cout << "I am a parent and I am going to wait
for my
child" << endl;
do {
/* parent menunggu sinyal
SIGCHLD mengirim tanda bila proses
child diterminasi */
wait_result =
wait(&status);
} while (wait_result != child_pid);
cout << "I am a
parent and I am quitting." << endl;
}
return 0;
}
Hasil:
2. Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 5
fork 5.cpp
$ ./fork 5
Hasil:
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:
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
/*
pid_t fork() dideklarasikan pada unistd.h.
pid_t
adalah type khusus untuk process id yg ekuivalen dg int
*/
int main(void) { pid_t chil d_pid;
int status;
pid_t wait_result;
child_pid = fork();
if (child_pid == 0) {
/*
kode ini hanya dieksekusi proses child */
cout << "I am a child and my pid =
" << getpid() << endl;
execl("fork3",
"goose", NULL);
/* jika execl berhasil kode ini tidak
pernah digunakan */
cout
<< "Could not execl file fork3" << endl;
exit(1);
/* exit menghentikan hanya proses child */
}
else if (child_pid > 0) {
/* kode ini hanya mengeksekusi proses parent */ cout << "I
am the parent and my pid = " <<
getpid()
<< endl;
cout << "My child has pid = " << child_pid << endl;
}
else {
cout << "The fork system call failed to create a new
process" << endl;
exit(1);
}
/* kode ini hanya
dieksekusi oleh proses parent karena child mengeksekusi dari “fork3”
atau keluar */
cout << "I am a
happy, healthy process and my pid = "
<<
getpid() << endl;
if
(child_pid == 0) {
/* kode ini
tidak pernah dieksekusi */ printf("This code will never be
executed!\n");
}
else {
/* kode ini hanya dieksekusi oleh proses
parent */ cout <<
"I am a parent and I am going
to wait for my
child" << endl;
do {
/* parent menunggu sinyal
SIGCHLD mengirim tanda bila proses
child diterminasi */
wait_result
= wait(&status);
} while (wait_result != child_pid);
cout << "I am a
parent and I am quitting." << endl;
}
return
0;
}
Hasil:
2. Gunakan
g++ compiler untuk menjalankan program di atas
$ g++ -o fork 6
fork 6.cpp
$ ./fork 6
Hasil:
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 32927 adalah proses parent, sedangkan
proses dengan PID 32928 adalah process child. Namun, saat proses child
menjalankan execl dan mengeksekusi fork3, proses dengan PID 32928 pada program
fork3 akan menjadi proses parent dan ia akan membuat proses child baru dengan
PID 32929.
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:
Perintah free akan
menampilkan informasi tentang memori dan swap dalam kilobyte (1 kilobyte).
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:
Sebelum:
Sesudah:
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.
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?
Jawab:
Jawab:
Informasi yang ditampilkan mengenai manajemen memori
pada dmesg adalah banyaknya memori yang tersedia beserta rincian penggunaan
memori tersebut seperti kernel code, rwdata (read-write), rodata (read-only),
init, bss, reserved (memori cadangan), dan cma-reserved.
3. Bagaimana
informasi yang ditampilkan dengan perintah free pada
percobaan Anda?
Jawab:
Informasi
yang ditampilkan dengan perintah free adalah:
·
Total:
Menampilkan total memori yang ada computer.
·
Used:
Menampilkan total memori yang sedang digunakan. Rumus perhitungannya adalah Total
– (Free + Buffers + Cache).
·
Free:
Menampilkan total memori yang tidak digunakan.
·
Shared:
Menampilkan total memori yang digunakan oleh buffers, page cache, dan slabs.
· Available:
Menampilkan perkiraan dari total memori yang siap digunakan untuk menjalankan
program baru tanpa dilakukannya swapping.
4. Apa isi file /proc/meminfo pada
percobaan yang Anda lakukan?
Jawab:
Ada banyak sekali informasi yang ditampilkan pada
meminfo, diantaranya sebagai berikut:
5. Berapa besar memory yang digunakan setelah percobaan 7
dengan perintah ps
–uax?
Jawab:
Banyaknya memori yang
digunakan menurut ps -uax adalah sebesar 0,1%.
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 dan perhatikan hal-hal berikut:
a. Informasi
apa saja yang ditampilkan dengan perintah free?
Jawab:
Informasi
yang ditampilkan dengan perintah free adalah:
·
Total:
Menampilkan total memori yang ada computer.
· Used:
Menampilkan total memori yang sedang digunakan. Rumus perhitungannya adalah Total
– (Free + Buffers + Cache).
·
Free:
Menampilkan total memori yang tidak digunakan.
· Shared:
Menampilkan total memori yang digunakan oleh buffers, page cache, dan slabs.
· Available:
Menampilkan perkiraan dari total memori yang siap digunakan untuk menjalankan
program baru tanpa dilakukannya swapping.
b.
Informasi apa
saja yang disimpan file /proc/meminfo?
Jawab:
Berikut adalah informasi yang disimpan dalam
/proc/meminfo:
c.
Berapa besar kapasitas memory total?
Jawab:
Kapasitas memori total adalah 2035284 kB.
d.
Berapa kapasitas memory yang sudah terpakai?
Jawab:
Kapasitas memori yang sudah terpakai adalah 712808 kB.
e.
Berapa kapasitas memory yang belum
terpakai?
Jawab:
Kapasitas memori yang belum terpakai adalah 510540 kB.
f.
Berapa kapasitas memory yang digunakan
sharing beberapa proses?
Jawab:
Kapasitas memori yang
digunakan sharing beberapa proses adalah 1712 kB.
g.
Berapa kapasitas buffer cache?
Jawab:
Kapasitas buffer cache
adalah 755504 kB.
KESIMPULAN:
System
calls adalah cara terprogram di mana program komputer meminta layanan dari
kernel sistem operasi tempat dijalankannya. System calls menyediakan antarmuka
antara proses dan sistem operasi. Pada praktikum kali ini, kita melakukan 3
macam system calls, yaitu system calls fork, execl, dan wait. System calls fork
adalah system calls yang dapat membuat proses baru dengan menduplikasi proses.
Proses baru disebut sebagai proses child. Proses yang memanggilnya disebut
sebagai proses parent. System calls execl berfungsi untuk mengekseskusi sebuah
file dengan memberi parameter berupa path file dan argumen-argumen perintah
file. Sistem call execl meletakkan program executable baru ke memory dan mengasosiasikannya
dengan proses saat itu. Sedangkan system calls wait adalah ystem call yang
digunakan untuk menunggu perubahan status pada child process yang dipanggil,
dan mendapatkan informasi tentang child process yang statusnya telah berubah.
Linux mengimplementasikan sistem virtual memory demand-paged. Proses mempunyai
besar memory virtual yang besar.
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. 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.
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, membedakan copy dari semua data, termasuk variable dengan current
value dan stack, membedakan program counter yang menunjukkan eksekusi
berikutnya meskipun awalnya keduanya mempunyai nilai yang sama tetapi setelah
itu berbeda, dan setelah fork, kedua proses tersebut tidak menggunakan variable
bersama.
DAFTAR PUSTAKA:
Ananta, C. J. (2020, Juni 21). Laporan
Resmi Praktikum 12 Sistem Operasi. Retrieved from Jalusoit:
https://jalusoit.files.wordpress.com/2020/06/prakos12rev2_1d4tib_2110191045.pdf
Komentar
Posting Komentar