Khác biệt giữa hệ điều hành 32bit và 64bit

Chào các bác, em chưa hiểu rõ hệ điều hành 32bit và 64bit khác nhau như thế nào và tại sao một đoạn code assembly chạy được trên win32 nhưng không chạy được trên win64. Mong các bác giải thích giúp. Em cám ơn!

2 Likes

Khác biệt chủ yếu ở mỗi câu lệnh assembly tùy hệ điều hành mà có kích thước khác nhau. ở OS 32bit thì kích thước là 32bit, OS 64bit tương tự. Nhưng lệnh 64bit mới không chạy được trên OS 32bit chứ nhỉ?

2 Likes

Theo mình hiểu thì cái 32 bits hay 64 bits ở đây chính là chỉ số đường truyền dữ liệu đồng thời. 32 bits thì cùng một lúc sẽ có 32 bits được truyền đi, nên không gian địa chỉ là 2^32bytes = 4BG, vừa cung cấp địa chỉ cho bộ nhớ và các cổng vào ra nữa nên chỉ quản lí được nhỏ hơn 4GB Ram, còn 64 bits thì tương tự nhé. Tương tự cho đường truyền dữ liệu

1 Like

Mình học vi sử lý bình thường code trên emu8086 nhưng có lần thầy mình viết trên notepad rồi build trên win32 bit. Cuối buổi thầy bảo code không chạy trên win64 mà chỉ trên win32

1 Like

trường mình thầy cũng chỉ debug ở win 32 bit.

2 Likes

Cám ơn bạn, bạn có thể cho mình ít tài liệu để đọc cặn kẽ được không.

1 Like

emu8086 chạy trên win64 bình thường, cái asm của 8086 chạy trên DOS OS, emu8086 là phần mềm giả lập DOS OS thôi.

1 Like

Dân điện tử ko thể ko biết tới cuốn The Intel Microprocessor 8086/8088…

1 Like

Theo mình biết thì bits là nói về dữ liệu (data) chứ nhỉ ^^ (1 bytes là 8 bits, nên 32 bits là 4 byte và 64 bits là 8 octet).

Thực ra để hiểu cái này chúng ta lật lai lịch sử 1 chút và kiến trúc software / hardware ^^

  • Chúng ta đã biết hardware ngày càng phát triển, nhất là kích thước RAM. Khi kích thước RAM > 4GB thì OS 32 bits không nhận diện được toàn bộ RAM nữa. Một số phần mềm cũng yêu cầu làm việc với rất nhiều RAM để performance được ngon hơn.
  • Lý do cho sự hạn chế này thì chúng ta phải hiểu qua về kiến trúc:
    Đó là: Processor -> OS -> Application
    Để chạy được 64 bits OS bạn có phải CPU 64 bits
    Để chạy được app 64 bits, bạn phải có OS 64 bits

Ở hệ thống OS 32 bits, các app chỉ được hạn chế sử dụng tới 4096 MB RAM (2^32 = 4.294.967.296) bởi vì kích thước của giá trị 32 bits chỉ tới vậy. Do đó, mỗi process được OS cấp 4GB bộ nhớ ảo để dùng (thực tế, do driver được nạp của BIOS và các thiết bị # nên RAM dùng còn nhỏ hơn 4GB, tầm 3.6GB là cùng)

Vậy đó, CPU 32 bits chỉ:

  • Chỉ có thể trỏ tới / quản lý các địa chỉ có địa chỉ < 2^32
  • Xử lý đươc các data có kích thước < 2^32 (vì lý do 1)

Ngược lại, các CPU 64bits có thể vượt qua con số 4GB này rất dễ dàng (2^64 = 17.2 tỷ GB), ngoài ra, các CPU 64 bits còn được thiết kể multi-core nên cũng cho tốc độ tính toán nhanh hơn, chính xác hơn, đặc biệt là các app được viết theo kiểu xử lý // (một dữ liệu lớn, nó chia thành nhiều dữ liệu xử lý trên nhiều core, đồng thời các dữ liệu chia nhỏ này cũng không bị hạn chế 4GB về kích thước)

Thử tượng tượng với các app 32 bits trước kia, khi cần xử lý dữ liệu có kích thước lớn thì phải làm thế nào? Cắt nhỏ, xử lý đơn luồng, rồi lại ghép … Chậm và khó chính xác như app 64 bits được (tất nhiên cũng có app 64 bits thiết kế đơn luồng nhé)

Một số quan điểm sai:

  • Tập lệnh / câu lệnh trong CPU 64 bits # 32 bits. (cái # nhau ở đây là dữ liệu có thể được handle, vì chúng ta đã biết khi app hoạt động, dữ liệu sẽ được nạp lên RAM)
  • OS 64 bits dùng tốn RAM gấp đôi 32 bits và chạy nhanh gấp 2 (có dùng thêm cho các con trỏ địa chỉ, nhưng dữ liệu nạp vào RAM vẫn thế, không phải là kích thước gấp 2)
  • Chạy app 32 bits trên OS 64 bits nhanh hơn là chạy trên OS 32 bits (như nhau)
  • Chạy app 64 bits trên OS 64 bits chậm hơn 32 bits trên OS 32 bits (thậm chí sẽ nhanh hơn do multicore và dữ liệu xử lý batch)
8 Likes

Một chút về compatible:

  • Các app 32 bits vẫn chạy được trên OS 64 bits.
  • Muốn chạy các app 64 bits trên OS 32 bits -> không được, trừ phi phải dùng công nghệ ảo hóa (virtualization). Đặc biệt, công nghệ ảo hóa này phải giả lập được CPU 64 bits (nghĩa là CPU thật của bạn cũng phải là 64 bits và support hyper threading Intel VTX hoặc AMD V, khi đó CPU ảo sẽ dùng core của CPU thật luôn mà không cần dịch kiểu 1-1 các tập lệnh).
4 Likes

1K like cho Rep của bạn …
Thấy cái này có thể giúp các ứng dụng 64 bit chạy trên OS 32 bit :slight_smile:
Link : http://wiki.qemu.org/Download

1 Like

CPU xử lý song song hạn chế lắm, do các câu lệnh của các chương trình thường phải theo trình tự chứ ít khi chạy song song. Bởi vậy có 2 core 4 core thì cũng chả nhanh hơn 1 core gấp 2 hay 4 lần đâu. 32-bit mà multicore thì cũng như 64-bit multicore thôi. Xử lý song song phải là bên GPU, GPU nhiều core hơn CPU hẳn. Đề cao multicore ở đây là ko hoàn toàn đúng lắm

3 Likes

Cái này thì mình đồng ý với bạn. Thực ra, các app 32 bits trước kia do chạy trên OS/CPU 32 bits mà thời đó chưa có multi-core nên thường được thiết kế đơn luồng. Chứ bây giờ cũng có app 32 bits chạy đa luồng thật (thực ra mình cũng không có đề cao multi-core mà chỉ nói ưu thế của CPU 64 bits so với CPU 32 bits thôi)

Đúng là hiện giờ threading đang được đẩy sang GPU tính toán (nhưng không phải đẩy hoàn toàn vì GPU chỉ có ưu thế với các tính toán động). Bạn có thể xem https://en.wikipedia.org/wiki/AlphaGo, sẽ thấy tỷ lệ CPU / GPU trong tính toán song song (con này là Google DeepMind AI vừa chơi cờ vây)

Rất nhiều chương trình vẫn chạy // đó chứ, nhất là các chương trình trên máy chủ, ví dụ như MySQL, NginX, hay thậm chi NodeJS (tuy là single thread, nhưng vẫn có thể dùng PM2 để chạy Multi-process cùng lúc trên tất cả các core) giúp cho việc phục vụ tốt hơn nhiều.

3 Likes

Cám ơn các bác rất nhiều :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?