2012-01-10 61 views
7

Học kỳ này tôi là một NVHTGV của khóa học hệ điều hành. Vì vậy, tôi được yêu cầu thiết kế một bài tập lập trình đa luồng cho sinh viên đại học CS với các kỹ năng lập trình C giới hạnThiết kế bài tập cho lập trình đa luồng

Đây không phải là bài tập lớn vì chỉ mất 5% điểm cuối cùng. Và điều này sẽ là một cái gì đó mới mẻ vì vậy sinh viên không thể tải xuống một số mã từ Internet.

Đây là những gì tôi đang suy nghĩ, một đơn giản hàng đợi Message Queue.

Chúng tôi sẽ cung cấp cho sinh viên một máy chủ MQ rất giả, chỉ có một chủ đề và chỉ chấp nhận 2 kết nối máy khách, người đọc và người viết. Nhà văn định kỳ gửi tin nhắn đến hàng đợi, tức là máy chủ và người đọc đọc tin nhắn từ hàng đợi, tức là máy chủ gửi thông báo tới người đọc. Chúng tôi cũng sẽ cung cấp cho người đọc và người viết.

Sau đó, chúng tôi yêu cầu học sinh sửa đổi máy chủ để chấp nhận nhiều người đọc và nhà văn cùng một lúc . Và chúng tôi cũng sẽ yêu cầu chủ đề an toàn . Nói cách khác, một tin nhắn chỉ nên được gửi một độc giả, và không có thông điệp nào bị mất trong hàng đợi, yêu cầu sử dụng mutex.

Tôi cảm thấy rằng nó có thể quá đơn giản nhưng tôi không thể nghĩ ra bất cứ điều gì khác vào lúc này. Nếu bạn ở vị trí của tôi, bạn sẽ giao nhiệm vụ gì?

+0

Tôi đã tham gia lớp hệ điều hành, cách đây không lâu. Họ đã mô hình hóa chương trình giảng dạy của lớp học hệ điều hành pintos stanford.Điều này có lẽ là quá lớn của một sự thay đổi từ những gì bạn đang có kế hoạch, nhưng có lẽ bạn nên xem xét nó cho năm tới. http://www.stanford.edu/class/cs140/projects/pintos/pintos_2.html Chỉnh sửa: Nhân tiện, đây là lớp học yêu thích của tôi trong toàn bộ khóa học chính của CS cho đến nay. Tôi cảm thấy như tôi thực sự đã đạt được một sự hiểu biết về kiến ​​trúc hệ điều hành cơ bản. –

Trả lời

0

Bạn đang sử dụng Unix? Không phải là nó quan trọng, bạn có thể sử dụng Windows cho điều này là tốt.

Đơn giản, hãy tạo một đường ống có tên.

Sau đó tạo 4 chuỗi.

1 chuỗi điều khiển, 1 chuỗi người tiêu dùng (người đọc) và 2 chuỗi nhà sản xuất (người viết).

Các nhà sản xuất chỉ cần gửi một chuỗi đến đường ống và người tiêu dùng lấy chuỗi, viết hoa nó hoặc thứ gì đó và in ra.

Chuỗi điều khiển được sử dụng để bắt đầu và dừng 3 chuỗi khác. Nó có các lệnh đơn giản: startProducer1, startProducer2, startConsumer, stop commands và lệnh shutdown.

Điều này cho thấy các chủ đề khác nhau tất cả đều hoạt động độc lập, nhưng đồng thời được kiểm soát bởi chủ (biết khi nào tắt máy, v.v.).

Điểm thưởng nếu bạn có thể bọc này là GUI đơn giản hoặc thậm chí một số màn hình video Ncurses đơn giản để màn hình điều khiển luôn có khả năng hiển thị để chấp nhận lệnh và hiển thị kết quả.

Bạn có thể hiển thị nếu bạn bắt đầu 1 nhà sản xuất nhưng không có người tiêu dùng, cách chuỗi sẽ chặn. Cùng với cả hai nhà sản xuất, hoặc làm thế nào người tiêu dùng khối không có nhà sản xuất.

Sử dụng đường ống có nghĩa là bạn không phải dựa vào chương trình bên ngoài đó (và tất cả chi tiết thiết lập, gỡ lỗi cấu hình và hỗ trợ nó).

Cả Unix và Windows đều đặt tên đường ống (nhưng các cuộc gọi hệ thống tôi nghĩ khác nhau, nhưng tính di động POSIX có thể chỉ hoạt động ở đây ...).

0

bạn có thể có Trình quản lý nhóm kết nối ở giai đoạn nguyên thủy chỉ tạo một nhóm kết nối và có thể sử dụng và tái sử dụng một đối tượng kết nối một cách đáng tin cậy. Thứ hai, bạn có thể có một httpclient có thể thực hiện nhiều yêu cầu GET (như khác sẽ làm cho nó quá phức tạp), và bạn sẽ có thể xác minh tất cả các phản ứng tương ứng với mỗi yêu cầu (cũng có thể làm cho nó để hủy bỏ yêu cầu).

Thứ ba đơn giản nhất là viết một ổ cắm máy chủ đơn giản có thể chấp nhận từng yêu cầu khác nhau và gán nó cho chuỗi máy chủ mới nhận được yêu cầu và trả về phản hồi.

đó là những gì tôi có thể nghĩ ra ..

0

Lợi ích của các vấn đề kinh điển như Dining Philosphers là bế tắc và đói rất dễ để chứng minh mà không nhận được sâu vào chi tiết thực hiện.

Nếu bạn thực sự cần một cái gì đó nguyên bản, hãy thử chọn một dự án nơi dễ dàng thấy trước những cạm bẫy đồng thời. Bằng cách này, sinh viên có khả năng chạy vào họ và nhận được nhiều hơn từ nhiệm vụ. Nếu không, hãy cải cách một trong những vấn đề kinh điển, do đó nó đủ khác với các giải pháp internet hiện có nhưng vẫn giữ nguyên bản chất.

0

Tôi sẽ bị cám dỗ yêu cầu học sinh cung cấp máy trạng thái luồng để truy cập các phần quan trọng, ví dụ, với cánh tay robot.

ví dụ: chủ đề cánh tay robot sẽ chứa các phương thức công cộng như “MoveArm (vị trí kép)” và “StopArm()”, v.v. tất cả đều gửi tín hiệu đến hàng đợi tín hiệu của cánh tay robot. Các chủ đề cánh tay robot sẽ theo dõi hàng đợi và kéo các tín hiệu ra một lúc và hành động phù hợp, để lại các yêu cầu khác xếp hàng đợi cho chuỗi chuyển tiếp trạng thái tiếp theo. Điều này có nghĩa không?

Điều này chứng tỏ làm thế nào để nối tiếp truy cập đến không chỉ các phần quan trọng, mà là chuỗi hành động quan trọng.

Ví dụ: MoveArm gọi từ thread 1 (ví dụ như giao diện người dùng) sẽ được đăng tải trên hàng đợi tín hiệu cánh tay robot, và một khi các chủ đề cánh tay robot dò tìm tín hiệu trong chủ đề của riêng mình, sẽ di chuyển qua các trạng thái sau đây từ readyState:

  1. StartingToMoveArmState
  2. MovingArmState (ở đây chúng ta có thể lắng nghe các tín hiệu StopArm (ví dụ như nếu chúng ta phải e-dừng lại, vv)
  3. readyState (một lần di chuyển đầy đủ).

chủ đề 2 có thể trong khi thread cánh tay robot được chế biến chủ đề 1 yêu cầu di chuyển cánh tay, hãy gọi StopArm() - và điều này sẽ được xử lý trong MovingArmState. Ngoài ra, thread 2 có thể yêu cầu cánh tay di chuyển ở nơi khác, nhưng chuỗi cánh tay robot sẽ không phục vụ nó cho đến khi nó trở lại trong ReadyState. I E. ReadyState sẽ chỉ bỏ hàng đợi tín hiệu tiếp theo để di chuyển.

Vì vậy, hàng đợi tín hiệu cần phải là luồng an toàn và bị khóa bất cứ khi nào chuỗi 1 hoặc 2 thêm tín hiệu vào đó. Ngoài ra, hàng đợi tín hiệu cần phải đặt chuỗi cánh tay robot để bỏ chặn để sau đó nó có thể kiểm tra tín hiệu này và hành động tương ứng (sử dụng ví dụ: sự kiện đặt lại thủ công).

Hy vọng điều này có thể hữu ích!

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