เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจœเจพเจฃ เจชเจ›เจพเจฃ

I/O เจฐเจฟเจเจ•เจŸเจฐ (เจธเจฟเฉฐเจ—เจฒ เจฅเจฐเจฟเฉฑเจกเจก เจ˜เจŸเจจเจพ เจฒเฉ‚เจช) เจ‰เฉฑเจš-เจฒเฉ‹เจก เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจฒเจฟเจ–เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจชเฉˆเจŸเจฐเจจ เจนเฉˆ, เจœเฉ‹ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจชเฉเจฐเจธเจฟเฉฑเจง เจนเฉฑเจฒเจพเจ‚ เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ:

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ…เจคเฉ‡ เจฌเจพเจนเจฐ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ…เจคเฉ‡ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ•เฉ‹เจก เจฆเฉ€เจ†เจ‚ 200 เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฒเจพเจ—เฉ‚เจ•เจฐเจจ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡, เจ…เจคเฉ‡ 40 เจฎเจฟเจฒเฉ€เจ…เจจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚/เจฎเจฟเฉฐเจŸ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ HTTP เจธเจฐเจตเจฐ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฌเจฃเจพเจตเจพเจ‚เจ—เฉ‡เฅค

เจฎเฉเจ–เจฌเฉฐเจง

  • เจฒเฉ‡เจ– I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ‡ เจ•เฉฐเจฎเจ•เจพเจœ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจจ เจฒเจˆ เจฒเจฟเจ–เจฟเจ† เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจœเฉ‹เจ–เจฎเจพเจ‚ เจจเฉ‚เฉฐ เจธเจฎเจเฉ‹เฅค
  • เจฒเฉ‡เจ– เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฒเจˆ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจ—เจฟเจ†เจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจธเฉ€ เจญเจพเจธเจผเจพ เจ…เจคเฉ‡ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจกเจฟเจตเฉˆเจฒเจชเจฎเฉˆเจ‚เจŸ เจตเจฟเฉฑเจš เจ•เฉเจ เจ…เจจเฉเจญเจตเฅค
  • เจธเจพเจฐเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ (เจธเจพเจตเจงเจพเจจ: เจฒเฉฐเจฌเฉ€ PDF) C11 เจธเจŸเฉˆเจ‚เจกเจฐเจก เจคเฉฑเจ• Linux เจฒเจˆ เจ…เจคเฉ‡ เจ‡เจธ 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเฉˆ GitHub.

เจ‡เจน เจ•เจฟเจ‰เจ‚ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ?

เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ เจฆเฉ€ เจตเจงเจฆเฉ€ เจชเฉเจฐเจธเจฟเฉฑเจงเฉ€ เจฆเฉ‡ เจจเจพเจฒ, เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจตเฉฑเจกเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจญเจพเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจชเฉˆเจฃ เจฒเฉฑเจ—เฉ€, เจ…เจคเฉ‡ เจ‡เจธ เจฒเจˆ เจฆเฉ‹ เจคเจฐเฉ€เจ•เฉ‡ เจ…เจœเจผเจฎเจพเจ‰เจฃเฉ‡ เจชเจ: เจตเฉฑเจกเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš OS เจฅเจฐเจฟเฉฑเจกเจพเจ‚ 'เจคเฉ‡ I/O เจจเฉ‚เฉฐ เจฌเจฒเจพเจ• เจ•เจฐเจจเจพ เจ…เจคเฉ‡ I/O เจจเฉ‚เฉฐ เจจเจพ-เจฌเจฒเจพเจ• เจ•เจฐเจจเจพเฅค เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจจเฉ‹เจŸเฉ€เจซเจฟเจ•เฉ‡เจธเจผเจจ เจธเจฟเจธเจŸเจฎ, เจœเจฟเจธเจจเฉ‚เฉฐ "เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ" เจตเฉ€ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจˆเจชเฉ‹เจฒ/kqueue/เจ†เจˆ.เจ“.เจธเฉ€.เจชเฉ€/ เจ†เจฆเจฟ)เฅค

เจชเจนเจฟเจฒเฉ€ เจชเจนเฉเฉฐเจš เจตเจฟเฉฑเจš เจนเจฐเฉ‡เจ• เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ OS เจฅเฉเจฐเฉˆเจก เจฌเจฃเจพเจ‰เจฃเจพ เจธเจผเจพเจฎเจฒ เจนเฉˆเฅค เจ‡เจธเจฆเจพ เจจเฉเจ•เจธเจพเจจ เจฎเจพเฉœเฉ€ เจฎเจพเจชเจฏเฉ‹เจ—เจคเจพ เจนเฉˆ: เจ“เจชเจฐเฉ‡เจŸเจฟเฉฐเจ— เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเฉ‡ เจชเฉˆเจฃเจ—เฉ‡ เจธเฉฐเจฆเจฐเจญ เจชเจฐเจฟเจตเจฐเจคเจจ ะธ เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚. เจ‰เจน เจฎเจนเจฟเฉฐเจ—เฉ‡ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจนเจจ เจ…เจคเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจธเฉฐเจ–เจฟเจ† เจฆเฉ‡ เจจเจพเจฒ เจฎเฉเจซเจค RAM เจฆเฉ€ เจ˜เจพเจŸ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจธเฉ‹เจงเจฟเจ† เจนเฉ‹เจ‡เจ† เจธเฉฐเจธเจ•เจฐเจฃ เจนเจพเจˆเจฒเจพเจˆเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ เจฅเจฐเจฟเฉฑเจกเจพเจ‚ เจฆเฉ€ เจธเจฅเจฟเจฐ เจธเฉฐเจ–เจฟเจ† (เจฅเฉเจฐเฉˆเฉฑเจก เจชเฉ‚เจฒ), เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจจเฉ‚เฉฐ เจ…เจงเฉ‚เจฐเจพ เจ›เฉฑเจกเจฃ เจคเฉ‹เจ‚ เจฐเฉ‹เจ•เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจธเจฎเฉฑเจธเจฟเจ† เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ: เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจฅเจฐเจฟเฉฑเจก เจชเฉ‚เจฒ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจฒเฉฐเจฌเฉ‡ เจฐเฉ€เจก เจ“เจชเจฐเฉ‡เจธเจผเจจ เจฆเฉเจ†เจฐเจพ เจฌเจฒเฉŒเจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจนเฉ‹เจฐ เจธเจพเจ•เจŸ เจœเฉ‹ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจกเฉ‡เจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจ—เฉ‡. เจ…เจœเจฟเจนเจพ เจ•เจฐเฉ‹

เจฆเฉ‚เจœเฉ€ เจชเจนเฉเฉฐเจš เจตเจฐเจคเจฆเจพ เจนเฉˆ เจ˜เจŸเจจเจพ เจธเฉ‚เจšเจจเจพ เจธเจฟเจธเจŸเจฎ (เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ) OS เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจฆเจพเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ‡เจน เจฒเฉ‡เจ– I/O เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฒเจˆ เจคเจฟเจ†เจฐเฉ€ เจฌเจพเจฐเฉ‡ เจšเฉ‡เจคเจพเจตเจจเฉ€เจ†เจ‚ (เจ˜เจŸเจจเจพเจตเจพเจ‚, เจธเฉ‚เจšเจจเจพเจตเจพเจ‚) เจฆเฉ‡ เจ…เจงเจพเจฐ เจคเฉ‡, เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจฆเฉ€ เจธเจญ เจคเฉ‹เจ‚ เจ†เจฎ เจ•เจฟเจธเจฎ เจฆเฉ€ เจšเจฐเจšเจพ เจ•เจฐเจฆเจพ เจนเฉˆ, เจจเจพ เจ•เจฟ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจฎเฉเจ•เฉฐเจฎเจฒ เจนเฉ‹เจฃ เจฌเจพเจฐเฉ‡ เจธเฉ‚เจšเจจเจพเจตเจพเจ‚. เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเจฐเจฒ เจ‰เจฆเจพเจนเจฐเจฃ เจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจฌเจฒเจพเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉเจ†เจฐเจพ เจฆเจฐเจธเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ:

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจ‡เจนเจจเจพเจ‚ เจชเจนเฉเฉฐเจšเจพเจ‚ เจตเจฟเฉฑเจš เจ…เฉฐเจคเจฐ เจ‡เจธ เจชเฉเจฐเจ•เจพเจฐ เจนเฉˆ:

  • I/O เจ“เจชเจฐเฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจ•เจฐเจจเจพ เจฎเฉเจ…เฉฑเจคเจฒ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจตเจนเจพเจ… เจœเจฆ เจคเฉฑเจ•เจ“เจเจธ เจ เฉ€เจ• เจนเฉ‹เจฃ เจคเฉฑเจ• เจกเฉ€เจซเฉเจฐเฉˆเจ—เจฎเฉˆเจ‚เจŸเจธ เจ†เจ‰เจฃ เจตเจพเจฒเจพ IP เจชเฉˆเจ•เฉ‡เจŸ เจฌเจพเจˆเจŸ เจธเจŸเฉเจฐเฉ€เจฎ เจจเฉ‚เฉฐ (TCP, เจกเจพเจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ) เจœเจพเจ‚ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจฐเจพเจˆเจŸ เจฌเจซเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจญเฉ‡เจœเจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจฅเจพเจ‚ เจ‰เจชเจฒเจฌเจง เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจเจจ เจ†เจˆ เจธเฉ€ (เจกเฉ‡เจŸเจพ เจญเฉ‡เจœเจฃเจพ)
  • เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ afikun asiko เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจธเฉ‚เจšเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ“.เจเจธ เจนเฉ€ เจกเฉ€เจซเฉเจฐเฉˆเจ—เจฎเฉˆเจ‚เจŸ เจ•เฉ€เจคเฉ‡ IP เจชเฉˆเจ•เฉ‡เจŸ (TCP, เจกเฉ‡เจŸเจพ เจฐเจฟเจธเฉˆเจชเจธเจผเจจ) เจœเจพเจ‚ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจฐเจพเจˆเจŸ เจฌเจซเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจพเจซเจผเฉ€ เจฅเจพเจ‚ เจนเฉ€ เจ‰เจชเจฒเจฌเจง (เจกเฉ‡เจŸเจพ เจญเฉ‡เจœเจฃเจพ).

เจ‡เจธ เจจเฉ‚เฉฐ เจธเฉฐเจ–เฉ‡เจช เจ•เจฐเจจ เจฒเจˆ, เจนเจฐเฉ‡เจ• I/O เจฒเจˆ เจ‡เฉฑเจ• OS เจฅเฉเจฐเฉˆเจก เจฐเจฟเจœเจผเจฐเจต เจ•เจฐเจจเจพ เจ•เฉฐเจชเจฟเจŠเจŸเจฟเฉฐเจ— เจชเจพเจตเจฐ เจฆเฉ€ เจฌเจฐเจฌเจพเจฆเฉ€ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจฅเฉเจฐเฉˆเจก เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐ เจฐเจนเฉ‡ เจนเจจ (เจ‡เจธ เจฒเจˆ เจ‡เจน เจธเจผเจฌเจฆ "เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจฐเฉเจ•เจพเจตเจŸ"). เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจ‡เจธ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ CPU เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจฐเจฅเจฟเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจตเจฐเจคเจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

I/O เจฐเจฟเจเจ•เจŸเจฐ เจฎเจพเจกเจฒ

I/O เจฐเจฟเจเจ•เจŸเจฐ เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ•เฉ‹เจก เจฆเฉ‡ เจตเจฟเจšเจ•เจพเจฐ เจ‡เฉฑเจ• เจชเจฐเจค เจตเจœเฉ‹เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจฆเฉ‡ เจธเจฟเจงเจพเจ‚เจค เจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจฌเจฒเจพเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉเจ†เจฐเจพ เจฆเจฐเจธเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ:

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

  • เจฎเฉˆเจจเฉ‚เฉฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจฃ เจฆเจฟเจ“ เจ•เจฟ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจ‡เฉฑเจ• เจจเฉ‹เจŸเฉ€เจซเจฟเจ•เฉ‡เจธเจผเจจ เจนเฉˆ เจœเฉ‹ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเจพเจ•เจŸ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจฌเจฒเจพเจ•เจฟเฉฐเจ— I/O เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจนเฉˆเฅค
  • เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉเจ†เจฐเจพ เจฌเฉเจฒเจพเจ‡เจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจชเฉเจฐเจพเจชเจค เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจซเจฟเจฐ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจฌเจฒเจพเจ•เจฟเฉฐเจ— I/O เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‡เจน เจจเฉ‹เจŸ เจ•เจฐเจจเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ เจ•เจฟ I/O เจฐเจฟเจเจ•เจŸเจฐ เจชเจฐเจฟเจญเจพเจธเจผเจพ เจ…เจจเฉเจธเจพเจฐ เจธเจฟเฉฐเจ—เจฒ-เจฅเฉเจฐเฉˆเฉฑเจกเจก เจนเฉˆ, เจชเจฐ 1 เจฅเฉเจฐเฉˆเจก: 1 เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ‡ เจ…เจจเฉเจชเจพเจค 'เจคเฉ‡ เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจš เจตเจฐเจคเจฃ เจคเฉ‹เจ‚ เจธเฉฐเจ•เจฒเจช เจจเฉ‚เฉฐ เจ•เฉ‹เจˆ เจตเฉ€ เจจเจนเฉ€เจ‚ เจฐเฉ‹เจ• เจฐเจฟเจนเจพ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจธเจพเจฐเฉ‡ CPU เจ•เฉ‹เจฐเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉ€เจธเจพเจˆเจ•เจฒ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

ะ ะตะฐะปะธะทะฐั†ะธั

เจ…เจธเฉ€เจ‚ เจชเจฌเจฒเจฟเจ• เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฐเฉฑเจ–เจพเจ‚เจ—เฉ‡ reactor.h, เจ…เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ - เจตเจฟเฉฑเจš reactor.c. reactor.h เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจ˜เฉ‹เจธเจผเจฃเจพเจตเจพเจ‚ เจธเจผเจพเจฎเจฒ เจนเฉ‹เจฃเจ—เฉ€เจ†เจ‚:

reactor.h เจตเจฟเฉฑเจš เจ˜เฉ‹เจธเจผเจฃเจพเจตเจพเจ‚ เจฆเจฟเจ–เจพเจ“

typedef struct reactor Reactor;

/*
 * ะฃะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ ั„ัƒะฝะบั†ะธัŽ, ะบะพั‚ะพั€ะฐั ะฑัƒะดะตั‚ ะฒั‹ะทั‹ะฒะฐั‚ัŒัั I/O ั€ะตะฐะบั‚ะพั€ะพะผ ะฟั€ะธ ะฟะพัั‚ัƒะฟะปะตะฝะธะธ
 * ัะพะฑั‹ั‚ะธั ะพั‚ ัะธัั‚ะตะผะฝะพะณะพ ัะตะปะตะบั‚ะพั€ะฐ.
 */
typedef void (*Callback)(void *arg, int fd, uint32_t events);

/*
 * ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ `NULL` ะฒ ัะปัƒั‡ะฐะต ะพัˆะธะฑะบะธ, ะฝะต-`NULL` ัƒะบะฐะทะฐั‚ะตะปัŒ ะฝะฐ `Reactor` ะฒ
 * ะฟั€ะพั‚ะธะฒะฝะพะผ ัะปัƒั‡ะฐะต.
 */
Reactor *reactor_new(void);

/*
 * ะžัะฒะพะฑะพะถะดะฐะตั‚ ัะธัั‚ะตะผะฝั‹ะน ัะตะปะตะบั‚ะพั€, ะฒัะต ะทะฐั€ะตะณะธัั‚ั€ะธั€ะพะฒะฐะฝะฝั‹ะต ัะพะบะตั‚ั‹ ะฒ ะดะฐะฝะฝั‹ะน ะผะพะผะตะฝั‚
 * ะฒั€ะตะผะตะฝะธ ะธ ัะฐะผ I/O ั€ะตะฐะบั‚ะพั€.
 *
 * ะกะปะตะดัƒัŽั‰ะธะต ั„ัƒะฝะบั†ะธะธ ะฒะพะทะฒั€ะฐั‰ะฐัŽั‚ -1 ะฒ ัะปัƒั‡ะฐะต ะพัˆะธะฑะบะธ, 0 ะฒ ัะปัƒั‡ะฐะต ัƒัะฟะตั…ะฐ.
 */
int reactor_destroy(Reactor *reactor);

int reactor_register(const Reactor *reactor, int fd, uint32_t interest,
                     Callback callback, void *callback_arg);
int reactor_deregister(const Reactor *reactor, int fd);
int reactor_reregister(const Reactor *reactor, int fd, uint32_t interest,
                       Callback callback, void *callback_arg);

/*
 * ะ—ะฐะฟัƒัะบะฐะตั‚ ั†ะธะบะป ัะพะฑั‹ั‚ะธะน ั ั‚ะฐะนะผ-ะฐัƒั‚ะพะผ `timeout`.
 *
 * ะญั‚ะฐ ั„ัƒะฝะบั†ะธั ะฟะตั€ะตะดะฐัั‚ ัƒะฟั€ะฐะฒะปะตะฝะธะต ะฒั‹ะทั‹ะฒะฐัŽั‰ะตะผัƒ ะบะพะดัƒ ะตัะปะธ ะพั‚ะฒะตะดั‘ะฝะฝะพะต ะฒั€ะตะผั ะฒั‹ัˆะปะพ
 * ะธะปะธ/ะธ ะฟั€ะธ ะพั‚ััƒั‚ัั‚ะฒะธะธ ะทะฐั€ะตะณะธัั‚ั€ะธั€ะพะฒะฐะฝะฝั‹ั… ัะพะบะตั‚ะพะฒ.
 */
int reactor_run(const Reactor *reactor, time_t timeout);

I/O เจฐเจฟเจเจ•เจŸเจฐ เจฌเจฃเจคเจฐ เจฆเฉ‡ เจธเจผเจพเจฎเจฒ เจนเจจ เจซเจพเจ‡เจฒ เจตเฉ‡เจฐเจตเจพ เจšเฉ‹เจฃเจ•เจพเจฐ เจˆเจชเฉ‹เจฒ ะธ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ GHashTable, เจœเฉ‹ เจนเจฐเฉ‡เจ• เจธเจพเจ•เจŸ เจจเฉ‚เฉฐ เจฎเฉˆเจช เจ•เจฐเจฆเจพ เจนเฉˆ CallbackData (เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเจพ เจขเจพเจ‚เจšเจพ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเจฒเฉ€เจฒ)เฅค

เจฐเจฟเจเจ•เจŸเจฐ เจ…เจคเฉ‡ เจ•เจพเจฒเจฌเฉˆเจ•เจกเจพเจŸเจพ เจฆเจฟเจ–เจพเจ“

struct reactor {
    int epoll_fd;
    GHashTable *table; // (int, CallbackData)
};

typedef struct {
    Callback callback;
    void *arg;
} CallbackData;

เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจนเฉˆเจ‚เจกเจฒ เจ•เจฐเจจ เจฆเฉ€ เจธเจฎเจฐเฉฑเจฅเจพ เจจเฉ‚เฉฐ เจธเจฎเจฐเฉฑเจฅ เจฌเจฃเจพเจ‡เจ† เจนเฉˆ เจ…เจงเฉ‚เจฐเฉ€ เจ•เจฟเจธเจฎ เจธเฉ‚เจšเจ•เจพเจ‚เจ• เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ. IN reactor.h เจ…เจธเฉ€เจ‚ เจขเจพเจ‚เจšเฉ‡ เจฆเจพ เจเจฒเจพเจจ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ reactorเจ…เจคเฉ‡ เจ…เฉฐเจฆเจฐ reactor.c เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจจเฉ‚เฉฐ เจ‡เจธเจฆเฉ‡ เจ–เฉ‡เจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจธเจชเจธเจผเจŸ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจคเฉ‹เจ‚ เจฐเฉ‹เจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจชเฉˆเจŸเจฐเจจ เจฆเฉ‡ เจ‡เฉฑเจ• เจนเฉˆ เจกเจพเจŸเจพ เจฒเฉเจ•เจพเจ‰เจฃเจพ, เจœเฉ‹ เจธเฉฐเจ–เฉ‡เจช เจฐเฉ‚เจช เจตเจฟเฉฑเจš C เจ…เจฐเจฅ เจตเจฟเจ—เจฟเจ†เจจ เจตเจฟเฉฑเจš เจซเจฟเฉฑเจŸ เจฌเฉˆเจ เจฆเจพ เจนเฉˆเฅค

เจซเฉฐเจ•เจธเจผเจจ reactor_register, reactor_deregister ะธ reactor_reregister เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจ…เจคเฉ‡ เจนเฉˆเจธเจผ เจŸเฉ‡เจฌเจฒ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฆเฉ€เจ†เจ‚ เจธเจพเจ•เจŸเจพเจ‚ เจ…เจคเฉ‡ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจˆเจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเฉ‹เฅค

เจฐเจœเจฟเจธเจŸเฉเจฐเฉ‡เจธเจผเจจ เจซเฉฐเจ•เจธเจผเจจ เจฆเจฟเจ–เจพเจ“

#define REACTOR_CTL(reactor, op, fd, interest)                                 
    if (epoll_ctl(reactor->epoll_fd, op, fd,                                   
                  &(struct epoll_event){.events = interest,                    
                                        .data = {.fd = fd}}) == -1) {          
        perror("epoll_ctl");                                                   
        return -1;                                                             
    }

int reactor_register(const Reactor *reactor, int fd, uint32_t interest,
                     Callback callback, void *callback_arg) {
    REACTOR_CTL(reactor, EPOLL_CTL_ADD, fd, interest)
    g_hash_table_insert(reactor->table, int_in_heap(fd),
                        callback_data_new(callback, callback_arg));
    return 0;
}

int reactor_deregister(const Reactor *reactor, int fd) {
    REACTOR_CTL(reactor, EPOLL_CTL_DEL, fd, 0)
    g_hash_table_remove(reactor->table, &fd);
    return 0;
}

int reactor_reregister(const Reactor *reactor, int fd, uint32_t interest,
                       Callback callback, void *callback_arg) {
    REACTOR_CTL(reactor, EPOLL_CTL_MOD, fd, interest)
    g_hash_table_insert(reactor->table, int_in_heap(fd),
                        callback_data_new(callback, callback_arg));
    return 0;
}

I/O เจฐเจฟเจเจ•เจŸเจฐ เจจเฉ‡ เจตเจฐเจฃเจจเจ•เจฐเจคเจพ เจจเจพเจฒ เจ˜เจŸเจจเจพ เจจเฉ‚เฉฐ เจฐเฉ‹เจ•เจฟเจ† เจนเฉˆ fd, เจ‡เจน เจธเฉฐเจฌเฉฐเจงเจฟเจค เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจคเฉฑเจ• เจ‡เจน เจชเจพเจธ เจนเฉเฉฐเจฆเจพ เจนเฉˆ fd, เจฌเจฟเฉฑเจŸ เจฎเจพเจธเจ• เจ‰เจคเจชเฉฐเจจ เจ‡เจตเฉˆเจ‚เจŸเจธ เจ…เจคเฉ‡ เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจชเฉเจ†เจ‡เฉฐเจŸเจฐ void.

reactor_run() เจซเฉฐเจ•เจธเจผเจจ เจฆเจฟเจ–เจพเจ“

int reactor_run(const Reactor *reactor, time_t timeout) {
    int result;
    struct epoll_event *events;
    if ((events = calloc(MAX_EVENTS, sizeof(*events))) == NULL)
        abort();

    time_t start = time(NULL);

    while (true) {
        time_t passed = time(NULL) - start;
        int nfds =
            epoll_wait(reactor->epoll_fd, events, MAX_EVENTS, timeout - passed);

        switch (nfds) {
        // ะžัˆะธะฑะบะฐ
        case -1:
            perror("epoll_wait");
            result = -1;
            goto cleanup;
        // ะ’ั€ะตะผั ะฒั‹ัˆะปะพ
        case 0:
            result = 0;
            goto cleanup;
        // ะฃัะฟะตัˆะฝะฐั ะพะฟะตั€ะฐั†ะธั
        default:
            // ะ’ั‹ะทะฒะฐั‚ัŒ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะพะฒ ัะพะฑั‹ั‚ะธะน
            for (int i = 0; i < nfds; i++) {
                int fd = events[i].data.fd;

                CallbackData *callback =
                    g_hash_table_lookup(reactor->table, &fd);
                callback->callback(callback->arg, fd, events[i].events);
            }
        }
    }

cleanup:
    free(events);
    return result;
}

เจธเฉฐเจ–เฉ‡เจช เจ•เจฐเจจ เจฒเจˆ, เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจซเฉฐเจ•เจธเจผเจจ เจ•เจพเจฒเจพเจ‚ เจฆเฉ€ เจฒเฉœเฉ€ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจนเฉ‹เจตเฉ‡เจ—เฉ€:

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจธเจฟเฉฐเจ—เจฒ เจฅเจฐเจฟเฉฑเจกเจก เจธเจฐเจตเจฐ

เจ‰เฉฑเจš เจฒเฉ‹เจก เจฆเฉ‡ เจ…เจงเฉ€เจจ I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ HTTP เจตเฉˆเจฌ เจธเจฐเจตเจฐ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡ เจœเฉ‹ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจจเจพเจฒ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจฌเฉ‡เจจเจคเฉ€ เจฆเจพ เจœเจตเจพเจฌ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

HTTP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจนเจตเจพเจฒเจพ

HTTP เจจเฉ‚เฉฐ - เจ‡เจน เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจนเฉˆ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจชเฉฑเจงเจฐ, เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฐเจตเจฐ-เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจธเจผเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

HTTP เจจเฉ‚เฉฐ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ†เจตเจพเจœเจพเจˆ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ TCP, เจจเจฟเจฐเจฆเจฟเจธเจผเจŸ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจธเฉเจจเฉ‡เจนเฉ‡ เจญเฉ‡เจœเจฃเจพ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจจเจฟเจฐเจงเจพเจฐเจจ.

เจฌเฉ‡เจจเจคเฉ€ เจซเจพเจฐเจฎเฉˆเจŸ

<ะšะžะœะะะ”ะ> <URI> <ะ’ะ•ะ ะกะ˜ะฏ HTTP>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš 1>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš 2>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš N>CRLF CRLF
<ะ”ะะะะซะ•>

  • CRLF เจฆเฉ‹ เจ…เฉฑเจ–เจฐเจพเจ‚ เจฆเจพ เจ•เฉเจฐเจฎ เจนเฉˆ: r ะธ n, เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ€ เจชเจนเจฟเจฒเฉ€ เจฒเจพเจˆเจจ, เจธเจฟเจฐเจฒเฉ‡เจ– เจ…เจคเฉ‡ เจกเฉ‡เจŸเจพ เจจเฉ‚เฉฐ เจตเฉฑเจ– เจ•เจฐเจจเจพเฅค
  • <ะšะžะœะะะ”ะ> - เจตเจฟเจšเฉ‹ เจ‡เจ• CONNECT, DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT, TRACE. เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจธเจพเจกเฉ‡ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฎเจพเจ‚เจก เจญเฉ‡เจœเฉ‡เจ—เจพ GET, เจฎเจคเจฒเจฌ "เจฎเฉˆเจจเฉ‚เฉฐ เจซเจพเจˆเจฒ เจฆเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจญเฉ‡เจœเฉ‹เฅค"
  • <URI> - เจ‡เจ•เจธเจพเจฐ เจธเจฐเฉ‹เจค เจชเจ›เจพเจฃเจ•เจฐเจคเจพ. เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจœเฉ‡เจ•เจฐ URI = /index.html, เจซเจฟเจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจธเจพเจˆเจŸ เจฆเฉ‡ เจฎเฉเฉฑเจ– เจชเฉฐเจจเฉ‡ เจจเฉ‚เฉฐ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • <ะ’ะ•ะ ะกะ˜ะฏ HTTP> โ€” เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš HTTP เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ HTTP/X.Y. เจ…เฉฑเจœ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจตเจฐเจคเจฟเจ† เจœเจพเจฃ เจตเจพเจฒเจพ เจธเฉฐเจธเจ•เจฐเจฃ เจนเฉˆ HTTP/1.1.
  • <ะ—ะะ“ะžะ›ะžะ’ะžะš N> เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเฉเฉฑเจ–-เจฎเฉเฉฑเจฒ เจœเฉ‹เฉœเจพ เจนเฉˆ <ะšะ›ะฎะง>: <ะ—ะะะงะ•ะะ˜ะ•>, เจนเฉ‹เจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจฒเจˆ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฟเจ† เจ—เจฟเจ†เฅค
  • <ะ”ะะะะซะ•> โ€” เจธเจฐเจตเจฐ เจฆเฉเจ†เจฐเจพ เจ•เจพเจฐเจตเจพเจˆ เจ•เจฐเจจ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจกเจพเจŸเจพเฅค เจ…เจ•เจธเจฐ เจ‡เจน เจธเจงเจพเจฐเจจ เจนเฉเฉฐเจฆเจพ เจนเฉˆ JSON เจœเจพเจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจซเจพเจฐเจฎเฉˆเจŸเฅค

เจœเจตเจพเจฌ เจซเจพเจฐเจฎเฉˆเจŸ

<ะ’ะ•ะ ะกะ˜ะฏ HTTP> <ะšะžะ” ะกะขะะขะฃะกะ> <ะžะŸะ˜ะกะะะ˜ะ• ะกะขะะขะฃะกะ>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš 1>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš 2>CRLF
<ะ—ะะ“ะžะ›ะžะ’ะžะš N>CRLF CRLF
<ะ”ะะะะซะ•>

  • <ะšะžะ” ะกะขะะขะฃะกะ> เจ‡เฉฑเจ• เจธเฉฐเจ–เจฟเจ† เจนเฉˆ เจœเฉ‹ เจ•เจพเจฐเจตเจพเจˆ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆเฅค เจธเจพเจกเจพ เจธเจฐเจตเจฐ เจนเจฎเฉ‡เจธเจผเจพ เจธเจฅเจฟเจคเฉ€ 200 (เจธเจซเจฒ เจ•เจพเจฐเจตเจพเจˆ) เจตเจพเจชเจธ เจ•เจฐเฉ‡เจ—เจพเฅค
  • <ะžะŸะ˜ะกะะะ˜ะ• ะกะขะะขะฃะกะ> - เจธเจฅเจฟเจคเฉ€ เจ•เฉ‹เจก เจฆเฉ€ เจธเจคเจฐ เจชเฉเจฐเจคเฉ€เจจเจฟเจงเจคเจพเฅค เจธเจŸเฉ‡เจŸเจธ เจ•เฉ‹เจก 200 เจฒเจˆ เจ‡เจน เจนเฉˆ OK.
  • <ะ—ะะ“ะžะ›ะžะ’ะžะš N> โ€” เจฌเฉ‡เจจเจคเฉ€ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‰เจธเฉ‡ เจซเจพเจฐเจฎเฉˆเจŸ เจฆเจพ เจธเจฟเจฐเจฒเฉ‡เจ–เฅค เจ…เจธเฉ€เจ‚ เจ–เจผเจฟเจคเจพเจฌ เจตเจพเจชเจธ เจ•เจฐ เจฆเฉ‡เจตเจพเจ‚เจ—เฉ‡ Content-Length (เจซเจพเจˆเจฒ เจฆเจพ เจ†เจ•เจพเจฐ) เจ…เจคเฉ‡ Content-Type: text/html (เจตเจพเจชเจธเฉ€ เจกเจพเจŸเจพ เจ•เจฟเจธเจฎ)เฅค
  • <ะ”ะะะะซะ•> โ€” เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจฆเฉเจ†เจฐเจพ เจฌเฉ‡เจจเจคเฉ€ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจกเฉ‡เจŸเจพเฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจ‡เจน เจšเจฟเฉฑเจคเจฐ เจฆเจพ เจฎเจพเจฐเจ— เจนเฉˆ HTML.

เจซเจพเจ‡เจฒ http_server.c (เจธเจฟเฉฐเจ—เจฒ เจฅเจฐเจฟเฉฑเจกเจก เจธเจฐเจตเจฐ) เจตเจฟเฉฑเจš เจซเจพเจˆเจฒ เจธเจผเจพเจฎเจฒ เจนเฉˆ common.h, เจœเจฟเจธ เจตเจฟเฉฑเจš เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจธเจผเจพเจฎเจฒ เจนเจจ:

Common.h เจตเจฟเฉฑเจš เจซเฉฐเจ•เจธเจผเจจ เจชเฉเจฐเฉ‹เจŸเฉ‹เจŸเจพเจˆเจช เจฆเจฟเจ–เจพเจ“

/*
 * ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ัะพะฑั‹ั‚ะธะน, ะบะพั‚ะพั€ั‹ะน ะฒั‹ะทะพะฒะตั‚ัั ะฟะพัะปะต ั‚ะพะณะพ, ะบะฐะบ ัะพะบะตั‚ ะฑัƒะดะตั‚
 * ะณะพั‚ะพะฒ ะฟั€ะธะฝัั‚ัŒ ะฝะพะฒะพะต ัะพะตะดะธะฝะตะฝะธะต.
 */
static void on_accept(void *arg, int fd, uint32_t events);

/*
 * ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ัะพะฑั‹ั‚ะธะน, ะบะพั‚ะพั€ั‹ะน ะฒั‹ะทะพะฒะตั‚ัั ะฟะพัะปะต ั‚ะพะณะพ, ะบะฐะบ ัะพะบะตั‚ ะฑัƒะดะตั‚
 * ะณะพั‚ะพะฒ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ HTTP ะพั‚ะฒะตั‚.
 */
static void on_send(void *arg, int fd, uint32_t events);

/*
 * ะžะฑั€ะฐะฑะพั‚ั‡ะธะบ ัะพะฑั‹ั‚ะธะน, ะบะพั‚ะพั€ั‹ะน ะฒั‹ะทะพะฒะตั‚ัั ะฟะพัะปะต ั‚ะพะณะพ, ะบะฐะบ ัะพะบะตั‚ ะฑัƒะดะตั‚
 * ะณะพั‚ะพะฒ ะฟั€ะธะฝัั‚ัŒ ั‡ะฐัั‚ัŒ HTTP ะทะฐะฟั€ะพัะฐ.
 */
static void on_recv(void *arg, int fd, uint32_t events);

/*
 * ะŸะตั€ะตะฒะพะดะธั‚ ะฒั…ะพะดัั‰ะตะต ัะพะตะดะธะฝะตะฝะธะต ะฒ ะฝะตะฑะปะพะบะธั€ัƒัŽั‰ะธะน ั€ะตะถะธะผ.
 */
static void set_nonblocking(int fd);

/*
 * ะŸะตั‡ะฐั‚ะฐะตั‚ ะฟะตั€ะตะดะฐะฝะฝั‹ะต ะฐั€ะณัƒะผะตะฝั‚ั‹ ะฒ stderr ะธ ะฒั‹ั…ะพะดะธั‚ ะธะท ะฟั€ะพั†ะตััะฐ ั
 * ะบะพะดะพะผ `EXIT_FAILURE`.
 */
static noreturn void fail(const char *format, ...);

/*
 * ะ’ะพะทะฒั€ะฐั‰ะฐะตั‚ ั„ะฐะนะปะพะฒั‹ะน ะดะตัะบั€ะธะฟั‚ะพั€ ัะพะบะตั‚ะฐ, ัะฟะพัะพะฑะฝะพะณะพ ะฟั€ะธะฝะธะผะฐั‚ัŒ ะฝะพะฒั‹ะต
 * TCP ัะพะตะดะธะฝะตะฝะธั.
 */
static int new_server(bool reuse_port);

เจซเฉฐเจ•เจธเจผเจจเจฒ เจฎเฉˆเจ•เจฐเฉ‹ เจฆเจพ เจตเฉ€ เจตเจฐเจฃเจจ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ SAFE_CALL() เจ…เจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ fail(). เจฎเฉˆเจ•เจฐเฉ‹ เจธเจฎเฉ€เจ•เจฐเจจ เจฆเฉ‡ เจฎเฉเฉฑเจฒ เจฆเฉ€ เจ—เจฒเจคเฉ€ เจจเจพเจฒ เจคเฉเจฒเจจเจพ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจธเจฅเจฟเจคเฉ€ เจธเจนเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ fail():

#define SAFE_CALL(call, error)                                                 
    do {                                                                       
        if ((call) == error) {                                                   
            fail("%s", #call);                                                 
        }                                                                      
    } while (false)

เจซเฉฐเจ•เจธเจผเจจ fail() เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸเจพเจ‚ เจจเฉ‚เฉฐ เจŸเจฐเจฎเฉ€เจจเจฒ 'เจคเฉ‡ เจชเฉเจฐเจฟเฉฐเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ (เจœเจฟเจตเฉ‡เจ‚ printf()) เจ…เจคเฉ‡ เจ•เฉ‹เจก เจจเจพเจฒ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ EXIT_FAILURE:

static noreturn void fail(const char *format, ...) {
    va_list args;
    va_start(args, format);
    vfprintf(stderr, format, args);
    va_end(args);
    fprintf(stderr, ": %sn", strerror(errno));
    exit(EXIT_FAILURE);
}

เจซเฉฐเจ•เจธเจผเจจ new_server() เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจฌเจฃเจพเจ "เจธเจฐเจตเจฐ" เจธเจพเจ•เจŸ เจฆเจพ เจซเจพเจˆเจฒ เจกเจฟเจธเจ•เฉเจฐเจฟเจชเจŸเจฐ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ socket(), bind() ะธ listen() เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจฌเจฒเฉŒเจ•เจฟเฉฐเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจ†เจ‰เจฃ เจตเจพเจฒเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจจ เจฆเฉ‡ เจธเจฎเจฐเฉฑเจฅเฅค

new_server() เจซเฉฐเจ•เจธเจผเจจ เจฆเจฟเจ–เจพเจ“

static int new_server(bool reuse_port) {
    int fd;
    SAFE_CALL((fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, IPPROTO_TCP)),
              -1);

    if (reuse_port) {
        SAFE_CALL(
            setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &(int){1}, sizeof(int)),
            -1);
    }

    struct sockaddr_in addr = {.sin_family = AF_INET,
                               .sin_port = htons(SERVER_PORT),
                               .sin_addr = {.s_addr = inet_addr(SERVER_IPV4)},
                               .sin_zero = {0}};

    SAFE_CALL(bind(fd, (struct sockaddr *)&addr, sizeof(addr)), -1);
    SAFE_CALL(listen(fd, SERVER_BACKLOG), -1);
    return fd;
}

  • เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจธเจพเจ•เจŸ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจซเจฒเฉˆเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ—เฉˆเจฐ-เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฃเจพเจ‡เจ† เจ—เจฟเจ† เจนเฉˆ SOCK_NONBLOCKเจ‡เจธ เจฒเจˆ เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš on_accept() (เจนเฉ‹เจฐ เจชเฉœเฉเจนเฉ‹) เจธเจฟเจธเจŸเจฎ เจ•เจพเจฒ accept() เจฅเจฐเจฟเฉฑเจก เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฐเฉ‹เจ•เจฟเจ†เฅค
  • เจœเฉ‡ reuse_port เจฌเจฐเจพเจฌเจฐ true, เจซเจฟเจฐ เจ‡เจน เจซเฉฐเจ•เจธเจผเจจ เจธเจพเจ•เจŸ เจจเฉ‚เฉฐ เจตเจฟเจ•เจฒเจช เจฆเฉ‡ เจจเจพเจฒ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเฉ‡เจ—เจพ SO_REUSEPORT เจฆเฉเจ†เจฐเจพ setsockopt()เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจ‡เฉฑเจ•เฉ‹ เจชเฉ‹เจฐเจŸ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ ("เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ" เจญเจพเจ— เจตเฉ‡เจ–เฉ‹)เฅค

เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ on_accept() OS เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจพเจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ EPOLLIN, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจจเจตเจพเจ‚ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจตเฉ€เจ•เจพเจฐ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค on_accept() เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ‡เจธเจจเฉ‚เฉฐ เจ—เฉˆเจฐ-เจฌเจฒเฉŒเจ•เจฟเฉฐเจ— เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเจพเจฒ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ on_recv() เจ‡เฉฑเจ• I/O เจฐเจฟเจเจ•เจŸเจฐ เจตเจฟเฉฑเจš.

on_accept() เจซเฉฐเจ•เจธเจผเจจ เจฆเจฟเจ–เจพเจ“

static void on_accept(void *arg, int fd, uint32_t events) {
    int incoming_conn;
    SAFE_CALL((incoming_conn = accept(fd, NULL, NULL)), -1);
    set_nonblocking(incoming_conn);
    SAFE_CALL(reactor_register(reactor, incoming_conn, EPOLLIN, on_recv,
                               request_buffer_new()),
              -1);
}

เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ on_recv() OS เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจพเจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ EPOLLIN, เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฐเจœเจฟเจธเจŸเจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ on_accept(), เจกเจพเจŸเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเฉˆเฅค

on_recv() เจ•เจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เจ‚ เจกเจพเจŸเจพ เจชเฉœเฉเจนเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• HTTP เจฌเฉ‡เจจเจคเฉ€ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจชเฉเจฐเจพเจชเจค เจจเจนเฉ€เจ‚ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€, เจซเจฟเจฐ เจ‡เจน เจ‡เฉฑเจ• เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ on_send() เจ‡เฉฑเจ• HTTP เจœเจตเจพเจฌ เจญเฉ‡เจœเจฃ เจฒเจˆ. เจœเฉ‡เจ•เจฐ เจ•เจฒเจพเจ‡เฉฐเจŸ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจคเฉ‹เฉœเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจธเจพเจ•เจŸ เจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐเจก เจ…เจคเฉ‡ เจฌเฉฐเจฆ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ close().

เจซเฉฐเจ•เจธเจผเจจ on_recv() เจฆเจฟเจ–เจพเจ“

static void on_recv(void *arg, int fd, uint32_t events) {
    RequestBuffer *buffer = arg;

    // ะŸั€ะธะฝะธะผะฐะตะผ ะฒั…ะพะดะฝั‹ะต ะดะฐะฝะฝั‹ะต ะดะพ ั‚ะตั… ะฟะพั€, ั‡ั‚ะพ recv ะฒะพะทะฒั€ะฐั‚ะธั‚ 0 ะธะปะธ ะพัˆะธะฑะบัƒ
    ssize_t nread;
    while ((nread = recv(fd, buffer->data + buffer->size,
                         REQUEST_BUFFER_CAPACITY - buffer->size, 0)) > 0)
        buffer->size += nread;

    // ะšะปะธะตะฝั‚ ะพะฑะพั€ะฒะฐะป ัะพะตะดะธะฝะตะฝะธะต
    if (nread == 0) {
        SAFE_CALL(reactor_deregister(reactor, fd), -1);
        SAFE_CALL(close(fd), -1);
        request_buffer_destroy(buffer);
        return;
    }

    // read ะฒะตั€ะฝัƒะป ะพัˆะธะฑะบัƒ, ะพั‚ะปะธั‡ะฝัƒัŽ ะพั‚ ะพัˆะธะฑะบะธ, ะฟั€ะธ ะบะพั‚ะพั€ะพะน ะฒั‹ะทะพะฒ ะทะฐะฑะปะพะบะธั€ัƒะตั‚
    // ะฟะพั‚ะพะบ
    if (errno != EAGAIN && errno != EWOULDBLOCK) {
        request_buffer_destroy(buffer);
        fail("read");
    }

    // ะŸะพะปัƒั‡ะตะฝ ะฟะพะปะฝั‹ะน HTTP ะทะฐะฟั€ะพั ะพั‚ ะบะปะธะตะฝั‚ะฐ. ะขะตะฟะตั€ัŒ ั€ะตะณะธัั‚ั€ะธั€ัƒะตะผ ะพะฑั€ะฐะฑะพั‚ั‡ะธะบะฐ
    // ัะพะฑั‹ั‚ะธะน ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ ะดะฐะฝะฝั‹ั…
    if (request_buffer_is_complete(buffer)) {
        request_buffer_clear(buffer);
        SAFE_CALL(reactor_reregister(reactor, fd, EPOLLOUT, on_send, buffer),
                  -1);
    }
}

เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ on_send() OS เจฆเฉเจ†เจฐเจพ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจคเจฟเจ†เจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจพเจฒ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ EPOLLOUT, เจฎเจคเจฒเจฌ เจ•เจฟ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจฐเจœเจฟเจธเจŸเจฐ เจนเฉ‹เจ‡เจ† เจนเฉˆ on_recv(), เจกเจพเจŸเจพ เจญเฉ‡เจœเจฃ เจฒเจˆ เจคเจฟเจ†เจฐ เจนเฉˆเฅค เจ‡เจน เจซเฉฐเจ•เจธเจผเจจ เจ•เจฒเจพเจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจšเจฟเฉฑเจคเจฐ เจฆเฉ‡ เจจเจพเจฒ HTML เจตเจพเจฒเจพ เจ‡เฉฑเจ• HTTP เจœเจตเจพเจฌ เจญเฉ‡เจœเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฆเจพ เจนเฉˆ on_recv().

on_send() เจซเฉฐเจ•เจธเจผเจจ เจฆเจฟเจ–เจพเจ“

static void on_send(void *arg, int fd, uint32_t events) {
    const char *content = "<img "
                          "src="https://habrastorage.org/webt/oh/wl/23/"
                          "ohwl23va3b-dioerobq_mbx4xaw.jpeg">";
    char response[1024];
    sprintf(response,
            "HTTP/1.1 200 OK" CRLF "Content-Length: %zd" CRLF "Content-Type: "
            "text/html" DOUBLE_CRLF "%s",
            strlen(content), content);

    SAFE_CALL(send(fd, response, strlen(response), 0), -1);
    SAFE_CALL(reactor_reregister(reactor, fd, EPOLLIN, on_recv, arg), -1);
}

เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš http_server.c, เจซเฉฐเจ•เจธเจผเจจ เจตเจฟเฉฑเจš main() เจ…เจธเฉ€เจ‚ เจตเจฐเจค เจ•เฉ‡ เจ‡เฉฑเจ• I/O เจฐเจฟเจเจ•เจŸเจฐ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ reactor_new(), เจ‡เฉฑเจ• เจธเจฐเจตเจฐ เจธเจพเจ•เจŸ เจฌเจฃเจพเจ“ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจฐเจœเจฟเจธเจŸเจฐ เจ•เจฐเฉ‹, เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹ reactor_run() เจฌเจฟเจฒเจ•เฉเจฒ เจ‡เฉฑเจ• เจฎเจฟเฉฐเจŸ เจฒเจˆ, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจธเจฐเฉ‹เจค เจœเจพเจฐเฉ€ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเฉ‹เจ‚ เจฌเจพเจนเจฐ เจ† เจœเจพเจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค

http_server.c เจฆเจฟเจ–เจพเจ“

#include "reactor.h"

static Reactor *reactor;

#include "common.h"

int main(void) {
    SAFE_CALL((reactor = reactor_new()), NULL);
    SAFE_CALL(
        reactor_register(reactor, new_server(false), EPOLLIN, on_accept, NULL),
        -1);
    SAFE_CALL(reactor_run(reactor, SERVER_TIMEOUT_MILLIS), -1);
    SAFE_CALL(reactor_destroy(reactor), -1);
}

เจ†เจ“ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ เจ•เจฟ เจธเจญ เจ•เฉเจ เจ‰เจฎเฉ€เจฆ เจ…เจจเฉเจธเจพเจฐ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆเฅค เจ•เฉฐเจชเจพเจ‡เจฒเจฟเฉฐเจ— (chmod a+x compile.sh && ./compile.sh เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฐเฉ‚เจŸ เจตเจฟเฉฑเจš) เจ…เจคเฉ‡ เจธเจตเฉˆ-เจฒเจฟเจ–เจค เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจฒเจพเจ‚เจš เจ•เจฐเฉ‹, เจ–เฉ‹เจฒเฉเจนเฉ‹ http://127.0.0.1:18470 เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจ…เจคเฉ‡ เจฆเฉ‡เจ–เฉ‹ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจ•เฉ€ เจ‰เจฎเฉ€เจฆ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจฎเจพเจช

เจฎเฉ‡เจฐเฉ€ เจ•เจพเจฐ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเจฟเจ–เจพเจ“

$ screenfetch
 MMMMMMMMMMMMMMMMMMMMMMMMMmds+.        OS: Mint 19.1 tessa
 MMm----::-://////////////oymNMd+`     Kernel: x86_64 Linux 4.15.0-20-generic
 MMd      /++                -sNMd:    Uptime: 2h 34m
 MMNso/`  dMM    `.::-. .-::.` .hMN:   Packages: 2217
 ddddMMh  dMM   :hNMNMNhNMNMNh: `NMm   Shell: bash 4.4.20
     NMm  dMM  .NMN/-+MMM+-/NMN` dMM   Resolution: 1920x1080
     NMm  dMM  -MMm  `MMM   dMM. dMM   DE: Cinnamon 4.0.10
     NMm  dMM  -MMm  `MMM   dMM. dMM   WM: Muffin
     NMm  dMM  .mmd  `mmm   yMM. dMM   WM Theme: Mint-Y-Dark (Mint-Y)
     NMm  dMM`  ..`   ...   ydm. dMM   GTK Theme: Mint-Y [GTK2/3]
     hMM- +MMd/-------...-:sdds  dMM   Icon Theme: Mint-Y
     -NMm- :hNMNNNmdddddddddy/`  dMM   Font: Noto Sans 9
      -dMNs-``-::::-------.``    dMM   CPU: Intel Core i7-6700 @ 8x 4GHz [52.0ยฐC]
       `/dMNmy+/:-------------:/yMMM   GPU: NV136
          ./ydNMMMMMMMMMMMMMMMMMMMMM   RAM: 2544MiB / 7926MiB
             .MMMMMMMMMMMMMMMMMMM

เจ†เจ‰ เจ‡เฉฑเจ• เจธเจฟเฉฐเจ—เจฒ-เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ เจฆเฉ€ เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจจเฉ‚เฉฐ เจฎเจพเจชเฉ€เจเฅค เจ†เจ‰ เจฆเฉ‹ เจŸเจฐเจฎเฉ€เจจเจฒ เจ–เฉ‹เจฒเฉเจนเฉ€เจ: เจ‡เฉฑเจ• เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจšเฉฑเจฒเจพเจ‚เจ—เฉ‡ ./http_server, เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจตเจฟเฉฑเจš - เจ•เฉเจฐเจ•. เจ‡เฉฑเจ• เจฎเจฟเฉฐเจŸ เจฌเจพเจ…เจฆ, เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ…เฉฐเจ•เฉœเฉ‡ เจฆเฉ‚เจœเฉ‡ เจŸเจฐเจฎเฉ€เจจเจฒ เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡:

$ wrk -c100 -d1m -t8 http://127.0.0.1:18470 -H "Host: 127.0.0.1:18470" -H "Accept-Language: en-US,en;q=0.5" -H "Connection: keep-alive"
Running 1m test @ http://127.0.0.1:18470
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   493.52us   76.70us  17.31ms   89.57%
    Req/Sec    24.37k     1.81k   29.34k    68.13%
  11657769 requests in 1.00m, 1.60GB read
Requests/sec: 193974.70
Transfer/sec:     27.19MB

เจธเจพเจกเจพ เจธเจฟเฉฐเจ—เจฒ-เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ 11 เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจคเฉ‹เจ‚ เจชเฉˆเจฆเจพ เจนเฉ‹เจฃ เจตเจพเจฒเฉ€เจ†เจ‚ เจชเฉเจฐเจคเฉ€ เจฎเจฟเฉฐเจŸ 100 เจฎเจฟเจฒเฉ€เจ…เจจ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€เฅค เจฌเฉเจฐเจพ เจจเจคเฉ€เจœเจพ เจจเจนเฉ€เจ‚, เจชเจฐ เจ•เฉ€ เจ‡เจธ เจจเฉ‚เฉฐ เจธเฉเจงเจพเจฐเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ?

เจฎเจฒเจŸเฉ€เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ

เจœเจฟเจตเฉ‡เจ‚ เจ‰เฉฑเจชเจฐ เจฆเฉฑเจธเจฟเจ† เจ—เจฟเจ† เจนเฉˆ, I/O เจฐเจฟเจเจ•เจŸเจฐ เจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจฅเฉเจฐเฉˆเจกเจพเจ‚ เจตเจฟเฉฑเจš เจฌเจฃเจพเจ‡เจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจพเจฐเฉ‡ CPU เจ•เฉ‹เจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค เจ†เจ“ เจ‡เจธ เจชเจนเฉเฉฐเจš เจจเฉ‚เฉฐ เจ…เจฎเจฒ เจตเจฟเฉฑเจš เจฒเจฟเจ†เจˆเจ:

http_server_multithreaded.c เจฆเจฟเจ–เจพเจ“

#include "reactor.h"

static Reactor *reactor;
#pragma omp threadprivate(reactor)

#include "common.h"

int main(void) {
#pragma omp parallel
    {
        SAFE_CALL((reactor = reactor_new()), NULL);
        SAFE_CALL(reactor_register(reactor, new_server(true), EPOLLIN,
                                   on_accept, NULL),
                  -1);
        SAFE_CALL(reactor_run(reactor, SERVER_TIMEOUT_MILLIS), -1);
        SAFE_CALL(reactor_destroy(reactor), -1);
    }
}

เจนเฉเจฃ เจนเจฐ เจฅเจฐเจฟเฉฑเจก เจ‰เจธ เจฆเจพ เจ†เจชเจฃเจพ เจนเฉˆ เจฐเจฟเจเจ•เจŸเจฐ:

static Reactor *reactor;
#pragma omp threadprivate(reactor)

เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจ•เจฟ เจซเฉฐเจ•เจธเจผเจจ เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ new_server() เจฎเจฟเจนเจฐเจฌเจพเจจเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆ true. เจ‡เจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเจฐเจตเจฐ เจธเจพเจ•เจŸ เจจเฉ‚เฉฐ เจตเจฟเจ•เจฒเจช เจธเฉŒเจ‚เจชเจฆเฉ‡ เจนเจพเจ‚ SO_REUSEPORTเจ‡เจธ เจจเฉ‚เฉฐ เจฎเจฒเจŸเฉ€-เจฅเจฐเจฟเฉฑเจกเจก เจตเจพเจคเจพเจตเจฐเจจ เจตเจฟเฉฑเจš เจตเจฐเจคเจฃ เจฒเจˆเฅค เจคเฉเจธเฉ€เจ‚ เจนเฉ‹เจฐ เจตเฉ‡เจฐเจตเฉ‡ เจชเฉœเฉเจน เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ‡เฉฑเจฅเฉ‡.

เจฆเฉ‚เจœเฉ€ เจฆเฉŒเฉœ

เจ†เจ‰ เจนเฉเจฃ เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจธเจฐเจตเจฐ เจฆเฉ€ เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจจเฉ‚เฉฐ เจฎเจพเจชเฉ€เจ:

$ wrk -c100 -d1m -t8 http://127.0.0.1:18470 -H "Host: 127.0.0.1:18470" -H "Accept-Language: en-US,en;q=0.5" -H "Connection: keep-alive"
Running 1m test @ http://127.0.0.1:18470
  8 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.14ms    2.53ms  40.73ms   89.98%
    Req/Sec    79.98k    18.07k  154.64k    78.65%
  38208400 requests in 1.00m, 5.23GB read
Requests/sec: 635876.41
Transfer/sec:     89.14MB

1 เจฎเจฟเฉฐเจŸ เจตเจฟเฉฑเจš เจชเฉเจฐเฉ‹เจธเฉˆเจธ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ ~3.28 เจ—เฉเจฃเจพ เจตเจง เจ—เจˆ เจนเฉˆ! เจชเจฐ เจ…เจธเฉ€เจ‚ เจฐเจพเจ‰เจ‚เจก เจจเฉฐเจฌเจฐ เจคเฉ‹เจ‚ เจธเจฟเจฐเจซ ~XNUMX เจฎเจฟเจฒเฉ€เจ…เจจ เจ˜เฉฑเจŸ เจธเฉ€, เจ‡เจธ เจฒเจˆ เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจเฅค

เจชเจนเจฟเจฒเจพเจ‚ เจœเจจเจฐเฉ‡เจŸ เจ•เฉ€เจคเฉ‡ เจ—เจ เจ…เฉฐเจ•เฉœเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ–เฉ€เจ เจธเฉฐเจชเฉ‚เจฐเจฃ:

$ sudo perf stat -B -e task-clock,context-switches,cpu-migrations,page-faults,cycles,instructions,branches,branch-misses,cache-misses ./http_server_multithreaded

 Performance counter stats for './http_server_multithreaded':

     242446,314933      task-clock (msec)         #    4,000 CPUs utilized          
         1โ€ฏ813โ€ฏ074      context-switches          #    0,007 M/sec                  
             4โ€ฏ689      cpu-migrations            #    0,019 K/sec                  
               254      page-faults               #    0,001 K/sec                  
   895โ€ฏ324โ€ฏ830โ€ฏ170      cycles                    #    3,693 GHz                    
   621โ€ฏ378โ€ฏ066โ€ฏ808      instructions              #    0,69  insn per cycle         
   119โ€ฏ926โ€ฏ709โ€ฏ370      branches                  #  494,653 M/sec                  
     3โ€ฏ227โ€ฏ095โ€ฏ669      branch-misses             #    2,69% of all branches        
           808โ€ฏ664      cache-misses                                                

      60,604330670 seconds time elapsed

CPU เจเจซเฉ€เจจเจฟเจŸเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ, เจจเจพเจฒ เจธเฉฐเจ•เจฒเจจ -march=native, เจชเฉ€.เจœเฉ€.เจ“, เจนเจฟเฉฑเจŸ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจฟเฉฑเจš เจตเจพเจงเจพ เจ•เฉˆเจธเจผ, เจตเจพเจงเจพ MAX_EVENTS เจ…เจคเฉ‡ เจตเจฐเจคเฉ‹ EPOLLET เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเจพเจงเจพ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฑเจคเจพ. เจชเจฐ เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจธเจฎเจ•เจพเจฒเฉ€ เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ•เฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ?

352 เจ‡เฉฑเจ•เฉ‹ เจธเจฎเฉ‡เจ‚ เจฆเฉ‡ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฒเจˆ เจ…เฉฐเจ•เฉœเฉ‡:

$ wrk -c352 -d1m -t8 http://127.0.0.1:18470 -H "Host: 127.0.0.1:18470" -H "Accept-Language: en-US,en;q=0.5" -H "Connection: keep-alive"
Running 1m test @ http://127.0.0.1:18470
  8 threads and 352 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.12ms    3.79ms  68.23ms   87.49%
    Req/Sec    83.78k    12.69k  169.81k    83.59%
  40006142 requests in 1.00m, 5.48GB read
Requests/sec: 665789.26
Transfer/sec:     93.34MB

เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจจเจคเฉ€เจœเจพ เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจฆเจฟเจฒเจšเจธเจช เจ—เฉเจฐเจพเจซเจผ เจ•เจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ† 'เจคเฉ‡ 1 เจฎเจฟเฉฐเจŸ เจตเจฟเฉฑเจš เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเฉ€ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

เจชเฉ‚เจฐเฉ€-เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจตเจพเจฒเจพ เจฌเฉ‡เจ…เจฐ-เจธเฉ€ I/O เจฐเจฟเจเจ•เจŸเจฐ

เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจฆเฉ‹ เจธเฉŒ เจ•เฉเจจเฉˆเจ•เจธเจผเจจเจพเจ‚ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจฆเฉ‹เจตเจพเจ‚ เจธเจฐเจตเจฐเจพเจ‚ เจฒเจˆ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€เจ†เจ‚ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจ˜เฉฑเจŸ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ (เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจธเฉฐเจธเจ•เจฐเจฃ เจตเจฟเฉฑเจš เจ‡เจน เจตเจงเฉ‡เจฐเฉ‡ เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ)เฅค เจ•เฉ€ เจ‡เจน เจฒเฉ€เจจเจ•เจธ TCP/IP เจธเจŸเฉˆเจ• เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจจเจพเจฒ เจธเจฌเฉฐเจงเจค เจนเฉˆ? เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจฎเจฒเจŸเฉ€-เจฅเฉเจฐเฉˆเจกเจก เจ…เจคเฉ‡ เจธเจฟเฉฐเจ—เจฒ-เจฅเฉเจฐเฉˆเจกเจก เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฒเจˆ เจ—เฉเจฐเจพเจซ เจฆเฉ‡ เจ‡เจธ เจตเจฟเจตเจนเจพเจฐ เจ…เจคเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจฌเจพเจฐเฉ‡ เจ†เจชเจฃเฉ€เจ†เจ‚ เจงเจพเจฐเจจเจพเจตเจพเจ‚ เจฒเจฟเจ–เจฃ เจฒเจˆ เจธเฉเจคเฉฐเจคเจฐ เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเฉ‹เฅค

เจ•เจฐเจจเจพ เจจเฉ‹เจŸ เจ•เฉ€เจคเจพ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš, เจ‡เจน เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจŸเฉˆเจธเจŸ เจ…เจธเจฒ เจฒเฉ‹เจกเจพเจ‚ เจฆเฉ‡ เจ…เจงเฉ€เจจ I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ‡ เจตเจฟเจตเจนเจพเจฐ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฒเจ—เจญเจ— เจนเจฎเฉ‡เจธเจผเจพเจ‚ เจธเจฐเจตเจฐ เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจจเจพเจฒ เจ‡เฉฐเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจฆเจพ เจนเฉˆ, เจฒเฉŒเจ—เจธ เจจเฉ‚เฉฐ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเจฆเจพ เจนเฉˆ, เจ•เฉเจฐเจฟเจชเจŸเฉ‹เจ—เฉเจฐเจพเจซเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ TLS เจ†เจฆเจฟ, เจœเจฟเจธ เจฆเฉ‡ เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚ เจฒเฉ‹เจก เจ—เฉˆเจฐ-เจฏเฉ‚เจจเฉ€เจซเจพเจฐเจฎ (เจ—เจคเฉ€เจธเจผเฉ€เจฒ) เจฌเจฃ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค I/O เจชเฉเจฐเฉ‹เจเจ•เจŸเจฐ เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจฆเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจŸเฉˆเจธเจŸ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡เฅค

I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจธเจฎเจเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ•เจฟ I/O เจฐเจฟเจเจ•เจŸเจฐ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ…เจฐเจฅเจพเจค:

  • เจฎเจฒเจŸเฉ€-เจฅเจฐเจฟเฉฑเจกเจก เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• I/O เจฐเจฟเจเจ•เจŸเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ•เฉเจ เจนเฉ‹เจฐ เจฎเฉเจธเจผเจ•เจฒ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจชเฉเจฐเจตเจพเจน เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจเจพ เจชเจเจ—เจพเฅค
  • เจ…เจญเจฟเจ†เจธ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ—เฉˆเจฐ-เจฏเฉ‚เจจเฉ€เจซเจพเจฐเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจ‡เฉฑเจ• เจฅเจฐเจฟเฉฑเจก เจฒเฉŒเจ—เจฟเฉฐเจ— เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจฆเฉ‚เจœเจพ เจ•เฉฐเจฎ เจตเจฟเฉฑเจš เจฐเฉเฉฑเจเจฟเจ† เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค
  • เจœเฉ‡เจ•เจฐ เจ‡เฉฑเจ• เจ‡เจตเฉˆเจ‚เจŸ เจนเฉˆเจ‚เจกเจฒเจฐ เจ‡เฉฑเจ• เจฅเจฐเจฟเฉฑเจก เจจเฉ‚เฉฐ เจฌเจฒเฉŒเจ• เจ•เจฐเจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจธเจฟเจธเจŸเจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจ–เฉเจฆ เจตเฉ€ เจฌเจฒเฉŒเจ• เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจœเจฟเจธ เจจเจพเจฒ เจฒเฉฑเจญเจฃ เจตเจฟเฉฑเจš เจฎเฉเจธเจผเจ•เจฒ เจฌเฉฑเจ— เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค

เจ‡เจนเจจเจพเจ‚ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ I/O เจชเฉเจฐเฉ‹เจเจ•เจŸเจฐ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจ…เจ•เจธเจฐ เจ‡เฉฑเจ• เจธเจผเจกเจฟเจŠเจฒเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเฉ‹ เจฅเจฐเจฟเฉฑเจกเจพเจ‚ เจฆเฉ‡ เจ‡เฉฑเจ• เจชเฉ‚เจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจจเฉ‚เฉฐ เจธเจฎเจพเจจ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจตเฉฐเจกเจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจตเจงเฉ‡เจฐเฉ‡ เจธเฉเจตเจฟเจงเจพเจœเจจเจ• API เจตเฉ€ เจนเฉˆเฅค เจ…เจธเฉ€เจ‚ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš, เจฎเฉ‡เจฐเฉ‡ เจฆเฉ‚เจœเฉ‡ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เฉ‡.

เจธเจฟเฉฑเจŸเจพ

เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจธเจฟเจงเจพเจ‚เจค เจคเฉ‹เจ‚ เจธเจฟเฉฑเจงเจพ เจชเฉเจฐเฉ‹เจซเจพเจˆเจฒเจฐ เจเจ—เจœเจผเฉŒเจธเจŸ เจคเฉฑเจ• เจธเจพเจกเฉ€ เจฏเจพเจคเจฐเจพ เจ–เจคเจฎ เจนเฉ‹ เจ—เจˆ เจนเฉˆเฅค

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ 'เจคเฉ‡ เจงเจฟเจ†เจจ เจจเจนเฉ€เจ‚ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจตเฉฑเจ–-เจตเฉฑเจ– เจชเฉฑเจงเจฐเจพเจ‚ เจฆเฉ€ เจธเจนเฉ‚เจฒเจค เจ…เจคเฉ‡ เจ—เจคเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจจเฉˆเฉฑเจŸเจตเจฐเจ• เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจฒเจฟเจ–เจฃ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจฌเจฐเจพเจฌเจฐ เจฆเจฟเจฒเจšเจธเจช เจคเจฐเฉ€เจ•เฉ‡ เจนเจจเฅค เจฆเจฟเจฒเจšเจธเจช, เจฎเฉ‡เจฐเฉ€ เจฐเจพเจ เจตเจฟเฉฑเจš, เจฒเจฟเฉฐเจ• เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ—เจ เจนเจจ.

DO ะฝะพะฒั‹ั… ะฒัั‚ั€ะตั‡!

เจฆเจฟเจฒเจšเจธเจช เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ

เจฎเฉˆเจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ•เฉ€ เจชเฉœเฉเจนเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ?

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹