FreeBSD mendukung sebuah lingkungan multitasking. Setiap tasking atau thread dari eksekusi disebut proses. Susunan dari sebuah proses FreeBSD terdiri dari bagian level user, termasuk segala isi dari ruang pengalamatan dan run-time environment, dan bagian level kernel, dimana terdapat parameter - parameter penjadwalan, pengendalian sumber proses, dan informasi pengidentifikasian. Susunan tersebut termasuk segala sesuatu yang digunakan oleh kernel dalam memberikan servis untuk proses tsb. Si Pengguna dapat menciptakan berbagai proses, mengendalikan eksekusi berbagai proses, dan menerima notifikasi pada saat status eksekusi prose mengalami perubahan. Setiap proses diberikan sebuah nilai unik, dengan istilah "Proses Identifier" [ PID ]. Nilai ini dipergunakan oleh kernel untuk mengenali sebuah proses pada saat melaporkan status perubahan pada si Pengguna dan digunakan oleh suatu pengguna pada saat mereferensikan sebuah proses dalam sebuah sistem.
Kernel menciptakan sebuah proses dengan menduplikasikan susunan proses lain. Proses baru tersebut diistilahkan dengan "Child Process" dari turunan Parent Process. Susunan tersebut digandakan dalam penciptaan proses dengan menyertakan kedua-duanya: eksekusi proses pd tingkat user dan bagian proses sistem yang diatur oleh kernel. Komponen-komponen penting dari kernel akan dijabarkan pada BAB 4.
Perputaran proses tersebut digambarkan pada gambar 2.1. Sebuah proses mungkin menciptakan proses baru yang merupakan copy dari proses inti dengan menggunakan fungsi system-call yaitu fork. Pemanggilan fork tersebut mengembalikan sampai dua kali: pertama pada parent process, dimana nilai yang dikembalikan merupakan PID dari child process, dan kedua pada child process, dimana mengembalikan nilai 0. Hubungan antar parent-child menyebabkan terbentuknya sebuah struktur hirarki pada sekumpulan proses dalam sistem. Proses-proses baru tersebut berbagi resource proses asalnya [ parent process ], spt file-descriptor, status penanganan sinyal, dan susunan memori.
Gambar 2.1. Pengaturan Proses System-Call.
Walaupun ada saat-saat ketika proses baru adalah duplikasi dari parent, loading & eksekusi dari suatu program yang berbeda merupakan sesuatu yang lebih berguna dan unik. Sebuah proses dapat melapisi dirinya dengan memory image dari program lain, dengan memasukan pada proses baru menciptakan image sekumpulan parameter-parameter, menggunakan system call execve. Salah satu parameter adalah nama dari sebuah file yang isinya berada dalam format yang dikenali oleh sistem, baik file binary executable atau sebuah file yang menyebabkan eksekusi dari sebuah program intepreter untuk menterjemahkan isinya.
Sebuah proses mungkin berakhir dengan mengeksekusi sebuah system call - exit, dengan mengirimkan status exit - 8 bit kepada parent. Jika sebuah proses ingin berkomunikasi lebih dari pada satu informasi dengan parent-nya, ia harus: menyusun sebuah kanal komunikasi antar proses dg menggunakan baik "pipe" maupun "socket", atau menggunakan sebuah file penengah. Komunikasi antar proses dibahas secara luas pada BAB 11.
Sebuah proses dapat menghambat eksekusi hingga beberapa dr child-nya berakhir dengan menggunakan system-call "wait", yang mengembalikan PID dan status exit dari proses berakhirnya child. Sebuah proses dapat mengatur agar mendapat notifikasi sebuah sinyal pada saat sebuah child process berakhir secara tidak biasa. Dengan menggunakan fungsi wait dari system call, parent dapat mengambil informasi mengenai kejadian yang menyebabkan berakhirnya child process dan mengenai resource yang dipakai oleh proses selama berjalan. Sebuah proses dianggap "orphan" karena parent keluar sebelum proses tsb selesai, kemudian kernel mengatur status keluarnya child dimasukan kembali kepada sebuah proses sistem yang khusus ( lihat bagian 3.1 dan 14.5 ). Penjelasan mendetail bagaimana kernel menciptakan dan menghancurkan proses dibahas dalam BAB 5.
Proses-proses dijadwalkan untuk eksekusi menutur parameter prioritas proses. Dibawah standar penjadwalan pembagian waktu, prioritas ini diatur oleh sebuah algoritma penjadwalan kernel-based. User dapat berpengaruh terhadap penjadwalan sebuah proses dengan menetapkan sebuah parameter yang menitik beratkan prioritas penjadwalan secara keseluruhan tetapi tetap diharuskan untuk berbagi sumber CPU dasar menurut kebijakan penjadwalan kernel. Kernel akan menjalankan proses real-time dengan prioritas tertinggi untuk mengeluarkan semua proses-proses lainnya. jadi , proses-prose real-time tidak berkewajiban untuk berbagi dasar sumber CPU.
Signals
Sistem mendefinisikan sekumpulan sinyal yang mungkin dikirimkan pada sebuah proses. Sinyal-sinyal pada FreeBSD dipergakan setelah interrup-interrup hardware. Sebuah proses bisa menentukan sub-routine user-level menjadi sebuah "handler" yang mana sebuah sinyal harus dikirim. Pada saat sebuah sinyal digenerate, dia diblok dari kejadian berikutnya sementara hal tersebut tertangkap oleh handler. Menangkap sebuah sinyal melibatkan penyimpanan susunan proses yang sedang terjadi dan membangun sebuah hal baru yang menjalankan handler tersebut. Sinyal tersebut kemudian dikirim pada handler, yang dapat mengeluarkan proses maupun mengembalikan eksekusi proses (barangkali setelah menyusun sebuah variabel global). Jika handler tersebut kembali, sinyal dibuka kembali dan dapat diolah(dan ditamgkap) kembali.
Sebagai kemungkinan, sebuah proses mungkin menetapkan bahwa sebuah sinyal diabaikan atau merupakan aksi default, sebagaimana ditentukan oleh kernel, yang harus diterima. Aksi default dari sinyal tertentu adalah menghentikan proses. Penghentian ini mungkin disatukan dengan menciptakan sebuah file inti [core file] yang mengandung image memori yang sedang berjalan dari proses untuk digunakan dalam postmortem debugging.
Beberapa sinyal tidak dapat ditangkap dan diabaikan. Sinyal-sinyal ini termasuk SIGKILL, yang menghentikan proses-proses yang sedang berjalan, dan sinyal pengatur kerja SIGSTOP.
Sebuah proses bisa memilih untuk memiliki pengiriman sinyal-sinyal pada stack yang khusus sehingga hal tersebut manipulasi stack software yang handal memungkinkan. Contoh, coroutine pendukung bahasa perlu untuk memberikan sebuah stack terhadap setiap coroutine. Sistem run-time bahasa dapat mengalokasikan stack-stack tersebut dengan membagi stack tunggal yang diberikan oleh FreeBSD. Jika kernel tidak men-support stack sinyal yang terpisah, ruang yang dialokasikan untuk setiap coroutine harus diperluas dengan jumlah dari ruang yang diperlukan untuk menangkap sebuah sinyal.
Semua sinyal memiliki prioritas yang sama. Jika berkali-kali sinyal tertunda secara serempak, urutan dimana sinyal-sinyal dikirimkan pada sebuah proses diimplementasikan secara spesial. Pengendali sinyal dieksekusi dengan sinyal yang mengakibatkan penarikan mereka menjadi terhalang, tapi sinyal lainnya mungkin sedang berjalan. Mekanisme diberikan sehingga proses-proses tersebut dapat melindungi bagian-bagian kode yang kritis terhadap kejadian dari sinyal-sinyal tersebut.
Desain dan implementasi dari sinyal-sinyal dijabarkan pada bagian 4.7
Process Groups and Sessions
Proses-proses dikelompokan ke dalam group-group proses. Group-group proses digunakan untuk mengendalikan akses ke terminal-terminal dan memberi sebuah titik tengah penyebaran sinyal pada sekumpulan proses-prose yang berhubungan. Sebuah proses mewarisi group prosesnya dari parent process. Mekanisme diberikan kernel untuk mengijinkan sebuah proses untuk menggantikan group prosesnya atau group proses dari turunannya. Menciptakan sebuah proses baru adalah mudah; nilai dari sebuah group proses baru biasanya merupakan identifikasi proses dari proses yang diciptakan.
Group dari proses-proses dalam sebuah group proses terkadang The group of processes in a process group is sometimes dihubungkan sebagai sebuah job dan dimanipulasi oleh software sistem tingkat tinggi, spt shell. Sebuah hal yang umum yang tercipta dari shell adalah sebuah pipeline dari beberapa proses yang dihubungkan dengan pipe, seperti keluaran dari proses pertama adalah masukan dari proses kedua, keluaran proses kedua merupakan masukan bagi proses ketiga dst. Shell menciptakan sebuah job dengan mencabangkan sebuah proses untuk setiap tingkat dari pipeline, dan kemudian meletakan semua proses tersebut kedalam sebuah grup proses yang terpisah.
Sebuah proses user dapat mengirimkan sebuah sinyal ke setiap proses dalam sebuah group proses sebaik ke sebuah proses tunggal. Sebuah proses dalam sebuah group proses tertentu bisa menerima interupsi software, yang menyebabkan group tersebut untuk menunda atau menyelesaikan eksekusi, atau menjadi diinterupsi atau dihentikan.
Sebuah terminal (atau lebih umumnya sebuah emulasi software dari sebuah terminal disebut terminal pseudo) memiliki sebuah identifikasi group proses yang diberikan padanya. Identitas ini secara normal diset sbg pengenal sebuah group proses yang disatukan dengan terminal. Sebuah job-control shell menciptakan beberapa group proses yang disatukan dalam satu terminal yang sama; terminal tersebut merupakan terminal pengendali untuk setiap proses dalam group-group proses tsb. Sebuah proses mungkin membaca dari sebuah descriptor untuk terminal pengendalinya hanya jika identifikasi group proses terminal cocok dengan proses tsb. Jika identifikasi tidak cocok, proses akan diblok jika dia mencoba untuk membaca dari terminal. Dengan merubah pengenal group proses dari terminal, sebuah shell dapat memutuskan sebuah terminal diantara beberapa job yang berbeda. Penetapan ini disebut job control dan dijelaskan, dengan group-group proses dalam bagian 4.8.
Sebagaiman sekumpulan dari proses dapat dikumpulkan kedalam seuah group proses, sekumpulan group-group proses dikumpulkan kedalam sebuah session. Penggunaan utama dari session-session adalah untuk menciptakan sebuah lingkungan yang terisolasi untuk sebuah proses daemon dan child-nya, serta untuk mengumpulkan bersama sebuah shell login pengguna dan job-job yang dihasilkan oleh shell.