2008-10-06 32 views
106

Chúng là gì và chúng hoạt động như thế nào?Ống được đặt tên là gì?

Bối cảnh xảy ra là SQL Server

+0

Đây cũng là một câu trả lời rất toàn diện: http://askubuntu.com/questions/449132/why-use-a-named-pipe-instead-of-a-file –

Trả lời

119

Cả trên các hệ thống Windows và POSIX, tên-ống cung cấp một cách để giao tiếp giữa các quá trình xảy ra trong tiến trình đang chạy trên cùng một máy. Những ống dẫn được đặt tên cho bạn là một cách để gửi dữ liệu của bạn mà không bị ảnh hưởng về hiệu suất liên quan đến chồng mạng.

Cũng giống như bạn có một máy chủ nghe địa chỉ IP/cổng cho các yêu cầu gửi đến, máy chủ cũng có thể thiết lập một đường ống có tên có thể lắng nghe các yêu cầu. Trong cả hai trường hợp, quy trình khách hàng (hoặc thư viện truy cập DB) phải biết địa chỉ cụ thể (hoặc tên đường ống) để gửi yêu cầu. Thông thường, một thường được sử dụng mặc định tiêu chuẩn tồn tại (giống như cổng 80 cho HTTP, SQL server sử dụng cổng 1433 trong TCP/IP; \\. \ Pipe \ sql \ query cho một đường ống có tên).

Bằng cách thiết lập các đường ống bổ sung có tên, bạn có thể chạy nhiều máy chủ DB, mỗi máy chủ có trình nghe yêu cầu riêng.

Lợi thế của các đường ống được đặt tên là nó thường nhanh hơn nhiều và giải phóng tài nguyên ngăn xếp mạng.

- BTW, trong thế giới Windows, bạn cũng có thể đặt tên cho các máy từ xa - nhưng trong trường hợp đó, đường ống được đặt trên TCP/IP, vì vậy bạn sẽ mất hiệu suất. Sử dụng các đường ống có tên cho giao tiếp máy địa phương.

+0

Điểm bất lợi là gì? – lindhe

+0

@lindhe Không có khả năng hoạt động tự động trên mạng. Nói chung khó thiết lập hơn trong thực tế. Triển khai khác nhau trong Windows so với các hệ thống giống Unix/Unix. Họ thật tuyệt, nhưng tôi sẽ không bận tâm trừ phi hiệu suất là điều phải làm. – sudo

15

Theo Wikipedia:

[...] Một ống truyền thống là "vô danh" vì nó tồn tại một cách ẩn danh và chỉ kéo dài càng lâu càng quá trình này là đang chạy. Một đường ống có tên là hệ thống liên tục và tồn tại vượt quá vòng đời của quá trình và phải được "hủy liên kết" hoặc bị xóa khi nó không còn được sử dụng nữa. Các quy trình thường gắn với đường ống có tên (thường xuất hiện dưới dạng tệp) để thực hiện IPC (liên lạc giữa các quá trình).

5

Giao tiếp liên tục (chủ yếu) cho ứng dụng Windows. Tương tự như sử dụng ổ cắm để giao tiếp giữa các ứng dụng trong Unix.

MSDN

+2

Ống Named xuất hiện trong V6 hoặc AT & T Unix vào khoảng năm 1975. – dmckee

+0

Doh! Đó là một chút trước Microsoft. Theo tôi biết chúng không được sử dụng thường xuyên trong các ứng dụng Unix/Linux. Thật? – Ken

+0

Một vài mã của tôi sử dụng chúng. Điều đó có tính không? – dmckee

5

Ống là cách truyền dữ liệu giữa các ứng dụng. Trong Linux, tôi sử dụng tất cả thời gian để truyền đầu ra của một tiến trình này sang tiến trình khác. Đây là ẩn danh vì ứng dụng đích không có ý tưởng về nguồn đầu vào đó. Nó không cần.

Đường ống được đặt tên chỉ là cách tích cực gắn vào một đường ống hiện có và nâng cấp dữ liệu của nó. Đó là cho các tình huống mà các nhà cung cấp không biết những gì khách hàng sẽ được ăn dữ liệu.

1

Ống được đặt tên là hệ thống cửa sổ để liên lạc liên ngành. Trong trường hợp máy chủ SQL, nếu máy chủ nằm trên cùng một máy với máy khách, thì có thể sử dụng các đường ống được đặt tên để chuyển dữ liệu, ngược lại với TCP/IP.

+0

Nó không chỉ là Windows, vì câu trả lời của bạn làm cho nó xuất hiện. Như những người khác đã lưu ý, ống được đặt tên đã được khoảng từ những năm 70 trong UNIX, nói chung với sự xuất hiện của là một tập tin đặc biệt. Vẫn được bỏ phiếu, nhưng hãy sửa câu trả lời của bạn. –

+1

Ống có tên cũng hoạt động trên mạng –

7

Hãy so sánh

echo "test" | wc 

để

mkdnod apipe p 
wc apipe 

wc sẽ chặn cho đến khi

echo "test" > apipe 

thực hiện

19

Ống Linux
Cơ chế truyền thông interproccess đầu tiên trong đầu tiên (FIFO).

Ống chưa đặt tên
Trên dòng lệnh, được biểu thị bằng dấu "|" giữa hai lệnh.

Ống có tên
Tệp đặc biệt FIFO. Sau khi tạo ra, bạn có thể sử dụng đường ống giống như một tập tin bình thường (mở, đóng, viết, đọc, vv).

Để tạo một đường ống được đặt tên, được gọi là "myPipe", từ dòng lệnh (man page):

mkfifo myPipe 

Để tạo một đường ống đặt tên từ c, trong đó "tên đường dẫn" là tên mà bạn muốn đường ống có và "chế độ" chứa các điều khoản mà bạn muốn các đường ống có (man page):

#include <sys/types.h> 
#include <sys/stat.h> 
int mkfifo(const char *pathname, mode_t mode); 
34

Cả Unix và Windows đều có thứ gọi là "Ống có tên", nhưng chúng hoạt động khác nhau. Trên Unix, một đường ống có tên là một đường một chiều thường chỉ có một đầu đọc và một nhà văn - người viết viết, và người đọc đọc, bạn hiểu nó?

Trên Windows, thứ được gọi là "Ống có tên" là đối tượng IPC giống như ổ cắm TCP - mọi thứ có thể chảy theo cả hai cách và có một số siêu dữ liệu (Bạn có thể lấy thông tin xác thực ở đầu bên kia v.v.) .

Đường ống được đặt tên Unix xuất hiện dưới dạng tệp đặc biệt trong hệ thống tệp và có thể được truy cập bằng các lệnh IO tệp thông thường bao gồm cả trình bao. Windows không có, và cần phải được mở bằng một cuộc gọi hệ thống đặc biệt (sau đó chúng hoạt động chủ yếu giống như một tay cầm win32 bình thường).

Thậm chí còn khó hiểu hơn, Unix có một cái gì đó gọi là "ổ cắm Unix" hoặc ổ cắm AF_UNIX, hoạt động giống (nhưng không hoàn toàn giống) một ống có tên win32 "", hai chiều.

3

Các đường ống có tên trong ngữ cảnh unix/linux có thể được sử dụng để tạo hai vỏ khác nhau để giao tiếp vì một trình bao không thể chia sẻ bất kỳ thứ gì với một trình bao khác.

Hơn nữa, một tập lệnh được khởi tạo hai lần trong cùng một trình bao không thể chia sẻ bất kỳ thứ gì thông qua hai phiên bản. Tôi tìm thấy một sử dụng cho các đường ống được đặt tên khi mã hóa một daemon có chứa hàm start() và stop(), và tôi muốn sử dụng cùng một kịch bản để thực hiện hai hành động.

Không có đường ống có tên (hoặc bất kỳ loại semaphore) nào bắt đầu tập lệnh trong nền không phải là vấn đề. Vấn đề là khi nó kết thúc, bạn không thể truy cập cá thể trong nền.

Vì vậy, khi bạn muốn gửi cho anh ta lệnh dừng bạn không thể: chạy cùng một tập lệnh mà không có tên đường ống và gọi hàm stop() sẽ không làm bất cứ điều gì vì bạn đang thực sự chạy một thể hiện khác.

Giải pháp là triển khai hai ống, một READ và WRITE khác khi bạn khởi động daemon. Sau đó, làm cho anh ta, trong số các nhiệm vụ khác của nó, lắng nghe các ống READ. Sau đó, hàm Stop() chứa một lệnh sẽ viết một thông điệp trong đường ống, nó sẽ được xử lý bởi kịch bản chạy nền sẽ thực hiện một lối ra 0. Cách này ví dụ thứ hai của cùng một tập lệnh chỉ có tác vụ: nói với trường hợp đầu tiên dừng lại.

Bằng cách này, một và chỉ một tập lệnh có thể bắt đầu và dừng lại.

Tất nhiên bạn có nhiều cách khác nhau để thực hiện điều đó bằng cách kích hoạt điểm dừng qua một lần chạm ví dụ. Nhưng điều này là tốt đẹp và thú vị để mã.

3

Đây là một exeprt từ Technet (vì vậy không chắc chắn lý do tại sao câu trả lời được đánh dấu cho biết tên là ống là nhanh hơn ??):

Named Pipes vs TCP/IP Sockets

Trong một khu vực địa phương nhanh môi trường mạng (LAN), Cổng giao thức điều khiển truyền dẫn/Giao thức Internet (TCP/IP) và các máy khách có tên là có thể so sánh được về hiệu suất. Tuy nhiên, sự khác biệt hiệu suất giữa các cổng TCP/IP Sockets và các máy khách có tên Named trở nên rõ ràng với các mạng chậm hơn, chẳng hạn như trên các mạng diện rộng (WAN) hoặc các mạng dial-up. Điều này là do các cách khác nhau mà các cơ chế truyền thông giữa các quá trình liên lạc (IPC) giao tiếp giữa các đồng nghiệp.

Đối với các đường ống được đặt tên, thông tin liên lạc mạng thường tương tác hơn. Một peer không gửi dữ liệu cho đến khi một peer khác hỏi nó bằng cách sử dụng lệnh read. Một mạng đọc thường bao gồm một loạt các peek tên ống thông điệp trước khi nó bắt đầu đọc dữ liệu. Đây có thể là rất tốn kém trong mạng chậm và gây ra lưu lượng truy cập mạng quá mức, điều này sẽ ảnh hưởng đến các khách hàng mạng khác.

Điều cũng quan trọng là phải làm rõ nếu bạn đang nói về đường ống hoặc ống dẫn mạng cục bộ. Nếu ứng dụng máy chủ đang chạy cục bộ trên máy tính đang chạy một thể hiện của SQL Server, giao thức đường ống tên địa phương là một tùy chọn. Các đường ống được đặt tên cục bộ chạy ở chế độ hạt nhân và rất nhanh.

Đối với cổng TCP/IP, việc truyền dữ liệu được sắp xếp hợp lý hơn và có ít chi phí hơn. Việc truyền dữ liệu cũng có thể tận dụng các cơ chế nâng cao hiệu suất của các cổng TCP/IP như cửa sổ, các xác nhận bị trì hoãn, v.v. Điều này có thể rất hữu ích trong một mạng chậm. Tùy thuộc vào loại ứng dụng, sự khác biệt về hiệu suất như vậy có thể đáng kể.

Ổ cắm TCP/IP cũng hỗ trợ hàng đợi tồn đọng. Điều này có thể cung cấp hiệu ứng làm mịn giới hạn so với các đường ống được đặt tên có thể dẫn đến lỗi đường ống bận khi bạn đang cố gắng kết nối với SQL Server. Thông thường, TCP/IP được ưu tiên trong mạng LAN, WAN hoặc mạng quay chậm, trong khi các đường ống được đặt tên có thể là lựa chọn tốt hơn khi tốc độ mạng không phải là vấn đề, vì nó cung cấp nhiều chức năng hơn, dễ sử dụng hơn, và các tùy chọn cấu hình.

3

Named Pipes:

  1. Named Pipes sử dụng liên process communication (IPC) kênh cho hiệu quả truyền thông liên máy chủ, cũng như mạng cục bộ thông tin liên lạc (LAN).

  2. Giao thức đường ống được đặt tên có một số cải tiến trong SQL Server 2008 bao gồm hỗ trợ lưu lượng được mã hóa, nhưng do chi phí quá cao của Ống được đặt tên khi kết nối qua mạng hoặc tường lửa và cổng bổ sung được đặt tên yêu cầu phải mở (445),

  3. Thông thường, nên tắt giao thức Ống đã đặt tên.
  4. Có nhiều ứng dụng tận dụng giao thức Đặt tên đường ống vì chúng được thiết kế để triển khai mạng cục bộ.
  5. Ống có tên cung cấp khả năng truy cập dễ dàng vào các cuộc gọi thủ tục từ xa (RPC) trong một miền bảo mật duy nhất, và vì vậy thuận lợi cho các ứng dụng này.
  6. Nếu bạn cần hỗ trợ một trong các ứng dụng cần truy cập vào (RPC) và SQL Server không được tiếp xúc với lưu lượng bên ngoài, nguy cơ bật giao thức được đặt tên theo ống và điểm cuối tương ứng là tối thiểu.
  7. Giao thức được đặt tên theo đường ống cũng mang lại lợi ích hiệu suất cao khi được sử dụng bởi ứng dụng khách nằm trên cùng một hộp như cơ sở dữ liệu SQL Server đang truy cập,
  8. Đặt tên đường ống cũng có thể tạo điều kiện kết nối máy khách với cơ sở dữ liệu SQL Server từ xa hoặc SQL Server lưu trữ trên các máy khác nhau
  9. Ống có tên có hai thuộc tính có thể cấu hình • Đã bật: Thuộc tính được bật hoạt động giống như giao thức Bộ nhớ chia sẻ. • Tên đường ống: Tên đường ống chỉ định đường ống liên tiến trình mà SQL Server sẽ lắng nghe. Đường ống mặc định là \. \ Pipe \ sql \ query.

http://saurabhsinhainblogs.blogspot.in/2015/09/what-is-difference-between-tcp-ip-and-Named-Pipes.html

Các vấn đề liên quan