We have a queue organized with a table on MS Sql Server 2014:

    CREATE TABLE [queue].[Messages](
    	[Id] [bigint] IDENTITY(1,1) NOT NULL,
    	[Status] [tinyint] NOT NULL,
    	[Data] [nvarchar](max) NOT NULL,
        [CreationDateUtc] [datetime] NOT NULL
    )

    CREATE NONCLUSTERED INDEX [IX_Messages_Status] ON [queue].[Messages]
    ([Status] ASC)

And a stored procedure to receive messages:

    ALTER PROCEDURE [queue].[ReceiveMessage]
    AS
    BEGIN
        SET NOCOUNT ON;
    
        UPDATE TOP (1) m 
        SET
    	   m.Status = 2,
    	   m.StartDateUtc = GETUTCDATE()
        OUTPUT
    	   INSERTED.*
        FROM [queue].[Messages] m WITH (UPDLOCK, READPAST)
        WHERE m.Status = 1
    END

This stored procedure executes every second to check new messages in queue.
So, very often we get blocks (PAGELATCH_EX) on this query even queue is empty:
[![enter image description here][1]][1]

First idea was - diff-backups, but they are scheduled in tifferent time:
[![enter image description here][2]][2]

Other queries don't make blocks so often.

 1. Am i right and this is because of `UPDLOCK` and `READPAST` hints?
 2. Are there other reasons?

  [1]: https://i.sstatic.net/wVxks.png
  [2]: https://i.sstatic.net/kBLve.png