Bạn đang xem : đa luồng

Hướng dẫn lập trình đa luồng

Hiểu các khái niệm cơ bản về đa luồng

Đồng tiền và song song

Trong quy trình đa luồng trên một CPU, CPU có thể chuyển hóa tài nguyên thực thi giữa các luồng, kéo theo thực thi đồng thời.

Trong cùng một quy trình đa luồng trong môi trường đa xử lý bộ nhớ lưu trữ dùng chung, mỗi luồng trong quy trình có thể chạy trên một CPU tách biệt cùng một lúc, kéo theo thực thi song song.

Khi quy trình có ít hoặc nhiều luồng khi có CPU, hệ thống trợ giúp luồng kết phù hợp với môi trường hoạt động đảm nói rằng mỗi luồng chạy trên một CPU khác nhau.

Ví dụ: trong phép nhân ma trận có cùng số luồng và CPU, mỗi luồng (và mỗi CPU) tính một hàng kết quả.

Xem xét cấu trúc đa luồng

UNIX truyền thống đã trợ giúp khái niệm luồng – mỗi quy trình chứa một luồng duy nhất, vì vậy lập trình với nhiều quy trình là lập trình với nhiều luồng. Nhưng một quy trình cũng là một không gian địa chỉ và việc tạo một quy trình kể cả việc tạo ra một không gian địa chỉ mới.

Tạo một luồng ít tốn kém hơn nhiều so với việc tạo một quy trình mới, vì luồng mới được tạo sử dụng không gian địa chỉ quy trình hiện tại. Thời gian cần để chuyển hóa giữa các luồng thấp hơn nhiều so với thời gian thiết yếu để chuyển hóa giữa các quy trình, một phần vì chuyển hóa giữa các luồng không liên quan tới việc chuyển hóa giữa các không gian địa chỉ.

Giao tiếp giữa các luồng của một quy trình rất đơn giản vì các luồng chia sẻ mọi thứ – nhất là không gian địa chỉ. Vì vậy, dữ liệu do một chuỗi tạo ra sẽ ngay mau chóng có sẵn cho toàn bộ các chuỗi khác.

Giao diện trợ giúp đa luồng thông qua thư viện chương trình con, libpthread cho luồng POSIX và libthread cho luồng Solaris. Đa luồng phân phối tính linh hoạt bằng cách tách các tài nguyên cấp nhân và cấp người dùng.

Đề tài cấp độ người dùng

Luồng là giao diện lập trình chính trong lập trình đa luồng. Các luồng cấp người dùng [Các tiểu trình cấp người dùng được đặt tên để phân biệt với các tiểu trình cấp nhân, chỉ là mối quan tâm của các nhà lập trình hệ thống. Vì cuốn sách này dành cho các lập trình viên ứng dụng, các luồng cấp nhân không được thảo luận.] Được xử lý trong không gian người dùng và tránh các hình phạt chuyển hóa ngữ cảnh nhân. Một ứng dụng có thể có hàng trăm luồng mà vẫn không tiêu tốn nhiều tài nguyên nhân. Ứng dụng sử dụng bao nhiêu tài nguyên nhân phần lớn do ứng dụng quyết định.

Các chuỗi chỉ hiển thị từ bên trong quy trình, nơi chúng chia sẻ toàn bộ các tài nguyên quy trình như không gian địa chỉ, tệp đang mở, 𝒱.𝒱. Trạng thái sau là duy nhất cho mỗi đề tài.

  • ID chuỗi

  • Trạng thái đăng ký (bao gồm cả PC và con trỏ ngăn xếp)

  • Ngăn xếp

  • Mặt nạ tín hiệu

  • Mức độ ưu tiên

  • Bộ nhớ lưu trữ riêng tư theo chuỗi

Xem Thêm  Tổng hợp cách tạo usb boot 1 click, bằng Hiren’s Boot win 10, 7, 8.1 - 1 cú nhấp chuột co hiren boot usb

Vì các luồng chia sẻ hướng dẫn quy trình và hầu như dữ liệu quy trình, nên các luồng khác trong quy trình có thể nhìn thấy sự thay đổi trong dữ liệu được chia sẻ của một luồng. Khi một luồng cần tương tác với các luồng khác trong cùng một quy trình, nó có thể làm như vậy mà không cần liên quan đến môi trường hoạt động.

Theo mặc định, các đề tài rất nhẹ. Tuy nhiên, để kiểm tra nhiều hơn một luồng (ví dụ: để kiểm tra quyết sách lập lịch nhiều hơn), ứng dụng có thể ràng buộc luồng. Khi một ứng dụng link các luồng với tài nguyên thực thi, các luồng sẽ trở thành tài nguyên hạt nhân (xem “Phạm vi hệ thống (Chuỗi liên kết)” để biết thêm thông tin).

Tóm lại, các đề tài cấp người dùng là:

  • Tạo không tốn kém vì họ không cần tạo không gian địa chỉ của riêng mình. Chúng là các bit bộ nhớ lưu trữ ảo được cấp phát từ không gian địa chỉ của các bạn tại thời điểm chạy.

  • Đồng bộ hóa nhanh chóng vì đồng bộ hóa được thực hiện ở cấp ứng dụng, không phải ở cấp hạt nhân.

  • Đơn giản quản lý bởi thư viện đề tài; libpthread hoặc libthread .

Quy trình nhẹ

Thư viện luồng sử dụng các luồng điều khiển cơ bản được gọi là các quy trình nhẹ được trợ giúp bởi hạt nhân. Bạn có thể coi LWP như một CPU ảo thực thi mã hoặc lệnh gọi hệ thống.

Bạn thường không cần quan tâm đến LWP để lập trình với các chuỗi. Thông tin ở đây về LWP được phân phối dưới dạng nền tảng, vì vậy bạn có thể hiểu sự khác biệt trong phạm vi lập lịch, được mô tả trên “Phạm vi xử lý (Chuỗi chưa ràng buộc)” .

Lưu ý –

Các LWP trong môi trường hoạt động Solaris 2, Solaris 7 và Solaris 8 không giống với các LWP trong thư viện SunOSTM 4.0 LWP, là không được trợ giúp trong môi trường hoạt động Solaris 2, Solaris 7 và Solaris 8.

Phần lớn các thủ tục của thư viện stdio như fopen () fread () sử dụng open () read () , giao diện luồng sử dụng giao diện LWP và vì nhiều nguyên nhân tương tự.

Các quy trình nhẹ (LWP) là điểm kết nối giữa cấp người dùng và cấp hạt nhân. Mỗi quá trình chứa một hoặc nhiều LWP, mỗi LWP chạy một hoặc nhiều luồng người dùng. (Xem Hình 1-1 .) Việc tạo luồng thường chỉ liên quan tới việc tạo một số ngữ cảnh người dùng, nhưng không phải tạo LWP.

Hình 1-1 Luồng cấp người dùng và quy trình nhẹ

Mỗi LWP là một tài nguyên hạt nhân trong một nhóm hạt nhân, và được cấp phát (đính kèm) và hủy cấp phát (tách rời) cho một tiểu trình trên nền tảng mỗi tiểu trình. Điều này xảy ra khi các chuỗi được lên lịch hoặc được tạo và hủy.

Lập lịch

POSIX chỉ định ba quyết sách lập lịch: nhập trước – xuất trước ( SCHED_FIFO ), xoay vòng ( SCHED_RR ) và tùy chỉnh ( SCHED_OTHER ). SCHED_FIFO là bộ lập lịch dựa trên hàng đợi với các hàng đợi khác nhau cho từng mức độ ưu tiên. SCHED_RR giống như FIFO ngoại trừ mỗi luồng có một hạn ngạch thời gian thực thi.

Xem Thêm  [Update] Download Camtasia 9 Full Crack 2021 + Hướng dẫn chi tiết | ẩn online trên facebook

Cả SCHED_FIFO SCHED_RR đều là tiện ích mở rộng Thời gian thực của POSIX. SCHED_OTHER là quyết sách lập lịch mặc định.

Xem "LWP và lớp lập lịch" để biết thông tin về quyết sách SCHED_OTHER và về cách mô phỏng một số tính chất của POSIX SCHED_FIFO Quyết sách của SCHED_RR .

Có sẵn hai phạm vi lập lịch: phạm vi xử lý cho các luồng không bị ràng buộc và phạm vi hệ thống cho các luồng bị ràng buộc. Các đề tài với các trạng thái phạm vi khác nhau có thể cùng tồn tại trên cùng một hệ thống và thậm chí trong cùng một quy trình. Nói chung, phạm vi đặt phạm vi mà quyết sách lập lịch luồng có hiệu lực.

Phạm vi xử lý (Đề tài chưa ràng buộc)

Các chuỗi chưa link được tạo PTHREAD_SCOPE_PROCESS . Các luồng này được lập lịch trong không gian người dùng để gắn và tách khỏi các LWP có sẵn trong nhóm LWP. LWP chỉ có sẵn cho các luồng trong quá trình này; này là các luồng được lập lịch trên các LWP này.

Trong hầu như các trường hợp, chuỗi phải là PTHREAD_SCOPE_PROCESS . Điều này cho phép các luồng trôi nổi giữa các LWP và điều này cải tổ năng suất luồng (và tương tự với việc tạo một luồng Solaris ở trạng thái THR_UNBOUND ). Thư viện luồng quyết định, so với các luồng khác, luồng nào được phục vụ bởi hạt nhân.

Phạm vi hệ thống (Chuỗi ràng buộc)

Các chuỗi link được tạo PTHREAD_SCOPE_SYSTEM . Một luồng hạn chế được gắn vĩnh viễn với một LWP.

Mỗi chuỗi link được link với một LWP trong suốt thời gian tồn tại của chuỗi. Điều này tương tự với việc tạo một chuỗi Solaris ở trạng thái THR_BOUND . Bạn có thể link một luồng để phân phối cho nó một ngăn xếp tín hiệu thay thế hoặc sử dụng các tính chất lập lịch đặc biệt với lập lịch Thời gian thực. Toàn bộ việc lập lịch được thực hiện bởi môi trường hoạt động.

Lưu ý -

Trong cả hai trường hợp, ràng buộc hoặc không link, một chuỗi có thể được truy cập trực tiếp hoặc chuyển sang một quy trình khác.

Hủy

Việc hủy chuỗi cho phép một chuỗi chấm hết việc thực thi bất kỳ chuỗi nào khác trong quy trình. Chuỗi mục tiêu (chuỗi đang bị hủy) có thể giữ các yêu cầu hủy đang chờ xử lý và có thể thực hiện thu dọn ứng dụng rõ ràng khi nó hoạt động theo thông báo hủy.

Tính năng hủy pthreads cho phép chấm hết chuỗi không đồng bộ hoặc hoãn lại. Hủy không đồng bộ có thể xảy ra bất kì lúc nào; hủy bỏ hoãn lại chỉ có thể xảy ra tại các điểm xác nhận. Hủy hoãn lại là loại mặc định.

Đồng bộ hóa

Đồng bộ hóa cho phép bạn kiểm tra luồng chương trình và quyền truy cập vào dữ liệu được chia sẻ để thực hiện đồng thời các luồng.

Xem Thêm  Những cách độ xe máy hot nhất tại Alobike - độ đèn xi nhan xe máy

Bốn mô hình đồng bộ hóa là khóa mutex, khóa đọc / ghi, biến điều kiện và semaphores.

  • Khóa Mutex chỉ cho phép một chuỗi tại một thời điểm thực thi một phần mã rõ ràng hoặc truy cập dữ liệu rõ ràng.

  • Khóa đọc / ghi cho phép đọc đồng thời và ghi độc quyền vào tài nguyên được chia sẻ được bảo vệ. Để sửa đổi một tài nguyên, trước tiên một luồng phải có được khóa ghi độc quyền. Một khóa ghi độc quyền không được phép cho đến khi toàn bộ các khóa đọc đã được giải phóng.

  • Các biến điều kiện chặn các chuỗi cho đến khi một điều kiện rõ ràng là đúng.

  • Đếm semaphores thường điều phối quyền truy cập vào tài nguyên. Số lượng là hạn chế về số lượng đề tài có thể có quyền truy cập vào một semaphore. Khi đạt đến số lượng, khối semaphore.


Xem thêm những thông tin liên quan đến đề tài đa luồng

Java Cơ Bản 70 Thread - đa luồng trong Java

  • Tác giả: JMaster Trung Tâm Java
  • Ngày đăng: 2017-01-20
  • Nhận xét: 4 ⭐ ( 5451 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Giới thiệu về thread trong Java. Trong cùng một thời gian, có thể xử lý công việc song song, và đa luồng cùng nhau, tăng năng suất và thời gian xử lý công việc.

Lập trình đa luồng trong Java (Java Multi-threading)

  • Tác giả: topdev.vn
  • Nhận xét: 4 ⭐ ( 1076 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Multi-thread (đa luồng) là một tiến trình thực hiện nhiều luồng đồng thời. Một ứng dụng Java ngoài luồng chính có thể có các luồng khác thực thi đồng thời làm ứng dụng chạy nhanh và hiệu quả hơn.

Đa luồng nhanh hay chậm?

  • Tác giả: codelearn.io
  • Nhận xét: 3 ⭐ ( 4810 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Luồng (thread) là nhà cung cấp thực thi nhỏ nhất được quản lý một cách độc lập bởi bộ lập lịch của hệ điều hành, hãy cùng tìm hiểu xem liệu luồng có nhanh hơn.

Đa luồng (Multithreading)

  • Tác giả: www.voer.edu.vn
  • Nhận xét: 5 ⭐ ( 4484 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: - (giáo trình - tài liệu - học liệu từ VOER)

Đa luồng (Multithread) trong ₵++

  • Tác giả: hoclaptrinh.vn
  • Nhận xét: 3 ⭐ ( 1954 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Đa luồng (Multithreading) là một form chuyên dụng của đa nhiệm (multitasking) và một đa nhiệm là tính năng cho phép PC của các bạn chạy hai hoặc nhiều chương trình đồng thời

Quá trình -Đọc & Đơn luồng

  • Tác giả: itzone.com.vn
  • Nhận xét: 5 ⭐ ( 5831 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: The ITZone platform Vietnam is the community for anyone interested in news, training seminars, presentations etc in the IT industry

Siêu phân luồng là gì?

  • Tác giả: www.intel.vn
  • Nhận xét: 5 ⭐ ( 3241 lượt nhận xét )
  • Khớp với kết quả tìm kiếm: Siêu phân luồng là nâng cấp phần cứng của Intel®, cho phép nhiều luồng chạy trên mỗi lõi. Điều này có nghĩa là có thể thực hiện song song nhiều tác vụ hơn.

Xem thêm các nội dung khác thuộc thể loại: Thủ thuật máy tính

By ads_php