Тёмный

Memory layout in C: Một chương trình C được tổ chức trong memory như thế nào? Heap và Stack là gì? 

Code Kỹ
Подписаться 3,8 тыс.
Просмотров 23 тыс.
50% 1

Video này giải thích cách một chương trình được tổ chức trong memory khi thực thi.
Bạn có biết Heap là gì? Stack là gì? Bạn có tự tin khi trả lời câu hỏi phỏng vấn về Heap và Stack?
Trong video này, các bạn sẽ biết được một chương trình C được tổ chức trong bộ nhớ như thế nào khi thực thi. Bạn sẽ biết được một biến được lưu ở đâu trong bộ nhớ, và một function frame trong stack sẽ có cấu trúc như thế nào.
P/S: Memory layout là một câu hỏi phỏng vấn ưa thích của mình dành cho các bạn senior embedded.
Code Kỹ channel
Fanpage: codeky.dev
Website: codeky.dev

Опубликовано:

 

19 сен 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 63   
@codeky2261
@codeky2261 3 года назад
Một lưu ý là ở video chỉ liệt kê các các phần cơ bản của một stack frame để các bạn dễ nắm bắt thôi nhé. Một stack frame đầy đủ còn có exception handler, saved registers... Và một câu hỏi phụ dành cho các Code Kỹ: truy cập biến trong stack và trong heap cái nào sẽ nhanh hơn?
@minhquannguyen3605
@minhquannguyen3605 3 года назад
Theo mình hiểu là stack sẽ nhanh hơn. Con trỏ chương trình thường sẽ trỏ lên stack (trong việc xử lý các vấn đề scope). Trên heap thì sẽ phải tốn qua 1 bước qua pointer, ngoài ra code trên heap cũng ko đc đưa vào cache, register trong quá trình optimize, trong khi stack thì có thể
@namdophuong2609
@namdophuong2609 7 месяцев назад
Anh ơi, cho em hỏi là trong ngôn ngữ lập trình C thì thực sự sẽ có mấy kiểu cấp phát bộ nhớ ạ ? Em có tham khảo trên một số trang web thì nói có hai cách cấp phát đó là static memory allocation và dynamic memory allocation. Nhưng có một số nơi còn có thêm cả automatic memory allocation nữa ạ. Mong anh giải đáp thắc mắc giúp em ạ. E cảm ơn !
@MrThinhle
@MrThinhle 2 года назад
Cảm ơn anh nhé, rất dễ hiểu ạ
@longvungoc260
@longvungoc260 3 месяца назад
hay quá ạ, anh có thể ra thêm video về compiler và cách compiler hoạt động không ạ
@parkle_
@parkle_ 2 года назад
cảm ơn anh rất nhiều
@KienNguyenTT
@KienNguyenTT 3 месяца назад
anh hướng dẫn lập trình assembly đi ạ
@minhcuongtran8504
@minhcuongtran8504 3 года назад
ôi đỉnh , a ra video thêm về mcu đi a , những cái cần để đi thực tập ạ
@codeky2261
@codeky2261 3 года назад
Ok nhé ;)
@lennguyenphuoc8164
@lennguyenphuoc8164 Год назад
Học môn nào thì có thể biết được các kiến thức về phần này vậy ad
@LongHoang-xl7vj
@LongHoang-xl7vj Год назад
Hợp ngữ - Assembly nha bạn
@phatngqn
@phatngqn Год назад
bạn làm về memory pool region nhé.
@_USER_NAME_
@_USER_NAME_ 3 года назад
hay quá A
@codeky2261
@codeky2261 3 года назад
Thanks bạn đã ủng hộ kênh nhé
@viennguyenquoc7920
@viennguyenquoc7920 3 года назад
ad có thể giải thích rõ hơn về Stack Frame dc không ạ
@mykun8737
@mykun8737 2 года назад
đoạn push() hàm foo vào stack bạn vẽ nhầm, vì khi đó hàm foo phải ở bên trên stack mới đúng
@chungtrinhuc4936
@chungtrinhuc4936 2 года назад
Bạn nhầm rồi, cái stack đầu nó ở dưới đáy nó ở trên theo như hình minh họa nên như thế là đúng r
@levantho7264
@levantho7264 3 года назад
Thanks anh.
@codeky2261
@codeky2261 3 года назад
Thanks em đã ủng hộ kênh nhé
@levantho7264
@levantho7264 3 года назад
@@codeky2261 mong anh ra nhiều video ....anh có chuyên về MCU không ạ? em muốn học hỏi thêm....
@codeky2261
@codeky2261 3 года назад
Sắp tới sẽ làm video về embedded nhé :)
@abisut
@abisut 3 года назад
Mình không biết có đúng hay là không, nhưng có vẻ đây là memory layout của 1 process(trên linux chẳn hạn) mà C program là một trong những process như vậy nên nó có memory layout như bạn trình bày. Bạn có thử làm với C trên window chưa? cái memory layout có giống vậy không? Mình nghĩ đây thật sự có liên quan mật thiết đến platform chứ không chính xác là với mọi C program trên mọi platform là nó như vậy. Trên window nó khác, trên linux nó khác, và có vẻ trên Mac cũng khác luôn.
@codeky2261
@codeky2261 3 года назад
Thanks, câu hỏi của bạn rất hay và gợi mở được nhiều vấn đề mới không có trong video. Memory layout của một process trên linux cũng tương tự như vậy, nhưng không phải vì vậy mà một chương trình C có cấu trúc như đó. Thực ra là Linux kernel được viết bằng C. Các segment như Text, DS và BSS là các concept trong computer science chứ không phải thuộc về Linux. Từ kiến trúc của chip 8086 đã support các Code segment, Data segment, Stack segment… Các ngôn ngữ hiện đại hơn sau này apply và phát triển các concept này. Khi compiler compile code C ra một chương trình thực thi thì đã bao gồm Text, DS và BSS rồi. Nếu chương trình được build và chạy trên môi trường OS như Linux hoặc Window thì OS sẽ tạo virtual address space cho process và load chương trình vào mem. Heap và Stack được allocate bởi OS. Chú ý là trong hình visualize các segment này liền kề nhau nhưng thực tế không cần như vậy. Allocate như thế nào là do OS quyết định. Nếu build chương trình bare-metal (non-os) cho các ứng dụng embedded, chúng ta cần define các segment này trong linker script và viết thêm startup code (thường là dùng assembly) Thân :)
@toancong2327
@toancong2327 3 года назад
@@codeky2261 cảm ơn bạn đã cho mình biết thêm kiến thức hữu ích này. ESP, EFP thực sự rất hữu ích trong quá trình trace back. Anyway, kênh này cũng là 1 trang khá hay để hiểu hơn về virtual memory: cpp.daynhauhoc.com/8/10-phan-loai-cac-vung-nho-stack-va-heap/ Thank !!!
@codeky2261
@codeky2261 3 года назад
Thanks bạn. Link bạn gửi rất hữu ích.
@haoanh655
@haoanh655 2 года назад
cho e hỏi toàn bộ memory layout nằm trên RAM phải k ạ?
@ducduong6328
@ducduong6328 Год назад
chuan, memory dich ra la ram ma
@baotang6436
@baotang6436 7 месяцев назад
@@ducduong6328vậy rom chứa gì bạn
@NgPhucAn
@NgPhucAn 3 месяца назад
@@ducduong6328không có kiến thức thì đừng có dạy người ta. RAM là random access memory, còn memory là bộ nhớ.
@ducduong6328
@ducduong6328 3 месяца назад
@@NgPhucAn ram la thang cha may ay
@NgPhucAn
@NgPhucAn 3 месяца назад
@@ducduong6328 kkk cmt 1 năm rồi mà vẫn cay à =))
@PiPuisme
@PiPuisme Год назад
Dạ cho em hỏi khi mình tạo một con trỏ thì con trỏ đó sẽ được lưu ở stack còn data tại địa chỉ con trỏ trỏ đến được cấp phát sẽ được lưu trong heap, như vậy có đúng không ạ? Em cám ơn.
@codeky2261
@codeky2261 Год назад
Data chỉ được lưu trong heap nếu đc cấp phát động, như là bằng malloc hoăc new. Khi cấp phát động thì sẽ trả về con trỏ để quản lý vùng nhớ đó.
@quanphamanh957
@quanphamanh957 3 года назад
Anh ơi cho em hỏi là sao ví dụ về stack thì function foo lại ném ở dưới function main mà không phải bỏ từ trên xuống ạ
@atNguyen-gm6cf
@atNguyen-gm6cf 3 года назад
cùng câu hỏi
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 3 года назад
Mình code thì có thể code được, vì cũng làm một vài project rồi. Mà hiện mình chưa tự tin ứng cử vào vị trí lập trình nhúng. Vậy có lời khuyên nào cho mình? Do mình thích code nhúng.
@codeky2261
@codeky2261 3 года назад
Mình có thể tự làm một số project về nhúng, vừa để nâng skill, vừa để có cái show kinh nghiệm. Code thì up lên github, demo quay video lại và up lên youtube. CV thì liệt kê các project đó và dẫn link đến code+demo. Ý tưởng về project thì có thể tìm trên mạng. :)
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 3 года назад
@@codeky2261 Mình đã từng làm một số project, nhưng vẫn chauw tự tin PV, do mình cũng đã hơn 32 rồi. Mình chưa hiểu lắm các thuật ngữ trong code, với cũng ít dùng, mặc dù có làm một vài cái như smart Locker, Thiết bị thước đo lường...
@hoantran3541
@hoantran3541 2 года назад
@@Huynh-Tan-Quoc Tầm tuổi đấy mà chưa tự tin với kiến thức thì... Trẻ họ còn chỉ bảo, chứ lớn phải nỗ lực để mức kinh nghiệm nó tương đương với tuổi. Sự thực nó vậy. Không biết hỏi vậy để làm gì
@Huynh-Tan-Quoc
@Huynh-Tan-Quoc 2 года назад
@@hoantran3541 Thật ra khi đi làm, mình điều biết giữa làm được, làm chạy ổn định, làm tối ưu là các cấp bậc level nó khác nhau. Mình code này cũng được 2 năm, nhưng với các project nó bé tí, tính cọ xác ko cao. Với chưa vòa môi trường chuyên nghiệp, trước giờ mình toàn tự mò tới mò, chưa qua trường lớp nào về lập trình cả. Kiểu dân trong đạo hay nói mình là dân ngoại đạo vậy ý. Nhiều lúc code được, nhưng ko hiểu nó thuật ngữ chuyên môn gì. Với mình code trên nền có sẵn thư viện rồi, mình kế thừa thư viện ý vào ứng dụng của mình. cho nên nhiều lúc ứng dụng mình ko quá phức tạp, nên kiến thức nó cũng hạn hẸp. mình chuyên về QL hệ thống, nhưng giờ muốn đổi qua chuyên môn này ý.
@minhcuongtran8504
@minhcuongtran8504 3 года назад
cho em hỏi bộ nhớ flash có thể ở trong vùng text đúng k ạ . và stack có được tạo ra bởi vùng nhớ flash k ạ
@codeky2261
@codeky2261 3 года назад
Vùng text chứa code nên trong bare application thường là dùng flash luôn. Với OS-based application thì os sẽ load chương trình vào ram cho nên text segment sẽ nằm ở RAM. Về stack, và cả heap, thì mình sẽ dùng RAM vì đặc thù các vùng này liên tục cấp phát và giải phóng bộ nhớ, nghĩa là đọc ghi liên tục. Nếu dùng flash thì sẽ rất chậm, chưa kể flash ngày xưa có write cycle khá ít :)
@minhcuongtran8504
@minhcuongtran8504 3 года назад
Vâng em cảm ơn . A ra thêm video đi ạ
@mandaraanda2597
@mandaraanda2597 3 года назад
Cho em hỏi là em sv năm 4 rồi muốn hướng sang Embedded (cụ thể là lập trình ECU xe máy) thì lập trình hướng đối tượng có nên học ko ạ hay mình chỉ cần tập trung vào vi điều khiển ạ?
@codeky2261
@codeky2261 3 года назад
Hi em, Lập trình embedded cho ECU chủ yếu vẫn dùng C và thường thì không lập trình theo OOP. Theo định hướng nhúng cho ECU thì trước tiên em nên tập trung vào C, kiến trúc vi điều khiển, các ngoại vi và các chuẩn giao tiếp bus (trong automotive thì LIN, CAN, Flexray...). Sau khi đã vững với C và embedded, em có thể học thêm OOP để mở rộng lĩnh vực của mình. Em cũng có thể áp dụng một số khái niệm của object (không phải full OOP) vào lập trình C cho embedded để có kiến trúc chương trình tốt hơn. Chúc em thành công với định hướng của bản thân nhé :)
@mandaraanda2597
@mandaraanda2597 3 года назад
@@codeky2261 dạ, em chân thành cảm ơn góp ý của anh. Và nếu giờ em muốn học thêm về automotive thì em nên học ở đâu ạ (em ở sài gòn). Mong chờ nhiều nhiều video của anh để em có thể học hỏi và sẻ chia cho nhiều bạn khác hơn ạ. Chúc anh 1 ngày 20.11 thật nhiều niềm an vui.
@codeky2261
@codeky2261 3 года назад
Cảm ơn em. Anh cũng không biết trung tâm nào dạy về automotive tốt ở Saigon. Sắp tới nhóm sẽ thêm các video về automotive. Em tiếp tục ủng hộ nhóm nhé. :)
@mandaraanda2597
@mandaraanda2597 3 года назад
@@codeky2261 Dạ, em để sub alarm lun òi :v có video là em ủng hộ liền liền luonn
@phuco8206
@phuco8206 3 года назад
Hi bạn, nếu bạn muốn theo hướng automative thì có thể apply vào FPT nhé, bên đấy có tuyển fresher nha. Chỉ cần bạn có kiến thức về C và vi điều khiển là được.
@nghialuu2203
@nghialuu2203 3 года назад
Những cái này thì đọc sách nào nhỉ ?
@duongvumanh5651
@duongvumanh5651 Год назад
cho em hỏi tại sao stack lại cấp từ địa chỉ cao đến thấp với ạ
@codeky2261
@codeky2261 Год назад
Cái này do OS hoặc compiler quy định. Tùy theo OS hoặc compiler mà sắp xếp stack từ đc cao xuống thấp hoặc thấp lên cao thôi.
@hoc-lap-trinh
@hoc-lap-trinh Месяц назад
⁠@@codeky2261do kiến trúc máy tính quy định đó bạn, OS hay compiler chỉ giúp phân bố phần bộ nhớ làm stack thôi, các lệnh push luôn làm giảm giá trị của stack pointer (SP), pop thì ngược lại
@ngoctranss
@ngoctranss Год назад
Anh ơi cho em xin slide được không ạ
@hoangbachdang9075
@hoangbachdang9075 2 года назад
local variable em không thấy anh đề cập
@ducduong6328
@ducduong6328 Год назад
Stack segment Call Stack (thường được gọi là Stack) được dùng để cấp phát bộ nhớ cho tham số của các hàm (function parameters) và biến cục bộ (local variables). Call Stack được thực hiện theo cấu trúc dữ liệu stack, do đó, trước khi nói về phân vùng Stack trên bộ nhớ ảo mình sẽ trình bày cho các bạn về cấu trúc dữ liệu stack trước.
@hoc-lap-trinh
@hoc-lap-trinh Месяц назад
Local variable được chứa trong stack đó bạn
Далее
Ромарио стал Ромой
00:46
Просмотров 89 тыс.
Pointers and dynamic memory - stack vs heap
17:26
Просмотров 1,4 млн
Stack vs Heap Memory in C++
19:31
Просмотров 567 тыс.
Tất cả các tướng Tam Quốc trong 15 phút
14:58
Stack vs Heap Memory - Simple Explanation
5:28
Просмотров 229 тыс.
Ромарио стал Ромой
00:46
Просмотров 89 тыс.