2016-03-04 21 views
9

Khi một người dùng đang truy cập một ứng dụng, có thể sử dụng nhiều luồng và có thể chạy song song nếu có nhiều lõi. Nếu chỉ có một bộ xử lý tồn tại, thì các luồng sẽ chạy cái khác.Đa luồng - nhiều người dùng

Khi nhiều người dùng đang truy cập một ứng dụng, các luồng được xử lý như thế nào?

+0

loại ứng dụng nào? – ArchLicher

+0

một ứng dụng web được viết bằng java, được triển khai trên máy chủ tomcat – user2296988

Trả lời

7

Tôi có thể nói từ phối cảnh Java, vì vậy câu hỏi của bạn là "khi nhiều người dùng đang truy cập vào một ứng dụng, các luồng được xử lý như thế nào?". Câu trả lời là tất cả phụ thuộc vào cách bạn lập trình nó, nếu bạn đang sử dụng một số thùng chứa web/ứng dụng, chúng cung cấp cơ chế nhóm luồng nơi bạn có thể có nhiều chủ đề cho người dùng máy chủ reuqests, Mỗi người dùng có một yêu cầu bắt đầu và lần lượt được xử lý bởi một luồng, vì vậy nếu có 10 người dùng đồng thời sẽ có 10 luồng để xử lý 10 yêu cầu cùng một lúc, bây giờ chúng ta không có IO chặn ngay bây giờ một ngày mà xử lý yêu cầu có thể được tải tới các chủ đề khác để cho phép ít hơn 10 chủ đề để xử lý 10 người dùng.

Bây giờ nếu bạn muốn biết chính xác việc lập lịch trình chuỗi được thực hiện xung quanh lõi CPU, nó lại phụ thuộc vào hệ điều hành như thế nào. Một điều phổ biến mặc dù 'thread là đơn vị phân bổ cơ bản cho CPU'. Bắt đầu với chủ đề màu xanh lá cây here và bạn sẽ hiểu nó tốt hơn.

2

Tomcat sử dụng hỗ trợ đa luồng Java để phục vụ các yêu cầu http.

Để phục vụ yêu cầu http, tomcat bắt đầu một chuỗi từ nhóm chủ đề. Hồ bơi được duy trì cho hiệu quả như việc tạo ra các sợi là tốn kém.

Tham khảo tài liệu java về đồng thời để đọc thêm https://docs.oracle.com/javase/tutorial/essential/concurrency/

Xin xem tomcat cấu hình bơi thread để biết thêm thông tin https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html

4

Bạn cần hiểu về chủ đề lên lịch. Trong thực tế, trong một lõi đơn, CPU chia thời gian của nó giữa nhiều luồng (quá trình không chính xác tuần tự). Trong một lõi nhiều, hai (hoặc nhiều) chủ đề có thể chạy đồng thời. Đọc thread article in wikipedia. Tôi khuyên bạn nên Tanenbaum's OS book.

6

Các assuption không chính xác là

Nếu chỉ có một bộ xử lý tồn tại, sau đó bài sẽ chạy cái khác.

Chủ đề đang được thực hiện tùy thuộc vào môi trường thời gian chạy như thế nào. Với java có một số định nghĩa rằng các phần nhất định của mã của bạn sẽ không gây ra đồng bộ hóa với các luồng khác và do đó sẽ không gây ra (tiềm năng) lên lịch lại các luồng.

Nói chung, hệ điều hành sẽ chịu trách nhiệm lên lịch các đơn vị thực thi. Trong những ngày trước đó hầu hết các thực thể như vậy đã được các quá trình. Bây giờ có thể bởi các quy trình và chủ đề (một số chỉ lập kế hoạch ở cấp độ thread). Để đơn giản, hãy để hệ điều hành SSume chỉ xử lý các luồng.

Hệ điều hành sau đó có thể cho phép luồng chạy cho đến khi đạt đến điểm không thể tiếp tục, ví dụ: chờ đợi một hoạt động I/O đến cpmplete. Điều này là tốt cho các chủ đề vì nó có thể sử dụng CPU cho tối đa. Điều này là xấu cho tất cả các chủ đề khác mà muốn nhận được một số chu kỳ CPU của riêng mình. (Nói chung sẽ luôn có nhiều luồng hơn CPU có sẵn. Do đó, vấn đề là độc lập với số lượng CPU.) Để cải thiện hành vi tương tác, một hệ điều hành có thể sử dụng các lát thời gian cho phép một luồng chạy trong một thời gian nhất định. Sau khi lát thời gian đã hết hạn, luồng sẽ bị gỡ bỏ khỏi CPU và hệ điều hành chọn một luồng mới để chạy (thậm chí có thể là chuỗi bị gián đoạn).

Điều này sẽ cho phép mỗi chủ đề thực hiện một số tiến trình (thêm một số phí để lên lịch). Bằng cách này, ngay cả trên một hệ thống xử lý duy nhất, chủ đề của tôi (dường như) để chạy song song. Vì vậy, đối với hệ điều hành, nó không quan trọng cho dù một tập hợp các sợi là kết quả từ một người dùng duy nhất (hoặc thậm chí từ một cuộc gọi đến một ứng dụng web) hoặc đã được tạo ra bởi một số người dùng và các cuộc gọi web.

1

Có hai điểm cần câu trả lời cho câu hỏi của bạn: Thread Scheduling & Thread Communication

Thread Scheduling thực hiện là đặc trưng cho hệ điều hành. Lập trình viên không có bất kỳ điều khiển nào trong vấn đề này ngoại trừ mức độ ưu tiên thiết lập cho một số Thread.

Thread Communication được điều khiển bởi program/programmer.

Giả sử rằng bạn có nhiều bộ xử lý và nhiều chuỗi. Nhiều luồng có thể chạy song song với nhiều bộ xử lý. Nhưng cách dữ liệu được chia sẻ và truy cập cụ thể cho chương trình.

Bạn có thể chạy chủ đề song song Hoặc bạn có thể đợi để hoàn tất quá trình thực hiện trước khi tiếp tục (join, invokeAll, CountDownLatch v.v.). Lập trình viên có toàn quyền kiểm soát quản lý vòng đời Thread.

0

Không có sự khác biệt nếu bạn có một hoặc nhiều người dùng. Chủ đề làm việc tùy thuộc vào logic của chương trình của bạn. Bộ vi xử lý chạy tất cả các luồng cho một số thời gian nhất định và sau đó chuyển sang bộ xử lý tiếp theo. Thời gian rất ngắn, vì vậy nếu không có quá nhiều luồng (hoặc các quy trình khác nhau) hoạt động, người dùng sẽ không nhận thấy nó. Nếu bộ vi xử lý sử dụng một đơn vị 20 ms, và có 1000 chủ đề, sau đó mỗi thread sẽ phải chờ hai giây cho lượt tiếp theo của nó. May mắn thay, các bộ xử lý hiện tại, thậm chí chỉ với một lõi, có hai đơn vị xử lý có thể được sử dụng cho các luồng song song.

0

Trong triển khai "cổ điển", tất cả các yêu cầu web đến cùng một cổng đều được dịch vụ đầu tiên bởi cùng một chuỗi. Tuy nhiên ngay sau khi nhận được yêu cầu (Socket.accept trả về), hầu như tất cả các máy chủ sẽ ngay lập tức nĩa hoặc sử dụng lại một luồng khác để hoàn thành yêu cầu. Một số máy chủ người dùng chuyên dụng duy nhất và cũng có một số máy chủ thế hệ tiếp theo nâng cao như Netty có thể không.

Cách tiếp cận đơn giản (và phổ biến) là chọn hoặc sử dụng lại một chuỗi mới cho toàn bộ thời lượng của yêu cầu web đơn (GET, POST, v.v.). Sau khi yêu cầu đã được phân phát, chuỗi có thể sẽ được sử dụng lại cho một yêu cầu khác có thể thuộc về cùng một người dùng hoặc người dùng khác.

Tuy nhiên, hoàn toàn có thể viết mã tùy chỉnh cho máy chủ liên kết và sau đó sử dụng lại chuỗi cụ thể cho yêu cầu web của người dùng đã đăng nhập hoặc địa chỉ IP. Điều này có thể khó mở rộng. Tôi nghĩ các máy chủ đơn giản tiêu chuẩn như Tomcat thường không làm điều này.

Các vấn đề liên quan