nói dối e blog

Viết Một Cái Proxy, Mục Đích Thì Bạn Hiểu Rồi

Dùng Linode đã hơn một năm, ngoài việc dựng blog, mình cũng cài mấy cái tool nhỏ lên đó. Việc sở hữu một server riêng trên internet đối với lập trình viên là khá cần thiết. Tất nhiên VPS này tuyệt đối không thể chọn trong nước, lý do bạn hiểu mà. Một lợi ích kèm theo là có thể dùng ssh -D, tin rằng nhiều bạn đã quen dùng cách này.

Di Chuyển Gc Của Lua Sang Một Luồng Độc Lập

Dưới đây là phần diễn giải lại nội dung về việc chuyển garbage collection (GC) của Lua sang một luồng độc lập, được trình bày bằng tiếng Việt phong phú và chính xác:


Chuyển cơ chế GC của Lua sang luồng xử lý riêng biệt

Vài hôm trước, tôi đã đi sâu phân tích chi tiết cách thức GC hoạt động trong nhân Lua. Để tổng hợp lại, đây là các bài viết phân tích cụ thể:

Mười Năm Tại NetEase

Tôi đã làm việc tại NetEase được mười năm rồi. Đúng một thập kỷ trước, vào ngày này, tôi đã hoàn tất thủ tục nhận việc tại tầng 36 ở Quảng Châu. Qua từng ấy năm, tôi đã viết không ít thứ, từng dự định hôm nay sẽ tổng kết lại, nhưng đến lúc ngồi xuống lại thấy chẳng còn cảm xúc gì. Ngày đầu tiên đi làm, người hướng dẫn tôi là Xiao Haitong. Anh ấy nói riêng với tôi: “Chúng tôi không áp dụng kiểu đào tạo nhập môn sáo rỗng, tôi biết anh cũng không thích điều đó. Nhiều công ty thích dùng phương pháp huấn luyện kiểu ‘rửa não’, nhưng NetEase chưa bao giờ như vậy. Dù sao anh cứ cầm cuốn sổ tay nhân viên về đọc trước đã.”

Nếu Phát Triển Một Engine 3D Mới Từ Đầu

Nếu bắt đầu xây dựng một engine 3D mới từ đầu
Gần đây tôi có chút thời gian rảnh. Trong những lúc suy nghĩ ngắt quãng, tôi tự hỏi liệu có nên thử làm một dự án nguồn mở vào thời gian rảnh hay không, chủ đề nào vừa thú vị vừa phù hợp với bản thân. Suy đi tính lại, phát triển một engine 3D có vẻ là lựa chọn hợp lý. Theo quan điểm của tôi, một dự án muốn thu hút được sự tham gia của các lập trình viên giàu kinh nghiệm thì trước tiên nó phải có giá trị thực tiễn. Dự án cần dễ thiết lập môi trường làm việc và tạo ra kết quả trực quan ngay lập tức để duy trì sự hứng thú cho việc phát triển dài hạn. Giai đoạn đầu nhất định phải tự mình thực hiện, xây dựng một bản mẫu cơ bản, do đó cần chọn lĩnh vực mà bản thân đã từng nghiên cứu sâu.

Phân Tích Mã Nguồn Lua GC (6) Kết Thúc

Phần phức tạp nhất trong GC là đánh dấu (mark) đã được trình bày xong. Những phần còn lại khá đơn giản. Hôm nay sẽ hoàn thành toàn bộ nội dung.

Quy trình dọn dẹp (sweep) gồm hai giai đoạn: giai đoạn đầu xử lý các chuỗi ký tự, giai đoạn sau xử lý các đối tượng khác. Xem đoạn mã tại lgc.c dòng 573:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
  case GCSsweepstring: {
   lu_mem old = g->totalbytes;
   sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]);
   if (g->sweepstrgc >= g->strt.size) /* không còn gì để dọn nữa? */
    g->gcstate = GCSsweep; /* kết thúc giai đoạn quét chuỗi */
   lua_assert(old >= g->totalbytes);
   g->estimate -= old - g->totalbytes;
   return GCSWEEPCOST;
  }
  case GCSsweep: {
   lu_mem old = g->totalbytes;
   g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX);
   if (*g->sweepgc == NULL) { /* không còn gì để quét nữa? */
    checkSizes(L);
    g->gcstate = GCSfinalize; /* kết thúc giai đoạn quét */
   }
   lua_assert(old >= g->totalbytes);
   g->estimate -= old - g->totalbytes;
   return GCSWEEPMAX*GCSWEEPCOST;
  }

Trong trạng thái GCSsweepstring, mỗi bước gọi sweepwholelist sẽ xử lý một cột trong bảng băm của strt. Trong điều kiện lý tưởng, mọi chuỗi đều được phân bố đều trong bảng băm không có va chạm, mỗi cột sẽ chứa đúng một chuỗi. Chúng ta có thể tham khảo đoạn mã tại lstring.c dòng 68:

Trở Lại Với Thiết Kế Mô-Đun Trong Ngôn Ngữ C

Năm ngoái tôi từng chia sẻ về những hạn chế của ngôn ngữ C trong việc hỗ trợ mô-đun hóa. Lúc đó tôi đã đề xuất một phương pháp gọi là USING để biểu diễn mối quan hệ phụ thuộc giữa các mô-đun trong C, đồng thời xử lý thứ tự khởi tạo mô-đun một cách hợp lý.

Các ngôn ngữ lập trình hiện đại đều nhận thức rõ tầm quan trọng của việc xây dựng hệ thống như lắp ráp lego, vì vậy họ tích hợp hỗ trợ mô-đun hóa ngay ở cấp độ ngôn ngữ. Điều này đã được cộng đồng kỹ sư phần mềm thừa nhận qua thời gian. So với các “đàn em” như Go - ngôn ngữ có sẵn từ khóa import và package, C quả thực đã quá già cỗi. Giải pháp tôi đề xuất trước đây chỉ là mô phỏng thô sơ, bởi không có sự hỗ trợ từ chính ngôn ngữ thì khó có thể làm được điều gì hoàn hảo.

0%