Tại sao lại giới hạn số lượng tệp đang mở và các quy trình Chạy trong Linux?


14

Tôi không có nhiều kiến ​​thức về hoạt động bên trong của hệ điều hành, vậy tại sao chúng ta có giới hạn cho số lượng tệp mở tối đa và các quy trình đang chạy trong Linux?

Tôi sẽ đánh giá cao nếu ai đó có thể giúp tôi hiểu.

Câu trả lời:


16

Điều này chủ yếu là vì lý do lịch sử. Trên các máy tính lớn hơn của Linux, nhiều người dùng sẽ kết nối và sử dụng tài nguyên của máy tính lớn. Tất nhiên, cần phải hạn chế và vì các hoạt động như xử lý tệp và quy trình được tích hợp vào kernel, nên nó bị giới hạn ở đó. Nó cũng giúp hạn chế các cuộc tấn công như bom ngã ba . Một sự bảo vệ chống lại bom hình thức sử dụng giới hạn quá trình được hiển thị ở đây .

Nó cũng giúp kiểm tra các dịch vụ và trình tiện ích phức tạp bằng cách không cho phép chạy trốn và mở tệp, tương tự như những gì mà bom ngã ba cố gắng thực hiện.

Cũng cần lưu ý là những thứ như dung lượng RAM và CPU có sẵn, và thực tế là bộ đếm 32 bit chỉ có thể tham chiếu rất nhiều (chỉ có 4294967296 mục có thể được đếm bằng bộ đếm 32 bit), nhưng giới hạn như vậy là rất xa ở trên những cái thường được thiết lập bởi các lập trình viên và quản trị viên hệ thống. Dù sao, rất lâu trước khi bạn có 4294967296 quy trình, máy của bạn có thể đã được khởi động lại, đúng như kế hoạch hoặc khi nó bắt đầu bị khóa do bỏ đói tài nguyên khác.

Trừ khi bạn chạy Titan với bộ nhớ 584 TiB (nếu không, vì Linux không thể chạy như một phiên bản trên siêu máy tính), bạn có thể sẽ không đạt đến giới hạn quá trình này sớm. Ngay cả khi đó, quá trình trung bình sẽ chỉ có khoảng 146KB bộ nhớ, giả sử không có bộ nhớ chia sẻ.


2
+1 cho bom ngã ba, cho thấy các phương pháp đệ quy này nguy hiểm đến mức nào nếu được sử dụng trong vỏ mà không cần thận trọng!
aka_learner

9

Có giới hạn cho hầu hết mọi thứ, cả trong cuộc sống và trong Linux. Đôi khi các giới hạn rất cao và không đáng lo ngại, và đôi khi chúng quá thấp, được thiết lập tùy ý bởi một lập trình viên lười biếng hoặc đặt theo giới hạn cho phần cứng.

Giới hạn tùy ý xuất hiện khi lập trình viên đưa ra quyết định, chẳng hạn như số lượng ký tự tối đa được phép trong một trường, chẳng hạn như địa chỉ. Việc đặt một số giới hạn tùy ý dễ dàng hơn nhiều so với việc phân bổ động bộ nhớ khi cần. Bạn không muốn phân bổ tất cả bộ nhớ khả dụng cho một trường đầu vào đơn giản, nhưng bạn không muốn cho phép đầu vào ghi đè lên bộ nhớ khác có thể quan trọng. Đối với các tệp và quy trình mở, có thể có giới hạn tùy ý hoặc có thể bị giới hạn bởi bộ nhớ khả dụng. Nếu sau này, điều tồi tệ sẽ bắt đầu xảy ra khi bạn đạt đến giới hạn và hệ thống có thể bị treo, do đó, thật tốt khi có một giới hạn xuất hiện trước khi điều đó xảy ra. Đôi khi, các giới hạn tùy ý có thể được xác định khi khởi động tùy thuộc vào bộ nhớ hoặc dung lượng ổ đĩa và thường khá thông minh,

Sau đó, có các giới hạn được đặt theo phần cứng, chẳng hạn như kích thước của một số nguyên hoặc ký tự. Nếu bạn có hệ thống 32 bit, thì sẽ có các giới hạn được đặt theo kích thước tối đa của một số nguyên (4.294.967.295 nếu không dấu hoặc một nửa nếu được ký).


1
Các giới hạn xuất hiện tùy ý có thể thực sự dựa trên các tiêu chuẩn. Tiêu chuẩn quốc tế dòng địa chỉ bưu chính đến 39 ký tự. Giới hạn như vậy có thể xuất hiện tùy ý. Giới hạn 60 ký tự cho một địa chỉ có thể sẽ tùy ý. Thật không may, quá ít lập trình viên kiểm tra các tiêu chuẩn nên nhiều giới hạn (đôi khi chính xác) được quyết định tùy ý.
BillThor

Tôi đồng ý; Khi tôi vẫn làm việc như một lập trình viên, tôi sẽ dành nhiều thời gian để tìm kiếm các giới hạn đã nêu, như bạn đã nói, hoặc được định nghĩa trong HĐH là một macro (chẳng hạn như max_path, v.v.). Nhưng tôi sẽ phải nói rằng các giới hạn tùy ý thường tốt hơn không có giới hạn nào cả, đặc biệt là đối với độ dài trường. :)
Marty Fried

7

Đối với các quy trình, / Proc / sys / kernel / pid_max là pid tối đa được phép, vì vậy đây là giới hạn cứng của số lượng quy trình có thể chạy bất kỳ lúc nào. Tuy nhiên, giới hạn về bộ nhớ thường phát huy tác dụng trước đó.

Đối với giới hạn trên đối với các tệp đang mở trên toàn bộ máy, / Proc / sys / fs / file-max là giới hạn cứng; điều này dựa trên dung lượng bộ nhớ trong máy, vì vậy nó sẽ thay đổi. Nhân đặt điều này là:

    n = (mempages * (PAGE_SIZE / 1024)) / 10;
    files_stat.max_files = max_t(unsigned long, n, NR_FILE);

có thể đạt khoảng 100 cho mỗi 1 MB RAM.

Mỗi giới hạn quá trình là khác nhau. ulimit sẽ định nghĩa những điều này.


-5

Chúng tôi có giới hạn vì máy tính có giới hạn, tôi có 4GB RAM, vậy bây giờ tôi không thể chạy 15 trò chơi được không?

Tôi rất có thể có thể chạy nó với một số độ trễ nhưng nó sẽ không phải là con người .

Giống như máy tính xách tay của tôi khi tôi chạy Windows 7, tôi có thể chơi Battlefield, nhưng nó chiếm 80% RAM nên nếu tôi thử chơi "Need For Speed", điều đó mất 60% thông thường, tôi có thể mở cả hai nhưng sau đó toàn bộ hệ thống của tôi bị chậm lại do tôi đang chạy 2 Chương trình nhiệm vụ nặng nề, cả hai đều chiến đấu vì RAM (Bộ nhớ truy cập ngẫu nhiên)

Nói một cách ngắn gọn, Một máy tính bình thường không thể chạy rất nhiều chương trình cùng một lúc Âm nhạc, Notepad, Trình duyệt, Email, Trò chơi, Bạn nghĩ rằng đó là rất nhiều trên máy tính nhưng đó chỉ là, Một trò chơi như World of Warcraft chiếm nhiều RAM hơn và làm cho máy tính của bạn phải vật lộn (Trừ khi bạn có 8-16 GB RAM như các máy tính xách tay đắt tiền làm!)


Cảm ơn thông tin về các quy trình như chúng tôi biết sẽ có tải CPU cao nếu nhiều quy trình sẽ chạy đồng thời và lưu lượng truy cập trên lõi CPU sẽ rất cao để xử lý và theo thời gian, hệ thống của bạn sẽ ở trạng thái treo, không cho phù hợp thời gian để bất kỳ quá trình để thực hiện tôi đoán nếu tôi không sai. Nhưng tại sao cũng có giới hạn cho các tệp mở trong Linux?
aka_learner

Tôi không biết về giới hạn của các tệp đang mở, tôi chưa từng trải nghiệm điều đó, Có lẽ đó là máy tính của bạn bị giới hạn so với của tôi, tôi không chắc về vấn đề đó. Tôi luôn có một vài tệp 10 mở, Sau đó, trình duyệt web, Trình phát nhạc và Thiết bị đầu cuối mở.
Ubisoft Terzuz

Nó thường xảy ra với tôi khi cơ sở dữ liệu mysql của tôi cung cấp cho tôi theo "120428 20:30:01 [ERROR] / usr / sbin / mysqld: Không thể mở tệp: './djlabo_open/cart_layout.frm' (errno: 24)" lỗi trong nhật ký lỗi của nó vì linux không cho phép nó mở tệp cơ sở dữ liệu này.
aka_learner

Đó có lẽ là một cái gì đó khác biệt so với giới hạn hệ điều hành để mở tệp.
Nanne

1
@Terzuz Nó thực sự dựa trên việc mọi người xem xét câu trả lời của nhau có thực sự đúng hay không. Nhiều người (bao gồm cả tôi, không may) cảm thấy như thể câu trả lời này có thể không thực sự giải quyết các giới hạn được đề cập trong câu hỏi, nhưng các giới hạn khác.
Phục hồi Monica - -
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.