2010-04-07 40 views
11

Làm thế nào để bạn biết trình lập lịch trình chuỗi trong linux để không làm gián đoạn luồng của bạn vì bất kỳ lý do gì? Tôi đang lập trình ở chế độ người dùng. Chỉ đơn giản là khóa một mutex acomplish này? Tôi muốn ngăn chặn các chủ đề khác trong quá trình của tôi không được lên kế hoạch khi một chức năng nhất định đang thực hiện. Họ sẽ chặn và tôi sẽ lãng phí các chu kỳ CPU với các công tắc ngữ cảnh. Tôi muốn bất kỳ thread thực hiện chức năng để có thể hoàn thành thực thi mà không bị gián đoạn ngay cả khi các chủ đề 'timeslice được vượt quá.ngăn chặn thread linux bị gián đoạn bởi scheduler

+0

Xin cảm ơn tất cả các nhận xét. Tôi nghĩ tôi đã học được câu trả lời, đó là KHÔNG. Lý do tôi hỏi là: Ứng dụng của chúng tôi dành nhiều thời gian trong trạng thái chờ IO vì ứng dụng này truy cập 500 GB giá trị của các tệp dữ liệu thay đổi theo giờ. Tôi muốn sử dụng rất nhiều chủ đề để thực hiện song song IO (có các filers có thể xử lý nó ... họ đã xử lý IO từ 3200 trường hợp của ứng dụng và điều này không phải là để xử lý công việc nhiều hơn, nhưng để rút ngắn thời gian tường). Hộp của chúng tôi là tất cả MP với 8-64 "CPU" đếm lõi thực tế và siêu phân luồng ... vì vậy tôi có thể có rất nhiều chủ đề chạy đồng thời. – johnnycrash

+0

Parallell IO thường làm giảm hiệu suất, nó có thể khá đáng kể. Một ổ đĩa không thể làm công cụ song song (ngoài một điểm nhất định tùy thuộc vào thiết lập đột kích của bạn). Nếu bạn muốn tối đa hóa hiệu năng, bạn sẽ muốn một số luồng IO cho ăn (càng lớn càng tốt) dữ liệu đến/từ các chuỗi công nhân. – leeeroy

+0

Nhìn vào aio.h. Đầu ra không đồng bộ @leeeroy Parallell IO có thể là một thắng lợi vì nó cho phép bộ lập lịch khối thiết bị thực sự có những thứ để lên lịch và sử dụng tốt hơn các lần quét của đầu đọc/ghi đĩa. Ổ đĩa Plus có bộ nhớ cache riêng và lập lịch biểu riêng. Dù bằng cách nào, AIO cũng sẽ nhận được lợi ích đó. – nategoose

Trả lời

8

Làm thế nào để bạn biết trình lập lịch trình chuỗi trong linux để không làm gián đoạn chuỗi của bạn vì bất kỳ lý do gì?

Không thể thực hiện được, bạn cần một hệ thống thời gian thực cho điều đó. Điều đóng bạn sẽ nhận được với linux là để đặt chính sách lập lịch biểu thành lập lịch thời gian thực, ví dụ: SCHED_FIFO và cũng đặt thuộc tính PTHREAD_EXPLICIT_SCHED. Xem ví dụ here, ngay cả bây giờ, ví dụ: xử lý irq và các công cụ khác sẽ làm gián đoạn chuỗi của bạn và chạy.

Tuy nhiên, nếu bạn chỉ quan tâm đến các chủ đề trong quá trình của riêng bạn không thể làm bất cứ điều gì, sau đó có, có họ chặn trên một mutex giữ thread chạy của bạn là đủ.

Phần khó khăn là phối hợp tất cả các chủ đề khác để lấy mutex bất cứ khi nào chủ đề của bạn cần làm điều đó.

+0

cơ bản là một chuỗi các chuỗi công việc và một hàng đợi công việc. Ngay bây giờ tôi đã gần như không có khóa kể từ khi tôi chuẩn bị công việc và sau đó cháy các chủ đề. Đối với giai đoạn 2, tôi muốn tăng tính song song bằng cách thêm các chuỗi công việc vào hàng đợi khi chúng đi. Để làm điều này, các chủ đề phải kiểm tra một kho dữ liệu chung để xem dữ liệu có tồn tại hay không. Dữ liệu không tồn tại = công việc cho hàng đợi. Đây là chức năng kiểm tra kho dữ liệu chung mà tôi sợ sẽ được truy cập rất nhiều. Tôi nghĩ rằng tôi chỉ cần thực hiện một phần mà hoàn toàn yêu cầu khóa thêm nhỏ với một viết lại. – johnnycrash

+0

Tôi đã sử dụng http://asgaard.homelinux.org/svn/threadqueue/ này để làm những việc tương tự. Bạn bắn ra không. của các chuỗi công việc mà bạn muốn, và cho chúng hoạt động thông qua threadqueue, nó khóa và đợi cho đến khi có dữ liệu được thêm vào hàng đợi.nếu bạn không có nhiều chuỗi công nhân hơn bạn có lõi, sự tranh chấp giữa chúng phải là tối thiểu. – nos

1

Bạn không thể. Nếu bạn có thể những gì sẽ ngăn chặn thread của bạn từ không bao giờ phát hành yêu cầu và đói các chủ đề khác.

Điều tốt nhất bạn có thể làm là đặt ưu tiên cho chủ đề để trình lên lịch sẽ ưu tiên hơn các chuỗi ưu tiên thấp hơn.

+0

Dang. Ưu tiên chủ đề là một vấn đề trừ khi tôi có thể thay đổi nó khi tôi nhập hàm và sau đó thấp hơn khi tôi thoát. Ngoài ra, những gì sẽ có chi phí về chu kỳ. Các chủ đề công nhân là những người tôi lo lắng và sẽ có rất nhiều người trong số họ. – johnnycrash

1

Tại sao không chỉ đơn giản là để cho các chuỗi chủ đề cạnh tranh, sau đó lịch trình sẽ không có gì còn lại để lên lịch nhưng chủ đề sống của bạn? Tại sao phức tạp thiết kế thứ hai đoán lịch trình?

+0

Vâng tôi đã nghĩ rằng nếu thread A bị khóa một nguồn lực vào cuối threadl của timeslice sau đó nó có thể được preempted. Trình lên lịch sau đó sẽ quay vòng qua tất cả các chuỗi công việc khác, cho phép nói là có 50. Vì chức năng này rất có khả năng bị tấn công, mỗi trong số 50 luồng có thể thực thi trong một thời gian ngắn, sau đó chặn. Vì vậy, tôi hình tôi chỉ có 50 thiết bị chuyển mạch ngữ cảnh vì bộ lập lịch trước. Không cần lãng phí. – johnnycrash

2

Bạn nên kiến ​​trúc cho chữ cái sw của mình để bạn không phụ thuộc vào trình lên lịch làm điều "đúng" từ quan điểm của ứng dụng của bạn. Trình lên lịch phức tạp. Nó sẽ làm những gì nó nghĩ là tốt nhất.

Công tắc ngữ cảnh có giá rẻ. Bạn nói

Tôi sẽ lãng phí các chu kỳ CPU với các công tắc ngữ cảnh.

nhưng bạn không nên nhìn theo cách đó. Sử dụng máy móc đa luồng của mutex và các quy trình bị chặn/chờ. Máy móc có sẵn để bạn sử dụng ...

+0

Vâng, tôi đồng ý. Tôi không muốn phát minh lại bánh xe. Tôi chỉ muốn biết cách sử dụng bánh xe đến mức tối đa. Tôi đọc ở đâu đó rằng một mutex có thể bị khóa và mở khóa theo thứ tự hàng ngàn lần một giây. Thats quá chậm cho những gì tôi cần. Bạn đúng về kiến ​​trúc sư. Thật không may tôi có 20 năm mã cũ, vì vậy kế hoạch đầu tiên của tôi là để thử một cái gì đó mà làm việc với những thay đổi tối thiểu. Do đó câu hỏi về việc mua trước. Ngoài ra, nó sử dụng memmap rất nhiều. Tôi đoán là memmap gọi malloc tại 4k khối. Tôi có thể có 64 bản ghi nhớ đồng thời diễn ra tất cả đều muốn 50 lần mỗi lần. – johnnycrash

+0

Vâng, mmap không gọi malloc, nó sẽ lỗi trong các trang bộ nhớ trong hạt nhân. Ngoài ra, có bao nhiêu nghìn/giây là quá chậm? Khóa/mở khóa một mutex không có tranh chấp có thể được thực hiện theo thứ tự của nhiều triệu/giây, khi có tranh chấp và chủ đề phải chặn, nó được mặc dù chậm hơn. – nos

+0

@Larry K Bạn có thể vui lòng cung cấp hỗ trợ cho tuyên bố "thiết bị chuyển ngữ cảnh có giá rẻ" không? – Bacon

1

Nhìn vào lịch trình thời gian thực trong Linux. Tôi đã không bao giờ làm điều đó, nhưng nếu bạn thực sự làm CẦN này này là gần như bạn có thể nhận được trong mã ứng dụng người dùng.

Những gì bạn có vẻ sợ hãi thực sự không phải là một vấn đề lớn. Bạn không thể ngăn chặn hạt nhân làm gián đoạn chương trình của bạn để thực sự bị gián đoạn hoặc nhiệm vụ ưu tiên cao hơn, nhưng với lịch trình thường xuyên, hạt nhân sử dụng giá trị ưu tiên được tính toán của chính nó. Nếu luồng A đang nắm giữ tài nguyên X độc quyền (X có thể là khóa) và luồng B đang đợi trên tài nguyên X để có sẵn thì ưu tiên hiệu quả của A sẽ ít nhất là mức ưu tiên của B. Nó cũng đưa vào tài khoản nếu một quá trình sử dụng rất nhiều CPU hoặc nếu nó dành nhiều thời gian ngủ để tính toán mức độ ưu tiên. Tất nhiên, giá trị tốt đẹp cũng có trong đó.

+0

Cảm ơn. Tôi không lo lắng về hạt nhân preempting tôi, chỉ là chủ đề khác trong quá trình của tôi. Vì vậy, những loại ngắt sẽ là ok. Một gián đoạn để cho một thread trong quá trình chạy của tôi là những gì tôi đang lo lắng về. – johnnycrash

+0

Những từ bạn đang sử dụng dường như không khớp với những gì bạn muốn, và tôi không chắc chắn rằng những gì bạn muốn là những gì bạn thực sự muốn. Bạn có thể muốn hợp tác đa luồng hoặc bạn có thể muốn cái gì khác. Bạn có nghĩa là trong khi luồng A giữ khóa X thì không có chuỗi nào khác muốn khóa X có thể thực thi được, bởi vì đó là điều mà tất cả những thứ đồng bộ hóa luồng đều có. Bạn chỉ cần thiết kế mã của mình một cách chính xác; gọi và giải phóng ổ khóa vào đúng thời điểm/địa điểm. Nếu bạn có nghĩa là khi luồng A giữ khóa X thì không có luồng nào khác có thể thực hiện được, bạn nên xem xét SIGSTOP – nategoose

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