동시와 동기화는 다른 것입니다! 동기화는 작업이 실행되는 순서를 나타냅니다! 후자는 전자의 결과에 의존해야 합니다! 비동기식은 동시에 수행되지만 사물 간의 연결은 전체 프로세스에 거의 영향을 미치지 않습니다! 예를 들어 동시에 여러 개의 Ajax 요청을 수행하는 경우 목적은 단지 데이터를 요청하고 데이터 간에 상관 관계가 없음을 표시하는 것입니다. 비유를 사용해보자! 도로를 건설하는 것과 같습니다! 반드시 아스팔트를 먼저 깔고 선을 칠해주세요! 그렇지 않으면 포장하는 동안 선을 그려서 포장도로를 엉망으로 만들게 됩니다! 이때 꼭 동기식과 비동기식을 병행해야 한다면 엉망이겠죠! 그러나 선 표시, 도로 청소, 도로 울타리 설치를 동시에 수행할 수 있으며 이를 비동기식이라고 하며 결과에 영향을 미치지 않지만 울타리 설치가 다른 작업보다 복잡하기 때문에 속도도 느려집니다. 드디어 모든 과정이 완료되었습니다! 반면, 후자 3개를 동시에 처리할 경우, 다음 단계를 처리하기 전에 이전 단계가 처리될 때까지 기다려야 하기 때문에 대기 시간이 더 길어지게 됩니다! 그런데 예전에는 도로 공사를 10명이 했는데, 나중에 처리해야 할 일이 3가지였기 때문에 비동기식 구현을 하려면 30명으로 늘려야 해서 컴퓨터 비용을 늘린 셈이다. (여기서는 별로 전문적이지 않지만) 컴퓨팅 리소스가 과잉되는 경우가 많습니다. 이런 방식으로 비동기 컴퓨팅 리소스를 효과적으로 활용할 수 있습니다.
프로그램은 여러 CPU 코어를 사용하여 동시에 여러 작업을 병렬로 실행할 수 있습니다. 맨 아래 계층은 다중 스레드 또는 다중 프로세스입니다.
Node의 맨 아래 레이어는 libuv입니다.
네트워크 읽기 및 쓰기(I/O)의 경우 libuv는 Linux 커널에서 제공하는 epoll 메커니즘을 사용합니다. Linux 커널에서 epoll의 하위 계층은 커널 스레드를 사용하여 구현되어야 하지만 epoll의 하위 계층 구현에는 필요하지 않습니다. libuv를 신경쓰려면 libuv만 호출하면 됩니다
파일 읽기 및 쓰기(I/O)의 경우 libuv는 Linux AIO를 사용할 수도 있고 이를 구현하기 위해 멀티스레딩을 사용할 수도 있습니다. 왜냐하면 Linux 커널에서 제공하는 비동기 파일 읽기 및 쓰기 메커니즘 AIO는 주로 데이터베이스를 제공하기 때문입니다. , MySQL은 libaio.so에 의존합니다. 현재 커널 AIO는 디스크 읽기 및 쓰기에 O_DIRECT 모드(DirectIO)만 지원합니다. 이는 프로그램이 시스템의 캐시 페이지 캐시를 사용할 수 없으며 읽기의 크기와 오프셋이 필요함을 의미합니다. 큰 파일을 읽고 쓰는 데는 적합할 수 있지만 작은 파일에는 적합하지 않습니다. 따라서 libuv는 비동기 파일 읽기 및 쓰기를 구현하기 위해 하위 계층에서 멀티스레딩을 사용해야 합니다.
네트워크 읽기 및 쓰기이든 파일 읽기 및 쓰기이든 프로그램은 항상 반환됩니다. 반환되면 모든 작업이 완료된 후 반환해야 하므로 일반적으로 시간이 많이 걸리는 작업은 읽고 쓰는 데 가장 오래 걸리는 작업입니다. 그러나 파일 읽기 및 쓰기는 디스크 IOPS에 의해 제한될 수 있으며 이로 인해 필연적으로 정체가 발생하고 전체 시간 소모가 더 길어질 수 있습니다.
Node를 서버 프로그래밍이나 서버 미들티어 프로그래밍에 사용할 때 주로 네트워크 읽기와 쓰기가 발생합니다.
으아아아 으아아아
JS 단일 스레드도 있습니다. 작성하는 기본 JS 코드는 기본 네트워크 또는 파일 I/O이면 이벤트 루프에 들어가 동시 작업을 수행합니다. . . 1234가 동시에 시작되었습니다. 누구도 기다리지 않습니다.
서로 간섭하지 않고 동시에 진행됩니다.
node.js 비동기 작업의 최하위 계층은 멀티스레딩으로 구현됩니다. 비동기 작업의 경우, 비동기 작업은 실행을 위해 스레드 풀에서 스레드를 가져옵니다. 스레드 풀
동시와 동기화는 다른 것입니다! 동기화는 작업이 실행되는 순서를 나타냅니다! 후자는 전자의 결과에 의존해야 합니다! 비동기식은 동시에 수행되지만 사물 간의 연결은 전체 프로세스에 거의 영향을 미치지 않습니다! 예를 들어 동시에 여러 개의 Ajax 요청을 수행하는 경우 목적은 단지 데이터를 요청하고 데이터 간에 상관 관계가 없음을 표시하는 것입니다. 비유를 사용해보자! 도로를 건설하는 것과 같습니다! 반드시 아스팔트를 먼저 깔고 선을 칠해주세요! 그렇지 않으면 포장하는 동안 선을 그려서 포장도로를 엉망으로 만들게 됩니다! 이때 꼭 동기식과 비동기식을 병행해야 한다면 엉망이겠죠! 그러나 선 표시, 도로 청소, 도로 울타리 설치를 동시에 수행할 수 있으며 이를 비동기식이라고 하며 결과에 영향을 미치지 않지만 울타리 설치가 다른 작업보다 복잡하기 때문에 속도도 느려집니다. 드디어 모든 과정이 완료되었습니다! 반면, 후자 3개를 동시에 처리할 경우, 다음 단계를 처리하기 전에 이전 단계가 처리될 때까지 기다려야 하기 때문에 대기 시간이 더 길어지게 됩니다! 그런데 예전에는 도로 공사를 10명이 했는데, 나중에 처리해야 할 일이 3가지였기 때문에 비동기식 구현을 하려면 30명으로 늘려야 해서 컴퓨터 비용을 늘린 셈이다. (여기서는 별로 전문적이지 않지만) 컴퓨팅 리소스가 과잉되는 경우가 많습니다. 이런 방식으로 비동기 컴퓨팅 리소스를 효과적으로 활용할 수 있습니다.
프로그램은 여러 CPU 코어를 사용하여 동시에 여러 작업을 병렬로 실행할 수 있습니다. 맨 아래 계층은 다중 스레드 또는 다중 프로세스입니다.
Node의 맨 아래 레이어는 libuv입니다.
네트워크 읽기 및 쓰기(I/O)의 경우 libuv는 Linux 커널에서 제공하는 epoll 메커니즘을 사용합니다. Linux 커널에서 epoll의 하위 계층은 커널 스레드를 사용하여 구현되어야 하지만 epoll의 하위 계층 구현에는 필요하지 않습니다. libuv를 신경쓰려면 libuv만 호출하면 됩니다
파일 읽기 및 쓰기(I/O)의 경우 libuv는 Linux AIO를 사용할 수도 있고 이를 구현하기 위해 멀티스레딩을 사용할 수도 있습니다. 왜냐하면 Linux 커널에서 제공하는 비동기 파일 읽기 및 쓰기 메커니즘 AIO는 주로 데이터베이스를 제공하기 때문입니다. , MySQL은 libaio.so에 의존합니다. 현재 커널 AIO는 디스크 읽기 및 쓰기에 O_DIRECT 모드(DirectIO)만 지원합니다. 이는 프로그램이 시스템의 캐시 페이지 캐시를 사용할 수 없으며 읽기의 크기와 오프셋이 필요함을 의미합니다. 큰 파일을 읽고 쓰는 데는 적합할 수 있지만 작은 파일에는 적합하지 않습니다. 따라서 libuv는 비동기 파일 읽기 및 쓰기를 구현하기 위해 하위 계층에서 멀티스레딩을 사용해야 합니다.
네트워크 읽기 및 쓰기이든 파일 읽기 및 쓰기이든 프로그램은 항상 반환됩니다. 반환되면 모든 작업이 완료된 후 반환해야 하므로 일반적으로 시간이 많이 걸리는 작업은 읽고 쓰는 데 가장 오래 걸리는 작업입니다. 그러나 파일 읽기 및 쓰기는 디스크 IOPS에 의해 제한될 수 있으며 이로 인해 필연적으로 정체가 발생하고 전체 시간 소모가 더 길어질 수 있습니다.
Node를 서버 프로그래밍이나 서버 미들티어 프로그래밍에 사용할 때 주로 네트워크 읽기와 쓰기가 발생합니다.