7 điểm bởi GN⁺ 2023-08-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • You’re the OS là một trò chơi nơi người chơi vào vai hệ điều hành, quản lý CPU core, process, memory page và swap space để ngăn người dùng khởi động lại máy
  • Luồng chơi cơ bản là gán các process nhàn rỗi vào CPU và gỡ các process đang hoạt động ra; những process bị bỏ mặc quá lâu sẽ đi qua các giai đoạn starvation rồi bị kết thúc
  • Càng về sau số lượng process và áp lực bộ nhớ càng tăng, buộc người chơi phải tự xử lý cả memory swapping để đưa các page trên đĩa trở lại RAM
  • Phần triển khai dựa trên Python/Pygame, đồng thời dùng pygbag để tạo bản dựng WebAssembly nhằm chạy được cả trong trình duyệt
  • Đây không phải là mô phỏng hệ điều hành chính xác, nhưng nếu nêu rõ các giả định thì vẫn có thể dùng để giải thích process scheduling và tình huống thiếu RAM

Ý tưởng về một trò chơi nơi bạn trở thành hệ điều hành

  • Trò chơi bắt đầu từ ý tưởng để người chơi trở thành hệ điều hành và quản lý CPU core, process, memory page, swap space
  • Mục tiêu là phân bổ thời gian CPU cho các process để người dùng không cảm thấy hệ thống quá chậm, đồng thời swap các memory page khi cần
  • Tác giả chọn Pygame thay vì một game engine hoàn chỉnh để phù hợp với một trò chơi 2D đơn giản
    • Một lý do khác là muốn quay lại sử dụng Python
    • Pygame có thể biên dịch sang WebAssembly thông qua pygbag, nên thuận lợi cho việc chạy trong trình duyệt
  • Thời gian phát triển là vài tuần rải rác trong vòng 8 tháng

Process scheduling và điều kiện kết thúc game

  • Cơ chế điều khiển trung tâm của game là quản lý process và CPU
    • Nhấp vào một process nhàn rỗi để gán nó vào một CPU còn trống
    • Nhấp vào một process đang hoạt động để gỡ nó khỏi CPU đó
  • Các process nhàn rỗi theo thời gian sẽ trải qua 6 mức starvation, được thể hiện bằng màu sắc và emoji
    • Nếu ở quá lâu trong giai đoạn cuối, người dùng sẽ kết thúc process đó
    • Khi 10 process bị kết thúc, người dùng sẽ khởi động lại người chơi trong vai hệ điều hành và game kết thúc
  • Để sống sót lâu hơn, mỗi process phải nhận đủ thời gian CPU trước khi đi qua toàn bộ các giai đoạn starvation

I/O và memory swapping

  • Các process đang hoạt động có thể trở thành trạng thái blocked khi chờ sự kiện I/O
    • Process blocked làm lãng phí thời gian CPU, nên tốt hơn là gỡ nó ra khỏi CPU
    • Có thể xử lý sự kiện I/O bằng cách nhấp vào nút đổi hình dạng khi sự kiện xảy ra
  • Theo thời gian, ngày càng nhiều process xuất hiện làm độ khó tăng lên
  • Từ một thời điểm nào đó, tổng lượng bộ nhớ mà tất cả process sử dụng sẽ vượt quá RAM, khiến việc swap page giữa RAM và đĩa trở nên cần thiết
    • Nếu một process đang hoạt động cố truy cập một page nằm trên đĩa, process và page đó sẽ nhấp nháy
    • Dựa vào dấu hiệu này để swap page cần thiết
  • Process đang chờ page ở trên đĩa sẽ tiếp tục ở trạng thái blocked cho đến khi page đó trở lại RAM
    • Nếu bị blocked quá lâu, nó vẫn tiếp tục đi qua các giai đoạn starvation và cuối cùng có thể bị kết thúc

Độ khó và thiết lập tùy chỉnh

  • Trò chơi có nhiều mức độ khó
  • Độ khó ảnh hưởng đến số lượng CPU, dung lượng RAM, số process tồn tại từ lúc bắt đầu, xác suất xảy ra sự kiện I/O, v.v.
  • Trong chế độ tùy chỉnh, có thể điều chỉnh riêng từng thiết lập này

Giá trị giáo dục và giới hạn

  • Trò chơi này trước hết là một trò chơi, và được thiết kế ưu tiên tính chơi được hơn là tính hiện thực
  • Có những điểm không mô tả chính xác một hệ điều hành thực tế
    • Tác giả không kỳ vọng người chơi phản ứng nhanh như máy tính thật
    • Các process sử dụng ít memory page hơn rất nhiều so với process thông thường ngoài đời thực
    • Cấu trúc để người dùng liên tục chạy vô hạn các process mới là một cơ chế gameplay nhằm tăng độ khó
  • Dù không được tạo ra cho mục đích giáo dục, nếu làm rõ rằng đây không phải mô tả chính xác thì nó vẫn có thể có giá trị trong việc giới thiệu các nguyên lý của hệ điều hành
    • Có thể dùng làm ví dụ để giải thích process schedulingmemory swapping
    • Có thể cho thấy việc có nhiều CPU core hơn có ý nghĩa gì, và điều gì xảy ra khi thiếu RAM

Biên dịch WebAssembly và triển khai

  • Việc biên dịch WebAssembly dễ hơn dự kiến nhờ tài liệu pygame-web
    • Các bước chính là cài pygbag và áp dụng những chỉnh sửa mã được nêu trong tài liệu
  • Vấn đề lớn nhất là thư viện pygame-emojis dùng để render emoji không hoạt động cùng pygbag
    • Thay vào đó, tác giả tải các tệp SVG từ OpenMoji
    • Dùng GIMP để thay đổi kích thước rồi xuất sang PNG để sử dụng
  • Bản trình duyệt về cơ bản được co giãn để khớp viewport của trình duyệt trong khi vẫn giữ cùng tỷ lệ với bản desktop
    • Nếu bản desktop dùng kích thước cửa sổ nhỏ hơn, màn hình có thể trông như bị kéo giãn
    • Vì trò chơi theo phong cách retro nên hiện tượng rỗ pixel không bị cảm nhận là quá nghiêm trọng
  • Có thể chơi game trên trình duyệt tại itch.io
  • Mã nguồn được công khai trên GitHub

1 bình luận

 
GN⁺ 2023-08-14
Ý kiến trên Hacker News
  • Một ý tưởng có thể rất hay hiện ra trong đầu là game chống phân mảnh. Về cơ bản là Tetris bố trí theo vòng tròn, trong đó các khối dữ liệu thường dùng thì đưa ra các track bên ngoài, còn các tệp cũ hoặc dạng tệp lưu trữ thì đưa vào các track bên trong để được nhiều điểm hơn
    Hồi trước tôi thích xem các công cụ chống phân mảnh dạng đồ họa di chuyển như có phép thuật, và nếu có game chống phân mảnh thì tôi thật sự muốn thử chơi

    • Wilmot's Warehouse thực chất là kiểu game như vậy
      Đây là game 2D nhìn từ trên xuống, bạn ở một mình trong một nhà kho lớn trống trải. Cứ sau một khoảng thời gian, xe tải sẽ dỡ nhiều món hàng ở phía sau, còn ở quầy phía trước thì vài người yêu cầu những món cụ thể. Việc cần làm là sắp xếp đồ trong kho sao cho có thể xử lý yêu cầu nhanh nhất có thể. Bạn có thể tổ chức theo cách phù hợp với mình, như màu sắc, chức năng, tên gọi, v.v.
      Càng chơi, xe tải càng mang đến nhiều loại đồ hơn; thường cũng có nhiều món thuộc nhiều danh mục, và các yêu cầu ngày càng phức tạp. Cuối cùng, game cho xem timelapse về việc nhà kho đã thay đổi ra sao trong suốt toàn bộ quá trình, để bạn thấy chiến lược của mình tiến hóa theo thời gian
      Game làm khá tốt và đơn giản. Thực ra tôi biết đến nó qua một trong các nhà phát triển trong phần bình luận HN
    • https://defrag.lolalabs.com/
    • Cũng có https://classic.csunplugged.org/activities/community-activit..., và https://www.itgsnews.com/the-defragmentation-game-lesson-pla... cũng đáng xem
      https://boardgamegeek.com/boardgame/376284/defrag
      https://www.defraggame.com
      Tôi nhớ trước đây từng chơi vài game cũ mô phỏng trực tiếp hơn những game này, nhưng không chắc người khác có tìm được không
    • Khi làm đồ điện tử, tôi cũng có cảm giác tương tự với đi dây và bố trí PCB
    • Tăng tiền cược lên đi: bắt dùng ổ đĩa thật làm vật hiến tế cho game
  • Như Ender's Game, sẽ rất thú vị nếu tưởng tượng những người chơi hàng đầu đang vô tình cấp phát bộ nhớ cho hạ tầng cốt lõi ở đâu đó

    • Có cảm giác giống Severance
    • “Để hoàn tất đăng ký, hãy cho chúng tôi biết trong hình này có biển báo dừng hay không. Nhanh lên, xe tự lái của chúng tôi cần nó.”
      https://xkcd.com/1897/
  • Chỉ đọc nửa câu trên website này là tôi đã hoàn toàn bị thuyết phục
    Đây là một trong những cách tốt nhất để hiểu dạng vấn đề này. “Giờ bạn là trình quản lý bộ nhớ. Chúc may mắn.”
    Ý tưởng thật sự rất hay. Có thể trang trí cho dễ thương rồi làm giống một game mô phỏng quản lý nhà hàng. Chỉ có điều nhà hàng là máy tính, còn khách là tài nguyên
    Human Resource Machine cũng xuất sắc ở khía cạnh này. Tôi nhớ có lúc đã nghĩ: “Khoan, mình vừa tạo ra một danh sách liên kết à?”

    • Human Resource Machine thật sự rất hay. Sau khi vợ tôi chơi xong game đó và phần tiếp theo, cô ấy thậm chí đã chuyển hướng sự nghiệp sang lập trình
  • Thật ra tôi nghĩ đời sống con người gần giống một dạng hệ điều hành. Mỗi ngày chúng ta sống bằng cách xử lý tác vụ, tài nguyên, nhập/xuất, lưu trữ, cache và trạng thái
    Dashboard là công cụ thiết yếu của hệ điều hành, và ở quy mô con người thì đó là những thứ như ngân hàng, việc cần làm, lịch và hộp thư đến. Vì vậy nhiều khái niệm “phát triển bản thân” có thể được chuyển dịch gọn gàng thành các best practice của hệ điều hành. Ví dụ như FIFO hoặc LIFO để quản lý phân bổ, lập kế hoạch trước để phá thế bế tắc, quản lý tính song song, và garbage collection đúng lúc

    • Tôi hơi liên tưởng đến cuốn sách đáng đọc Algorithms to Live By
      [0] https://algorithmstoliveby.com/
    • Con người thường thích ví bộ não với công nghệ
      Ví dụ, khi bánh răng còn là công nghệ tiên tiến, có những người hình dung bánh răng quay trong đầu và ví hành vi suy nghĩ với chuyển động của bánh răng. Tôi nghĩ trong truyện tranh thỉnh thoảng vẫn thấy cách biểu đạt như vậy
    • Thứ gần với cái mà chúng ta nghĩ là hệ điều hành hơn có thể là hệ thần kinh tự chủ. Nó trừu tượng hóa các hoạt động cấp thấp của phần cứng ướt
      https://en.m.wikipedia.org/wiki/Autonomic_nervous_system
    • Văn minh là một hệ điều hành phân tán! Tôi nghe điều đó từ Joscha Bach
    • Ẩn dụ hệ điều hành tương ứng với thủ dâm là gì nhỉ? Xóa cache?
  • Nhân tiện, bài này đã được đưa lên HN vào ngày 30 tháng 9 nhưng hoàn toàn không được chú ý, và người đăng cũng đã xóa bình luận của mình
    Lúc đó tôi cũng đã viết rồi: đây là một concept thật sự hay. Sẽ tốt nếu thêm các cấp độ. Ví dụ chia cấp độ thành microcontroller trong một sản phẩm thú vị, smartphone, bộ cân bằng tải hoặc API server của một công ty SaaS, v.v., để có thể giới thiệu từng khái niệm một. Như vậy sẽ thành một khóa học hệ điều hành ở trình độ đại học
    Sẽ hay nếu đưa vào một chút lập trình để tự động hóa, rồi đào sâu đến cả thuật toán cache của hệ điều hành. LRU thì tuyệt. Đây là kiểu khóa học mà lẽ ra tôi đã có thể hoàn thành trước khi tốt nghiệp trung học
    https://news.ycombinator.com/item?id=36938032

  • Ý tưởng rất hay nhưng quá khó với tôi. Ngay cả ở chế độ thường, mới bắt đầu game được 20 giây là tôi đã phải nhấp chuột điên cuồng, và dù có xoay vòng các tiến trình bị kẹt thì tiến trình đỏ vẫn cứ chất đống
    Một số tiến trình đã chết vì sự kiện nhập/xuất mãi không tới. Chế độ dễ cũng y như vậy, hoặc thậm chí có vẻ còn khó hơn. Tôi còn chưa đi tới điểm mà bộ nhớ trở thành vấn đề, và với tốc độ này thì tôi cũng chẳng muốn tới đó
    Có thể là do tôi đã có tuổi, và tôi hiểu rằng trở thành hệ điều hành thì căng thẳng, nhưng công việc của tôi vốn đã căng thẳng rồi. Tôi không muốn thêm một công việc nữa
    Nếu bắt đầu dễ hơn rồi tăng dần, nhưng với nhịp độ khoan dung hơn, chỉ ở ngay bên ngoài vùng thoải mái của tôi, thì đây có thể là một game rất thú vị

    • Tôi cũng gặp vấn đề tương tự: chờ sự kiện nhập/xuất nhưng nó mãi không tới, khiến tiến trình chết. Tất cả các tiến trình chết đều chết trong trạng thái đó. Khi chuyện này xảy ra thì dường như không có cách nào ngăn được
    • Máy tính tồn tại là để làm hộ những việc lặp đi lặp lại mà không sợ hãi mà :)
  • Những game như thế này có tương lai rất mạnh
    Các game đổi mới vượt ra ngoài phạm vi mà những game engine như Unity hay Unreal có thể cung cấp đang đi theo một hướng có khả năng thành công cao hơn so với phần lớn thứ ra mắt ngày nay, xét về mặt thiết kế
    Nếu làm một game siêu geek nằm ngoài vùng mà người dùng engine có thể chạm tới, bạn sẽ đứng ở một hạng đấu khác. Game trông có lộn xộn cũng được, miễn là vui và dùng được
    Game indie đã chết nếu hiểu theo nghĩa game indie của 5 năm trước. Giờ những thứ như thế này mới là game indie mới. GG. Nói thêm, tôi là một nhà phát triển indie thất bại đã phát hành hơn 2 tựa game thương mại
    Thật tiếc là Zachtronics đã dừng lại. Họ luôn đi trước

    • Có thể tôi đã bỏ lỡ điều gì đó, nhưng có vẻ như những game cùng kiểu đã tiếp tục được ưa chuộng suốt nhiều thập kỷ. Tôi cũng không rõ liệu khả năng thành công của chúng đã thấp hơn chưa, và cũng không chắc “bạn là hệ điều hành!” có khả năng thành công cao hơn không
      Và game này có vẻ cũng có thể làm bằng Unity
    • Không có lý do gì không thể làm thứ này bằng Unity hay Unreal. Trong giới hạn tính toán, bạn có thể làm đúng nghĩa là bất cứ thứ gì bằng các engine đó
    • Game này vượt ra ngoài phạm vi Unity có thể cung cấp ở điểm nào?
    • Còn tùy “thành công” nghĩa là gì. Nếu là có lãi, thì có lẽ không. Những game đi lệch xa khỏi luồng mà các engine tối ưu cho nhu cầu thị trường hỗ trợ có khả năng thất bại thường xuyên hơn những game nằm trong luồng đó
      Nếu nghĩa là “trở thành một cú đột phá bất ngờ, một hit làm thay đổi hướng đi của game”, thì xác suất của cả hai phía đều cực thấp, nhưng game ngoài khuôn khổ có thể có xác suất cao hơn
      Xác suất đánh home run cao hơn, nhưng xác suất bị loại cũng cao hơn, còn xác suất đánh trúng bóng an toàn thì thấp hơn
    • Tôi không rõ bạn đang nói gì. Game dành cho dân geek lúc nào cũng tồn tại, và vì quá geek nên thường không thành công lớn
      Những năm gần đây cũng có vài game geek về kỹ thuật, nhưng không có game nào đáng gọi là hit. Có lẽ bạn có thể làm game của riêng mình, nhưng tập khán giả vốn nhỏ nên trần thành công cũng bị giới hạn. Tôi cũng không nghĩ điều này sẽ thay đổi trong tương lai
      Thậm chí khả năng ngược lại còn cao hơn. Thế hệ trẻ có vẻ ít geek hơn và ngày càng xa rời các chủ đề, công nghệ cấp thấp
  • Khi game trở nên khó hơn do mức sử dụng cao, người chơi nên có thể “mua” các nâng cấp tự động hóa những tác vụ lặp nhỏ bằng token kiếm được nhờ đạt các cột mốc hoặc mục tiêu hiệu năng. Cảm giác giống Universal Paperclips
    Sau đó, game ném vào các workload bệnh hoạn cản trở tự động hóa đơn giản, buộc người dùng phải giải thủ công. Rồi người dùng mua tự động hóa tốt hơn một chút, nhưng lại bị chặn bởi workload bệnh hoạn hơn một chút. Như vậy là hoàn tất vòng lặp tiến trình của game

    • Giá mà có thể mua một bộ cấp phát bộ nhớ. Và cũng sẽ hay nếu có tùy chọn tự viết một cái
  • Chẳng mấy chốc hệ điều hành sẽ cung cấp một ngôn ngữ script để có thể tự động hóa công việc nhỉ?
    À, hiểu rồi...

    • Dùng một trình thông dịch C rồi cứ thế sao chép mã Linux sang... hoặc làm ngược lại
  • Rất tuyệt. Làm tôi nhớ tới game được đăng tuần trước. Có phải liên quan đến Defcon không? Đó là một game với các khối vuông giống block Tetris chứa opcode rơi xuống, và người dùng phải sắp xếp một chuỗi kiểu Rube Goldberg để trộn con số lớn nhất vào thanh ghi bộ nhớ “điểm số”