18Aug
Se você gosta de mexer com o Windows e aprender como você vai, você pode ter notado que o processo do Windows e as IDs de threads são pares e múltiplos de quatro. Por que é que? O Super-usuário Q & A publica as respostas às perguntas de um leitor curioso.
Pergunta de hoje e amp;A sessão de atendimento chega a cortesia do SuperUser - uma subdivisão do Stack Exchange, um agrupamento comunitário de sites Q & A.
O questionário
SuperUser Peter Hahndorf quer saber por que não existem números de identificação do Números ímpares:
Existem muitas maneiras de examinar as IDs do processo no Windows. Usando o PowerShell:
Eu obtenho esse resultado:
Como você pode ver, todos os IDs de processo são pares, não só isso, são todos múltiplos de quatro. Você pode olhar o máximo que quiser e nunca encontrará uma ID de processo de número ímpar, pelo menos não em qualquer versão baseada no Windows NT.Qual é a razão para isto?
Por que não existem números de identificação do processo de números ímpares?
A Respondente
SuperUser Contribuidor DavidPostill tem a resposta para nós:
Por que não há números de identificação de números ímpares?
O mesmo código que aloca alças do kernel também é usado para alocar números de processo e threads. Uma vez que as alças do kernel são um múltiplo de quatro, são também as IDs de processos e threads.
Por que o processo e os IDs de threads são múltiplos de quatro?
Nos sistemas operacionais baseados no Windows NT, as IDs de processos e threads sempre são um múltiplo de quatro. Isso é apenas uma coincidência?
Sim, é apenas uma coincidência, e você não deve confiar nela, uma vez que não faz parte do contrato de programação. Por exemplo, o processo do Windows 95 e as IDs de threads nem sempre eram múltiplos de quatro. Em comparação, a razão pela qual as alças do kernel são sempre um múltiplo de quatro é parte da especificação e será garantida para o futuro previsível.
As IDs do processo e do segmento são múltiplos de quatro como um efeito colateral da reutilização do código. O mesmo código que aloca alças do kernel também é usado para alocar as IDs de processos e threads. Uma vez que as alças do kernel são múltiplos de quatro, também são identificações de processos e threads. Este é um detalhe de implementação, então não escreva um código que dependa dele. Estou apenas dizendo para você satisfazer sua curiosidade.
Fonte: Por que múltiplos de quatro e quatro processos?
Por que as alças do kernel são sempre um múltiplo de quatro?
Algo que não é muito conhecido é que os dois bits inferiores de alças do kernel são sempre zero;em outras palavras, seu valor numérico é sempre um múltiplo de quatro. Observe que isso aplica-se apenas às alças do kernel;não se aplica a pseudo-alças ou a qualquer outro tipo de identificador( alças USER, alças GDI, alças multimídia, etc.).As alças do Kernel são coisas que você pode passar para a função CloseHandle.
Que pelo menos o bit inferior das alças do kernel são sempre zero é implícito pela função GetQueuedCompletionStatus, o que indica que você pode definir o bit inferior do identificador do evento para suprimir a notificação da porta de conclusão. Para que isso funcione, o bit inferior deve normalmente ser zero.
Esta informação não é útil para a maioria dos escritores de aplicativos, que devem continuar a tratar alças como valores opacos. As pessoas que estariam interessadas em bits de tag são aqueles que estão implementando bibliotecas de classes de baixo nível ou estão envolvendo objetos de kernel dentro de uma estrutura maior.
Fonte: Por que as alças do kernel são sempre um múltiplo de quatro?
Leitura adicional
A velha coisa nova: Desenvolvimento prático ao longo da evolução do Windows por Raymond Chen( Engenheiro de design de software principal na Microsoft )
Tem algo a ser adicionado à explicação? Som desligado nos comentários. Deseja ler mais respostas de outros usuários Tech-savvy Stack Exchange? Confira o tópico de discussão completo aqui.