thắc mắc Concurrency, Parallel, Asynchronous, Multithreading khác nhau như thế nào?

  • Người tạo chủ đề Người tạo chủ đề o0alvin0o
  • Ngày bắt đầu Ngày bắt đầu
STOP!!!
TÔI CẮM MẮT ĐÂY CÒN CÃI NHAU KHÍCH ĐỂU SPAM TÔI CHO RA ĐẢO HẾT.
RIẾT THẢ THREAD NÀO THREAD ĐÓ THÀNH CÁI CHỢ!!!
Có phải tại tôi đâu, ông xem tôi tranh luận đàng hoàng, chính chúng nó sủa trc đấy chứ, ông xem có đúng ko, tự nhiên kêu tôi lập trình 4 tháng, thì thích chửi tôi chửi lại thôi
Ông phải coi coi tranh luận ko tranh luận, tự nhiên lục post xong kêu tôi kinh nghiêm 4 tháng, xong tranh luận ko lại, dở tính đàn bà ra, chứ tôi làm gì, tôi luôn bàn luận trung lập, tự nhiên 1 thẳng kêu tôi tào lao, thì tôi tranh luận coi tôi tào lao chỗ nào, hoàn toàn ko chửi thề đến lúc nó đi lục post, thì tôi ko còn thấy thằng đó đáng để tranh luận rồi
Lỗi do tụi nó trước chứ liên quan gì tới tôi :D
 
mấy cái ông nói thì tôi cung có nói trong các comment trên cuả tôi rồi đó. Nói chung nó cũng chả cao siêu gì, nếu ai học môn Kiến trúc máy tính + hệ điều hành thì sẽ biết, tất cả các trường đại học rồi dạy cái này, đáng tiếc là học từ những năm đầu (hồi tui ở HUST là năm 2) nên lúc ra trường đi làm nhiều sinh viên k còn nhớ nữa.
Hệ điều hành của BK với Kiến trúc máy tính t thấy học rời rạc lắm. Giờ bảo context switch của OS chạy như nào chắc phần lớn chịu.
Context Switch không hình dung ra thì mấy cái như process scheduling, segmentation, paging, virtual memory đúng kiểu cưỡi ngựa xem hoa. Học cho có rồi thi chứ base phần cứng không có k hiểu nổi.
Học xong hỏi atomic instruction là gì cũng k biết dù đã dạy ở lớp hệ điều hành.

Kiến trúc máy tính toàn học những CPU đơn giản. Những cái phục vụ OS đa nhiệm như MMU, TLB các thứ thì chịu không dạy nổi. Học mấy cái associate cache là hết.
Multi core hay cache coherence thì càng chịu.
 
Hệ điều hành của BK với Kiến trúc máy tính t thấy học rời rạc lắm. Giờ bảo context switch của OS chạy như nào chắc phần lớn chịu.
Context Switch không hình dung ra thì mấy cái như process scheduling, segmentation, paging, virtual memory đúng kiểu cưỡi ngựa xem hoa. Học cho có rồi thi chứ base phần cứng không có k hiểu nổi.
Học xong hỏi atomic instruction là gì cũng k biết dù đã dạy ở lớp hệ điều hành.

Kiến trúc máy tính toàn học những CPU đơn giản. Những cái phục vụ OS đa nhiệm như MMU, TLB các thứ thì chịu không dạy nổi. Học mấy cái associate cache là hết.
Multi core hay cache coherence thì càng chịu.
Nói văn hoa làm gì, mình cùng tranh luận nào bạn ơi, bạn chê mình cùn thì mình cùng vs bạn tranh luận.
Mình nói mọi thứ chạy qua hệ điều hành, thì nó phải theo hệ điều hành, bạn kêu tính toán ko cần qua hệ điều hành, qua cpu tính toán, cho mình hỏi thế cpu nó lấy data từ đâu để chạy thế bạn, hệ điều hành nó ko load lên thì nó lấy đâu nó chạy thế bạn, thêm nữa cpu vai trò trong máy tính đóng vài trò tính toán, so sánh, vậy tính toán thì cần cpu chứ cần ổ cứng để tính toán à bạn :D

Bạn viết phần mềm trên hệ điều hành, bạn chạy câu lệnh tính toán, chắc cpu nó tự biết, nó chạy ra kết quả cho bạn :D

Đấy hỏi thế thôi, đừng mang mấy cái to lớn ra, mấy cái đó google search dễ lắm :D chỉ mấy cái căn bản thôi, mình người thường, có làm về phần cứng đâu mà nắm rõ đc :D
 
Hệ điều hành của BK với Kiến trúc máy tính t thấy học rời rạc lắm. Giờ bảo context switch của OS chạy như nào chắc phần lớn chịu.
Context Switch không hình dung ra thì mấy cái như process scheduling, segmentation, paging, virtual memory đúng kiểu cưỡi ngựa xem hoa. Học cho có rồi thi chứ base phần cứng không có k hiểu nổi.
Học xong hỏi atomic instruction là gì cũng k biết dù đã dạy ở lớp hệ điều hành.

Kiến trúc máy tính toàn học những CPU đơn giản. Những cái phục vụ OS đa nhiệm như MMU, TLB các thứ thì chịu không dạy nổi. Học mấy cái associate cache là hết.
Multi core hay cache coherence thì càng chịu.
Ơ bạn ơi ngủ rồi à, hay đang google search, lúc post quá khứ của tôi vậy :D
Bạn to mồm lắm mà, đấy tôi nói rồi, cứ thằng nào lôi càng nhiều tiếng Anh vào là y như rằng ....
Kết thúc ở đây nha, cứ thẳng nào càng nói tiếng anh, thì thằng đó chả hiểu cái mẹ gì về lập trình cả, đúc kết 4 tháng lập trình thấy vậy, ahihi :D
 
Context Switch không hình dung ra thì mấy cái như process scheduling, segmentation, paging, virtual memory đúng kiểu cưỡi ngựa xem hoa. Học cho có rồi thi chứ base phần cứng không có k hiểu nổi.
Học xong hỏi atomic instruction là gì cũng k biết dù đã dạy ở lớp hệ điều hành.
trước khi học môn này, thì tôi nhớ đã học môn điện tử số rồi nên có thể biết qua được base phần cứng rồi. Ngoài ra tôi nhớ k nhầm thi khi học môn kiến trúc máy tính có 1 chương nói qua về transistor và các mạch cơ bản.


Kiến trúc máy tính toàn học những CPU đơn giản. Những cái phục vụ OS đa nhiệm như MMU, TLB các thứ thì chịu không dạy nổi. Học mấy cái associate cache là hết.
Multi core hay cache coherence thì càng chịu.
cái này thì t thấy họ dạy như vậy là hợp lý. Thứ nhất mục đích của họ chỉ là muốn dạy kiến thức cơ bản về một chiếc máy tính thì bắt buộc phải có những thành phần nào?, các thành phần tương tác với nhau như thế nào? Nói đúng ra là nguyên lý von neumann về kiến trúc may tính.

Còn về kiến trúc tập lệnh thì để phù hợp với mục đích giảng dạy, họ chọn MIPS là đúng vì nó đủ dùng để truyền đạt những thứ cơ bản nhất về một kiến trúc tập lệnh với sinh viên năm 2 - 3 chưa có nhiều kinh nghiệm lập trình. Thứ 2 với số lượng buổi học cho phép trong 1 kỳ, đâu đó tầm hơn 10 buổi thì dùng các kiến trúc phức tạp hơn như ARM lại k đủ, nếu dùng ARM chẳng hạn thì lại phải cắt lỗ chỗ ra để nhét dạy cho đủ tiết, cuối cùng sinh viên lại không hiểu gì.

Nói chung họ chọn như vậy vì mục đích giảng dạy thôi, tôi nhớ thời đó tôi học môn kiến trúc máy tính, thầy Nguyễn Kim Khánh cũng có nói chọn MIPS vì mục đích như vậy. Giống như các trương cấp 3 chọn pascal, những năm đầu đại học chọn C mà thôi.

Tiện thể hỏi bác K mấy HUST vậy. lằng nhằng có khi cùng khoá =))
 
trước khi học môn này, thì tôi nhớ đã học môn điện tử số rồi nên có thể biết qua được base phần cứng rồi. Ngoài ra tôi nhớ k nhầm thi khi học môn kiến trúc máy tính có 1 chương nói qua về transistor và các mạch cơ bản.



cái này thì t thấy họ dạy như vậy là hợp lý. Thứ nhất mục đích của họ chỉ là muốn dạy kiến thức cơ bản về một chiếc máy tính thì bắt buộc phải có những thành phần nào?, các thành phần tương tác với nhau như thế nào? Nói đúng ra là nguyên lý von neumann về kiến trúc may tính.

Còn về kiến trúc tập lệnh thì để phù hợp với mục đích giảng dạy, họ chọn MIPS là đúng vì nó đủ dùng để truyền đạt những thứ cơ bản nhất về một kiến trúc tập lệnh với sinh viên năm 2 - 3 chưa có nhiều kinh nghiệm lập trình. Thứ 2 với số lượng buổi học cho phép trong 1 kỳ, đâu đó tầm hơn 10 buổi thì dùng các kiến trúc phức tạp hơn như ARM lại k đủ, nếu dùng ARM chẳng hạn thì lại phải cắt lỗ chỗ ra để nhét dạy cho đủ tiết, cuối cùng sinh viên lại không hiểu gì.

Nói chung họ chọn như vậy vì mục đích giảng dạy thôi, tôi nhớ thời đó tôi học môn kiến trúc máy tính, thầy Nguyễn Kim Khánh cũng có nói chọn MIPS vì mục đích như vậy. Giống như các trương cấp 3 chọn pascal, những năm đầu đại học chọn C mà thôi.

Tiện thể hỏi bác K mấy HUST vậy. lằng nhằng có khi cùng khoá :LOL:
Tôi K60 học OS Thầy Hải, Cũng học MIPS thầy Khánh.
Lớp t còn bắt phải viết một cái shell cơ bản như kiểu bash của linux.

Đúng là học vậy cũng khá là tốt rồi.
Nhưng t vẫn thấy thiếu thiếu.
Ví dụ có một cảnh trong phim the Social Network học môn hệ điều hành như có học đến cả từng bit trong Page Table Entry để hiểu rõ paging nó chạy thực tế ra sao. Phim hư cấu nhưng chắc có phần thật trong đó.
Thấy học như thế mới thực sự hiểu kiến thức OS được dạy.
Đọc quyển Understanding the Linux Kernel sẽ thấy mở mang kiến thức như nào.
Nhưng mà nó phức tạp quá, đi sâu từng bit từng register ra sao, các hàm C của kernel như nào. T cũng chỉ dám nói là đọc qua chứ hiểu hết thì còn mướt :LOL:)
 
Nói văn hoa làm gì, mình cùng tranh luận nào bạn ơi, bạn chê mình cùn thì mình cùng vs bạn tranh luận.
Mình nói mọi thứ chạy qua hệ điều hành, thì nó phải theo hệ điều hành, bạn kêu tính toán ko cần qua hệ điều hành, qua cpu tính toán, cho mình hỏi thế cpu nó lấy data từ đâu để chạy thế bạn, hệ điều hành nó ko load lên thì nó lấy đâu nó chạy thế bạn, thêm nữa cpu vai trò trong máy tính đóng vài trò tính toán, so sánh, vậy tính toán thì cần cpu chứ cần ổ cứng để tính toán à bạn :D

Bạn viết phần mềm trên hệ điều hành, bạn chạy câu lệnh tính toán, chắc cpu nó tự biết, nó chạy ra kết quả cho bạn :D

Đấy hỏi thế thôi, đừng mang mấy cái to lớn ra, mấy cái đó google search dễ lắm :D chỉ mấy cái căn bản thôi, mình người thường, có làm về phần cứng đâu mà nắm rõ đc :D
Google search được thì trả lời giúp mình đi =))))
 
Ơ bạn ơi ngủ rồi à, hay đang google search, lúc post quá khứ của tôi vậy :D
Bạn to mồm lắm mà, đấy tôi nói rồi, cứ thằng nào lôi càng nhiều tiếng Anh vào là y như rằng ....
Kết thúc ở đây nha, cứ thẳng nào càng nói tiếng anh, thì thằng đó chả hiểu cái mẹ gì về lập trình cả, đúc kết 4 tháng lập trình thấy vậy, ahihi :D
Câu này thì hết nói nổi luôn rồi =)))). Không còn gì phản bác giờ phải lôi mấy thứ linh tinh ra soi =)))

Học lập trình không dùng tiếng anh thì ngồi dịch ngược ra từ tiếng việt rồi tìm tài liệu tham khảo sấp mặt =)))

Những cái cơ bản còn có chứ còn những cái càng sâu thì càng ít tài liệu tiếng việt.
Không nói tiếng anh cố dịch ra tiếng việt thì đố ai hiểu được
 
Câu này thì hết nói nổi luôn rồi :LOL:)). Không còn gì phản bác giờ phải lôi mấy thứ linh tinh ra soi :LOL:)

Học lập trình không dùng tiếng anh thì ngồi dịch ngược ra từ tiếng việt rồi tìm tài liệu tham khảo sấp mặt :LOL:)

Những cái cơ bản còn có chứ còn những cái càng sâu thì càng ít tài liệu tiếng việt.
Không nói tiếng anh cố dịch ra tiếng việt thì đố ai hiểu được
haha hôm qua tôi khích cho phát là cay ngay, mấy kiểu này vậy chứ yếu đuối lắm, người ta xóc cho mấy câu k chịu nổi đâu.

Tui debate đưa article, quote từ book ra, bí quá k biết làm gì thì dở trò nói lòng vòng, nhét chữ rồi còn bảo tây tàu này kia, chê người khác k có kinh nghiệm chỉ giỏi search :LOL: đến ạ với bố.
 
Những thứ trừu tượng như này mà cãi nhau thì đúng là ko biết ông nào đúng, ông nào sai, vì toàn lý thuyết. Trước giờ chưa thấy màn combat code nào, mà toàn chửi bới qua lại thôi.
 
Những thứ trừu tượng như này mà cãi nhau thì đúng là ko biết ông nào đúng, ông nào sai, vì toàn lý thuyết. Trước giờ chưa thấy màn combat code nào, mà toàn chửi bới qua lại thôi.
Lý thuyết thì cũng có lý thuyết đúng và sai mà bác. Mấy cái về hệ điều hành thì chẳng nhẽ các bác lại bảo đem code của linux kernel ra để giải thích thì hỏi Việt Nam này có bao nhiều người làm được vậy?

Lý thuyết đã được viết trong các nguồn uy tín thì dev cỏ như mình nên chấp nhận, và kiểm tra tính logic của nó để lấy đó làm nền tảng. Còn bảo học luôn cặn kẽ về code thì đó là việc của mấy ông Kernel Engineer còn dev cỏ thì nắm được lý thuyết là ok rồi.

Tranh luận thì người ta vẫn sẽ tranh luận thôi, cái quan trọng vẫn là tự mình kiểm chứng, nhưng nội dung mà người ta đang tranh luận cũng là nguồn để dễ dàng research thêm.
 
Lý thuyết thì cũng có lý thuyết đúng và sai mà bác. Mấy cái về hệ điều hành thì chẳng nhẽ các bác lại bảo đem code của linux kernel ra để giải thích thì hỏi Việt Nam này có bao nhiều người làm được vậy?
Đúng rồi đấy, ý tôi chính xác là như thế. Những lúc bế tắc cần phải đột phá về trình độ, đi đến tận cùng vấn đề mới mới thỏa mãn các bên. Nhưng thường thì trên voz ko mấy người làm được.
Thôi thì chấp nhận thực thế voz vốn như vậy.
 
Mình nghĩ hiểu về lý thuyết là rất ổn rồi, nhưng nếu hiểu về code nữa thì quá tuyệt vời. Được vậy thì không lo Việt Nam không hoá rồng được.
 
Mình thì hiểu theo định nghĩa cơ bản của concurrency: 1 core vừa làm việc này một lúc có thể lưu state lại và nhảy sang làm việc khác. Nghe có giống switch-context không ạ :D
 
Mình cũng muốn đóng góp tí:
Nhà hàng có 4 nhân viên ( 4 cores, lần lượt là core A, B, C, D )
Nhân viên có thể làm mọi task từ nấu ăn, bồi bàn, nhận order từ user ...
Được cái 4 nhân viên không biết được những công việc của các nhân viên khác
Thread có thể hiểu là những chỉ dẫn cho nhân viên để nhân việc thực hiện task
Khách đến ăn là user

Quản lý chỉ dùng 1 nhân viên
Sync: Nhân viên đợi khách gọi món => nhân viên vô bếp nấu => nhân viên đem ra => đợi khách ăn xong => nhân viên dọn dẹp.

Trường hợp có nhiều khách đến ăn mà chỉ có 1 nhân viên ra phục vụ thì khách đến sau đợi đến mùa quýt nên quản lý dùng 4 nhân viên

Parallelism: A ghi món xong giao cho B nấu xong đến C bê ra D đợi khách ăn xong rồi dọn dẹp.
Hoặc mình có thể code sao cho mỗi core đều làm y chang:
(A ghi món => A nấu => A bê => A dọn dẹp)
(B ghi món => B nấu => B bê => B dọn dẹp)
(C ghi món => C nấu => C bê => C dọn dẹp)
(D ghi món => D nấu => D bê => D dọn dẹp)
Nói chúng là mình tận dùng toàn bộ core
Trong java có hàm để run parallelStream

Async ( hay còn gọi là non-blocking ): Trong lúc đợi khách gọi món, đợi khách ăn xong thì cho nhân viên làm việc khác. Nếu A đang đợi khách ăn xong thì A có thể ghi món cho khách mới.
Asyn là cách để đạt được concurrency.

Quản lý muốn đem lại trải nghiệm đồng thời (concurrency) cho khách hàng
Giả sử:
- 2 khách hàng gọi món cùng 1 thời điểm ( thời gian đợi của khách 1 là 10s, khách 2 là 20s)
- chỉ 1 nhân viên A
- đợi + ghi món mất 5p, nấu 20p, bê ra 3p, đợi + dọn dẹp 4p
Concurrency: A trong lúc đợi khách 1 thì sẽ chuyển qua phục vụ khách 2. Thậm chí nếu không đợi thì A vẫn phục vụ qua lại giữa khách 1 và khách 2.
Khách hàng cảm thấy như mình được phục vụ liên tục, nhưng thực sự không phải vậy.

Thực tế thì làm việc với concurrency rất phức tạp, dễ lỗi. Lỗi phổ biến như là: race condition, deadlock. Nên concurrency chỉ khuyên dùng cho heavy task thôi. Việc thiết kế code để cho phù hợp với concurrency cũng rất chát :<
 
Sửa lần cuối:
Hi các bác, không biết topic này còn sống không. Mình cũng đang tìm hiểu về sự khác biệt giữa Asynchronous và Multithread, theo mình đọc được bản chất của async cũng là tạo ra 1 thread khác để sử lý công việc của nó và thông báo khi công việc đó hoàn tất. Vậy thực sự điểm khác nhau giữa 2 cái là gì, e thấy các bác đưa rất nhiều ví dụ, nhưng đều chung quy lại là 2 bài toán khác nhau. Em thử đưa ra 1 bài toán.
Task A bao gồm những task nhỏ B,C,D. Task C,D sẽ không cần chờ task B thực hiện xong mới chạy.
Giải pháp:
1. Multithread: tạo 1 thread mới chạy task B, lúc này task C, D sẽ tiếp tục thực hiện trên thread chính, task B thực hiện trên thread khác.
2. Async: chạy async cho task B. (e nghĩ bản chất cũng là vứt qua thread khác cho nó xử lý task B).
Ví dụ điển hình khi sử dụng java. Mình đọc được nhiều bài nói điểm khác nhau chủ yếu là 1 bên cho IO blocking, 1 bên cho CPU. Vậy với bài toán trên thì như thế nào.
Mong được giải đáp thắc mắc. Đa tạ các bác.
 
Sửa lần cuối:
Hi các bác, không biết topic này còn sống không. Mình cũng đang tìm hiểu về sự khác biệt giữa Asynchronous và Multithread, theo mình đọc được bản chất của async cũng là tạo ra 1 thread khác để sử lý công việc của nó và thông báo khi công việc đó hoàn tất. Vậy thực sự điểm khác nhau giữa 2 cái là gì, e thấy các bác đưa rất nhiều ví dụ, nhưng đều chung quy lại là 2 bài toán khác nhau. Em thử đưa ra 1 bài toán.
Task A bao gồm những task nhỏ B,C,D. Task C,D sẽ không cần chờ task B thực hiện xong mới chạy.
Giải pháp:
1. Multithread: tạo 1 thread mới chạy task B, lúc này task C, D sẽ tiếp tục thực hiện trên thread chính, task B thực hiện trên thread khác.
2. Async: chạy async cho task B. (e nghĩ bản chất cũng là vứt qua thread khác cho nó xử lý task B).
Ví dụ điển hình khi sử dụng java. Mình đọc được nhiều bài nói điểm khác nhau chủ yếu là 1 bên cho IO blocking, 1 bên cho CPU. Vậy với bài toán trên thì như thế nào.
Mong được giải đáp thắc mắc. Đa tạ các bác.
Khi nói async thì chỉ cần hiểu đơn giản là nó là một cơ chế để k cần phải đợi cho task hoàn thành mới tiếp tục. Còn multithread là một trong những cách để implement cái async thôi. Ngay cả Single thread vẫn làm async đc.
 
Hi các bác, không biết topic này còn sống không. Mình cũng đang tìm hiểu về sự khác biệt giữa Asynchronous và Multithread, theo mình đọc được bản chất của async cũng là tạo ra 1 thread khác để sử lý công việc của nó và thông báo khi công việc đó hoàn tất. Vậy thực sự điểm khác nhau giữa 2 cái là gì, e thấy các bác đưa rất nhiều ví dụ, nhưng đều chung quy lại là 2 bài toán khác nhau. Em thử đưa ra 1 bài toán.
Task A bao gồm những task nhỏ B,C,D. Task C,D sẽ không cần chờ task B thực hiện xong mới chạy.
Giải pháp:
1. Multithread: tạo 1 thread mới chạy task B, lúc này task C, D sẽ tiếp tục thực hiện trên thread chính, task B thực hiện trên thread khác.
2. Async: chạy async cho task B. (e nghĩ bản chất cũng là vứt qua thread khác cho nó xử lý task B).
Ví dụ điển hình khi sử dụng java. Mình đọc được nhiều bài nói điểm khác nhau chủ yếu là 1 bên cho IO blocking, 1 bên cho CPU. Vậy với bài toán trên thì như thế nào.
Mong được giải đáp thắc mắc. Đa tạ các bác.
Để mình mô phỏng ngoài đời thực cho dễ hiểu
zFNuZTA.png


Trong khu nhà trọ có 2 phòng chơi thân với nhau, 2 phòng quyết định góp tiền tổ chức tiệc liên hoan cuối năm

Vậy: 1 Phòng == 1 Process

Trong mỗi phòng có 2 ông Vozer, vậy 2 phòng là có 4 ông Vozer

Vậy: 1 ông Vozer == 1 Thread

==> Vậy tổng là có 2 processes, 4 threads (ở đây nói về OS level nhé, chứ hardware có thể khác, mình ko rành hardware nên ko chém)

--------------

Bây giờ phân công công việc cho 4 ông Vozer này ntn cho hiệu quả?

Giả sử 2 phòng gọi là A và B, 4 ông Vozer gọi là A1 và A2, B1 và B2.

Ông A1 đi đun nước sôi, chờ nước sôi xong mới đi mổ gà => Ông A1 làm 2 việc là đun nước sôi và mổ gà. Ông này đang thực hiện cơ chế sync, chờ nước sôi xong mới đi mổ gà.

Ông A2 đi nấu nồi lẩu, ông này đi đun nước sôi, bắc bếp lên xong đi nhặt rau luôn => Ông A2 làm 2 việc là đun nước sôi và nhặt rau. Ông này thực hiện cơ chế async vì ông này ko chờ nước sôi mới đi nhặt rau.

Ông B1 phi ra tạp hóa mua ít mì tôm, sau đó phi ra chợ mua thêm miếng heo quay => Ông B2 làm 2 việc là mua mì tôm ở tạp hóa, sau đó mới ra chợ mua thêm heo quay. Ông này thực hiện cơ chế sync vì làm tuần tự mua mì -> mua heo quay.

Ông B2 rảnh quá ngồi chơi -> Idle ko làm gì cả
osCpCsi.png


--------------

Túm lại ở đây là:

SyncAsync là cách sắp xếp công việc thực hiện đồng bộ từng bước hay thực hiện đồng thời.

Thực hiện đồng thời khác thực hiện song song nhé.

SingleMulti Threads/Processes số lượng đơn vị tham gia xử lý, với bài toán mô phỏng trên là số người.

=> Single/Multi Threads/Processes có thể kết hợp với Sync và Async, bọn nó ko loại trừ lẫn nhau.
 

Thống kê chủ đề

Ngày tạo
o0alvin0o,
Người trả lời cuối
tuong_tuong_1,
Trả lời
163
Lượt xem
29.741
Quay lại
Lên đầu trang