Objek Pekerjaan

Objek pekerjaan memungkinkan grup proses dikelola sebagai unit. Objek pekerjaan adalah objek yang dapat diubah namanya, dapat diamankan, dan dapat dibagikan yang mengontrol atribut proses yang terkait dengannya. Operasi yang dilakukan pada objek pekerjaan memengaruhi semua proses yang terkait dengan objek pekerjaan. Contohnya termasuk memberlakukan batasan seperti ukuran set kerja dan prioritas proses atau mengakhiri semua proses yang terkait dengan pekerjaan.

Membuat Pekerjaan

Untuk membuat objek pekerjaan, gunakan fungsi CreateJobObject . Ketika pekerjaan dibuat, tidak ada proses yang terkait dengan pekerjaan.

Untuk mengaitkan proses dengan pekerjaan, gunakan fungsi AssignProcessToJobObject . Setelah proses dikaitkan dengan pekerjaan, asosiasi tidak dapat rusak. Proses dapat dikaitkan dengan lebih dari satu pekerjaan dalam hierarki pekerjaan berlapis. Untuk informasi selengkapnya, lihat Pekerjaan Berlapis.

Windows 7, Windows Server 2008 R2, Windows XP dengan SP3, Windows Server 2008, Windows Vista, dan Windows Server 2003: Proses hanya dapat dikaitkan dengan satu pekerjaan. Pekerjaan tidak dapat ditumpuk. Kemampuan untuk menyarangkan pekerjaan ditambahkan di Windows 8 dan Windows Server 2012.

Anda dapat menentukan deskriptor keamanan untuk objek pekerjaan saat Anda memanggil fungsi CreateJobObject . Untuk informasi selengkapnya, lihat Keamanan Objek Pekerjaan dan Hak Akses.

Mengelola Proses dalam Pekerjaan

Setelah proses dikaitkan dengan pekerjaan, secara default setiap proses turunan yang dibuatnya menggunakan CreateProcess juga dikaitkan dengan pekerjaan. (Proses anak yang dibuat menggunakan Win32_Process.Create tidak terkait dengan pekerjaan.) Perilaku default ini dapat diubah dengan mengatur batas yang diperpanjang JOB_OBJECT_LIMIT_BREAKAWAY_OK atau JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK untuk pekerjaan tersebut.

  • Jika pekerjaan memiliki batas yang diperpanjang JOB_OBJECT_LIMIT_BREAKAWAY_OK dan proses induk dibuat dengan bendera CREATE_BREAKAWAY_FROM_JOB, maka proses turunan dari proses induk tidak terkait dengan pekerjaan.
  • Jika pekerjaan memiliki batas yang diperpanjang JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK, maka proses turunan dari proses induk apa pun yang terkait dengan pekerjaan tidak terkait dengan pekerjaan. Proses induk tidak perlu dibuat dengan bendera CREATE_BREAKAWAY_FROM_JOB.

Jika pekerjaan berlapis, pengaturan breakaway pekerjaan induk dalam hierarki memengaruhi apakah proses anak dikaitkan dengan pekerjaan lain dalam hierarki. Untuk informasi selengkapnya, lihat Pekerjaan Berlapis.

Untuk menentukan apakah proses berjalan dalam pekerjaan, gunakan fungsi IsProcessInJob .

Untuk mengakhiri semua proses yang saat ini terkait dengan objek pekerjaan, gunakan fungsi TerminateJobObject .

Batas dan Pemberitahuan Pekerjaan

Pekerjaan dapat memberlakukan batasan seperti ukuran set kerja, prioritas proses, dan batas waktu akhir pekerjaan pada setiap proses yang terkait dengan pekerjaan. Jika proses yang terkait dengan pekerjaan mencoba meningkatkan ukuran set kerja atau prioritas prosesnya dari batas yang ditetapkan oleh pekerjaan, fungsi memanggil berhasil tetapi diabaikan secara diam-diam. Pekerjaan juga dapat menetapkan batasan yang memicu pemberitahuan ketika terlampaui tetapi memungkinkan pekerjaan untuk terus berjalan.

Untuk mengatur batas pekerjaan, gunakan fungsi SetInformationJobObject . Untuk daftar kemungkinan batasan yang dapat diatur untuk pekerjaan, lihat topik berikut:

Batas keamanan harus diatur satu per satu untuk setiap proses yang terkait dengan objek pekerjaan. Untuk informasi selengkapnya, lihat Keamanan Proses dan Hak Akses.

Windows XP dengan SP3 dan Windows Server 2003: Fungsi SetInformationJobObject dapat digunakan untuk mengatur batasan keamanan untuk semua proses yang terkait dengan objek pekerjaan. Dimulai dengan Windows Vista, batas keamanan harus diatur satu per satu untuk setiap proses yang terkait dengan objek pekerjaan.

Jika pekerjaan berlapis, pekerjaan induk dalam hierarki memengaruhi batas yang diberlakukan untuk pekerjaan tersebut. Untuk informasi selengkapnya, lihat Pekerjaan Berlapis.

Jika pekerjaan memiliki port penyelesaian I/O terkait, pekerjaan dapat menerima pemberitahuan ketika batas pekerjaan tertentu terlampaui. Sistem mengirim pesan ke port penyelesaian ketika batas terlampaui atau peristiwa tertentu lainnya terjadi. Untuk mengaitkan port penyelesaian dengan pekerjaan, gunakan fungsi SetInformationJobObject dengan kelas informasi objek pekerjaan JobObjectAssociateCompletionPortInformation dan penunjuk ke struktur JOBOBJECT_ASSOCIATE_COMPLETION_PORT . Yang terbaik adalah melakukan ini ketika pekerjaan tidak aktif, untuk mengurangi kemungkinan pemberitahuan yang hilang untuk proses yang statusnya berubah selama asosiasi port penyelesaian.

Semua pesan dikirim langsung dari pekerjaan seolah-olah pekerjaan telah memanggil fungsi PostQueuedCompletionStatus . Utas harus memantau port penyelesaian menggunakan fungsi GetQueuedCompletionStatus untuk mengambil pesan. Perhatikan bahwa, dengan pengecualian batas yang ditetapkan dengan kelas informasi JobObjectNotificationLimitInformation , pengiriman pesan ke port penyelesaian tidak dijamin; kegagalan pesan tiba tidak selalu berarti bahwa peristiwa tidak terjadi. Pemberitahuan untuk batas yang ditetapkan dengan JobObjectNotificationLimitInformation dijamin tiba di port penyelesaian. Untuk daftar kemungkinan pesan, lihat JOBOBJECT_ASSOCIATE_COMPLETION_PORT.

Akuntansi Sumber Daya untuk Pekerjaan

Objek pekerjaan merekam informasi akuntansi dasar untuk semua proses terkait, termasuk yang telah dihentikan. Untuk mengambil informasi akuntansi ini, gunakan fungsi QueryInformationJobObject . Untuk daftar informasi akuntansi yang dipertahankan untuk pekerjaan, lihat topik berikut:

Jika objek pekerjaan ditumpuk, informasi akuntansi untuk setiap pekerjaan anak dikumpulkan dalam pekerjaan induknya. Untuk informasi selengkapnya, lihat Pekerjaan Berlapis.

Mengelola Objek Pekerjaan

Status objek pekerjaan diatur ke sinyal ketika semua prosesnya dihentikan karena batas waktu akhir pekerjaan yang ditentukan telah terlampaui. Gunakan WaitForSingleObject atau WaitForSingleObjectEx untuk memantau objek pekerjaan untuk peristiwa ini.

Untuk mendapatkan handel untuk objek pekerjaan yang ada, gunakan fungsi OpenJobObject dan tentukan nama yang diberikan ke objek saat dibuat. Hanya objek pekerjaan bernama yang dapat dibuka.

Untuk menutup handel objek pekerjaan, gunakan fungsi CloseHandle . Pekerjaan dihancurkan ketika handel terakhirnya telah ditutup dan semua proses terkait telah dihentikan. Namun, jika pekerjaan memiliki bendera JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE yang ditentukan, menutup handel objek pekerjaan terakhir mengakhiri semua proses terkait dan kemudian menghancurkan objek pekerjaan itu sendiri. Jika pekerjaan berlapis memiliki bendera JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE yang ditentukan, menutup handel objek pekerjaan terakhir mengakhiri semua proses yang terkait dengan pekerjaan dan pekerjaan turunannya dalam hierarki.

Mengelola Pohon Proses yang Menggunakan Objek Pekerjaan

Dimulai dengan Windows 8 dan Windows Server 2012, aplikasi dapat menggunakan pekerjaan berlapis untuk mengelola pohon proses yang menggunakan lebih dari satu objek pekerjaan. Namun, aplikasi yang harus berjalan pada Windows 7, Windows Server 2008 R2, atau versi Windows yang lebih lama yang tidak mendukung pekerjaan berlapis harus mengelola pohon proses dengan cara lain.

Jika alat harus mengelola pohon proses yang menggunakan objek pekerjaan dan tidak mungkin menggunakan pekerjaan berlapis, alat dan anggota pohon proses harus bekerja sama. Gunakan salah satu opsi berikut ini:

  • Gunakan batas JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Jika alat menggunakan batas ini, alat tidak dapat memantau seluruh pohon proses. Alat ini hanya dapat memantau proses yang ditambahkannya ke pekerjaan. Jika proses ini membuat proses anak, proses tersebut tidak terkait dengan pekerjaan. Dalam opsi ini, proses anak dapat dikaitkan dengan objek pekerjaan lain.

  • Gunakan batas JOB_OBJECT_LIMIT_BREAKAWAY_OK. Jika alat ini menggunakan batas ini, alat ini dapat memantau seluruh pohon proses, kecuali untuk proses yang setiap anggota pohon secara eksplisit memisahkan diri dari pohon. Anggota pohon dapat membuat proses anak di objek pekerjaan baru dengan memanggil fungsi CreateProcess dengan bendera CREATE_BREAKAWAY_FROM_JOB, lalu memanggil fungsi AssignProcessToJobObject . Jika tidak, anggota harus menangani kasus di mana AssignProcessToJobObject gagal.

    Bendera CREATE_BREAKAWAY_FROM_JOB tidak berpengaruh jika pohon tidak dipantau oleh alat. Oleh karena itu, ini adalah opsi yang disukai, tetapi membutuhkan pengetahuan tingkat lanjut tentang proses yang dipantau.

  • Cegah pelarian dalam bentuk apa pun dengan mengatur JOB_OBJECT_LIMIT_BREAKAWAY_OK atau batas JOB_OBJECT_LIMIT_SILENT_BREAKAWAY_OK. Dalam opsi ini, alat ini dapat memantau seluruh pohon proses. Namun, jika proses anak mencoba mengaitkan dirinya sendiri atau proses anak lain dengan pekerjaan dengan memanggil AssignProcessToJobObject, panggilan akan gagal. Jika proses dirancang untuk dikaitkan dengan pekerjaan tertentu, kegagalan ini dapat mencegah proses bekerja dengan baik.