Praktikum 7 - UNIX System Call dan Manajemen Memori
PRAKTIKUM 7
UNIX SYSTEM CALL DAN MANAJEMEN MEMORI
SISTEM OPERASI
DOSEN PENGAMPU: MOHAMMAD FATHURAHMAN, S.T., M.T.
DISUSUN OLEH:
ALVIANA SIRAJUDIN – 2103421024
BM 5A
PROGRAM STUDI BROADBAND MULTIMEDIA
JURUSAN TEKNIK ELEKTRO
POLITEKNIK NEGERI JAKARTA
2023
POKOK BAHASAN
1. UNIX System Call
2. Manajemen Memory
TUJUAN BELAJAR
Setelah mempelajari materi dalam BAB ini, mahasiswa diharapkan mampu:
1. Menggunakan system call fork, wait dan ecxel pada Linux
2. Menggunakan pereintah-perintah untuk manajemen memory
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, execl 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.
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().
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 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 terlih at 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 :
|
Mem: |
total 247184 |
used 145772 |
free 101412 |
shared buffers cached 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 /.)
|
Mem: |
total 247184 |
used 230604 |
free 16580 |
shared 0 |
buffers cached 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
1. Apa yang dimaksud dengan system call ?
Jawab:
System call (sistem panggilan) adalah mekanisme yang digunakan dalam pemrograman komputer untuk berinteraksi dengan kernel atau inti dari sistem operasi. System call memungkinkan program aplikasi untuk meminta layanan atau operasi tertentu dari sistem operasi, seperti membaca atau menulis file, alokasi memori, membuat proses baru, atau berkomunikasi antar proses. Dengan menggunakan system call, program dapat meminta akses ke sumber daya sistem atau melakukan tugas yang memerlukan hak akses tinggi. System call menyediakan antarmuka antara aplikasi pengguna dan kernel sistem operasi, memfasilitasi eksekusi operasi-operasi inti yang diperlukan untuk menjalankan program secara efisien.
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(), execl(), dan wait() adalah fungsi-fungsi dasar dalam pemrograman sistem Unix/Linux yang digunakan untuk mengelola proses.
a). fork():
Deskripsi (man 2 fork): Membuat salinan proses pemanggil dan menciptakan proses baru yang disebut sebagai child process. Proses baru ini identik dengan proses pemanggil (parent process) kecuali untuk nilai yang dikembalikan.
Contoh Penggunaan: `man 2 fork`
b). execl():
Deskripsi (man 2 execl): Menggantikan gambar memori dari proses pemanggil dengan program baru. Fungsi ini digunakan untuk menjalankan program lain dalam konteks proses yang sama.
Contoh Penggunaan: `man 2 execl`
c). wait():
Deskripsi (man 2 wait): Menunggu proses anak selesai dan mengembalikan informasi tentang status proses anak tersebut. Fungsi ini digunakan oleh proses orangtua (parent) untuk menunggu selesainya proses anak.
Contoh Penggunaan: `man 2 wait`
3. Apa yang dimaksud sistem virtual memory, proses swapping dan buffer cache pada manajemen memory ?
Jawab:
Sistem Virtual Memory adalah konsep dalam manajemen memori yang memungkinkan program untuk menggunakan lebih banyak memori daripada yang sebenarnya tersedia secara fisik di sistem. Sistem ini menggunakan kombinasi dari RAM fisik dan penyimpanan sekunder (seperti hard disk) untuk menciptakan ilusi bahwa memori yang lebih besar tersedia.
Proses Swapping adalah teknik dalam manajemen memori di mana bagian-bagian dari program dan data yang sedang berjalan dapat ditukar antara RAM dan penyimpanan sekunder. Ini memungkinkan sistem untuk menjaga performa dengan memindahkan data yang jarang digunakan ke penyimpanan sekunder, memberikan ruang lebih banyak di RAM untuk aplikasi yang sedang berjalan.
Buffer Cache adalah area kecil di RAM yang digunakan untuk menyimpan salinan data yang sering diakses dari penyimpanan sekunder, seperti file sistem. Buffer cache membantu meningkatkan kinerja dengan mempercepat akses ke data yang sering diminta oleh program atau sistem operasi, menghindari kebutuhan untuk selalu membaca data dari penyimpanan sekunder yang lebih lambat.
4. Apa yang dimaksud perintah free dan cat /proc/meminfo ?
Jawab:
Perintah "free" dan "cat /proc/meminfo" pada sistem operasi Linux digunakan untuk memantau informasi terkait penggunaan memori. Perintah "free" memberikan tampilan ringkas tentang penggunaan memori fisik dan swap, termasuk informasi tentang total, digunakan, dan sisa memori, serta penggunaan cache. Sementara itu, perintah "cat /proc/meminfo" memberikan akses ke berbagai detail lebih lanjut tentang penggunaan memori, seperti jumlah total, bebas, dan digunakan untuk berbagai jenis memori, termasuk RAM dan cache. Keduanya adalah alat yang berguna untuk memantau kesehatan sistem dan memastikan efisiensi penggunaan memori pada lingkungan Linux.
5. Apa yang dimaksud perintah ps ?
JaJawab:
Perintah "ps" dalam sistem operasi Unix/Linux merupakan singkatan dari "process status" atau "process snapshot". Perintah ini digunakan untuk menampilkan informasi tentang proses-proses yang sedang berjalan di sistem. Saat dieksekusi, perintah "ps" akan menampilkan daftar proses yang terkait dengan terminal tempat perintah tersebut dijalankan. Outputnya mencakup informasi seperti ID proses (PID), status proses, pengguna yang menjalankan proses, penggunaan sumber daya, dan informasi lainnya terkait proses yang sedang berjalan. Dengan menggunakan berbagai opsi, pengguna dapat menyaring dan menyesuaikan informasi yang ditampilkan, memberikan pemahaman yang lebih mendalam tentang aktivitas sistem pada tingkat proses
PERCOBAAN
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;
} 2. Gunakan g++ compiler untuk menjalankan program diatas $ g++ -o fork 1 fork 1.cpp $ ./fork 1 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 5509 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 #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; }
2. Gunakan g++ compiler untuk menjalankan program diatas. Pada saat dijalankan, program tidak akan pernah berhenti. Untuk menghentikan program tekan Ctrl+C. $ g++ -o fork 2 fork 2.cpp $ ./fork 2 3. Amati output yang dihasilkan 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 5542, sedangkan yang merupakan parent process adalah process dengan PID 5543. 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; } 2. Gunakan g++ compiler untuk menjalankan program diatas. $ g++ -o fork 3 fork 3.cpp
$ ./fork 3 3. Amati output yang dihasilkan 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 5606, sedangkan yang merupakan parent process adalah proses dengan PID 5605. 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 peoses child dengan system call wait
1. Dengan menggunakan editor vi, buatlah file 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; } 2. Gunakan g++ compiler untuk menjalankan program diatas. $ g++ -o fork 4 fork 4.cpp $ ./fork 4 3. Amati output yang dihasilkan 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: System call fork/exec dan wait mengeksekusi program bernama ls, menggunakan file escuatble /bin/ls dengan satu parameter yang ekuivalen dengan ls-l
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> #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; } 2. Gunakan g++ compiler untuk menjalankan program diatas. $ g++ -o fork 5 fork 45cpp $ ./fork 5 3. Amati output yang dihasilkan 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: System call fork/exec dan wait mengeksekusi program lain
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> #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; } 2. Gunakan g++ compiler untuk menjalankan program diatas. $ g++ -o fork 6 fork 6.cpp $ ./fork 6 3. Amati output yang dihasilkan Pada program ini, proses child mengeksekusi program lain (fork3) dengan menggunakan system call execl. Pada percobaan diatas, proses dengan PID 2948 adalah proses parent, sedangkan proses dengan PID 2949 adalah process child. Namun, saat proses child menjalankan execl dan mengeksekusi fork3, proses dengan PID 2948 pada program fork3 akan menjadi proses parent dan ia akan membuat proses child baru dengan PID 2949dm. |
Percobaan 7: Melihat Manajemen Memory
1.
Perhatikan dengan perintah dmesg jumlah memory
tersedia dan proses swapping $ dmesg | more
2.
Dengan perintah free perhatikan jumlah memory
”free”, ”used”, “share” dan “buffer”
. $ free car 3.
Dengan perintah dibawah ini apakah hasilnya
sama dengan no 2 ?
$ cat /proc/meminfo 4. Gunakan perintah dibawah ini
$ ls –lR /. 5. Perhatikan perubahan manajemen memory
$ free 6. Jalankan sebuah
program, misalnya open Office. manajemen memory
$ free ps 7. Dengan perintah
ps bagaimana penggunaan
memory untuk se tiap proses diatas $ ps -uax |
KESIMPULAN
System calls adalah mekanisme terprogram di mana program komputer dapat meminta layanan dari kernel sistem operasi di mana mereka berjalan. Fungsi utama system calls adalah menyediakan antarmuka antara proses dan sistem operasi. Dalam konteks praktikum ini, terdapat tiga jenis system calls yang digunakan, yaitu fork, execl, dan wait.
1. System Call Fork:
- Fork adalah system call yang menciptakan proses baru dengan menggandakan proses yang memanggilnya.
- Proses baru disebut proses child, sedangkan proses yang memanggilnya disebut proses parent.
2. System Call Execl:
- Execl digunakan untuk mengeksekusi sebuah file dengan menyediakan path file dan argumen-argumen perintah.
- Execl meletakkan program executable baru ke dalam memory dan mengasosiasikannya dengan proses saat itu.
3. System Call Wait:
- Wait adalah system call yang digunakan untuk menunggu perubahan status pada child process yang dipanggil.
- Memberikan informasi tentang child process yang mengalami perubahan status.
Selain itu, Linux mengimplementasikan sistem virtual memory demand-paged, di mana transfer page antara disk dan memory fisik terjadi pada virtual memory. Jika tidak cukup memory fisik, kernel melakukan swapping page lama ke disk. Jika total page memory lebih besar dari memory fisik yang tersedia, dapat terjadi thrashing, yang mengakibatkan peningkatan swapping dan mengurangi utilitas.
Perbedaan antara proses parent dan proses child melibatkan pid yang berbeda, duplikasi data termasuk variable dengan nilai saat itu dan stack, program counter yang awalnya sama tetapi kemudian berbeda, dan setelah fork, keduanya tidak menggunakan variable bersama.
Komentar
Posting Komentar