GNU/Linux >> Belajar Linux >  >> Linux

Ikhtisar Proses UNIX (Di Dalam Proses Linux, dan Jenis Proses)

Proses adalah instance program yang sedang berjalan. Dalam artikel ini kami menggunakan dua istilah 'program' dan 'menjalankan instance'. Misalkan kita menjalankan sebuah program secara bersamaan sebanyak 5 kali, maka sesuai dengan setiap instance akan ada proses yang berjalan di dalam sistem. Jadi kita katakan bahwa sebuah proses adalah “instance yang berjalan” dari sebuah program.

Seperti yang telah Anda ketahui, Anda dapat menggunakan perintah ps untuk melihat proses yang berjalan di sistem Anda. Untuk penggunaan perintah ps yang efektif, lihat 7 Contoh Perintah PS Praktis untuk Pemantauan Proses.

1. Mengintip Ke Dalam Sebuah Proses

Sekarang, karena kita sudah jelas dengan apa sebenarnya sebuah proses, mari kita gali lebih dalam untuk melihat apa yang terdiri dari sebuah proses. Proses Unix dapat dianggap sebagai wadah yang berisi:

Petunjuk Program

Instruksi program disimpan dalam segmen teks yang dieksekusi oleh CPU. Biasanya untuk program seperti editor teks yang sering dijalankan, segmen teks dibagikan. Segmen ini memiliki hak hanya baca yang berarti bahwa program tidak dapat mengubah segmen teksnya.

Data

Sebagian besar data disimpan dalam segmen data. Segmen data dapat diklasifikasikan menjadi segmen data yang diinisialisasi dan segmen data yang tidak diinisialisasi. Seperti namanya, segmen data yang diinisialisasi berisi variabel global yang diinisialisasi sebelumnya sementara segmen data yang tidak diinisialisasi (juga dikenal sebagai segmen 'BSS') berisi variabel global yang tidak diinisialisasi. Selain itu, variabel statis disimpan dalam segmen data.

Variabel lokal yang lokal untuk fungsi disimpan di stack. Stack khusus untuk suatu fungsi dan selain berisi informasi tentang variabel lokal juga berisi informasi tentang alamat di mana aliran akan kembali setelah eksekusi fungsi selesai. Stack juga berisi informasi tentang lingkungan pemanggil, seperti beberapa register mesin juga disimpan di stack. Sebuah fungsi yang disebut mengalokasikan memori untuk variabel lokal dan variabel sementara pada stack itu sendiri. Dalam kasus fungsi rekursif, ada tumpukan independen untuk setiap panggilan fungsi.

Lalu ada data yang disimpan di heap. Memori untuk data ini dialokasikan pada waktu proses pada segmen heap. Segmen tumpukan tidak bersifat lokal untuk suatu proses tetapi dibagikan di seluruh proses. Inilah alasan mengapa programmer C sangat khawatir tentang kebocoran memori yang disebabkan pada segmen heap dan dapat mempengaruhi proses lain pada sistem.

Argumen baris perintah dan variabel lingkungan

Sebuah proses juga berisi ruang untuk menyimpan variabel lingkungan dan argumen baris perintah yang kita berikan ke program. Biasanya vektor yang berisi informasi baris perintah disimpan di sini dan kemudian alamat vektor informasi ini dan jumlah elemen dalam vektor disalin ke 'argv' dan 'argc' (dua argumen ke fungsi 'main()').

Selain informasi di atas, suatu proses juga mengandung informasi seperti

  • Status I/O-nya
  • Prioritasnya dan informasi kontrol lainnya

Salah satu informasi kontrol yang paling penting untuk suatu proses adalah hak istimewa. Sebuah proses secara langsung mewarisi semua hak istimewa dari pengguna yang telah memicu proses ini. Misalnya proses yang dipicu oleh pengguna yang tidak memiliki hak pengguna super tidak dapat melakukan hal-hal yang memerlukan hak akses root sementara proses yang dipicu oleh root dapat melakukan apa pun yang diprogram untuk dilakukan. Pengecualian untuk aturan di atas adalah di mana suatu proses dapat memperoleh hak istimewa yang lebih besar daripada pengguna yang memicunya jika bit setuid atau setgid diatur untuk proses tertentu. Tetapi kami tidak akan membahasnya secara rinci di sini (lihat halaman manual setuid dan setgid untuk informasi lebih lanjut tentang ini).

2. Proses latar belakang dan latar depan

Seperti yang telah kita bahas bahwa kita dapat memulai proses dengan namanya di Unix. Seperti beberapa program standar 'ls', 'ps' dll dapat dimulai hanya dengan mengetikkan namanya pada prompt shell. Ada dua cara untuk memulai proses

  • Mulai di latar depan
  • Mulai di latar belakang

Misalkan ada utilitas yang menghabiskan beberapa waktu dan menghitung. Katakanlah nama utilitasnya adalah 'count' Sekarang untuk memicu dan menjalankan program di latar depan, saya menjalankan perintah berikut (di mana 'count' adalah nama biner dari kode di atas):

$ ./count
Counting done

Jadi kita melihat bahwa, setelah menjalankan biner './count', dibutuhkan hampir 10 detik sebelum output ditampilkan di stdout dan sampai saat itu shell hanya ditempati oleh proses ini. yaitu Anda tidak dapat melakukan operasi lain pada shell yang sama. Sekarang, untuk memicu proses di latar belakang, tambahkan '&' di akhir perintah:

$ ./count &
[1] 4120

$ # Do some work on shell while the above program is working in the background

$ Counting done

Tanda ampersand '&' menunjukkan bahwa proses ini perlu dijalankan sebagai proses latar belakang. Dengan menjalankan proses latar belakang, kita dapat memiliki akses ke shell untuk melakukan operasi lebih lanjut. Seperti, pada output di atas, setelah menjalankan 'hitungan' biner di latar belakang, saya menggunakan beberapa perintah lagi pada shell yang sama dan ketika 'hitungan' biner selesai dengan pemrosesannya, output dilemparkan kembali ke shell yang sama (baris terakhir). Jadi kita dapat menyimpulkan bahwa secara default setiap proses berjalan di latar depan, menerima input (jika ada) dari keyboard dan mengembalikan output ke pengguna. Sementara proses latar belakang adalah proses yang terputus dari keyboard dan pengguna dapat menggunakan shell yang sama untuk melakukan lebih banyak operasi.

Untuk informasi lebih lanjut tentang proses latar depan dan latar belakang, lihat:Cara Mengelola Pekerjaan Latar Belakang UNIX

3. Jenis proses

Jadi kita melihat bahwa proses adalah konsep yang mendasar bagi sistem operasi. Hampir setiap aktivitas pada OS berbentuk proses untuk melakukan beberapa hal. Ada berbagai jenis proses yang berjalan pada suatu sistem, beberapa di antaranya adalah :

Proses turunan

Sebuah proses yang dibuat oleh beberapa proses lain selama run-time. Biasanya proses anak dibuat untuk mengeksekusi beberapa biner dari dalam proses yang ada. Proses anak dibuat menggunakan panggilan sistem fork(). Biasanya proses dibuat untuk dijalankan melalui shell/terminal. Dalam hal ini shell menjadi induk dan proses yang dieksekusi menjadi proses anak. Di Unix/Linux setiap proses memiliki induk kecuali proses init (kita akan mempelajarinya nanti).

Proses Daemon

Ini adalah proses khusus yang berjalan di latar belakang. Mereka adalah proses terkait sistem yang tidak memiliki terminal terkait. Proses-proses yang dijalankan ini akan me-root hak akses dan biasanya menyediakan layanan untuk proses. Seperti yang sudah kita ketahui bahwa proses daemon tidak memiliki terminal yang terpasang, untuk mencapai hal ini proses harus terlepas dari terminal. Cara ideal di Linux/Unix untuk melakukan ini adalah dengan menjalankan proses melalui terminal dan dari dalam proses ini buat proses lain dan kemudian hentikan proses induk. Karena induk dihentikan maka sekarang anak akan menjadi independen dari terminal dan akan diambil alih oleh proses init dan karenanya akan menjadi proses daemon. Contoh tipikalnya adalah daemon email yang menunggu kedatangan email dan memberi tahu saat email diterima.

Proses anak yatim

Biasanya suatu proses membuat proses anak (seperti yang dijelaskan di atas) dan ketika proses anak berakhir, sebuah sinyal dikeluarkan ke induk sehingga induk dapat melakukan semua hal yang harus dilakukan ketika salah satu anak dihentikan. Tetapi ada situasi ketika orang tua terbunuh. Dalam hal ini proses anak menjadi yatim piatu dan kemudian diambil alih oleh proses init. Meskipun proses init mengambil kepemilikan dari proses anak yatim tetapi proses ini tetap disebut sebagai anak yatim karena orang tua aslinya tidak ada lagi.

Proses zombie

Ketika proses anak dihentikan atau menyelesaikan eksekusinya, maka entrinya dalam tabel proses tetap ada sampai proses induk mengambil informasi status anak yang dihentikan. Jadi, sampai saat itu proses yang dihentikan memasuki keadaan zombie dan dikenal sebagai proses zombie. Ketika suatu proses dihentikan maka semua memori dan sumber daya yang terkait dengan proses dilepaskan tetapi entri proses dalam tabel proses ada. Sinyal SIGCHILD dikirim ke induk proses (yang baru saja dihentikan). Biasanya, pengendali sinyal ini di induk menjalankan panggilan 'tunggu' yang mengambil status keluar dari proses yang dihentikan dan kemudian entri proses zombie ini dari tabel proses juga dihapus.

4. Proses init

Seperti yang telah kita bahas sebelumnya, proses init adalah tahap ke-5 dari Tahap ke-6 Proses Boot Linux.

Anda akan mengetahui teori 'ayam dan telur' yang terkenal tentang siapa yang datang lebih dulu. Dalam hal proses, karena setiap proses memiliki proses induk, pertanyaan yang sama dapat diajukan tentang proses induk atau anak. Nah, untungnya ada jawaban di sini. Jawabannya adalah proses init yang dimulai sebagai proses pertama selama urutan boot. Itu berarti tidak ada induk dari proses init. Mari kita verifikasi, karena PID init adalah '1', kita menggunakan perintah ps :

Jadi kita lihat dari output bahwa PPID adalah 0, yang berarti tidak ada parent untuk proses ini.

$ ps -l 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
4 S     0     1     0  0  80   0 -  5952 poll_s ?          0:00 /sbin/init

Berikut ini adalah beberapa perintah yang berhubungan dengan proses:Perintah atas, Perintah HTOP, perintah PS, perintah Kill (pkill, xkill).


Linux
  1. Linux – Direktori Standar Dan/atau Umum Pada OS Unix/linux?

  2. 12 Langkah Install dan Konfigurasi Alfresco di UNIX / Linux

  3. UNIX / Linux:3 Cara Mengirim Sinyal ke Proses

  1. Perintah Linux - Gambaran Umum dan Contoh

  2. Cara Menemukan dan Membunuh Proses Zombie di Linux

  3. penghentian proses mmap, msync dan linux

  1. Linux – Memahami Izin Unix Dan Jenis File?

  2. Proses UNIX / Linux:C fork() Fungsi

  3. Linux:Temukan dan Bunuh Proses Zombie