Các Chủ Đề Tiến Bộ Trong C# part 7
Số trang: 5
Loại file: pdf
Dung lượng: 136.31 KB
Lượt xem: 22
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Quản lý bộ nhớ bên dưới của C# Một trong những ưu điểm của C# là ta không cần quan tâm về việc quản lí bộ nhớ bên dưới vì điều này đã được bộ gom rác ( garbage collector ) của C# làm rồi . mặc dù vậy nếu ta muốn viết các đoạn mã tốt, có hiệu suất cao
Nội dung trích xuất từ tài liệu:
Các Chủ Đề Tiến Bộ Trong C# part 7Quản lý bộ nhớ bên dưới của C#Một trong những ưu điểm của C# là ta không cần quan tâm về việc quản lí bộ nhớ bêndưới vì điều này đã được bộ gom rác ( garbage collector ) của C# làm rồi . mặc dù vậynếu ta muốn viết các đoạn mã tốt, có hiệu suất cao , ta cần tìm hiểu về cách quản lí bộnhớ bên dưới.Trong phần này ta sẽ tìm hiểu điều gì xảy ra trong bộ nhớ khi ta dùng cácbiến.Giá trị các kiểu dữ liệuta sẽ tìm hiểu những gì xảy ra khi ta tạo ra một biến của kiểu giá trị. ta sẽ kiểm tra điều gìxảy ra trong bộ nhớ khi thực hiện các dòng lệnh :{int nRacingCars = 10;double engineSize = 3000.0;// do calculations;}Window dùng hệ thống địa chỉ ảo ( virtual addressing) ánh xạ từ địa chỉ bộ nhớ màchương trình ta thấy đến vị trí thực sự trong bộ nhớ vật lý hoặc trên đĩa được quản lí phiásau window.kết quả là mỗi ứng dụng trên nền xử lí 32-bit thấy được 4GB bộ nhớ , khôngcần biết bộ nhớ vật lí thực sự có kích thước bao nhiêu ( nền xử lí 64bit thì bộ nhớ naỳ lớnhơn) 4GB bộ nhớ này được gọi là không gian địa chỉ ảo ( virtual address space ) hay bộnhớ ảo ( virtual memory) .để đơn giản ta gọi nó là bộ nhớmỗi vùng nhớ từ 4GB này được đánh số từ 0 . nếu ta muốn chỉ định 1 giá trị lưu trữ trên 1phần cụ thể trong bộ nhớ , ta cần cung cấp số đại diện cho vùng nhớ này.trong ngôn ngữcấp cao , như là C# ,VB,C++ ,Java ..1 trong những thứ mà trình biên dịch làm là chuyểnđổi tên đọc được ( ví dụ tên biến ) thành địa chỉ vùng nhớ mà bộ xử lí hiểu.4GB bộ nhớnày thực sự chứa tất cả các phần của chương trình bao gồm mã thực thi và nội dung củabiến được dùng khi chương trình chạy. bất kì DLLs đưọc gọi sẽ nằm trong cùng khônggian địa chỉ này, mỗi mục của mã hoặc dữ liệu sẽ có vùng định nghĩa riêngđâu đó trong bộ nhớ là 1 vùng gọi là stack( ngăn xếp) . stack là nơi giá trị kiểu dử liệuđược lưu.khi ta gọi phương thức stack cũng được dùng để sao chép các thông số đượctruyền.để hiểu cách stack làm việc.ta cần lưu ý về phạm vi của biến trong C#. ví dụ :{ int a; // do something { int b; // do something else } }Đầu tiên a được khai báo . thì bên khối bên trong , b được khai báo.sau đó khối bên trongbị ngắt và b ra ngoài phạm vi, a ra ngoài phạm vi , vì thế đời sống của b nằm trong đờisống của a .Chúng ta sẽ xem điều gì xảy ra khi ta khai báo biến nRacingCars và engineSize từ ví dụđầuđâu đó trong chương trình có một thứ gọi là con trỏ stack ( stack pointer). Dây đơn gaỉnlà 1 biến ( và 1 địa chỉ trong bộ nhớ) mà chỉ cho ta địa chỉ của vùng trống kế tiếp trongstack.khi chương trình chạy,con trỏ stack sẽ trỏ đến phần cuối của khối bộ nhớ mà đượcgiữ trong stack.( phần sau nói về đặc tính của stack )The stack actually fills downwards, from high memory addresses to low addresses. Asdata is put on the stack, the stack pointer will be adjusted accordingly, so it always pointsto just past the next free location. Now, we dont know exactly where in the address spacethe stack is - we dont need to know for C# development - but lets say for the sake ofargument, that immediately before the above code that allocates the variables is executed,the stack pointer contains the value 800000 or, in hexadecimal, 0xC3500). We are takingthis memory location just for the sake of argument, to keep the numbers simple. In fact,later on when we start running code that uses pointers, we will see that the stack actuallystarts round about memory location 1243328 (0x12F8C8). However, we can explain theprinciples of how the stack works just as well using any address, so we may as well picka simple one. We will also mostly use decimal for addresses, again for simplicity,although it is more common to write memory addresses in hexadecimal format.Tình huống được minh hoạ trong biểu đồ, trong đó ,chữ in đậm chỉ định nội dung của vịtrí bộ nhớ,chữ thường chỉ định địa chỉ hoặc 1 mô tả của vị tríỞ điểm này ,biến nRacingCars nằm trong phạm vi và giá trị 10 được đặt trong nó.nếu giátrị 10 được đặt ở vị trí 799996-799999, 4 byte bên dưới vị trí được trỏ đến bởi con trỏstack -mà là 4 byte đầu tiên trống trên stack.Dòng kế khai báo biến engineSze, 1 double và khởi tạo n1o với giá trị 3000.0. mộtsố double chiếm 8 byte, vì thế giá trị 3000.0 sẽ được đặt ở vị trí 799988-799995 torngstack.con trỏ stack sẽ được tăng theo mỗi lần 8 để trỏ đến vùng trống dầu tiên trên stack .Các kiểu dữ liệu tham chiếuTa có thể muốn dùng 1 vài phương thức để cấp phát vùng nhớ để lưu trữ dữ liệu ,và giữcho dữ liệu còn giá trị đến sau khi phương thức kết thúc.điều này có thể được làm vớimột toán tử mới - khi là trường hợp trong tất cả các kiểu tham chiếu.Nếu ta đã làm việc với các đọan mã quảnl ý bộ nhớ cấp thấp torng quá khứ,ta sẽ quen vớistack và heap được dùng trong các chương trình trước .NET.heap quản lý (managed heap) không giống như heap mà các đoạn mã trước .NET như C++ dùng. nó làm việc dưới sựđiều khiển của bộ thu gom ...
Nội dung trích xuất từ tài liệu:
Các Chủ Đề Tiến Bộ Trong C# part 7Quản lý bộ nhớ bên dưới của C#Một trong những ưu điểm của C# là ta không cần quan tâm về việc quản lí bộ nhớ bêndưới vì điều này đã được bộ gom rác ( garbage collector ) của C# làm rồi . mặc dù vậynếu ta muốn viết các đoạn mã tốt, có hiệu suất cao , ta cần tìm hiểu về cách quản lí bộnhớ bên dưới.Trong phần này ta sẽ tìm hiểu điều gì xảy ra trong bộ nhớ khi ta dùng cácbiến.Giá trị các kiểu dữ liệuta sẽ tìm hiểu những gì xảy ra khi ta tạo ra một biến của kiểu giá trị. ta sẽ kiểm tra điều gìxảy ra trong bộ nhớ khi thực hiện các dòng lệnh :{int nRacingCars = 10;double engineSize = 3000.0;// do calculations;}Window dùng hệ thống địa chỉ ảo ( virtual addressing) ánh xạ từ địa chỉ bộ nhớ màchương trình ta thấy đến vị trí thực sự trong bộ nhớ vật lý hoặc trên đĩa được quản lí phiásau window.kết quả là mỗi ứng dụng trên nền xử lí 32-bit thấy được 4GB bộ nhớ , khôngcần biết bộ nhớ vật lí thực sự có kích thước bao nhiêu ( nền xử lí 64bit thì bộ nhớ naỳ lớnhơn) 4GB bộ nhớ này được gọi là không gian địa chỉ ảo ( virtual address space ) hay bộnhớ ảo ( virtual memory) .để đơn giản ta gọi nó là bộ nhớmỗi vùng nhớ từ 4GB này được đánh số từ 0 . nếu ta muốn chỉ định 1 giá trị lưu trữ trên 1phần cụ thể trong bộ nhớ , ta cần cung cấp số đại diện cho vùng nhớ này.trong ngôn ngữcấp cao , như là C# ,VB,C++ ,Java ..1 trong những thứ mà trình biên dịch làm là chuyểnđổi tên đọc được ( ví dụ tên biến ) thành địa chỉ vùng nhớ mà bộ xử lí hiểu.4GB bộ nhớnày thực sự chứa tất cả các phần của chương trình bao gồm mã thực thi và nội dung củabiến được dùng khi chương trình chạy. bất kì DLLs đưọc gọi sẽ nằm trong cùng khônggian địa chỉ này, mỗi mục của mã hoặc dữ liệu sẽ có vùng định nghĩa riêngđâu đó trong bộ nhớ là 1 vùng gọi là stack( ngăn xếp) . stack là nơi giá trị kiểu dử liệuđược lưu.khi ta gọi phương thức stack cũng được dùng để sao chép các thông số đượctruyền.để hiểu cách stack làm việc.ta cần lưu ý về phạm vi của biến trong C#. ví dụ :{ int a; // do something { int b; // do something else } }Đầu tiên a được khai báo . thì bên khối bên trong , b được khai báo.sau đó khối bên trongbị ngắt và b ra ngoài phạm vi, a ra ngoài phạm vi , vì thế đời sống của b nằm trong đờisống của a .Chúng ta sẽ xem điều gì xảy ra khi ta khai báo biến nRacingCars và engineSize từ ví dụđầuđâu đó trong chương trình có một thứ gọi là con trỏ stack ( stack pointer). Dây đơn gaỉnlà 1 biến ( và 1 địa chỉ trong bộ nhớ) mà chỉ cho ta địa chỉ của vùng trống kế tiếp trongstack.khi chương trình chạy,con trỏ stack sẽ trỏ đến phần cuối của khối bộ nhớ mà đượcgiữ trong stack.( phần sau nói về đặc tính của stack )The stack actually fills downwards, from high memory addresses to low addresses. Asdata is put on the stack, the stack pointer will be adjusted accordingly, so it always pointsto just past the next free location. Now, we dont know exactly where in the address spacethe stack is - we dont need to know for C# development - but lets say for the sake ofargument, that immediately before the above code that allocates the variables is executed,the stack pointer contains the value 800000 or, in hexadecimal, 0xC3500). We are takingthis memory location just for the sake of argument, to keep the numbers simple. In fact,later on when we start running code that uses pointers, we will see that the stack actuallystarts round about memory location 1243328 (0x12F8C8). However, we can explain theprinciples of how the stack works just as well using any address, so we may as well picka simple one. We will also mostly use decimal for addresses, again for simplicity,although it is more common to write memory addresses in hexadecimal format.Tình huống được minh hoạ trong biểu đồ, trong đó ,chữ in đậm chỉ định nội dung của vịtrí bộ nhớ,chữ thường chỉ định địa chỉ hoặc 1 mô tả của vị tríỞ điểm này ,biến nRacingCars nằm trong phạm vi và giá trị 10 được đặt trong nó.nếu giátrị 10 được đặt ở vị trí 799996-799999, 4 byte bên dưới vị trí được trỏ đến bởi con trỏstack -mà là 4 byte đầu tiên trống trên stack.Dòng kế khai báo biến engineSze, 1 double và khởi tạo n1o với giá trị 3000.0. mộtsố double chiếm 8 byte, vì thế giá trị 3000.0 sẽ được đặt ở vị trí 799988-799995 torngstack.con trỏ stack sẽ được tăng theo mỗi lần 8 để trỏ đến vùng trống dầu tiên trên stack .Các kiểu dữ liệu tham chiếuTa có thể muốn dùng 1 vài phương thức để cấp phát vùng nhớ để lưu trữ dữ liệu ,và giữcho dữ liệu còn giá trị đến sau khi phương thức kết thúc.điều này có thể được làm vớimột toán tử mới - khi là trường hợp trong tất cả các kiểu tham chiếu.Nếu ta đã làm việc với các đọan mã quảnl ý bộ nhớ cấp thấp torng quá khứ,ta sẽ quen vớistack và heap được dùng trong các chương trình trước .NET.heap quản lý (managed heap) không giống như heap mà các đoạn mã trước .NET như C++ dùng. nó làm việc dưới sựđiều khiển của bộ thu gom ...
Tìm kiếm theo từ khóa liên quan:
máy tính mạng máy tính internet C# ngôn ngữ C# ngôn ngữ ngôn ngữ lập trình lập trình phần mềm file ứng dụngGợi ý tài liệu liên quan:
-
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 261 0 0 -
Giáo án Tin học lớp 9 (Trọn bộ cả năm)
149 trang 254 0 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 251 0 0 -
Kỹ thuật lập trình trên Visual Basic 2005
148 trang 251 0 0 -
Ngân hàng câu hỏi trắc nghiệm môn mạng máy tính
99 trang 242 1 0 -
47 trang 235 3 0
-
Bài giảng: Lịch sử phát triển hệ thống mạng
118 trang 234 0 0 -
Giáo trình Hệ thống mạng máy tính CCNA (Tập 4): Phần 2
102 trang 233 0 0 -
Đề cương chi tiết học phần Thiết kế và cài đặt mạng
3 trang 233 0 0 -
Giáo trình Lập trình cơ bản với C++: Phần 1
77 trang 229 0 0