Đồng tiền trong Python - Chủ đề

Nói chung, như chúng ta biết rằng chỉ là một sợi dây xoắn rất mảnh thường bằng vải bông hoặc vải lụa và được sử dụng để may quần áo và những thứ như vậy. Cụm từ tương tự cũng được sử dụng trong thế giới lập trình máy tính. Bây giờ, chúng ta liên hệ sợi chỉ dùng để may quần áo và sợi dùng để lập trình máy tính như thế nào? Các vai trò được thực hiện bởi hai luồng tương tự ở đây. Trong quần áo, chỉ giữ vải với nhau và ở mặt khác, trong lập trình máy tính, chỉ giữ chương trình máy tính và cho phép chương trình thực hiện các hành động tuần tự hoặc nhiều hành động cùng một lúc.

Threadlà đơn vị thực thi nhỏ nhất trong hệ điều hành. Bản thân nó không phải là một chương trình mà chạy trong một chương trình. Nói cách khác, các luồng không độc lập với nhau và chia sẻ phần mã, phần dữ liệu, v.v. với các luồng khác. Các luồng này còn được gọi là các quy trình nhẹ.

Kỳ của chủ đề

Để hiểu sâu về chức năng của các luồng, chúng ta cần tìm hiểu về vòng đời của các luồng hoặc các trạng thái khác nhau của luồng. Thông thường, một luồng có thể tồn tại ở năm trạng thái riêng biệt. Các trạng thái khác nhau được hiển thị bên dưới -

Chủ đề mới

Một luồng mới bắt đầu vòng đời của nó ở trạng thái mới. Tuy nhiên, ở giai đoạn này, nó vẫn chưa bắt đầu và nó chưa được phân bổ bất kỳ tài nguyên nào. Chúng ta có thể nói rằng nó chỉ là một thể hiện của một đối tượng.

Runnable

Khi luồng mới sinh được bắt đầu, luồng trở nên có thể chạy được tức là đang chờ chạy. Ở trạng thái này, nó có tất cả các tài nguyên nhưng trình lập lịch tác vụ vẫn chưa lập lịch để nó chạy.

Đang chạy

Ở trạng thái này, luồng tạo tiến trình và thực hiện tác vụ, tác vụ đã được bộ lập lịch tác vụ chọn để chạy. Bây giờ, luồng có thể chuyển sang trạng thái chết hoặc trạng thái không thể chạy / chờ.

Không chạy / đang chờ

Ở trạng thái này, luồng bị tạm dừng vì nó đang chờ phản hồi của một số yêu cầu I / O hoặc chờ hoàn thành việc thực thi luồng khác.

Đã chết

Một luồng có thể chạy đi vào trạng thái kết thúc khi nó hoàn thành nhiệm vụ của mình hoặc kết thúc bằng cách khác.

Sơ đồ sau đây cho thấy toàn bộ vòng đời của một luồng:

Các loại chủ đề

Trong phần này, chúng ta sẽ thấy các loại ren khác nhau. Các loại được mô tả bên dưới -

Chủ đề cấp độ người dùng

Đây là những chủ đề do người dùng quản lý.

Trong trường hợp này, nhân quản lý luồng không biết về sự tồn tại của các luồng. Thư viện luồng chứa mã để tạo và hủy luồng, để truyền thông điệp và dữ liệu giữa các luồng, để lập lịch thực thi luồng và để lưu và khôi phục ngữ cảnh luồng. Ứng dụng bắt đầu với một luồng duy nhất.

Các ví dụ về chủ đề cấp người dùng là:

  • Chủ đề Java
  • Chuỗi POSIX

Ưu điểm của Chủ đề cấp độ người dùng

Sau đây là những ưu điểm khác nhau của luồng cấp người dùng:

  • Chuyển đổi luồng không yêu cầu đặc quyền chế độ Kernel.
  • Chủ đề cấp người dùng có thể chạy trên bất kỳ hệ điều hành nào.
  • Lập lịch có thể là ứng dụng cụ thể trong luồng cấp người dùng.
  • Chủ đề cấp độ người dùng được tạo và quản lý nhanh chóng.

Nhược điểm của Chủ đề cấp độ người dùng

Sau đây là những nhược điểm khác nhau của các luồng cấp người dùng:

  • Trong một hệ điều hành điển hình, hầu hết các cuộc gọi hệ thống đều bị chặn.
  • Ứng dụng đa luồng không thể tận dụng đa xử lý.

Chủ đề cấp nhân

Các luồng do hệ điều hành quản lý hoạt động trên kernel, là lõi của hệ điều hành.

Trong trường hợp này, Kernel thực hiện quản lý luồng. Không có mã quản lý luồng trong khu vực ứng dụng. Các luồng nhân được hỗ trợ trực tiếp bởi hệ điều hành. Bất kỳ ứng dụng nào cũng có thể được lập trình để chạy đa luồng. Tất cả các chuỗi trong một ứng dụng được hỗ trợ trong một quy trình duy nhất.

Kernel duy trì thông tin ngữ cảnh cho toàn bộ quá trình và cho các luồng riêng lẻ trong quá trình. Lập lịch bởi Kernel được thực hiện trên cơ sở luồng. Kernel thực hiện tạo luồng, lập lịch và quản lý trong không gian Kernel. Các luồng nhân thường chậm tạo và quản lý hơn các luồng người dùng. Các ví dụ về luồng cấp nhân là Windows, Solaris.

Ưu điểm của luồng cấp nhân

Sau đây là những ưu điểm khác nhau của luồng cấp nhân:

  • Kernel có thể lập lịch đồng thời nhiều luồng từ cùng một tiến trình trên nhiều tiến trình.

  • Nếu một luồng trong một tiến trình bị chặn, Kernel có thể lên lịch cho một luồng khác của cùng một tiến trình.

  • Bản thân các quy trình hạt nhân có thể được đa luồng.

Nhược điểm của luồng cấp nhân

  • Các luồng nhân thường chậm tạo và quản lý hơn các luồng người dùng.

  • Việc chuyển quyền điều khiển từ luồng này sang luồng khác trong cùng một quy trình yêu cầu chuyển chế độ sang Kernel.

Khối điều khiển luồng - TCB

Khối điều khiển luồng (TCB) có thể được định nghĩa là cấu trúc dữ liệu trong nhân của hệ điều hành chủ yếu chứa thông tin về luồng. Thông tin cụ thể về chủ đề được lưu trữ trong TCB sẽ nêu bật một số thông tin quan trọng về mỗi quy trình.

Hãy xem xét các điểm sau liên quan đến các chủ đề có trong TCB:

  • Thread identification - Nó là id luồng duy nhất (tid) được gán cho mọi luồng mới.

  • Thread state - Nó chứa thông tin liên quan đến trạng thái (Đang chạy, Chạy được, Không chạy, Đã chết) của luồng.

  • Program Counter (PC) - Nó trỏ đến lệnh chương trình hiện tại của luồng.

  • Register set - Nó chứa các giá trị thanh ghi của luồng được gán cho chúng để tính toán.

  • Stack Pointer- Nó trỏ đến ngăn xếp của luồng trong tiến trình. Nó chứa các biến cục bộ trong phạm vi của luồng.

  • Pointer to PCB - Nó chứa con trỏ đến tiến trình đã tạo luồng đó.

Mối quan hệ giữa quy trình và luồng

Trong đa luồng, quy trình và luồng là hai thuật ngữ có liên quan chặt chẽ với nhau, có cùng mục tiêu là giúp máy tính có thể làm nhiều việc cùng một lúc. Một tiến trình có thể chứa một hoặc nhiều luồng nhưng ngược lại, luồng không thể chứa một tiến trình. Tuy nhiên, cả hai vẫn là hai đơn vị thực thi cơ bản. Một chương trình, thực hiện một loạt các lệnh, bắt đầu quá trình và phân luồng cả hai.

Bảng sau đây cho thấy sự so sánh giữa quy trình và luồng:

Quá trình Chủ đề
Quá trình có trọng lượng lớn hoặc sử dụng nhiều tài nguyên. Thread nhẹ, chiếm ít tài nguyên hơn một quy trình.
Quá trình chuyển đổi cần tương tác với hệ điều hành. Chuyển đổi luồng không cần phải tương tác với hệ điều hành.
Trong nhiều môi trường xử lý, mỗi tiến trình thực thi cùng một mã nhưng có bộ nhớ và tài nguyên tệp riêng. Tất cả các luồng có thể chia sẻ cùng một tập hợp các tệp đang mở, các quy trình con.
Nếu một quá trình bị chặn, thì không quá trình nào khác có thể thực thi cho đến khi quá trình đầu tiên được bỏ chặn. Trong khi một luồng bị chặn và đang chờ, một luồng thứ hai trong cùng một tác vụ có thể chạy.
Nhiều quy trình mà không sử dụng luồng sử dụng nhiều tài nguyên hơn. Nhiều quy trình phân luồng sử dụng ít tài nguyên hơn.
Trong nhiều quy trình, mỗi quy trình hoạt động độc lập với các quy trình khác. Một luồng có thể đọc, ghi hoặc thay đổi dữ liệu của luồng khác.
Nếu có bất kỳ thay đổi nào trong quy trình mẹ thì nó không ảnh hưởng đến các quy trình con. Nếu có bất kỳ thay đổi nào trong luồng chính thì nó có thể ảnh hưởng đến hoạt động của các luồng khác trong quá trình đó.
Để giao tiếp với các quy trình anh em, các quy trình phải sử dụng giao tiếp giữa các quy trình. Các luồng có thể giao tiếp trực tiếp với các luồng khác của quá trình đó.

Khái niệm về đa luồng

Như chúng ta đã thảo luận trước đó rằng Đa luồng là khả năng CPU quản lý việc sử dụng hệ điều hành bằng cách thực thi nhiều luồng đồng thời. Ý tưởng chính của đa luồng là đạt được sự song song bằng cách chia một quy trình thành nhiều luồng. Nói một cách đơn giản hơn, chúng ta có thể nói rằng đa luồng là cách để đạt được đa nhiệm bằng cách sử dụng khái niệm luồng.

Khái niệm đa luồng có thể được hiểu với sự trợ giúp của ví dụ sau.

Thí dụ

Giả sử chúng ta đang chạy một tiến trình. Quá trình này có thể là để mở MS word để viết một cái gì đó. Trong quá trình này, một luồng sẽ được chỉ định để mở MS word và một luồng khác sẽ được yêu cầu để viết. Bây giờ, giả sử nếu chúng ta muốn chỉnh sửa một cái gì đó thì một luồng khác sẽ được yêu cầu để thực hiện tác vụ chỉnh sửa, v.v.

Sơ đồ sau đây giúp chúng ta hiểu cách nhiều luồng tồn tại trong bộ nhớ -

Chúng ta có thể thấy trong sơ đồ trên rằng có thể tồn tại nhiều hơn một luồng trong một tiến trình mà mỗi luồng chứa tập đăng ký và các biến cục bộ của riêng nó. Ngoài ra, tất cả các luồng trong một quy trình đều chia sẻ các biến toàn cục.

Ưu điểm của Đa luồng

Bây giờ chúng ta hãy xem một vài lợi thế của đa luồng. Những ưu điểm như sau:

  • Speed of communication - Đa luồng cải thiện tốc độ tính toán vì mỗi lõi hoặc bộ xử lý xử lý đồng thời các luồng riêng biệt.

  • Program remains responsive - Nó cho phép một chương trình duy trì phản hồi vì một luồng đợi đầu vào và luồng khác chạy GUI cùng một lúc.

  • Access to global variables - Trong đa luồng, tất cả các luồng của một quá trình cụ thể có thể truy cập các biến toàn cục và nếu có bất kỳ thay đổi nào trong biến toàn cục thì nó cũng hiển thị cho các luồng khác.

  • Utilization of resources - Chạy một số luồng trong mỗi chương trình giúp sử dụng CPU tốt hơn và thời gian nhàn rỗi của CPU trở nên ít hơn.

  • Sharing of data - Không yêu cầu thêm dung lượng cho mỗi luồng vì các luồng trong chương trình có thể chia sẻ cùng một dữ liệu.

Nhược điểm của Đa luồng

Bây giờ chúng ta hãy xem một vài nhược điểm của đa luồng. Những bất lợi như sau:

  • Not suitable for single processor system - Đa luồng khó đạt được hiệu suất về tốc độ tính toán trên hệ thống đơn xử lý so với hiệu suất trên hệ thống đa xử lý.

  • Issue of security - Như chúng ta biết rằng tất cả các luồng trong một chương trình chia sẻ cùng một dữ liệu, do đó luôn có vấn đề về bảo mật vì bất kỳ luồng không xác định nào cũng có thể thay đổi dữ liệu.

  • Increase in complexity - Đa luồng có thể làm tăng độ phức tạp của chương trình và việc gỡ lỗi trở nên khó khăn.

  • Lead to deadlock state - Đa luồng có thể dẫn chương trình đến nguy cơ tiềm ẩn đạt được trạng thái bế tắc.

  • Synchronization required- Cần có sự đồng bộ để tránh loại trừ lẫn nhau. Điều này dẫn đến việc sử dụng nhiều bộ nhớ và CPU hơn.