Top Ad unit 728 × 90

Latest news

recent

Đồng bộ và bất đồng bộ (synchronous & asynchronous)

Hôm nay một cậu nào đó :) hay một em gái xinh xẻo nào đó (cái này có chúa mới biết) đột nhiên hỏi mình một câu hỏi liên quan tới kỉ thuật lập trình trong khi mình đang ngồi nhổ râu vì cái SPI driver cà rởn lúc chạy lúc không. Kỉ thuật mà em ấy hỏi (tạm cho đó là một nàng để đời nó bớt éo le) có liên quan tới cặp từ synchronous và asynchronous. Hầu như bí kíp võ công thường được chứa trong chỉ vài từ quan trọng (Key word), tinh hoa của một cuốn sách đôi khi chỉ nằm ở vài câu (cái này chỉ nói theo ai đó). Trong tình huống này, chỉ bằng cách hiểu cặp cụm từ này một cách xác đáng bạn có thể bao quát được khá nhiều kỉ thuật quan trọng và công nghệ đang thịnh hành ở nhiều lĩnh vực khác nhau. Giao thức TCP và UDP, Ajax, hàm Callback, truyền dẫn tín hiệu ... là vài trong những thứ linh tinh đó :).

Trước khi bàn trực tiếp về Đồng bộ và bất đồng bộ (synchronous & asynchronous), chúng ta nên bàn về bối cảnh của việc sử dụng cặp từ này. Có thể dễ dàng thấy chúng liên quan tới một cái gì đó có số nhiều. Bạn không bao giờ có thể dùng từ synchronous hay asynchronous cho trường hợp chỉ duy nhất một được. Mở rộng ra chúng còn thường được dùng liên quan tới những quá trình có khả năng tái diễn cao. Như vậy chúng nên được xem xét trong một phạm vi của tập hợp nhiều phần tử, những phần tử này có thể là dữ liệu, tín hiệu, tiến trình xử lý hay tác vụ.

Synchronous (đồng bộ) là khái niệm nói lên tính nguyên tắc, nó đòi hỏi các dữ liệu, tiến trình ... có liên quan phải được kết nối, liên hệ theo một trình tự thực hiện, một định dạng, ...cách thức cố định, không bao giờ thay đổi. Trong một chuỗi các hàm của một quy trình có n tác vụ, nếu nó được bảo là đồng bộ thì trình tự thực hiện các hàm đó sẽ không bao giờ thay đổi. Hàm A đã được thiết lập để được gọi và chạy trước hàm B thì dù có phải đợi dài cổ hàm B cũng phải chờ hàm A kết thúc mới được phép bắt đầu. Một dây chuyền sản xuất công nghiệp của một nhà máy có thể coi là một quá trình đồng bộ.

Asynchronous (bất đồng bộ) là một khái niệm có thể nói là ngược lại với Synchronous. Nó nói lên sự thiếu chặt chẻ, tính liên kết yếu, quản lý vô cùng khó khăn (đôi khi không biết đâu mà lần :p) tuy nhiên lại uyển chuyển và khả năng tùy biến cao. Trong một chuỗi các hàm của một quy trình có n tác vụ, nếu nó được bảo là bất đồng bộ thì có nghĩa là cho dù hàm B được gọi sau hàm A nhưng không ai đảm bảo được rằng hàm A sẽ phải kết thúc trước hàm B và hàm B bắt buộc phải chỉ được gọi chạy khi hàm A kết thúc.

Trong một xã hội đồng bộ, kẹt xe xãy ra, xe nọ nối đuôi xe kia trong đúng làn đường vì đơn giản mọi thành phần tham gia giao thông đều tuân thủ nguyên tắc trước sau (FIFO) và quy định đi đúng phần đường. Tuy nhiên trong một xã hội thiếu đồng bộ thì khi kẹt xe bạn có thể vác xe lên vai, hay phóng xe lên vỉa hè rồi tót lên trên, lao bừa vô hẻm, phân tích thiệt hơn chúng ta sẽ thấy sự ưu khuyết của hai quan điểm hành xữ Asynchronous và Synchronous có phần mang tính hên xui :p và tùy tình huống ứng dụng.

Thông thường người ta dễ hiểu Asynchronous gần với sự lộn xộn hay ngẫu nhiên (random), tôi không phủ định, tuy nhiên trong kỉ thuật, sự ba hồi ba phèng của Asynchronous thông thường trong khuôn khổ. Giống như khi bạn học trong một trường không cần đồng phục nhưng hãy thử bận bikini đi học xem :). Vì vậy hãy suy nghĩ về cặp khái niệm này trên cơ sở thuyết tương đối :).

Một lưu ý hết sức hay ho nữa được rút ra từ những gì đã nói ở trên là Asynchronous thường mang tính thực tế, tiệm cận với các xử lý thời gian thực, gần tính người, ít máy móc hơn Synchronous. Hãy suy nghĩ về lưu ý này với những ưu khuyến đã đề cập ở trên để liên hệ tới thực tiễn ứng dụng của bạn.

Dưới đây là ví dụ cụ thể về cách áp dụng khái niệm Asynchronous và Synchronous trong kỉ thuật lập trình:

/*1. cách thức nạp dữ liệu một cách không đồng bộ (asynchronously ) qua thiết bị*/

int iBlabla = 1;
void writerCall();

...

{
callbackStruct.fxn = writerCall
callbackStruct.fxn = NULL;

size = sizeof(userStruct);
status = GIO_submit(gioChan, IOM_WRITE, &userStruct, &size, &callbackStruct);

iBlabla = iBlabla + 1;
...
}

void writeCall()
{
iBlabla = 0;
}

// Yêu cầu nạp dữ liệu qua cổng thiết bị của hàm GIO_submit được chuyển vào hàng đợi, khi yêu cầu này được xử lý xong thì hàm writeCall được khởi phát. Trong khi quá trình này diễn ra iBlabla = iBlabla + 1; vẫn tiếp tục được thực hiện mà không chờ.

/*2. cách thức nạp dữ liệu một cách đồng bộ (synchronously ) qua thiết bị*/
size = sizeof(userStruct);
status = GIO_submit(gioChan, IOM_WRITE, &userStruct, &size, NULL);

iBlabla = iBlabla + 1;

// Yêu cầu nạp dữ liệu qua cổng thiết bị của hàm GIO_submit được chuyển vào hàng đợi, khi yêu cầu này được xử lý xong thì trạng thái status được trả về. Trong khi quá trình này diễn ra iBlabla = iBlabla + 1; phải chờ để thực hiện tuần tự.

Bạn không cần phải hiểu các hàm của ví dụ trên, thay vì thế hãy cố gắng hiểu ý niệm mà ví dụ này muốn chuyển tải.

Bài viết này là tác phẩm của một người tự cho mình là làm việc chỉ theo ngẫu hứng (Asynchronous).


Binh Nguyen - Bioz
Đồng bộ và bất đồng bộ (synchronous & asynchronous) Reviewed by Bioz Nguyen on 11:18:00 PM Rating: 5
All Rights Reserved by IEEV © 2009 - 2016
Powered By Blogger, Designed by Sweetheme

Contact Form

Name

Email *

Message *

Powered by Blogger.