Habilidades profissionais de design de arquitetura de sistema · sistema operacional

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。
Now everything is for the future of dream weaving wings, let the dream fly in reality.

Clique para entrar no diretório de séries de artigos

Insira a descrição da imagem aqui

1. Visão geral do sistema operacional

Tipos de sistemas operacionais: sistemas operacionais em lote, de compartilhamento de tempo, de tempo real, de rede e sistemas operacionais distribuídos.

O sistema operacional tem cinco funções principais: gerenciamento de processador, gerenciamento de armazenamento, gerenciamento de dispositivos, gerenciamento de arquivos e gerenciamento de tarefas. Independentemente de qualquer tipo de sistema operacional, existe tal alocação.

A maioria dos sistemas operacionais modernos possui dois estados de funcionamento: estado central e estado do usuário. Nossos aplicativos gerais funcionam no modo de usuário, enquanto o módulo do kernel e o núcleo mais básico do sistema operacional funcionam no modo principal.

A estrutura do sistema operacional pode ser dividida em estrutura não ordenada, estrutura hierárquica, estrutura orientada a objetos, estrutura de multiprocessamento simétrica e estrutura de microkernel.

Insira a descrição da imagem aqui

2. Gestão de processos

2.1 Conceito de processo

Um processo é um processo no qual um programa é executado em uma coleta de dados.É uma unidade independente para alocação e agendamento de recursos no sistema. Consiste em três partes: bloco de programa, bloco de controle de processo (PCB) e bloco de dados.

PCB, PCB é o único sinal da existência de um processo, parte integrante do processo e uma estrutura de dados do tipo registro. O conteúdo inclui identificador de processo, status, informações de localização, informações de controle, ponteiro de fila (ligando processos no mesmo status), prioridade, zona de proteção no local, etc.

Insira a descrição da imagem aqui

Processos e Procedimentos

A diferença entre processo e programa: Um processo é um processo de execução de um programa. Sem programa não há processo.

Programa é um conceito estático, enquanto processo é um conceito dinâmico. Ele é gerado pela criação e morre devido ao cancelamento após a conclusão da tarefa; o processo é uma unidade independente do sistema para alocação de recursos e escalonamento, mas o programa não é.

Processos e Threads

Existem dois atributos básicos de um processo: uma unidade independente que pode possuir recursos e uma unidade básica que pode programar e alocar recursos de forma independente.
Geralmente, um processo contém vários threads.

2.2 Situação do processo

Diagrama de três estados : três estados: pronto, em execução e bloqueado. Quando pronto, ele aguarda a execução de um intervalo de tempo. Bloqueio significa que o processo não recebeu recursos. Quando os recursos estão disponíveis, ele atinge o estado pronto.

Diagrama de cinco estados : estado de execução, estado de prontidão ativo, estado de prontidão quiescente, estado de bloqueio ativo e estado de bloqueio quiescente. Além do estado de execução, o estado de bloqueio é dividido em bloqueio estático e bloqueio ativo, e o estado pronto também é dividido em pronto estático e pronto ativo, portanto, há cinco estados no total.
Insira a descrição da imagem aqui
O gerenciamento de processos em um determinado sistema de computador adota o modelo de três estados. O seguinte método de organização adota o método de índice. Existem 2 processos em execução, 3 processos prontos e 4 processos bloqueados.
Insira a descrição da imagem aqui

2.3 Sincronização de processos e exclusão mútua

Como distinguir sincronização e exclusão mútua?

Exclusão mútua , milhares de soldados atravessando uma ponte de tábua única, competição por recursos semelhantes

Sincronização , diferenças de velocidade, parada e espera em determinadas circunstâncias, relacionamento cooperativo entre processos

A exclusão mútua fala principalmente da relação competitiva entre recursos semelhantes

Durante a execução de um processo, pode ser necessário parar e aguardar outros processos. Isso é sincronização (haverá questões semelhantes de múltipla escolha)

Vários processos compartilham uma impressora, normalmente mutuamente exclusivos

Depois que os consumidores consomem os bens, os produtores produzem os bens antes que possam ser colocados no mercado, o que é uma relação síncrona.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

2.4 Operação fotovoltaica

P é Passeren em holandês e V é Verhoogo em holandês.

A operação fotovoltaica é um método comum para obter sincronização de processos e exclusão mútua.

A operação P significa solicitar um recurso, que é responsável pela obtenção e bloqueio do recurso. A operação V significa liberar um recurso.

As operações P e as operações V são primitivas de comunicação de baixo nível e são inseparáveis ​​durante a execução.

A operação PV consiste na primitiva de operação P e na primitiva de operação V (a primitiva é um processo ininterrupto).

O significado da operação PV: Usamos semáforos e operações PV para obter sincronização de processos e exclusão mútua.

Semáforo: É uma variável especial (global), geralmente representada por S maiúsculo.

Na maioria dos casos (sem explicação prévia), o valor inicial do semáforo S será considerado 1, e 1 representa a chamada inicial de alocação de recursos.

Para operar o semáforo, a definição específica é a seguinte:

Operação P (solicitação de alocação de recurso):

Diminua o valor do semáforo S em 1, ou seja, S = S - 1.
Se S >= 0, o processo continua a execução, caso contrário o processo entra no estado de espera.

Operação V (liberar um recurso):

Adicione 1 ao valor do semáforo S, ou seja, S = S + 1.
Se S > 0, o processo continua em execução, caso contrário, significa que existem alguns processos na fila de espera aguardando o recurso e precisam acorde e espere.
Insira a descrição da imagem aqui

2.5 Gráfico precursor

O grafo direto é um grafo acíclico direcionado, consistindo de nós e arestas direcionadas.Os nós representam as operações de cada segmento do programa, e as arestas direcionadas entre os nós representam o relacionamento predecessor entre as operações dos dois segmentos do programa. Este tipo de diagrama pode ser usado para descrever o relacionamento da sequência de execução entre vários programas ou processos.

Regras de marcação de grafo precursor: De pequeno a grande porte, todas as saídas dos nós são operações V e todas as entradas são operações P. A seta representa um semáforo S.
Insira a descrição da imagem aqui

2.5 Impasse

O gerenciamento de processos é o núcleo do sistema operacional, mas se não for projetado adequadamente, ocorrerão problemas de impasse. Se um processo estiver esperando por algo que não pode acontecer, o processo entrará em conflito. E se um ou mais processos travarem, isso causará um impasse no sistema.

Como evitar impasses: alocação sequencial de recursos (método de alocação ordenada de recursos), algoritmo do banqueiro.
Insira a descrição da imagem aqui
Cálculo de recursos de impasse

Fórmula de cálculo de impasse:

Existem m recursos compartilhados en processos. O número máximo de recursos exigidos por cada processo é w. Então somente quando m > n * (w - 1), não haverá deadlock.

​ Ou seja, m é pelo menos = n * (w - 1) + 1

Exemplo típico: O sistema possui três processos A, B e C. Cada um desses três processos requer 5 recursos do sistema. Qual é o número mínimo de recursos que um sistema possui se for impossível haver um impasse?

De acordo com a fórmula de cálculo de impasse, 3 * (5 - 1) = 12, o sistema requer pelo menos 12 + 1 = 13 recursos.

2.6 Algoritmo do Banqueiro

Os princípios do algoritmo do banqueiro para alocação de recursos:

(1) Quando a demanda máxima de recursos por um processo não ultrapassar a quantidade de recursos do sistema, o processo poderá ser admitido
(2) O processo poderá solicitar recursos parcelados, mas o número total de solicitações não poderá ultrapassar a demanda máxima
(3) Quando o sistema atualmente Quando os recursos não conseguem satisfazer a quantidade de recursos que o processo ainda necessita, a solicitação do processo pode ser adiada, mas o processo sempre pode obter os recursos dentro de um tempo limitado.

3. Gerenciamento de armazenamento

3.1 Endereço lógico e endereço físico

Endereço relativo do endereço lógico, o endereço gerado pela CPU, o endereço lógico é usado internamente e para programação, e o endereço não é único Endereço
físico Endereço absoluto, o endereço carregado no registro de endereço de memória, o endereço real do endereço da unidade de memória
realocação, o endereço no programa O processo de conversão de um endereço virtual (endereço lógico) em um endereço real (endereço físico) de memória

3.2 Tipo

O principal objetivo do gerenciamento de armazenamento é resolver o problema de vários usuários usando a memória principal.Suas soluções de gerenciamento de armazenamento incluem principalmente gerenciamento de armazenamento de partição, gerenciamento de armazenamento de paginação, gerenciamento de armazenamento segmentado, gerenciamento de armazenamento de página segmentado e gerenciamento de armazenamento virtual.

Gerenciamento de armazenamento de partição:

Gerenciamento de armazenamento de paginação : paginação básica
gerenciamento de armazenamento segmentado : paginação de segmento segmentado básico
gerenciamento de armazenamento : paginação de segmento básico
gerenciamento de armazenamento virtual : paginação de solicitação, segmentação de solicitação, paginação de segmento de solicitação, correspondente à paginação básica, segmentação, paginação de segmento

3.3 Armazenamento em partição (espaço contínuo)

O gerenciamento de armazenamento particionado divide a área do usuário da memória principal em várias áreas, cada área é atribuída a um trabalho do usuário e restringe-os a serem executados apenas em sua própria área.

3.4 Armazenamento de páginas/armazenamento de paginação (espaço não contíguo)

Armazenamento paginado == armazenamento de paginação

Divida o espaço de endereço de um processo (programa) em diversas áreas de tamanhos iguais, chamadas páginas.

Da mesma forma, o espaço da memória principal (memória) é dividido em vários blocos físicos do mesmo tamanho da página, chamados de blocos ou quadros de página.

Ao alocar memória principal para um processo, várias páginas do processo são carregadas em vários blocos não contíguos.

Vantagens: alta utilização, pequena fragmentação, alocação e gerenciamento simples.

Desvantagens: Aumento da sobrecarga do sistema; pode ocorrer jitter.
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Endereço lógico = número da página + endereço da página, endereço físico = número do quadro da página + endereço da página

Armazenamento de páginas (detalhes): Divida o programa e a memória em blocos do mesmo tamanho e transfira o programa para a memória em unidades de páginas. Etapas de cálculo: 1. Divida
o
endereço lógico em: número da página + endereço intra-página
2. Número da página = Endereço lógico/tamanho da página Endereço na página = Endereço lógico% tamanho da página
3. Use a tabela de páginas para mapear o número da página e o número do bloco físico
4. Endereço físico = Número do bloco físico * Tamanho da página + Endereço na página

A unidade básica de tamanho de página/tamanho de bloco é bytes B. Preste atenção à conversão da unidade.
A diferença entre binário, decimal e hexadecimal. Preste atenção ao algoritmo simples.

Examine principalmente o armazenamento de páginas, converta o endereço lógico em endereço físico, preste atenção ao algoritmo simples de cada base

3.5 Armazenamento segmentado/armazenamento segmentado (espaço não contíguo)

Armazenamento segmentado == armazenamento segmentado

Em um sistema de gerenciamento de armazenamento segmentado, cada segmento recebe uma partição contínua, enquanto cada segmento no processo pode ser atribuído discretamente a diferentes partições da memória principal.

Uma tabela de mapeamento de segmentos é estabelecida para cada processo do sistema, denominada “tabela de segmentos”. Cada segmento ocupa uma entrada na tabela, que registra o endereço inicial do segmento na memória principal (também chamado de “endereço base”) e o comprimento do segmento. Quando o processo está em execução, ele consulta a tabela de segmentos para encontrar a área da memória principal correspondente a cada segmento.

Armazenamento segmentado: O espaço lógico é dividido de acordo com os segmentos naturais do trabalho do usuário e depois transferido para a memória. Os comprimentos dos segmentos podem ser diferentes.

Vantagens: Multiprogramas compartilham memória e as modificações em cada programa não afetam umas às outras.

Desvantagens: baixa utilização de memória e grande desperdício de fragmentação de memória.
Insira a descrição da imagem aqui
A principal inspeção do armazenamento de segmentos é determinar se o endereço lógico é legal (número do segmento + deslocamento).O deslocamento não pode exceder o comprimento do segmento.

"Endereço fora dos limites" ocorre ao converter "endereço lógico" em "endereço físico"

3.6 Gerenciamento de armazenamento de páginas de segmento (espaço não contíguo)

O princípio básico do sistema de paginação por segmento é primeiro dividir toda a memória principal em blocos de armazenamento de tamanhos iguais (quadros de página), dividir o programa do usuário em vários segmentos de acordo com o relacionamento lógico do programa e atribuir um nome de segmento a cada um. segmento e, em seguida, divida cada segmento em várias páginas e aloque-as discretamente em unidades de quadro de página. Em um sistema de segmento de página, a estrutura de endereço consiste em três partes: número do segmento, número da página dentro do segmento e endereço dentro da página.

Armazenamento segmentado de páginas: uma combinação de armazenamento segmentado e paginado. Primeiro segmento, depois página. Um programa possui vários segmentos e cada segmento pode ter várias páginas. O tamanho de cada página é o mesmo, mas o tamanho de cada segmento é diferente.

Vantagens: pouco desperdício de espaço, fácil compartilhamento de armazenamento, fácil proteção de armazenamento e conexão dinâmica.

Desvantagens: Devido ao aumento do software de gerenciamento, a complexidade e a sobrecarga também aumentam, e o hardware necessário e o conteúdo ocupado também aumentam, o que reduz bastante a velocidade de execução.
Insira a descrição da imagem aqui

3.7 Tabela rápida

A tabela rápida é uma memória associativa de pequena capacidade (memória associativa), composta por um cache. É rápida e pode garantir pesquisas paralelas com base no conteúdo do hardware. Geralmente é usada para armazenar os números de páginas de poucos páginas ativas que são atualmente acessadas com mais frequência.

Tabela rápida: armazena a tabela de páginas no Cache; tabela lenta: armazena a tabela de páginas na memória.

3.8 Gerenciamento de armazenamento virtual

No cenário de gerenciamento de armazenamento descrito anteriormente, cada trabalho deve receber espaço suficiente para armazenar todas as informações. Quando o espaço da memória principal não consegue atender aos requisitos do trabalho, o trabalho não pode ser carregado na memória principal para execução. Se um trabalho for carregado apenas parcialmente na memória principal, ele pode começar a ser executado. A parte restante é deixada temporariamente no disco e carregada na memória principal quando necessário. Isso pode utilizar efetivamente o espaço da memória principal. Do ponto de vista do usuário, a capacidade da memória principal do sistema será muito maior do que a capacidade real da memória principal. As pessoas chamam essa memória de memória virtual.

3.9 Algoritmo de substituição de página

  • Algoritmo de substituição ideal OPT
  • Algoritmo de eliminação aleatória RAND
  • Primeiro a entrar, primeiro a sair do algoritmo FIFO, pode "jitter"
  • O algoritmo LRU, que não é usado há muito tempo, não irá "jitter", ele usa a base teórica do "princípio da localidade" para eliminar os elementos que foram acessados ​​por mais tempo.
  • LFU de substituição de página menos usada, eliminando elementos com frequência de acesso menos recente
  • Algoritmo de substituição de página de relógio, algoritmo round robin, algoritmo de substituição de página não usado recentemente NUR

4. Gestão de Documentos

4.1 Estrutura do arquivo de índice

Os arquivos devem ser logicamente contínuos e podem ser fisicamente dispersos.

A estrutura lógica do arquivo é conveniente para uso dos usuários; a estrutura física do arquivo é como ele é armazenado no dispositivo físico.

Esta parte frequentemente examina o cálculo e a conversão de números lógicos e físicos, o tipo específico de índice usado, o cálculo do comprimento do arquivo, etc.

Intervalo de índice direto : número de blocos de índice * tamanho do bloco de índice

Intervalo de índice indireto de nível um : (tamanho do bloco de dados do disco (bloco de disco físico)/tamanho do item de endereço) * tamanho do bloco de índice

Intervalo de índice indireto secundário : (tamanho do bloco de dados do disco (bloco de disco físico) / tamanho do item de endereço) 2 * tamanho do bloco de índice

Intervalo de índice indireto de terceiro nível : (tamanho do bloco de dados do disco (bloco de disco físico) / tamanho do item de endereço) ao cubo * tamanho do bloco de índice

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

4.2 Bitmap

Método bitmap . Este método consiste em criar um bitmap na memória externa para registrar o uso da memória do arquivo. Cada bit corresponde a apenas um bloco físico no armazenamento de arquivos, e os valores 0 e 1 representam livre e ocupado respectivamente.
Insira a descrição da imagem aqui

O bitmap usa um bit binário para representar o uso de um bloco de disco no disco. Quando o valor for “0”, significa que o bloco de disco correspondente está livre; quando for “1”, significa que foi alocado. Alguns sistemas usam “0” como marca alocada do bloco de disco e “1” como marca livre. (Eles são essencialmente os mesmos. Ambos usam um bit para marcar dois estados: livre e alocado.) Todos os blocos de disco no disco possuem um bit binário correspondente a eles. Desta forma, todos os blocos de disco possuem Os bits correspondentes formam um conjunto , chamado de bitmap. Bitmap é uma estrutura muito comumente usada e amplamente utilizada em indexação, compactação de dados, etc.

4.3 Estrutura de diretórios em árvore

Insira a descrição da imagem aqui

5. Gestão de equipamentos

5.1 Método de controle de transmissão de dados

Métodos de gerenciamento de entrada/saída (E/S) do dispositivo:

A carga de trabalho da CPU torna-se cada vez menor de cima para baixo e a eficiência aumenta cada vez mais de cima para baixo.

Gerenciamento de armazenamento de partição

  • Modo de controle do programa [ Trabalho serial da CPU e E/S ]: É dividido em dois modos: transmissão incondicional e modo de consulta do programa. O método é simples e tem baixa sobrecarga de hardware, mas a capacidade de E/S não é alta, o que afeta seriamente a utilização da CPU. No modo de consulta do programa, a CPU deve testar constantemente o status da porta do dispositivo de E/S .
  • Modo de interrupção do programa [ Trabalho paralelo da CPU e E/S ]:
    Comparado com o modo de controle do programa, o modo de interrupção melhora a velocidade de resposta das solicitações de transmissão porque a CPU não precisa esperar. A CPU obtém o status do dispositivo chamando o dispositivo de controle de interrupção, e o dispositivo notifica a CPU sobre mudanças de status, obtém dados, etc. Após o término da interrupção, a CPU continuará executando o programa anterior__.
  • DMA (Acesso direto à memória) [ Trabalho paralelo de CPU e E/S ]:
    Configurado para obter troca de dados em lote de alta velocidade entre a memória principal e os periféricos. O modo DMA é mais eficiente que o modo de controle de programa e o modo de interrupção. O controlador DMA troca dados em lote diretamente com a memória. A CPU controla apenas o início e o fim. O processo de transmissão não requer intervenção da CPU.
    O hardware DMA é concluído diretamente sem qualquer intervenção da CPU. É adequado para dispositivos de E/S rápidos e responde ao DMA após o término de um barramento da CPU
    .
  • Modo de canal [ trabalho paralelo de CPU e E/S ]:
    Há um processador de canal dedicado no computador host, com menos intervenção da CPU. O programa de canal correspondente e a palavra de status do canal são armazenados na memória, e a CPU emite um comando de inicialização ao processador do canal. Independentemente disso, o processador do canal executa o programa do canal e controla o dispositivo para iniciar uma interrupção após transmitir todos os dados e entregá-los à CPU para processamento, e o dispositivo é conectado ao canal.
  • Processador de entrada-saída (IOP) [ trabalho paralelo de CPU e E/S ]:
    um sistema independente com memória própria, suporte de instruções e interrupção. É dedicado ao controle de dispositivos de entrada e saída de sistemas eficientes e de grande escala. , usando memória compartilhada, etc. para se comunicar com as informações do Host Exchange. Pode haver vários canais conectados ao dispositivo no processador de entrada e saída.

5.2 Software de gerenciamento de E/S

Insira a descrição da imagem aqui

  • Hardware, conclua operações de E/S específicas.
  • Manipulador de interrupção: ativa o driver do dispositivo após a conclusão da E/S
  • Driver de dispositivo, configuração de registros, verificação de status do dispositivo
  • Camada de E/S independente de dispositivo, resolução de nome de dispositivo, processo de bloqueio, alocação de buffer
  • Camada de E/S no nível do usuário (processo do usuário), emite chamadas de E/S.

6. Tecnologia de SPOOL

SPOOLing é a abreviatura de Simultaneous Peripheral Operation On-Line (ou seja, operação paralela online de dispositivo externo).É uma tecnologia sobre como dispositivos de caracteres lentos trocam informações com o host do computador, geralmente chamada de "tecnologia de spool".

A tecnologia SPOOLing (uma tecnologia comumente usada em dispositivos virtuais de entrada e saída) é colocada primeiro no buffer do disco e depois na área do dispositivo. Ela abre uma área de resposta no disco, de modo que o buffer é a memória externa.

A tecnologia SPOOLing transforma uma impressora dedicada em uma impressora que pode ser compartilhada por vários usuários.

Recursos técnicos de SPOOL:

(1) Poço de entrada e poço de saída, duas áreas de armazenamento abertas no disco, usadas para armazenar entrada de dados por dispositivos de E/S e saída de dados por programas de usuário para o dispositivo (2) Área de buffer de entrada e área de buffer de saída, em
dois buffers abertos na memória. O usuário do buffer de entrada armazena temporariamente os dados enviados do dispositivo de entrada e depois os envia para o poço de entrada; o buffer de saída armazena temporariamente os dados enviados do poço de saída e depois os transmite para o dispositivo de saída (3) O processo de entrada e
o O processo de saída é responsável pela transmissão de entrada e saída. Os dados
(4) melhoram a velocidade de E/S e aliviam a contradição entre a incompatibilidade de velocidade do host e do periférico, operando bem a entrada e a saída (5) O dispositivo não está diretamente
associado com o processo do usuário
(6) Implementa dispositivos virtuais, muitos Dois processos usam um dispositivo lógico ao mesmo tempo, e cada processo pensa que tem uso exclusivo do dispositivo.

7. Micronúcleo

  • Microkernel visa simplificar o sistema operacional e reter apenas as funções mais básicas. O kernel do sistema operacional comum inclui cinco partes: processo, armazenamento, dispositivo, arquivo e gerenciamento de tarefas.No sistema operacional microkernel , ele foi adaptado e o sistema de arquivos, a comunicação e o gerenciamento de periféricos são todos colocados no sistema operacional. O estrangeiro foi cuidar disso.
  • A maioria dos sistemas operacionais modernos possui dois estados de funcionamento, ou seja, estado central e estado do usuário . Geralmente, os aplicativos funcionam no modo de usuário, enquanto os módulos do kernel e o núcleo mais básico do sistema operacional funcionam no modo principal. Porque no microkernel há menos funções de estado central e muitas operações que originalmente pertencem ao sistema operacional são implementadas no estado do usuário.
  • A segurança e a confiabilidade dos sistemas microkernel foram melhoradas . Os sistemas operacionais microkernel são amplamente utilizados em aplicativos distribuídos e se tornaram a maior vantagem dos sistemas operacionais microkernel.
  • É claro que, em um sistema operacional microkernel, uma tarefa precisa ser concluída alternando constantemente diretamente entre o modo de usuário e o modo kernel. A alternância frequente, naturalmente, não é muito eficiente.

Coloque o código do sistema operacional tradicional em um nível superior e remova o máximo possível de coisas do sistema operacional, deixando apenas o menor núcleo, que é chamado de microkernel (estrutura C/S).
Insira a descrição da imagem aqui

substância vantagem deficiência
único nucleo Todas as funções, como gráficos, drivers de dispositivos e sistemas de arquivos, são implementadas no kernel e executadas no estado do kernel e no mesmo espaço de endereço. Reduza a sobrecarga do sistema de comunicação entre processos e comutação de status para obter maior eficiência operacional O kernel é enorme, consome muitos recursos e é difícil de cortar. A estabilidade e a segurança do sistema não são boas
micronúcleo Apenas funções básicas são implementadas, e o sistema gráfico, sistema de arquivos, driver de dispositivo e funções de comunicação são colocados fora do kernel. O núcleo é refinado e fácil de cortar e transplantar. O programa de serviço do sistema é executado no espaço de endereço do usuário. O sistema possui alta confiabilidade, estabilidade e segurança e pode ser usado em sistemas distribuídos. O estado do usuário e o estado do kernel precisam ser alternados com frequência, resultando em uma eficiência do sistema que não é tão boa quanto a de um único kernel

Clique para entrar no diretório de séries de artigos

Acho que você gosta

Origin blog.csdn.net/weixin_30197685/article/details/132782562
Recomendado
Clasificación