Praktikum 7
Unix System Call dan
Manajemen Memory
Nama : Muhammad Ariq Dzulfiqar
Kelas : BM5B
Nim : 1803421017
1. 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
dilakukanakan dibuat
program yang didalamnya terdapatfungsi
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 danbeberapa program yang
berisi system callfork().
Bila suatu
program berisi sebuah fungsi fork(), eksekusi dari program menghasilkan
eksekusi dua proses. Satu proses dibuat untuk memulai eksekusiprogram. 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
systemcallfork() 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 hasilfork()dapat diabaikan.
·
Untuk
kill proses gunakanCtrl+C.
·
Untuk dokumentasi fork() dapat dilihat dengan ketikkan man 2fork.
·
Untuk melihat id dari proses, gunakan system
call getpid()
·
Untuk melihat dokumentasidarigetpid(),
ketikkan man
2getpid
Perbedaan antara
proses parent dan proses child adalah
·
Mempunyai pid yangberbeda
·
Pada proses parent ,
fork() menghasilkan pid dari
proses child jikasebuah proses child dibuat.
·
Pada proses child, fork()selalumenghasilkan 0
·
Membedakan copy
darisemua data, termasuk variable dengan current value dan stack
·
Membedakan program
counter (PC) yang menunjukkan eksekusi berikutnya meskipunawalnyakeduanyamempunyainilai
yang sama tetapi
setelahitu berbeda.
·
Setelah fork, kedua
proses tersebut tidak menggunakan variable bersama.
System call fork
menghasilkan :
·
Pid proses child yang baru ke proses parent, hal ini samadengan memberitahukan proses parent namadarichild-nya
·
0 :menunjukkan proses child
·
-1 :1jika terjadi error,fork()gagal karena proses baru tidakdapatdibuat.
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 2wait.
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 yangberbeda.
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 memoryfisik.
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; jikadatayangsamadibutuhkanlagidapatdengancepatdiambildaricache.
Pertama kali
sistem melakukan booting, ROM BIOS membentuk memory testseperti terlihat
berikut :
ROM BIOS (C) 1990 008192 KB OKWAIT......
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 perintahdmesg.
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 freeshared buffers
Mem: 709652161880 2328 2800
Swap:194640 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
berjalanpadashell. 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,
dengansatu user log in, dengan perintah free
system melaporkanberikut:
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.
Situasiberubahsetelahmenjalankanperintah
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” jugaberkurang.
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 |
RSSTTY STAT |
START |
TIME
COMMAND |
student |
4581 0.0 0.34316 |
856
pts/0 S |
10:25 |
0:00
bash |
student |
4699 0.0 0.22604 |
656
pts/0 R |
10.39 |
0:00
ps -u |
TUGAS
PENDAHULUAN:
Jawablah
pertanyaan-pertanyaan berikut ini :
1.
Apa yang dimaksuddengan
system call?
Jawab:
Sistem call
adalah sebuah sistem yang menyediakan
interface antara program dan bagian OS. Sistem call menjadi jembatanantara 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 execldan
man 2 wait)?
Jawab:
Sistem
call fork adalahsuatusistem call yang membuatsuatu proses baru pada
sistemoperasi UNIX. Nilai yang dihasilkanfork() disimpan dalam variable bertipepid_t, yang
berupa nilai
integer, karena tidak digunakan, makahasil
fork() dapat diabaikan.
Sistem call execl() adalah suatu sistem call yang
meletakkan program executable barukememori dan mengasosiasikannyadengan proses
saatitu. 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 system operasi ke parent bila child
diterminasi.
3.
Apa yang dimaksudsistem
virtual memory, proses swapping dan buffer cache pada manajemenmemory?
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 sebuahsistem. Swap merupakan memori backup atau cadanganapabilamemoriutamasudahkewalahanmenanganioperasi
di computer kita, dan biasanya swap ini ditemukan pada
waktuinstalasi Linux denganalokasi hard disk.
4.
Apayangdimaksudperintahfreedancat/proc/meminfo?
Jawab:
Free digunakan untuk mengetahui total memori
yang digunakan dalam
proses. Dalamperintah free ditampilkan total kapasitasmemori, memori yang
terpakai, yang tidaksedangdipakai, yang dibagi, buffer, cache, dan juga swap.
Perintah
cat/proc/meminfo digunakan untuk mengetahui isi dari meminfo kemudian ditampilkan.
5.
Apayang dimaksud perintah ps?
Jawab:
Perintah ps digunakan untuk menampilkaninformasi
proses yang sedang berjalan termasuk nomor PID dari proses
tersebut.
Percobaan
1: Melihat proses parent dan proses child
1. 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 ygdideklarasikan
pada unistd.h.
Menghasilkansuatunilaidengan
type pid_t.
pid_tadalah type khususuntuk process id
ygekuivalen dg int
*/
int main(void) {
pid_tmypid;
uid_tmyuid;
for (int
i=0; i<3; i++) {
mypid=getpid();
cout<< "I am
process " <<mypid<<endl;
cout<< "My parent is process "
<<getppid() <<endl;
cout<<"Theownerofthisprocesshasuid"<<getuid()
<<endl;
/* sleep adalah system call ataufungsilibrary yang menghentikan
proses inidalamdetik
*/
sleep(1);
}
return 0;
}
Hasil:
2. 2.
Gunakan g++ compiler untukmenjalankan program di atas
$ g++ -o fork1 fork1.cpp
$ ./fork1
Hasil:
3. 3.
Amati output yang dihasilkan
Analisa:
Oke jadi program ini adalah program yang
bertujuanuntukmelihat proses parent dan proses child. Salah
satucaranyayaitudenganmelihat PID (Process Identifier) dan PPID (Parent Process
Identifier) dari proses. Untukmendapatkannilai PID dan PPID dapat dilakukan dengan fungsi getpid() dan getppid()
yang dideklarasikan pada unistd.h. kedua fungsi tersebut akan mengembalikan nilai bertipepid_t yang merupakan sebuah signed integer
yang menunjukkan PID. Dapatdilihatdenganmenggunakan perintah ps bahwa proses ./fork1 memiliki
PID 9930 dan PPID adalah 2952 yang merupakan proses bash. Selainitu, pada
program ini juga digunakan fungsi getuid() untuk mendapatkan id dari
user yang menjalankan dan fungsi sleep() yang menghentikan proses dalam detik.
Percobaan
2: Membuatdua proses terusmenerusdengansebuah system call fork()
1. Denganmenggunakan
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 ygdideklarasikan pada unistd.h.
Menghasilkansuatunilaidengan
type pid_t.
pid_tadalah
type khususuntuk process id ygekuivalen dg int
*/
int main(void)
{
pid_tchildpid;
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. 2 Gunakan g++ compiler
untukmenjalankan program di ats. Pada saatdijalankan, program
tidakakanpernahberhenti. Untukmenghentikan program tekanCtrl+C.
$ g++ -o fork2 fork2.cpp
$ ./fork2
Hasil:
3. Amati
output yang dihasilkan.
Analisa:
Program di atas bertujuan untuk membuat dua proses secara terus menerus menggunakan system call
fork(). Fork adalahsuatu system call yang dapatmembuat proses baru. Proses asal
yang melakukan fork disebutdengan parent process, sedangkan proses baru yang
dibuatsetelahmelakukan 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
telahterjadi.
Percobaan
3: Membuatdua proses sebanyak lima kali
1. Denganmenggunakan
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 ygdideklarasikan pada unistd.h.
Menghasilkansuatunilaidengan type pid_t.
pid_tadalah type khususuntuk
process id ygekuivalen dg int
*/
int main(void)
{
pid_tchildpid; childpid =fork();
for
(int i=0; i<5; i++){
cout<<"This
is process
" <<getpid()
<<endl; sleep(2);
}
return
0;
}
Hasil :
2. Gunakan
g++ compiler untukmenjalankan program di atas
$ g++ -o fork3 fork3.cpp
$ ./fork3
Hasil:
3. 3,
Amati output yang dihasilkan
Analisa:
Program inihampirsamadengan 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 menunggusinyaldari proses child dengansistem call wait
1. Denganmenggunakan
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_tfork() dideklarasikan pada unistd.h.
pid_tadalah type khususuntuk
process id ygekuivalendgint
*/
int main(void) {
pid_tchild_pid; int status;
pid_twait_result;
child_pid = fork();
if (child_pid== 0) {
/*
kodeinihanyadieksekusi proses child */
cout<< "I am a child and
my pid= " <<getpid() <<endl; cout<< "My parent is " <<getppid() <<endl;
/*
keluar if akanmenghentikanhanya proses child */
}
else if (child_pid> 0) {
/* kodeinihanyamengeksekusi
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);
}
/* kodeinidieksekusibaik oleh
proses parent dan child */ cout<<
"I am a happy, healthy process and
my pid = "
<<getpid()
<<endl;
if (child_pid == 0) {
/* kodeinihanyadieksekusi oleh
proses child */ cout<< "I am a child and
I am quitting work now!"
<<endl;
}
else {
/* kodeinihanyadieksekusi oleh
proses parent */ cout<<
"I am a parent and I am going to wait
for my
child"
<<endl;
do
{
/* parent menunggusinyal SIGCHLD mengirimtandabahwa 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. 2.
Gunakan g++ compiler untukmenjalankan program di atas
$ g++ -o fork4 fork4.cpp
$ ./fork4
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 pengkondisianif..else
pada hasilpengembalian 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.
Percobaan
5: Sistenm call fork/exec dan wait mengeksekusi program bernama ls, menggunakan
file executable /bin/ls dengansatu parameter -l yang ekuivalendengan ls -l
1. Denganmenggunakan
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_tfork() dideklarasikan pada unistd.h.
pid_tadalah
type khususuntuk process id ygekuivalen dg int
*/
int main(void) {
pid_tchild_pid;
int status;
pid_twait_result;
child_pid = fork();
if (child_pid== 0) {
/*
kodeinihanyadieksekusi proses child */
cout<< "I am a child and my pid = " <<getpid() <<endl; execl("/bin/ls", "ls","-l","/home", NULL);
/* jikaexeclberhasilkodeinitidakpernahdigunakan
*/ cout<<"Could not execlfile /bin/ls"
<<endl;
exit(1);
/*
exit menghentikanhanya proses child */
}
else if (child_pid> 0) {
/* kodeinihanyamengeksekusi
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);
}
/*
kodeinihanyadieksekusi oleh proses parent karenachild mengeksekusidari“/bin/ls”ataukeluar */
cout<< "I am a happy, healthy process and my pid ="
<<getpid()
<<endl;
if (child_pid == 0) {
/* kodeinitidakpernahdieksekusi
*/ printf("This code will never be executed!\n");
}
else
{
/* kodeinihanyadieksekusi
oleh proses parent */ cout<< "I am a parent and I am going to wait
for my
child" <<endl;
do {
/* parent menunggusinyal
SIGCHLD mengirimtandabilaproses 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 untukmenjalankan program di atas
$ g++ -o fork5 fork5.cpp
$ ./fork5
Hasil:
3. Amati
output yang dihasilkan
Analisa:
Program
iniakanmelakukan forking dan proses child akanmenjalankanperintah ls -l. Hal
inidapatdilakukandenganmenjalankan system call execl pada proses child.
Execlmerupakan system call yang berfungsiuntukmengeksekusi file. Pada kasusini,
child process mengeksekusiperintah ls yang filenyaberada di /bin/ls dengan
argument -l dan /home.
Komentar
Posting Komentar