Lý lịch:
Chi phí cuộc gọi hệ thống lớn hơn nhiều so với chi phí cuộc gọi chức năng (phạm vi ước tính từ 20-100x) chủ yếu là do chuyển ngữ cảnh từ không gian người dùng sang không gian kernel và ngược lại. Thông thường các chức năng nội tuyến để lưu chi phí cuộc gọi chức năng và các cuộc gọi chức năng rẻ hơn nhiều so với các tòa nhà cao tầng. Lý do là các nhà phát triển muốn tránh một số cuộc gọi trên hệ thống bằng cách chăm sóc càng nhiều hoạt động trong nhân trong một tòa nhà càng tốt.
Vấn đề:
Điều này đã tạo ra rất nhiều cuộc gọi hệ thống (không cần thiết?) Như sendmmsg () , recvmmsg () cũng như chdir, mở, lseek và / hoặc sự kết hợp liên kết tượng trưng như: openat
, mkdirat
, mknodat
, fchownat
, futimesat
, newfstatat
, unlinkat
, fchdir
, ftruncate
, fchmod
, renameat
, linkat
, symlinkat
, readlinkat
, fchmodat
, faccessat
, lsetxattr
, fsetxattr
, execveat
, lgetxattr
, llistxattr
, lremovexattr
, fremovexattr
, flistxattr
, fgetxattr
, pread
, pwrite
vv ...
Bây giờ Linux đã thêm vào copy_file_range()
mà dường như kết hợp đọc lseek và viết các tòa nhà. Vấn đề chỉ còn là thời gian trước khi điều này trở thành fcopy_file_range (), lcopy_file_range (), copy_file_rangeat (), fcopy_file_rangeat () và lcopy_file_rangeat () ... nhưng vì có 2 tệp liên quan đến X hơn. OK, Linus và các nhà phát triển BSD khác nhau sẽ không đi xa đến thế, nhưng quan điểm của tôi là nếu có một tòa nhà theo lô, tất cả (hầu hết?) Có thể được thực hiện trong không gian người dùng và giảm độ phức tạp của hạt nhân mà không cần thêm nhiều nếu bất kỳ chi phí ở phía libc.
Nhiều giải pháp phức tạp đã được đề xuất bao gồm một số dạng chuỗi tòa nhà đặc biệt cho các tòa nhà không chặn cho các tòa nhà quy trình hàng loạt; tuy nhiên các phương thức này thêm độ phức tạp đáng kể cho cả kernel và không gian người dùng theo cách tương tự như libxcb so với libX11 (các cuộc gọi không đồng bộ yêu cầu thiết lập nhiều hơn)
Giải pháp?:
Một tòa nhà chung chung. Điều này sẽ giảm bớt chi phí lớn nhất (nhiều công tắc chuyển đổi chế độ) mà không có sự phức tạp liên quan đến việc có luồng nhân chuyên biệt (mặc dù chức năng đó có thể được thêm vào sau).
Về cơ bản đã có một cơ sở tốt cho một nguyên mẫu trong tòa nhà của socketcall (). Chỉ cần mở rộng nó từ việc lấy một mảng các đối số để thay vào đó là một mảng trả về, con trỏ tới các mảng của các đối số (bao gồm số s chọc trời), số lượng các tòa nhà và một đối số cờ ... đại loại như:
batch(void *returns, void *args, long ncalls, long flags);
Một điểm khác biệt lớn là tất cả các đối số có thể cần phải là con trỏ cho đơn giản để kết quả của các tòa nhà trước có thể được sử dụng bởi các tòa nhà tiếp theo (ví dụ: bộ mô tả tệp open()
để sử dụng trong read()
/ write()
)
Một số lợi thế có thể:
- ít không gian người dùng -> không gian kernel -> chuyển đổi không gian người dùng
- trình biên dịch có thể chuyển đổi -fcombine-s tòa nhà để cố gắng tự động hàng loạt
- cờ tùy chọn cho hoạt động không đồng bộ (trả về fd để xem ngay)
- khả năng thực hiện các chức năng tòa nhà kết hợp trong tương lai trong không gian người dùng
Câu hỏi:
Có khả thi để thực hiện một tòa nhà cao tầng không?
- Tôi có thiếu một số vấn đề rõ ràng không?
- Tôi có đánh giá quá cao lợi ích không?
Có đáng để tôi bận tâm triển khai một tòa nhà cao tầng không (tôi không làm việc tại Intel, Google hay Redhat)?
- Tôi đã vá kernel của chính mình trước đây, nhưng sợ xử lý với LKML.
- Lịch sử đã chỉ ra rằng ngay cả khi một cái gì đó hữu ích rộng rãi cho người dùng "bình thường" (người dùng cuối không phải là công ty không có quyền truy cập git write), nó có thể không bao giờ được chấp nhận ngược dòng (unionfs, aufs, cryptodev, tuxonice, v.v ...)
Người giới thiệu:
batch
tòa nhà cao tầng vào cácbatch
tòa nhà cao tầng, bạn có thể tạo ra một cây gọi sâu tùy ý của các tòa nhà cao tầng tùy ý. Về cơ bản, bạn có thể đặt toàn bộ ứng dụng của mình vào một tòa nhà duy nhất.