Tác vụ (điện toán)

Trong khoa học máy tính, **tác vụ** () là một đơn vị thực thi (unit of execution) hoặc một đơn vị công việc (unit of work). Khái niệm task thường mang tính chất khá chung chung, vì đối tượng chính xác được hướng đến khi dùng khái niệm task thường là tiến trình (process), tiến trình nhẹ (light-weight process), luồng (thread), bước (step), yêu cầu (request) hoặc yêu cầu truy vấn (query). Hình bên minh họa một hàng đợi (queue) được dùng cho các task sẽ thực thi (task queue, màu xanh trong hình), một thread pool (màu xanh) dành cho các luồng (thread) để thực thi các task đó và những task đã hoàn thành (completed tasks, màu vàng). Hình ảnh này mình họa cho khái niệm task là một đơn vị công việc.

## Thuật ngữ
Với khái niệm "đơn vị thực thi" (unit of execution), trong một số hệ điều hành, task tương đương với một tiến trình (process). Trong thực thi không tương tác (batch processing), một task là một đơn vị thực thi trong một job (công việc), với bản thân một task là một tiến trình. Thuật ngữ "multitasking" (đa nhiệm) được dùng để chỉ việc xử lý nhiều tác vụ cùng một lúc, dưới góc dộ xử lý tiến trình, đồng thời cũng để chỉ việc thực hiện nhiều tác vụ cùng lúc.

Với khái niệm "đơn vị công việc" (unit of work), trong một công việc (có nghĩa là "công việc một lần"), một task có thể tương đương với một bước duy nhất (bản thân bước đó, chứ không phải việc thực hiện nó), trong khi việc xử lý hàng loạt các task riêng lẻ có thể tương ứng với một bước xử lý một đơn vị trong batch, hoặc một bước xử lý tất cả các đơn vị trong batch. Trong các hệ thống trực tuyến (kết nối Internet), các task thường tương ứng với một *yêu cầu (request)* duy nhất (trong kiến trúc response-request) như một HTTP request và response, hoặc một câu lênh truy vấn (trong truy xuất thông tin), một giai đoạn hoặc toàn bộ quá trình xử lý của hệ thống.

### Ví dụ
Trong ngôn ngữ lập trình Java, hai khái niệm đơn vị công việc và đơn vị thực thi được gộp chung khi làm việc trực tiếp với các thread (luồng), nhưng được phân biệt rõ ràng trong Executor framework: (Bản gốc tài liệu)

### Thuật ngữ của IBM
Việc IBM sử dụng thuật ngữ "task" đã có ảnh hưởng lớn, mặc dù đã nhấn mạnh sự mơ hồ của thuật ngữ này. Trong thuật ngữ của IBM, **task** có nhiều định nghĩa cụ thể, bao gồm:

* Một đơn vị công việc đại diện cho một trong các bước trong một tiến trình.
* Một đơn vị công việc được thực hiện bởi một thiết bị hoặc tiến trình.
* Một tiến trình và các thủ tục để chạy tiến trình đó.
* Một tập hợp các hành động được thiết kế để đạt được một kết quả cụ thể. Một task được thực hiện trên một tập hợp các mục tiêu trên một lịch trình cụ thể.
* Một đơn vị tính toán. Trong một công việc song song, hai hoặc nhiều task đồng thời hoạt động cùng nhau thông qua truyền tin nhắn và chia sẻ bộ nhớ. Mặc dù một tác vụ thường được phân bổ cho mỗi bộ xử lý vật lý (physical processor) hoặc logic (logical processor), thuật ngữ "task" và "bộ xử lý" (processor) không thể hoán đổi cho nhau.
* Một hoạt động có giá trị do người dùng khởi xướng và được thực hiện bằng phần mềm.

Đặc biệt trong z/OS, nó được định nghĩa chính xác là:

* "Trong môi trường đa chương (multiprogramming) hoặc đa xử lý (multiprocessing), một hoặc nhiều chuỗi lệnh (instructions) được chương trình điều khiển coi như là một phần của công việc được máy tính thực hiện."

Khái niệm "task" trong OS/360 thông qua z/OS gần tương đương với tiến trình nhẹ (light-weight process); các task trong một bước công việc (job step) chia sẻ cùng một địa chỉ trong bộ nhớ. Tuy nhiên, trong MVS/ESA thông qua z/OS, một task hoặc Service Request Block (SRB) (Khối Yêu cầu Dịch vụ) có thể có quyền truy cập vào các vùng địa chỉ khác thông qua danh sách truy cập của nó.

### Nhân Linux
Thuật ngữ *task* được sử dụng trong nhân Linux (ít nhất là kể từ v2.6.13, và ở các phiên bản sau và bao gồm v4.8) để chỉ một đơn vị thực thi, đơn vị này có thể chia sẻ nhiều tài nguyên hệ thống với các task khác trên hệ thống. Tùy thuộc vào mức độ chia sẻ, một task có thể được coi là một chuỗi hoặc tiến trình thông thường. Các task được thực hiện bằng dùng `clone()` trong system call, nơi người dùng có thể chỉ định mức chia sẻ tài nguyên mong muốn.

## Lịch sử
Thuật ngữ *task* bắt đầu được sử dụng cho khái niệm đa chương (multiprogramming) vào đầu những năm 1960, như trong ví dụ này từ năm 1961: (Bản gốc tài liệu)

Thuật ngữ này được phổ biến với sự ra đời của OS/ 360 (công bố năm 1964), có tính năng Multiprogramming with a Fixed number of Tasks (MFT) (tạm dịch: Đa chương trình với một số nhiệm vụ cố định) và Multiprogramming with a Variable number of Tasks (MVT) (Tạm dịch: Đa chương trình với một số công việc thay đổi). Trong trường hợp này, các task được xác định bằng các tiến trình nhẹ (light-weight process), một công việc bao gồm một số task và các task con được phát sinh sau đó (sub-task hay child processes theo thuật ngữ hiện đại).

Ngày nay thuật ngữ "task" đang được sử dụng rất mơ hồ. Ví dụ: như chương trình Windows Task Manager trên hệ điều hành Windows, dùng để quản lý các tasks đang chạy trên hệ thống, trong khi chương trình Windows Task Scheduler lên lịch cho *các chương trình* để thực thi trong tương lai, công việc được gọi là job scheduler với phần mở rộng tập tin là `.job`. Ngược lại, thuật ngữ task queue (hàng đợi task) thường được sử dụng theo nghĩa "đơn vị công việc".

## Xem thêm

* Tiến trình (khoa học máy tính)
*Task parallelism
* Task queue

## Chú thích