มีรายละเอียด "ต่ำ" ค่อนข้างมาก
ก่อนอื่นให้พิจารณาว่าเคอร์เนลมีรายการของกระบวนการและในเวลาใดก็ตามกระบวนการเหล่านี้บางส่วนกำลังทำงานอยู่และบางกระบวนการไม่ทำงาน เคอร์เนลอนุญาตให้แต่ละกระบวนการทำงานของเวลา CPU บางส่วนจากนั้นขัดจังหวะและเลื่อนไปยังขั้นตอนถัดไป หากไม่มีกระบวนการที่รันได้เคอร์เนลอาจออกคำสั่งเช่นHLTไปยัง CPU ซึ่งระงับ CPU จนกว่าจะมีการขัดจังหวะของฮาร์ดแวร์
ที่ใดที่หนึ่งในเซิร์ฟเวอร์คือการเรียกของระบบที่ระบุว่า "ให้บางสิ่งบางอย่างแก่ฉัน" มีสองประเภทกว้าง ๆ ของวิธีนี้สามารถทำได้ ในกรณีของ Apache ก็เรียกaccept
บนซ็อกเก็ Apache ได้เปิดก่อนหน้านี้อาจจะฟังในพอร์ต 80 เคอร์เนลรักษาคิวของความพยายามในการเชื่อมต่อและเพิ่มลงในคิวที่ทุกครั้งที่TCP SYNจะได้รับ วิธีที่เคอร์เนลรู้ว่าได้รับ TCP SYN นั้นขึ้นอยู่กับไดรเวอร์อุปกรณ์ สำหรับ NIC จำนวนมากอาจมีการขัดจังหวะฮาร์ดแวร์เมื่อได้รับข้อมูลเครือข่าย
accept
ขอให้เคอร์เนลกลับมาที่การเชื่อมต่อครั้งต่อไปให้ฉัน หากคิวไม่ว่างเปล่าให้accept
ส่งคืนทันที หากคิวว่างเปล่ากระบวนการ (Apache) จะถูกลบออกจากรายการกระบวนการที่กำลังทำงานอยู่ เมื่อการเชื่อมต่อเริ่มต้นในภายหลังกระบวนการจะดำเนินการต่อ สิ่งนี้เรียกว่า "การปิดกั้น" เนื่องจากกระบวนการที่เรียกมันaccept()
ดูเหมือนว่าฟังก์ชั่นที่ไม่ส่งคืนจนกว่าจะมีผลลัพธ์ซึ่งอาจจะมีบางเวลานับจากนี้ ในช่วงเวลานั้นกระบวนการไม่สามารถทำอะไรได้อีก
เมื่อaccept
กลับมาแล้ว Apache รู้ว่ามีใครบางคนกำลังพยายามเริ่มต้นการเชื่อมต่อ จากนั้นเรียกใช้forkเพื่อแยกกระบวนการ Apache ออกเป็นสองกระบวนการที่เหมือนกัน หนึ่งในกระบวนการเหล่านี้ดำเนินการตามคำขอ HTTP อีกสายaccept
หนึ่งอีกครั้งเพื่อรับการเชื่อมต่อครั้งต่อไป ดังนั้นจึงมีกระบวนการหลักอยู่เสมอซึ่งไม่ทำอะไรเลยนอกจากเรียกaccept
กระบวนการย่อยและวางไข่แล้วมีกระบวนการย่อยหนึ่งกระบวนการสำหรับแต่ละคำขอ
นี่คือการทำให้เข้าใจง่าย: เป็นไปได้ที่จะทำเช่นนี้กับเธรดแทนกระบวนการและเป็นไปได้ที่จะทำfork
ไว้ล่วงหน้าดังนั้นจึงมีกระบวนการของผู้ปฏิบัติงานพร้อมที่จะไปเมื่อได้รับการร้องขอซึ่งจะช่วยลดค่าใช้จ่ายในการเริ่มต้น ทั้งนี้ขึ้นอยู่กับการกำหนดค่า Apache ว่าอาจทำอย่างใดอย่างหนึ่งเหล่านี้
นั่นเป็นหมวดหมู่แรกที่กว้างของวิธีการทำและเรียกว่าการบล็อก IOเพราะระบบเรียกaccept
และread
และwrite
ที่ทำงานบนซ็อกเก็ตจะระงับกระบวนการจนกว่าพวกเขาจะมีสิ่งที่จะกลับมา
วิธีอื่น ๆ ในวงกว้างที่จะทำมันจะเรียกว่าไม่ปิดกั้นหรือเหตุการณ์หรือไม่ตรงกัน IO นี้จะดำเนินการกับสายระบบเช่นหรือselect
epoll
สิ่งเหล่านี้แต่ละคนทำสิ่งเดียวกัน: คุณให้รายการซ็อกเก็ต (หรือโดยทั่วไปตัวอธิบายไฟล์) และสิ่งที่คุณต้องการจะทำกับพวกเขาและเคอร์เนลบล็อกจนกว่ามันจะพร้อมที่จะทำสิ่งเหล่านั้น
ด้วยรุ่นนี้คุณอาจบอกเคอร์เนล (พร้อมepoll
) "บอกฉันเมื่อมีการเชื่อมต่อใหม่บนพอร์ต 80 หรือข้อมูลใหม่เพื่ออ่านบนการเชื่อมต่ออื่น ๆ ที่ฉันเปิด 9471 เหล่านี้" epoll
บล็อกจนกว่าหนึ่งในสิ่งเหล่านั้นจะพร้อมจากนั้นคุณทำมัน จากนั้นคุณทำซ้ำ ระบบเรียกเหมือนaccept
และread
และwrite
ไม่เคยบล็อกในส่วนหนึ่งเพราะเมื่อใดก็ตามที่คุณเรียกพวกเขาepoll
เพิ่งบอกคุณว่าพวกเขามีความพร้อมเพื่อให้มันน่าจะมีเหตุผลที่จะป้องกันไม่และยังเพราะเมื่อคุณเปิดซ็อกเก็ตหรือไฟล์ที่คุณระบุว่าคุณต้องการให้พวกเขา ในโหมดไม่บล็อคดังนั้นการโทรเหล่านั้นจะล้มเหลวEWOULDBLOCK
แทนที่จะปิดกั้น
ข้อดีของรุ่นนี้คือคุณต้องการเพียงหนึ่งกระบวนการ ซึ่งหมายความว่าคุณไม่ต้องจัดสรรสแต็กและโครงสร้างเคอร์เนลสำหรับแต่ละคำขอ NginxและHAProxyใช้โมเดลนี้และเป็นเหตุผลใหญ่ที่พวกเขาสามารถจัดการกับการเชื่อมต่อได้มากกว่า Apache บนฮาร์ดแวร์ที่คล้ายกัน