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 useddan”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 freejugaberkurang.

 

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

Postingan populer dari blog ini