Điều gì xảy ra nếu tôi vô tình để một ứng dụng đang chạy và nhấp vào Cài đặt ngay bây giờ trong Trình cập nhật phần mềm?


22

Trình update-managercập nhật phần mềm bật lên và hiển thị các bản cập nhật bảo mật cho Firefox chẳng hạn. Đương nhiên, tôi sẽ nhấp vào "Cài đặt ngay" để tiếp tục.

Tuy nhiên, điều gì xảy ra nếu tôi vẫn có Firefox chạy khi tôi làm điều này? Nó vẫn sẽ cập nhật Firefox chứ? Bản cập nhật có bị bỏ qua và chỉ bật lên lần sau không? Bản cập nhật có buộc Firefox đóng cửa và có thể bị sập không? Nó sẽ chỉ cập nhật một phần phần mềm và có thể phá vỡ cài đặt Firefox của tôi chứ?


10
Không có gì xảy ra, Firefox đang mở trong Ram. Đôi khi nó phát hiện bản cập nhật và yêu cầu bạn khởi động lại trình duyệt. Nhưng có lẽ ai đó có cái nhìn sâu sắc hơn và tài liệu tham khảo có thể đưa ra một câu trả lời tốt hơn.
pLumo

3
Tôi không biết cụ thể về Ubuntu, nhưng trên Arch (và tôi không nghĩ nó khác hoàn toàn trong trường hợp này), cập nhật firefox dưới chân trong khi chạy dường như hoạt động, nhưng sau đó, điều đầu tiên bạn làm trong firefox gặp sự cố Điều. Tôi luôn luôn cho rằng do tính chất phức tạp của các trình duyệt hiện đại, thời gian chạy - tải tất cả các loại công cụ. Nhưng firefox là điều duy nhất xảy ra với tôi.
tomsmeding

2
Firefox sẽ dừng lại vào lần tới khi bạn mở một tab và nói với bạn rằng nó cần phải khởi động lại. Các ứng dụng khác có thể làm một cái gì đó khác nhau.
Michael Hampton

Câu trả lời:


40

Bạn phải nghĩ về Windows. Unix đã làm đúng, và sau đó, Windows đã xuất hiện và phát triển những cách làm sai.

Với Windows, việc thay thế một tệp đang được sử dụng bởi một quy trình đang chạy có thể ảnh hưởng xấu đến quá trình đó. Quá trình sẽ tham chiếu các vị trí trong tệp đó và nhận thông tin không chính xác từ nó, thường có kết quả thảm khốc. Đó là lý do tại sao một bản cập nhật Windows thường yêu cầu khởi động lại để đảm bảo rằng tất cả các quy trình đang sử dụng các phiên bản chính xác của thư viện, v.v.

Với Unix, một khi một tệp đã được mở bởi một quy trình, cùng một tệp đó sẽ luôn có sẵn cho quy trình ngay cả khi tệp gốc bị xóa khỏi hệ thống tệp .

Sau khi cập nhật, hệ thống tệp sẽ chứa một phiên bản khác của tệp và tất cả quá trình bắt đầu sau khi cập nhật sẽ sử dụng tệp mới đó. Nhưng, không giống như Windows, tất cả các quy trình Unix cũ sẽ tiếp tục sử dụng các tệp gốc mà chúng bắt đầu. Mặc dù không còn có thể truy cập qua hệ thống tệp, các tệp đó sẽ tồn tại miễn là bất kỳ quá trình nào đang sử dụng chúng. Cuối cùng, khi không có quá trình nào sử dụng các tệp, phiên bản cũ của các tệp cuối cùng sẽ bị xóa.

Tất nhiên bạn có thể quyết định khởi động lại Firefox (hoặc các quy trình khác) nếu bạn muốn nhận được lợi ích của bản cập nhật ngay lập tức. Sự lựa chọn là của bạn.


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Thomas Ward

18

Thông thường, cập nhật chương trình trong khi chương trình đã mở không có vấn đề gì - như những người trả lời khác đã giải thích, một quy trình đang chạy có thể tiếp tục chạy ngay cả khi chương trình thực thi của nó bị xóa.

Tuy nhiên, do mô hình đa quy trình của Firefox, bạn có thể nhận được lời nhắc khởi động lại nó sau khi cập nhật. Điều này là do Firefox sinh ra các quy trình mới để cô lập các trang web khác nhau, vì vậy nếu nó sinh ra một quy trình mới sau khi bạn cập nhật nó nhưng trước khi bạn khởi động lại Firefox, quy trình mới sẽ là phiên bản Firefox mới hơn so với phần còn lại của trình duyệt. Điều này có thể gây ra nhiều vấn đề khác nhau, vì vậy Firefox có thể nhắc bạn khởi động lại nó trước khi cho phép bạn tiếp tục.

Ngẫu nhiên, Chrome tránh điều này bằng cách sử dụng quy trình "hợp tử" mà không phải làm gì; Khi trình duyệt cần sinh ra một quy trình mới, thay vì yêu cầu HĐH thực thi lại trình duyệt có thể thực thi lại (sẽ thực thi nhị phân có thể cập nhật), nó yêu cầu quá trình hợp tử tự sao chép và một trong các bản sao sau đó trở thành trình kết xuất bình thường quá trình.


1
Ngoài ra, với một ứng dụng phức tạp như Firefox, mọi thứ nó có thể cần để xử lý mọi thứ nó gặp không được tải vào bộ nhớ khi chương trình khởi chạy. Vì vậy, các thành phần được tải khi cần có thể tạo ra sự không phù hợp của các phiên bản. Tôi thường bị treo Firefox khi cập nhật nó khi nó đang chạy.
fixer1234

Đó không chỉ là các trình duyệt với các mô hình đa quy trình, mà bất kỳ tình huống nào các thư viện được sử dụng cho IPC và các thư viện đều có thể được tải trước và sau khi cập nhật - mặc dù các trình duyệt có thể là ví dụ được biết đến nhiều nhất trong những ngày này (COM can thiệp vào Windows khá phổ biến có nghĩa là nhiều chương trình hơn có thể mặc nhiên làm một cái gì đó như thế này). Tôi cũng không thể tưởng tượng rằng Chrome hoàn toàn tránh được vấn đề này với quy trình hợp tử - nó có thực sự tải mọi thư viện mà nó có thể cần tại bất kỳ thời điểm nào khi khởi động không?
Voo

@Voo hỏi "nó có thực sự tải mọi thư viện mà nó có thể cần tại bất kỳ thời điểm nào khi khởi động không?". Tôi không biết về ví dụ cụ thể này, nhưng nói chung là không cần thiết. Tất cả những gì được yêu cầu là đảm bảo rằng mỗi thư viện có thể được mở khi khởi động, do đó đảm bảo rằng dữ liệu chính xác sẽ được đọc nếu cần. Mở một tệp (hoặc hàng tá tệp) là một chi phí không đáng kể so với tải mọi thứ chúng chứa.
Ray Butterworth

@Ray Thực tế thú vị: dlopen chỉ lấy một tên tệp chứ không phải mô tả tệp để có thể không đơn giản như bạn nghĩ (bạn có thể chơi xung quanh với / Proc nhưng khác biệt rõ rệt dọc theo * nixes). Nhưng vấn đề lớn hơn là điều đó sẽ loại bỏ hầu hết các trường hợp sử dụng trong đó tải động được sử dụng để bắt đầu.
Voo

@Voo, xin lỗi, tôi đã nhầm tưởng bình luận này nằm trong luồng không định hướng, không phải về Windows và dlls.
Ray Butterworth
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.