Hỏi về hàm và cách nó hoạt động

mấy bạn cho mình hỏi thực sự thì 1 hàm sẽ hoạt động thế nào .

vd 1 biến sẽ được cấp phát 1 vùng nhớ trên bộ nhớ rồi sau đó sẽ lưu giá trị tương ứng vào vùng nhớ đó , khi nào muốn truy cập thì có thể truy cập qua tên hoặc địa chỉ của biến , nếu trong lập trình tuần tự thì hàm này tương tác với biến này xong rồi hàm khác mới tương tác tiếp

theo mình đọc trên mạng thì code của hàm sẽ được lưu trong Code segment (text segment) , và hàm cũng có 1 con trỏ hàm thay vì truy cập qua tên thì truy cập qua con trỏ này

nếu chạy chương trình theo kiểu tuần tự thì ko có gì đáng nói , nhưng nếu chạy đa luồng thì , hàm lúc đó sẽ được các luồng chạy đồng thời gọi như thế nào , vì tại 1 thời điểm chỉ có thể thực thi được 1 hàm và mã lệnh của hàm cũng chỉ nằm ở 1 vùng nhất định làm sao nhiều luồng có thể thực thi cùng 1 hàm tại cùng 1 thời điểm được ??

code segment như 1 cái bảng hướng dẫn nhiều người đọc và làm theo cũng được mà, có cần tuần tự người này đọc xong mới tới người kia đọc đâu :V

cái bảng hướng dẫn chỉ để đọc ko để ghi, ko sợ bị lỗi. Chứ còn 1 tờ giấy nhiều người ghi cùng lúc cũng được luôn mà. Có điều ghi dẫm đè lên nhau thôi :V

5 Likes

vậy mình suy diễn thế này có đúng ko
vd:

void methodA (int param){
    int a = param + 1 ;
    print(a); 
}

nếu 4 luồng cùng gọi đến methodA , thì 4 luồng sẽ xin cấp phát vùng nhớ khác nhau cho 4 biến a , 4 biến param , đó là về mặt cấp phát , còn về mặt lệnh thực thi thì cả 4 hàm sẽ luôn thực thi 2 dòng lệnh

int a = param + 1 ;
print(a); 

vì trong code segment nó có mã lệnh cố định là như vậy đúng ko?

đúng rồi :V

nói “cấp phát vùng nhớ” nghe ghê gớm vậy chứ thật ra nó dịch stack pointer đi 4 bytes cho param và 4 bytes cho a là xong rồi :V

mỗi luồng sẽ có vùng stack riêng của nó, còn vùng code, vùng data, vùng heap được shared giữa các luồng. (sai: Nên hàm methodA kia gọi chả luồng nào ảnh hưởng luồng nào, vô tư.) Á nhầm, nếu hàm print in ra stdout, mà stdout được shared giữa các luồng, vậy thì các luồng vẫn giẫm chân lên nhau :joy:

5 Likes

cảm ơn bạn 1h đêm vẫn rep cho mình …:smiley:

Trước mình học C khá ổn và đây là cách thầy giáo nói về vấn đề khi một hàm được gọi (trong C/C++):

Cụ thể nó gồm bước như sau:

Bước 1: Cấp pháp bộ nhớ cho biến cục bộ và tham số của hàm ở bộ nhớ stack và cái này mình không chắc (con trỏ lưu địa chỉ trả về của hàm)

Bước 2: Sao chép các giá trị của các đối số cho các tham số tương ứng (giá trị ở đây phải hiểu là vừa là giá trị bình thường như int, float vừa có thể là con trỏ-tương ứng với địa chỉ)

Bước 3: Thực hiện các lệnh trong thân của hàm và lưu vào địa chỉ chưa giá trị trả về của hàm

Bước 4: Giải phóng bộ nhớ cho các biến cục bộ, tham số, quay trở về giá trị của hàm.

Đối với hàm inline chỉ có mỗi bước thứ 3.

Cái này cũng lâu rồi nên có thể sai chút, nhưng khá chính xác đấy.

Còn về vấn đề đa luồng thì cần phải xử lý riêng, có nhiều cơ chế xử lý đồng bộ để quản lý việc chia sẻ tài nguyên. Như kỹ thuật đèn báo(Semaphore) chẳng hạn.

5 Likes

Hi VietReam.

  1. Code chỉ là hướng dẫn CPU làm việc thôi. Còn cái chạy code là nhân CPU Code segment (text segment). Và vùng nhớ này là chỉ đọc nên nếu có nhiều luồng cùng đọc một lúc cũng không sao.
  2. Trong cùng một thời điển, máy có bao nhiêu nhân thì có chừng ấy luồng thực thi cùng một lúc.
  3. Nếu máy chỉ có một nhân thì nó sẽ chuyển qua lại liên tục các mã nhưng thời gian chạy một lệnh cực nhanh nên không cảm thấy có đỗ trễ.
  4. Tuy nhiên với các vùng nhớ cả đọc và ghi thì cần các kỹ thuật bảo vệ vùng nhớ.
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?