Hiểu các cấp độ của máy tính


9

Xin lỗi, cho câu hỏi bối rối của tôi. Tôi đang tìm kiếm một số gợi ý.

Cho đến nay tôi đã làm việc chủ yếu với Java và Python trên lớp ứng dụng và tôi chỉ có một sự hiểu biết mơ hồ về các hệ điều hành và phần cứng. Tôi muốn hiểu nhiều hơn về các cấp độ tính toán thấp hơn, nhưng bằng cách nào đó nó thực sự áp đảo. Ở trường đại học, tôi đã tham gia một lớp học về lập trình vi mô, tức là cách các bộ xử lý có dây cứng để thực hiện mã ASM. Cho đến bây giờ tôi luôn nghĩ rằng mình sẽ không làm được gì nhiều hơn nếu biết thêm về "cấp độ thấp".

Một câu hỏi tôi có là: làm thế nào thậm chí có khả năng phần cứng bị ẩn gần như hoàn toàn khỏi nhà phát triển? Có chính xác để nói rằng hệ điều hành là một lớp phần mềm cho phần cứng? Một ví dụ nhỏ: trong lập trình tôi chưa bao giờ bắt gặp nhu cầu hiểu L2 hoặc L3 Cache là gì. Đối với môi trường ứng dụng kinh doanh điển hình, người ta hầu như không bao giờ cần phải hiểu về trình biên dịch và mức độ tính toán thấp hơn, bởi vì ngày nay có một ngăn xếp công nghệ cho hầu hết mọi thứ. Tôi đoán rằng toàn bộ quan điểm của các cấp thấp hơn là cung cấp giao diện cho các cấp cao hơn. Mặt khác, tôi tự hỏi mức độ ảnh hưởng của các cấp thấp hơn có thể có, ví dụ như toàn bộ điều máy tính đồ họa này.

Mặt khác, có ngành khoa học máy tính lý thuyết này, hoạt động trên các mô hình điện toán trừu tượng. Tuy nhiên, tôi cũng hiếm khi gặp phải tình huống, trong đó tôi thấy nó có suy nghĩ hữu ích trong các loại mô hình phức tạp, xác minh bằng chứng, v.v. Tôi biết rằng, có một lớp phức tạp gọi là NP, và chúng không thể giải quyết được một số lượng lớn N. Những gì tôi đang thiếu là một tài liệu tham khảo cho một khung để suy nghĩ về những điều này. Dường như với tôi, có tất cả các loại trại khác nhau, những người hiếm khi tương tác.

Vài tuần qua tôi đã đọc về các vấn đề bảo mật. Ở đây bằng cách nào đó, phần lớn các lớp khác nhau kết hợp với nhau. Tấn công và khai thác hầu như luôn xảy ra ở cấp độ thấp hơn, vì vậy trong trường hợp này cần phải tìm hiểu về các chi tiết của các lớp OSI, hoạt động bên trong của HĐH, v.v.


1
Có một câu trả lời tuyệt vời cho điều này (người đầu tiên cho câu hỏi) lập trình
viên.stackexchange.com/questions/81624/ mẹo

Tấn công và khai thác có thể xảy ra ở tất cả các cấp. Nếu tôi viết một tập lệnh PHP dễ bị tổn thương, nó có thể bị khai thác bất kể HĐH cơ bản, chứ chưa nói đến phần cứng.
tdammers

1
Tìm thấy một cuốn sách tuyệt vời về chủ đề: Các yếu tố của hệ thống máy tính: Xây dựng một máy tính hiện đại từ các nguyên tắc đầu tiên Noam Nisan, Shimon Schocken. Cuộc nói chuyện của ông Schocken về cách tiếp cận này: youtube.com/watch?v=IlPj5Rg1y2w&feature=plcp
RParadox

Quay trở lại thời của dos, sử dụng ngôn ngữ lắp ráp cho các thói quen đồ họa VGA là cách duy nhất để có được bất kỳ hiệu suất nào nhưng tôi cho rằng tôi không biết mình đang làm gì! Nhưng trong 10 năm trở lên trong sự nghiệp, tôi không phải nhìn bất cứ thứ gì quá thấp. Và bây giờ tôi hầu như không biết gì về những gì xảy ra ở những cấp độ đó. Hiếm khi tôi cần phân bổ hoặc dọn dẹp bộ nhớ của riêng tôi. Tôi nghi ngờ nhiều người trong nhóm của tôi không biết ngăn xếp là gì! Theo nhiều cách, việc viết mã ở mức độ như vậy là không hiệu quả, phát minh lại bánh xe để nói. Thay vào đó chúng tôi đứng trên vai của những người khổng lồ.
Gavin Howden

Câu trả lời:


19

Từ khóa để suy nghĩ về những điều này là trừu tượng .

Trừu tượng chỉ có nghĩa là cố tình bỏ qua các chi tiết của một hệ thống để bạn có thể nghĩ về nó như một thành phần duy nhất, không thể tách rời khi lắp ráp một hệ thống lớn hơn trong số nhiều hệ thống con. Đây là mức tưởng tượng mạnh mẽ - viết một chương trình ứng dụng hiện đại trong khi xem xét các chi tiết của cấp phát bộ nhớ đăng ký tràn runtimes transistor sẽ có thể theo một cách lý tưởng, nhưng nó là không hai dễ dàng hơn khôngđể suy nghĩ về chúng và chỉ sử dụng các hoạt động cấp cao thay thế. Mô hình điện toán hiện đại chủ yếu dựa vào nhiều mức độ trừu tượng: điện tử trạng thái rắn, lập trình vi mô, hướng dẫn máy, ngôn ngữ lập trình cấp cao, API lập trình hệ điều hành và web, các ứng dụng và khung lập trình người dùng. Ngày nay, không ai có thể hiểu được toàn bộ hệ thống, và thậm chí không có một con đường nào có thể hiểu được mà qua đó chúng ta có thể quay lại tình trạng đó.

Mặt trái của sự trừu tượng là mất điện. Bằng cách để lại quyết định về chi tiết cho các cấp thấp hơn, chúng tôi thường chấp nhận rằng chúng có thể được thực hiện với hiệu quả dưới mức tối ưu, vì các cấp thấp hơn không có 'Bức tranh lớn' và chỉ có thể tối ưu hóa hoạt động của chúng bằng kiến ​​thức địa phương và không phải là (có khả năng) thông minh như một con người. (Thông thường. Đối với isntance, biên soạn HLL sang mã máy là ngày nay thường được thực hiện tốt hơn bằng máy hơn bởi ngay cả những người am hiểu nhất, vì kiến trúc vi xử lý đã trở nên quá phức tạp.)

Vấn đề bảo mật là một vấn đề thú vị, bởi vì lỗ hổng và 'rò rỉ' trong sự trừu tượng thường có thể bị khai thác để vi phạm tính toàn vẹn của một hệ thống. Khi API yêu cầu bạn có thể gọi các phương thức A, B và C, nhưng chỉ khi điều kiện X giữ, bạn sẽ dễ quên điều kiện và không được chuẩn bị cho bụi phóng xạ xảy ra khi điều kiện bị vi phạm. Chẳng hạn, lỗi tràn bộ đệm cổ điển khai thác thực tế là việc ghi vào các ô nhớ mang lại hành vi không xác định trừ khi bạn tự cấp phát khối bộ nhớ cụ thể này. API chỉ đảm bảo rằng một cái gì đósẽ xảy ra như một kết quả, nhưng trong thực tế, kết quả được xác định bởi các chi tiết của hệ thống ở cấp thấp hơn tiếp theo - mà chúng tôi đã cố tình quên đi! Miễn là chúng tôi đáp ứng điều kiện, điều này không quan trọng, nhưng nếu không, kẻ tấn công hiểu cả hai cấp độ thường có thể điều khiển hành vi của toàn bộ hệ thống như mong muốn và gây ra những điều xấu xảy ra.

Trường hợp lỗi cấp phát bộ nhớ đặc biệt xấu vì hóa ra nó thực sự rất khó quản lý bộ nhớ theo cách thủ công mà không có một lỗi nào trong một hệ thống lớn. Đây có thể được coi là một trường hợp trừu tượng thất bại: mặc dù có thể làm mọi thứ bạn cần với CmallocAPI, nó chỉ đơn giản là dễ lạm dụng. Các bộ phận của cộng đồng lập trình bây giờ nghĩ rằng đây là nơi sai lầm khi đưa ranh giới cấp độ vào hệ thống, và thay vào đó thúc đẩy các ngôn ngữ với quản lý bộ nhớ tự động và thu gom rác, mất một số năng lượng, nhưng cung cấp bảo vệ chống tham nhũng bộ nhớ và hành vi không xác định . Trên thực tế, một lý do chính cho việc vẫn sử dụng C ++ hiện nay chính xác là nó cho phép bạn kiểm soát chính xác những tài nguyên nào được mua và phát hành khi nào. Theo cách này, sự phân ly chính giữa các ngôn ngữ được quản lý và không được quản lý ngày nay có thể được coi là một sự bất đồng về nơi chính xác để xác định một lớp trừu tượng.

Điều tương tự cũng có thể xảy ra đối với nhiều mô hình thay thế lớn khác trong điện toán - vấn đề thực sự phát triển mọi lúc khi các hệ thống lớn phải được xây dựng, bởi vì chúng ta đơn giản là không thể thiết kế các giải pháp từ đầu cho các yêu cầu phức tạp phổ biến hiện nay. (Một quan điểm phổ biến ở AI những ngày này là bộ não con người thực sự làm việc như vậy - hành vi phát sinh qua vòng phản hồi, mạng ồ ạt kết nối với nhau, vv thay vì các module riêng biệt và các lớp với đơn giản, giao diện trừu tượng giữa chúng, và rằng đây là lý do tại sao chúng tôi đã có rất ít thành công trong việc mô phỏng trí thông minh của chính chúng ta.)


1
Cảm ơn rất nhiều. Vì vậy, ví dụ về quản lý bộ sưu tập / bộ nhớ rác có lẽ là ví dụ nổi tiếng nhất về sự tương tác này. Neil Gershenfeld đã viết một số thứ thú vị, mặc dù tôi chỉ hiểu một phần của nó.
RParadox

... Điểm rất tốt về sự phức tạp. Nếu chỉ có máy móc có thể thiết kế máy móc của chúng tôi, điều này dẫn đến đâu? Nếu người AI đang nói về AI tạo ra AI thông minh hơn, có lẽ chúng ta gần như ở đó. ;)
RParadox
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.