【问题标题】:How a 10GB movie running in limited Primary memory?10GB 电影如何在有限的主内存中运行?
【发布时间】:2014-10-01 20:08:23
【问题描述】:

据我所知,当我们运行某个程序时,存储在辅助内存(硬盘)中的进程或文件进入主内存(RAM),然后只有程序运行。我的问题是,如果电影文件大约 10 GB,而我的 RAM 为 1 GB,那么我们可以得出结论,电影文件中的所有数据都没有加载到 RAM 中,

那么它(电影文件)是如何加载到 RAM 中的?我想了解完整的 内部结构。

他们遵循什么算法来管理相同的?请帮忙。

【问题讨论】:

    标签: algorithm memory-management operating-system filesystems hardware


    【解决方案1】:

    电影播放器​​通常一次从电影文件中读取一个块。我会使用 2 个线程来处理视频,伪代码如下:

    解码线程:

    do
      read next chunk  (a chunk contains one or more frames)
      decode chunk
      add decoded frames to frame queue
      while #frames in queue > safety margin
        sleep((#frames in queue - safety margin)/framerate)
    until EOF
    End of movie
    

    显示线程:

    do
      get next frame from frame queue
      got frame?
      if yes
        display frame 
      if no
        End of movie?
          return
        else
           display the previous frame
      sleep until it is time to display the next frame
    until
    

    编辑(回应评论中的 OP:s 问题):

    如何设置安全边际?

    安全裕度的目的是避免在计算机出现负载尖峰时画面冻结(解码会占用大量处理能力)。如果电影每秒有 25 帧,将安全边距设置为 25 帧将保留 1 秒的解码帧缓冲区。我会将它设置为某个值,可能是 1/3 秒,然后根据用户反馈进行更改。它必须大于解码块所需的时间,否则电影将开始冻结,因此块大小是决定安全边际的一个因素。

    当我们暂停视频并打开另一个视频时,比如说 5 GB,内存交换是如何发生的?

    当我们暂停视频时,解码器线程将停止解码(注意我在睡眠前后将if 更改为while)。

    当我们开始一个新视频时,解码器线程关闭旧电影文件,清空帧缓冲区,然后开始解码新文件。以编程方式,我可能会让旧的解码器线程终止并为新电影文件启动一个新的解码器线程。

    【讨论】:

    • 感谢您的回复,我有一个问题,如何设置safety margin?当我们pause 视频并打开另一个视频时,比如说5 GB 内存交换是如何发生的?我很想知道(不是在编程方式上,而是在理论上)。
    猜你喜欢
    • 2011-06-18
    • 2020-04-15
    • 2018-06-26
    • 2015-04-23
    • 1970-01-01
    • 2017-11-30
    • 2022-11-14
    • 2019-01-23
    • 2012-01-18
    相关资源
    最近更新 更多