Hạt nhân NTP và NTPD


7

Tôi đã có một vài câu hỏi về hạt nhân NTP như được giải thích ở đây: http://www.eecis.udel.edu/~mills/database/brief/nano/nano.pdf

Câu hỏi lớn là làm thế nào để Nanokernel này quản lý để cung cấp độ chính xác thấp hơn đánh dấu đồng hồ hệ thống (chẳng hạn như độ chính xác của ns)?

Tôi có một vài câu hỏi phụ:

  1. Nếu và khi nào sửa đổi này được đưa vào nhân Linux dòng chính?
  2. Thứ hai, Nanokernel dường như sử dụng kết hợp tổng hợp của đồng hồ CPU (tại bất kỳ HZ nào được đặt thành) và bộ đếm chu kỳ đồng hồ.

"Bộ đếm chu trình quá trình (PCC) được sử dụng để nội suy micro giây hoặc nano giây giữa các ngắt đánh dấu"

Làm thế nào để nó sử dụng bộ đếm chu kỳ, bởi vì theo như tôi biết thì nó không cung cấp một ngắt, vì vậy Nanokernel có liên tục đọc giá trị đăng ký của bộ xử lý có chứa bộ đếm hiện tại không?

  1. Cuối cùng, NTPD có bao giờ sửa đổi tần số xung nhịp CPU hay chỉ duy trì đồng hồ phần mềm nơi áp dụng điều chỉnh đồng hồ tính toán?

Về số 2, việc đồng bộ hóa thời gian chính xác nhất trong NTP đạt được bằng cách sử dụng tín hiệu Xung mỗi giây (PPS) kích hoạt ngắt chính xác vào đầu giây (được cung cấp đúng thiết lập, ví dụ, bạn thậm chí có thể phải tính đến độ trễ do chiều dài dây). Đối với # 3, "đồng hồ" nào bạn đang đề cập đến? Hầu hết các CPU x86 hiện đại đều sử dụng TSC cho nguồn xung nhịp, nhưng nó chỉ là một bộ đếm. Kernel có biểu diễn thời gian UTC thực và đây là những gì đang được cập nhật bằng cách tăng tốc hoặc làm chậm đồng hồ dựa trên bộ đếm TSC.
Thomas Guyot-Sionnest

Câu trả lời:


2

Lưu ý: Mặc dù NTP có ý tưởng về hạt nhân nano có thể được sử dụng để vá các hệ điều hành không sử dụng NTP, nhưng đặc biệt trong Linux không có trong trường hợp này. Mã NTP nằm trong chính hạt nhân như bạn đã nói ở câu hỏi 1 .

0: Làm thế nào để Nanokernel này quản lý để cung cấp độ chính xác thấp hơn đánh dấu đồng hồ hệ thống (chẳng hạn như độ chính xác của ns)?

Độ chính xác lớn hơn độ chính xác đánh dấu đồng hồ hệ thống được thực hiện bằng cách dựa vào độ chính xác tổng hợp của (các) máy tính hoặc thiết bị khác. Đánh dấu đồng hồ hệ thống cho biết tần suất cập nhật của máy tính này. Tuy nhiên, số lượng vị trí chính xác được xác định trong phần mềm cụ thể được sử dụng, chẳng hạn như HĐH thường dựa trên các tiêu chuẩn POSIX. Các tiêu chuẩn POSIX cho một số cấu trúc thời gian đi xuống độ chính xác nano giây như bạn đề cập.

Để xem làm thế nào chúng ta có thể có được độ chính xác lớn hơn độ chính xác của đồng hồ hệ thống, giả sử trên máy tính của tôi, tôi đã gắn vào nó một thiết bị GPS hoặc một loại đồng hồ nguyên tử lạ mắt nào đó. Bất cứ khi nào ai đó hỏi tôi mấy giờ, tôi chỉ cần tham khảo đồng hồ đó và đưa ra.

Nếu ntp nằm trong kernel như với Linux, thì thời gian của thiết bị GPS này thay vì thời gian của đồng hồ hệ thống có thể được sử dụng trong các cuộc gọi gettimeofday () .

Đối với đồng hồ của máy tính, chắc chắn, tôi so sánh thời gian tôi nhận được với GPS hoặc đồng hồ nguyên tử với những gì máy tính và khi nó vượt quá tích tắc, tôi sắp xếp để điều chỉnh lại bằng cách sử dụng adjtime () được mô tả trong câu trả lời cho câu hỏi 3 .

  1. Nếu và khi nào sửa đổi này được đưa vào nhân Linux dòng chính?

Ý tưởng Nok Nanokernel được giới thiệu trong phiên bản ntp 4.0, quay trở lại ít nhất là vào năm 1998. Tôi nghĩ rằng nó đã có trong nhân Linux ở một số dạng kể từ ít nhất là 2.2.36. Nhật ký github của linux báo cáo ngày 1 tháng 10 năm 2006 như khi mã ntp được tách riêng thành tệp riêng ntp.ctrong kernel. Nhưng tất nhiên nó ở đó từ trước.

Tóm lại, không ai trong số này là mới.

  1. Làm thế nào để nó sử dụng bộ đếm chu kỳ, bởi vì theo như tôi biết thì nó không cung cấp một ngắt, vì vậy Nanokernel có liên tục đọc giá trị đăng ký của bộ xử lý có chứa bộ đếm hiện tại không?

Nó sử dụng điều này giống như bất kỳ chương trình khác sẽ đọc một biến chương trình. Khi mã sử dụng nó chạy và giá trị là cần thiết, giả sử vì nó đã lấy lại thông tin mới, nó sẽ đọc biến và cập nhật nó. Nếu ai đó cần có thời gian, nó cũng sử dụng nó trong tính toán đó. Vì vậy, trừ khi mã được viết theo cách thực sự ngu ngốc (và tôi khá chắc chắn là không phải vậy), không, nó không "liên tục đọc giá trị đăng ký của bộ xử lý" nhiều hơn mức cần thiết.

  1. Cuối cùng, NTPD có bao giờ sửa đổi tần số xung nhịp CPU hay chỉ duy trì đồng hồ phần mềm nơi áp dụng điều chỉnh đồng hồ tính toán?

Nó sử dụng lệnh gọi hệ thống adjtime () quay trở lại ngay cả trước năm 1998. Thời gian điều chỉnh nào được sắp xếp theo định kỳ để bộ đếm đồng hồ bỏ lỡ một mức tăng để làm chậm hoặc tăng hơn 1 để tăng tốc.


"Làm thế nào chúng ta có thể có được độ chính xác lớn hơn độ chính xác của đồng hồ hệ thống" -> Vì đồng hồ hệ thống là một sự trừu tượng hóa phần mềm, tôi nghĩ rằng có một số cơ hội trong mã hạt nhân để có thời gian phân giải cao hơn nhiều mà không cần nguồn bên ngoài (đồng hồ nguyên tử, v.v. ) - sau tất cả, nó vẫn duy trì đánh dấu phần mềm đó và nó không làm điều đó một cách tùy tiện, Có lẽ nền tảng của điều này là tần số CPU, thường sẽ ở quy mô nano giây.
goldilocks

1
@goldilocks vâng, tôi nghĩ điều này cũng xảy ra. Sau khi NTP đã chạy được một lúc, nó sẽ đọc được "độ trôi" của đồng hồ hệ thống. Nó sử dụng điều đó để dự đoán thời gian trong tương lai. Tuy nhiên, bạn vẫn cần một cái gì đó chính xác hơn để có được hiệu chuẩn. (Thật ra thì không: bạn chỉ có thể tạo ra giá trị này từ toàn bộ vải và đặt nó trong tệp "drift" của ntp mà nó đọc.)
rocky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.