PRAKTIKUM 7 UNIX SYSTEM CALL & MANAJEMEN MEMORI

NAMA : FATIA YASMIN HENDRY

KELAS : BM-5A

NIM : 2023000032

M.K : SISTEM OPERASI



UNIX SYSTEM CALL & MANAJEMEN MEMORI

  • Pokok Bahasan

  1. UNIX System Call
  2. Manajemen Memory

  • Tujuan Belajar

  1. Menggunakan system call fork, wait dan execl pada Linux.
  2. Menggunakan perintah-perintah untuk manajemen memory.

  • Abstrak

      Materi ini membahas konsep dasar sistem operasi UNIX terkait dengan pemanggilan sistem (system call) dan manajemen memori. Sistem operasi UNIX adalah sistem operasi yang kuat dan sering digunakan dalam lingkungan komputasi. Pemanggilan sistem adalah antarmuka yang memungkinkan program pengguna untuk berinteraksi dengan kernel sistem operasi. Materi ini mencakup pengenalan kepada pemanggilan sistem, termasuk penggunaan umum seperti pembuatan proses, manajemen berkas, dan komunikasi antar proses. Selain itu, materi ini juga membahas konsep manajemen memori di sistem operasi UNIX. Manajemen memori adalah proses mengelola alokasi dan dealokasi memori untuk program-program yang berjalan di sistem. Topik-topik seperti paging, segmentasi, dan manajemen memori virtual juga dibahas dalam materi ini. Materi ini sangat penting bagi pengembang perangkat lunak dan administrator sistem yang ingin memahami dasar-dasar sistem operasi UNIX, pemanggilan sistem, dan manajemen memori untuk mengoptimalkan kinerja sistem dan aplikasi mereka.

  • Teori Singkat

       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.

    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 tetapi 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 Execl

    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 

       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 nomemory fisik, kernel melakukan swappingt  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.


  • Tugas Pendahuluan
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

          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 fork1 fork1.cpp

$ ./fork1

3. Amati output yang dihasilkan

          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 menjala nkan program diatas. Pada saat dijalankan, program tidak akan pernah berhenti. Untuk menghentikan program tekan Ctrl+C.

$ g++ -o fork2 fork2.cpp

$ ./fork2

3. Amati output yang dihasilkan

          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 fork3 fork3.cpp

$ ./fork3

3. Amati output yang dihasilkan

          Percobaan 4 : Proses parent menunggu sinyal dari proses 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 fork4 fork4.cpp

$ ./fork4

3. Amati output yang dihasilkan

          Percobaan 5 : System 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 file 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;

}

2. Gunakan g++ compiler untuk menjalankan program diatas

$ g++ -o fork5 fork5.cpp

$ ./fork5

3. Amati output yang dihasilkan

          Percobaan 6 : System call fork/exec dan wait mengeksekusi program lain

1. Dengan menggunakan editor vi, buatlah file 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 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("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 fork6 fork6.cpp

$ ./fork6

3. Amati output yang dihasilkan

          Percobaan 7 : Melihat Manajemen History

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

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. Perhatikan perubahan manajemen memory

$ free

7. Dengan perintah ps bagaimana penggunaan memory untuk se tiap proses diatas ?

$ ps -uax


  • Latihan
1. Ubahlah program fork5.cpp pada percobaan 5 untuk mengeksekusi perintah yang ekuivalen dengan 
a. ls –al /etc.
b. cat fork2
c. ./fork2
Jawab : 

2. Informasi apa saja mengenai manajemen memory yang ditampilkan pada perintah dmesg pada percobaan Anda ?
Jawab : 

3. Bagaimana informasi yang ditampilkan dengan perintah free pada percobaan Anda ?
Jawab : 

4. Apa isi file /proc/meminfo pada percobaan yang Anda lakukan ?
Jawab : 

5. Berapa besar memory yang digunakan setelah percobaan 7 dengan perintah ps – uax ?
Jawab : 

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 ?
b. Informasi apa saja yang disimpan file /proc/meminfo ?
c. Berapa besar kapasitas memory total ?
d. Berapa kapasitas memory yang sudah terpakai ?
e. Berapa kapasitas memory yang belum terpakai ?
f. Berapa kapasitas memory yang digunakan sharing beberapa proses ?
g. Berapa kapasitas buffer cache ?
Jawab : 

  • 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/Referensi

Comments

Popular posts from this blog

PRAKTIKUM 8 SISTEM FILE

PRAKTIKUM MANAJEMEN APLIKASI