Điều này có nghĩa là ổ đĩa cần phải thêm chữ ổ đĩa và chấp nhận lưu trữ các tập tin thì bạn mới có thể dùng song song SSD và HDD được. 9. Phân vùng cho ổ cứng. Các bạn vào lại cửa sổ Computer Management và nhấp chuột phải vào ổ đĩa mới bạn vừa cài đặt nhưng Hướng dẫn cài đặt 2 hệ điều hành Windows song song. Ví dụ dưới đây là máy tính đang cài đặt sẵn Windows 10, mình sẽ tiến hành cài đặt thêm Ghost Win 7 để có 2 hệ điều hành song song. Bước 1: Khởi động MiniTool Partition Wizard. Như ví dụ bên dưới, mình đang sử dụng 1 Sử dụng cầu nối để kết nối 2 card đồ họa. Cài đặt phần cứng. Việc ghép 2 card công nghệ CrossFire/SLI khá đơn giản. Sử dụng cầu nối (đi kèm bo mạch chủ hoặc card đồ họa) và kích hoạt công nghệ này thông qua trình điều khiển (driver) card. Tuy nhiên, cần kiểm tra For a 15-second video, according to the 30FPS, there are 450 frames in 15-second so it will cost 2.25 minutes or so. AVCLabs Video Enhancer AI is an AI-based video enhancer software to upscale video quality and enlarge the video resolution from SD to 1080p, HD to 4K, and up to 8K. Con-Verge Industries RENTALS Halverson 150 Firewood Processor Load, cut and split your firewood from your loader cab. 22in saw, 4-way adjustable wedge. Daily $275 • Weekly $975 2022 Kubota 97-2s with Cimaf Mulcher Attachment for rent . Clean up your fence rows or wood lots! Máy bàn chạy card rời và card onboard song song. Mình có 1 con máy bàn main intel, card onboard intel, bây giờ mình muốn lắp thêm 1 cái card rời với mục đích để chạy 2 màn hình cùng một lúc ( 1 màn hình cắm vào card onboard, 1 màn hình cắm vào card rời). Nhờ mọi người tư vấn cho Cách Ghép 2 Video Chạy Song Song, Làm Video Phân Thân Trên Tiktok | Hồng Ngọc Tourguide-----Tặng Ngọc 1 ly tà tữa nếu video này có ích cho mình dùng 2cảm biến siêu âm hoạt động độc lập nhau. 1 timer đếm cho 1 cảm biến, mà 2 cảm biến chạy độc lập với nhau nên mình muốn cho 2 timer chạy song song với nhau thì dùng cách nào. dùng ngắt được không, mình biết dùng cấu trúc thread thì cũng được nhưng k biết cú pháp câu lệnh @@ App Vay Tiền. Laptop của bạn đã có ѕẵn card onboard nhưng bạn muốn lắp thêm card màn hình rời cho laptop. Vậу ѕử dụng card rời ᴠà onboard cùng lúc có được không? Cùng tìm hiểu thông tin chi tiết qua bài ᴠiết ѕau nhé. Và có lời giải đáp cụ thể cho câu hỏi trên. Lắp thêm card màn hình cho laptopCard màn hình haу còn được gọi ᴠới nhiều cái tên như card đồ họa, chip VGA. Đâу là bộ phận хử lý thông tin hình ảnh trong máу như thông ѕố piхel, độ tương phản, chỉnh màu ѕắc… để có được hình ảnh chân thực nhất hiện ra màn hình. Để quуết định ѕức mạnh card màn hình tốt haу không thì chủ уếu dựa ᴠào chỉ ѕố GPU Graphic Proceѕѕing Unit. Có hai loại card màn hình là card onboard gắn ᴠới CPU ᴠà được lắp liền ᴠới main ᴠà một loại là card đang хem Chạу ѕong ѕong 2 card đồ họaBạn đang хem Chạу ѕong ѕong 2 card đồ họaXem thêm Cách Múa Côn Nhị Khúc Đơn Giản Toankungfu, Luуện Côn Nhị Khúc Tổng Hợp Cho Người Mới TậpLắp thêm card màn hình cho laptopThông thường khi mua máу tính là đã có ѕẵn card onboard gắn ѕẵn trong máу ᴠới hiệu năng làm ᴠiệc ổn định ᴠà giải quуết những уêu cầu làm ᴠiệc ᴠà học tập ở mức phổ thông. Còn nếu bạn muốn lắp thêm card màn hình cho laptop thì có thể được. Hiện naу, nhiều người có nhu cầu nâng cấp card màn hình laptop để có thể tải được một ѕố chương trình như game cao cấp, đồ họa nặng, dựng ᴠideo, thiết kế…..Vậу có nên nâng cấp card màn hình haу không?Câu trả lời là còn phụ thuộc ᴠào chiếc laptop của bạn. Vì ѕao lại thế? Laptop của bạn có hỗ trợ nâng cấp thì mới có thể làm được. Ví dụ như một chiếc laptop đã quá cũ CPU ở mức độ thấp thì ᴠiệc nâng cấp là không hợp lý. Thêm nữa quá trình thaу card màn hình haу хảу ra lỗi không mong muốn. Vì thế nên khi có nhu cầu nâng card màn hình cho laptop thì cần хem хét kỹ lưỡng, cần lời khuуên từ những người am hiểu máу tính. Hơn nữa, card màn hình rời giá thành cao gấp nhiều lần card thường nên bạn cần cân nhắc nhu cầu của mình cũng như tầm tài chính để có ѕự lựa chọn phù hợp. Nếu máу tính của bạn đáp ứng đủ khả năng có thể nâng cấp thì có thể mang ra hàng nhờ đội kỹ thuật tiến hành. Công ᴠiệc nàу khá phức tạp ᴠà đòi hỏi chuуên môn cao nên không tự ý làm tại dụng card rời ᴠà onboard cùng lúc có được không?Khi máу tính của bạn đã được nâng cấp ѕử dụng card màn hình rời thì ᴠẫn luôn hiện diện card onboard trong máу. Nhưng không thể ѕử dụng card rời ᴠà onboard cùng lúc được. Như bạn đã biết thì card rời có hiệu năng làm ᴠiệc cao gấp nhiều lần ѕo ᴠới card onboard có thể đảm nhiệm được nhiều chương trình, hệ điều hành nặng. Nên có thể chỉ cần dùng card rời đã thực hiện tốt các công ᴠiệc. Hơn nữa, nếu để ѕử dụng card onboard thì hiệu năng không được như mong muốn lại còn khiến cho CPU ᴠà ram chạу nhiều khiến máу tính nhanh bị nóng. Vì ᴠậу bạn nên tắt card onboard để chỉ ѕử dụng card rời. Vậу cách tắt card onboard làm như thế nào?Sử dụng card rời ᴠà onboard cùng lúc có được không?Nếu bạn đang ѕử dụng card rời Nᴠidia Control Panel thì mách bạn cách tắt card onboard ᴠới một ѕố thao tác như ѕau. Đầu tiên, bạn cần tìm phần mềm Nᴠidia Control Panel ᴠà mở ra. Mở Manage 3D ѕettingѕ —> Chọn Preferred graphicѕ proceѕѕor —> Chọn High-peformance Nᴠidia proceѕѕor —> Hoàn thành ᴠà khởi động lại máу ra còn cách tắt card màn hình onboard khác như ѕau. Nhấp chuột phải ᴠào Computer —> Chọn Deᴠice manager —> Chọn Diѕplaу adapter —> Chọn card màn hình onboard —> Nhấn chuột phải chọn Diѕable deᴠice. Vậу là đã hoàn thành ᴠà khởi động lại máу để ѕử dụng bình thường. Như ᴠậу bạn đã có câu trả lời thỏa đáng cho ᴠiệc ѕử dụng card rời ᴠà onboard cùng lúc. Việc lắp thêm card màn hình cho laptop là nhu cầu có thực tuу nhiên cũng cần lưu ý một ѕố уếu tố. Nếu còn băn khoăn ᴠề ᴠấn đề nâng cấp card màn hình laptop thì ghé trung tâm laptop Đại Phong ѕố 12 Lương Thế Vinh để được tư ᴠấn ngaу nhé. Cách nào để làm CPU chạy full load ? Khi mang em laptop bị nóng rồi tự tắt đi sửa, các anh kỹ thuật dùng cách vào youtube và tìm video 4k rồi mở fullscreen để xem... Cách này chưa chắc đã làm full CPU, lại yêu cầu phải có mạng internet đủ nhanh. Những options nào khác? 1. Dùng bash while true; do true; done 2. Dùng Python python -c 'while True pass' Hai cách này nghe có vẻ ổn, nhưng chúng chỉ làm full 01 CPU. Trong khi máy bạn có thể có nhiều CPU - ngay cả các Android smartphone của năm 2016 cũng đã có 4 CPU rồi. Lấy số CPU của máy Khái niệm CPU được hiểu theo nghĩa khác nhau trong các hòan cảnh khác nhau. Nếu hiểu theo nghĩa số chương trình chạy đồng thời cùng lúc thực sự - chứ không phải giả đồng thời bằng cách chuyển nhanh qua các chương trình khác nhau chạy mỗi cái 1 tí như cách 1 CPU làm để chạy nhiều chương trình, ta có thể gõ `top` rồi bấm 1. Trên Linux, mọi thứ đều là file , thông tin CPU nằm trong /proc/cpuinfo $ grep 'core id' /proc/cpuinfo core id 0 core id 0 core id 1 core id 1 getconf là câu lệnh đi kèm glibc, chuẩn POSIX tức có trên cả OSX, BSD ... $ getconf -a grep processor -i _NPROCESSORS_CONF 4 _NPROCESSORS_ONLN 4 $ getconf _NPROCESSORS_ONLN 4 Ở đây có tất cả 4 processor CPU. Với 2 core, mỗi core 2 processor -> 2 x 2 = 4 $ sysctl -a grep cpu ... cũng sẽ hiện thông tin lần lượt cho các CPU0 1 2 3 Trên Linux, lệnh lscpu sẽ cho thông tin chi tiết $ lscpu Architecture x86_64 CPU op-modes 32-bit, 64-bit Byte Order Little Endian CPUs 4 On-line CPUs list 0-3 Threads per core 2 Cores per socket 2 Sockets 1 NUMA nodes 1 Vendor ID GenuineIntel CPU family 6 Model 69 Model name IntelR CoreTM i5-4200U CPU Với 1 socket, với 2 core, mỗi core có 2 thread, => 1 x 2 x 2 = 4 CPUs = Threads per core X cores per socket X sockets Vậy cách làm đúng ở đây là mở 4 cửa sổ và chạy theo cách python hoặc cách bash nói trên. Với máy tính có 128 CPU thì chúc bạn vui vẻ nhé! Chạy lệnh song song với xargs xargs là câu lệnh giải quyết bài tóan chạy song song các câu lệnh ở đây. Đầu tiên lấy số CPU online khái niệm offline xuất hiện trên máy tính có nhiều khe cắm CPU - các máy server $ getconf _NPROCESSORS_ONLN 4 Tạo ra dãy số từ 1 đến 4 với lệnh seq $ seq $getconf _NPROCESSORS_ONLN 1 2 3 4 Biến 4 dòng này thành 4 đầu vào cho chương trình, mỗi chương trình có nhiệm vụ chạy full CPU seq $getconf _NPROCESSORS_ONLN xargs -n1 -P$getconf _NPROCESSORS_ONLN yes > /dev/null yes là câu lệnh in ra màn hình liên tục dòng chữ `y`, nó có tác dụng như 1 vòng lặp vô hạn. export CPUS=$getconf _NPROCESSORS_ONLN; seq $CPUS xargs -n1 -P $CPUS python -c 'while True pass' Sử dụng chương trình `psensor`, nhiệt độ của các Core được hiển thị trên biểu đồ, tăng từ ~45 nhiệt độ bình thường lên 69, 70 độ C nóng. Các thiết bị làm mát phải vào cuộc, đảm bảo nhiệt độ không cao hơn, nếu không sẽ xảy ra cháy thiết bị - sau một vài phút ta có thể bắt đầu nghe thấy tiếng quạt CPU kêu khi nó bắt đầu hoạt động. Nếu quạt hỏng không quay, nhiệt độ sẽ tăng cao và hệ điều hành thường sẽ tắt thiết bị để đảm bảo không có cháy nổ. Các option của lệnh xargs - n 1 số argument gửi tới mỗi chương trình, ở đây là 1 - P số process tối đa được chạy đồng thời - ở đây set bằng số CPU online = 4 python -c 'while True pass' - câu lệnh được chạy, như thấy ở hình top, các chương trình này lần lượt nhận đầu vào là 1 2 3 4. 4 chương trình sau sẽ được chạy song song python -c 'while True pass' 1 python -c 'while True pass' 2 python -c 'while True pass' 3 python -c 'while True pass' 4 Với máy có lệnh `nproc`, có thể dùng lệnh này seq $nproc xargs -n1 -P $nproc python -c 'while True pass' $ whatis nproc nproc 1 - print the number of processing units available $ dpkg -S `which nproc` coreutils /usr/bin/nproc Tham khảo - CPU count Hết. HVN at and 19/06/2021 Lập trình đa luồng luôn bị coi là một chủ đề phức tạp và đáng sợ. Tuy nhiên, rất khó né tránh chủ đề này khi app của chúng ta càng ngày càng thực hiện nhiều tác vụ mà vẫn phải đảm bảo trải nghiệm người dùng. Trong series này mình sẽ cùng các bạn khám phá mọi góc cạnh của đa luồng và biến nó trở thành công cụ đắc lực. Với bất kỳ kiến thức nào, nền tảng luôn là thứ quan trọng nhất. Vậy nên, mình sẽ dành phần đầu series để nói về cách thức hoạt động của CPU và hệ điều hành. Kiến thức này sẽ giúp ta hiểu rõ hơn về bản chất của lập trình đa luồng trong iOS CPU & Core CPU là bộ não của một thiết bị điện tử. Nó nhận lệnh từ hệ điều hành và biến chúng thành các tính toán cần thiết. CPU được cấu thành bởi một hoặc nhiều Core với chức năng thực hiện các tính toán trên. Chip M1 của Apple sở hữu CPU với 8 Core Mỗi Core chỉ có thể làm duy nhất một tác vụ một lúc. Hiểu một cách đơn giản, nếu CPU là bộ não, thì Core như cánh tay của nó. Mỗi tay chỉ làm một việc tại một thời điểm như cầm sách, quẹt điện thoại, hay di chuột. Theo logic trên, ta có thể suy ra số Core tỉ lệ thuận với số tác vụ được thực thi song song. Process & Thread CPU và Core là phần cứng, và hệ điều hành là phần mềm giúp ta giao tiếp với chúng. Trong iOS, một chương trình khi chạy được tạo nên bởi một process tương ứng. Process có nhiệm vụ cung cấp các tài nguyên, tập lệnh, và vùng nhớ cần thiết cho hoạt động của chương trình đó. Các process khác nhau chạy tách biệt và không dùng chung bất cứ dữ liệu nào. Gmail và Safari là 2 process độc lập Process sở hữu một hoặc nhiều luồng. Luồng, hay còn gọi là thread, là hàng chờ của các lệnh. Mỗi khi bạn gọi function như reloadData, hay tạo biến như let language = "swift", chúng sẽ biến thành chỉ dẫn cho CPU dưới dạng nhị phân và được đặt vào thread. Các thread sẽ chuyển những chỉ dẫn đó tới CPU và sau đó CPU sẽ sử dụng Core để thực thi và thay đổi trạng thái của process. Quay lại phép ẩn dụ ở phần trước, bạn hãy hình dung bộ não đang tung hứng nhiều quả bóng với 2 cánh tay, mỗi cánh tay chỉ có thể cầm một quả bóng và ngay sau đó phải đổi sang quả bóng khác. Những quả bóng ở đây chính là thread, và hành động tung hứng cũng giống việc CPU điều khiển các Core thực hiện chỉ dẫn trong thread đó. Một Core chỉ làm việc với một thread một lúc và chỉ xử lý một chỉ dẫn trong thread đó tại bất cứ thời điểm nào. Nguồn GIPHY Điều gì sẽ xảy ra khi số tay được tăng từ 2 lên 4? Nếu câu trả lời của bạn là bộ não giờ đây có thể cầm tối đa 4 quả bóng cùng lúc thì bạn đã hiểu chính xác rồi đấy. Nguồn GIPHY sorry, đây gif hợp lý nhất mình có thể tìm được Số thread trong một process không cố định. Process có thể huỷ hoặc sinh ra thread mới khi cần thiết. Các thread trong cùng một process chia sẻ vùng nhớ và dữ liệu với nhau. Dữ liệu ở đây có thể kể đến như object, function, con trỏ địa chỉ vùng nhớ, hoặc bất kì biến nào được tạo ra. Các thread khác nhau sở hữu độ ưu tiên khác nhau. CPU chạy thread dựa theo độ ưu tiên giảm dần. Mỗi process sở hữu một tập thread riêng. Các thread trong một process hoạt động trên cùng một vùng nhớ Trong iOS, ta không làm việc với process mà chỉ có thể tương tác với thread qua class Thread. Tuy nhiên, Thread là một API bậc thấp và yêu cầu người code phải xử lý rất nhiều chi tiết phức tạp. trường hợp, bạn nên tránh sử dụng nó trực tiếp. Hãy ưu tiên các API bậc cao như Grand Central Dispatch GCD hoặc Operation. Nếu bạn thấy GCD là một thuật ngữ xa lạ thì đừng sợ, thực ra đây là một API rất thân thuộc với chúng ta. Chắc hẳn bạn đã từng dùng rồi chứ 😉 Về bản chất, khi app khởi tạo, iOS sẽ cung cấp cho nó một thread chính, gọi là main thread. Code bạn viết ra mặc định chạy trên thread này. Đây cũng là thread bắt buộc phải dùng để gọi code liên quan tới UI. Bạn có thể truy cập main thread qua override func viewDidLoad { //code mặc định chạy trên main thread = self = self callAPI } func callAPI { //vẫn đang ở trên main thread let url = URLstring "domain"! url { data, res, err in //... //hiện đang không ở main thread //... { //quay lại main thread để cập nhật UI } } } Khi bạn gọi hoặc thì các dòng lệnh ở giữa 2 dấu { } sẽ được chạy trên main thread. Ta gọi chung những dòng lệnh đó là task. Từ giờ khi dùng thread là mình muốn ám chỉ thread của process, còn Thread để biểu thị class Thread trong swift Đa luồng - Multithreading Trang bị những kiến thức trên, chúng ta đã sẵn sàng tìm hiểu đa luồng và chi tiết cách CPU cùng các Core hoạt động với nó. Multithreading là gì? Multithreading là khả năng xử lý nhiều thread cùng lúc của CPU. Khi có nhiều task khác nhau, CPU có thể làm việc với chúng đồng thời - concurrent hoặc song song - parallel. Giả sử tồn tại task A với thời gian chạy 1 phút, và task B với thời gian chạy 2 phút. Hai task A, B chạy parallel nếu CPU xử lí chúng cùng thời điểm. Tổng thời gian cần để hoàn thành 2 task sẽ là thời gian chạy của task lâu nhất, tức maxA, B = 2 phút Hai task A, B chạy đồng thời nếu CPU xử lí chúng parallel hoặc chạy một phần của task A rồi đổi sang task B và cứ thể lặp lại cho đến khi 2 task hoàn thành. Tổng thời gian chạy có thể là maxA, B = 2 phút nếu chúng thực sự chạy parallel, hoặc A + B = 3 phút nếu CPU phải đổi giữa các task. 2-Core CPU có thể chạy 2 task A và B song song trong khi 1-Core CPU phải thay đổi liên tục giữa các task Nhắc lại kiến thức phần trước, Core là nơi thực hiện các task và mỗi Core chỉ chạy 1 task tại một thời điểm. Chính vì lí do này, 1-Core CPU chỉ có thể thực thi một task một lúc, và càng nhiều Core thì CPU càng thực hiện được nhiều task. Từ đây ta có thể hiểu concurrent là làm nhiều task cùng lúc. CPU không cần đợi task A hoàn thành để bắt đầu task B. Nó đạt được điều này bằng cách chạy các task đồng thời trên nhiều Core khác nhau, hoặc liên tục chuyển giữa chúng tại 1 Core. Parallel là trường hợp đặc biệt của concurrent, khi các task thực sự được cùng xử lý tại một thời điểm. Số task tối đa có thể chạy parallel chính bằng số Core của CPU. Về mặt hiệu năng, xử lý parallel giúp giảm thời gian hoàn thành task trong khi đối với concurrent thì điều này không được đảm bảo. Một điều cần lưu ý nữa là việc đổi giữa các task của các thread khác nhau không miễn phí. Khoảng xám giữa các lần đổi task là thời gian chuẩn bị cho task mới của CPU Để đổi task, hệ điều hành phải lưu trạng thái hiện giờ của CPU, xác định task mới, thiết lập trạng thái cho task mới, load các thông tin cần thiết vào bộ nhớ và cache, load các lệnh chưa chạy hoặc đang chạy dở, và cuối cùng mới có thể thực thi task đó. Chính vì lí do này, multithread phải được dùng một cách rất cẩn trọng và có suy nghĩ. Việc lạm dụng multithread sẽ phản tác dụng và làm chậm app của bạn thay vì tăng tốc cho nó. Tại sao cần multithreading Những năm 90, máy tính phổ thông chỉ có một Core duy nhất. Điều này có nghĩa nếu không có multithreading, bạn sẽ không thể vừa nghe nhạc vừa duyệt web, hoặc không thể vừa down phim vừa làm luận án. Rất may là điều đó không phải sự thật. CPU có tốc độ xử lý hàng nghìn triệu phép tính một giây, kết hợp với multithreading, 1-Core CPU cho chúng ta ảo giác rằng ta có thể cùng lúc thao tác nhiều việc dù thực chất nó chỉ đang luân phiên xử lý các tác vụ. Ngày nay, kể cả khi máy tính sở hữu nhiều Core hơn, việc multithreading bằng cách đổi task vẫn rất phổ biến. Lý do đơn giản bởi vì luôn có hàng trăm process khác nhau chạy ngầm trong máy tính của bạn. Trong thực tế, rất khó để biết chắc chắn được khi nào các tác vụ được chạy parallel hoặc concurrent vì điều này hoàn toàn phụ thuộc vào số Core, cơ chế hoạt động của từng CPU, và hệ điều hành. iOS không cho bạn lựa chọn giữa parallel và concurrent. Bạn chỉ có thể chuyển task cho thread và hệ thống sẽ thực thi chúng tuỳ theo hoàn cảnh. Vậy nên từ giờ trở đi, mình sẽ dùng thuật ngữ concurrency danh từ của concurrent để nói chung cho cả parallel và concurrent. Race condition Multithreading không chỉ có màu hồng. Nếu bạn đã từng phải debug những lỗi khó tái hiện, hoặc lỗi thi thoảng mới gặp thì rất nhiều khả năng chúng liên quan đến concurrency. Ở phần này bài viết, chúng ta sẽ cùng tìm hiểu một vấn đề kinh điển khi code đa luồng. Thread trong một process hoạt động trên cùng một vùng nhớ và chia sẻ hầu hết tài nguyên của process. Nếu tại một thời điểm, hai hoặc nhiều thread cùng truy cập và thay đổi một địa chỉ nhớ thì thứ tự truy cập của chúng sẽ ảnh hưởng đến kết quả bạn nhận được. Nói một cách khác, kết quả của tác vụ trở nên không thể đoán định và phụ thuộc vào trình tự chạy của các thread. Hiện tượng này được gọi là race condition. Hình dung bạn và một người lạ đang ở rạp phim và cùng có ý định mua vé xem Avengers. Điều gì sẽ xảy ra nếu 2 nhân viên quầy vé cùng nhấn nút một lúc? Có thể người mua được là bạn hoặc cũng có thể là người lạ kia. Nếu viễn cảnh đấy lặp lại 100 lần, không gì đảm bảo 100 lần đó kết quả đều như nhau. Trong thực tế, việc kết quả của các lệnh phụ thuộc vào sự kết hợp đan xen ngẫu nhiên của các thread gây ra rất nhiều rắc rối class UnsafeDataSource { private var model [Int] = [1, 2, 3] func removeAll { } func printFirstItem { if ! { printmodel[0] } } } Giả sử có hai thread A, B cùng đọc và thay đổi giá trị của UnsafeDataSource, thread A gọi function removeAll để xoá hết item trong model, còn thread B in item đầu tiên sau khi kiểm tra model không rỗng. Trong trường hợp A chạy xong hoàn toàn rồi mới đến B, không có gì được in ra. Nếu B chạy trước A, model[0] sẽ được in trước khi A xoá item trong model. Tuy nhiên, do trình tự thực thi của các thread không thể đoán định, hoàn toàn có khả năng B vừa check isEmpty xong thì CPU đổi sang thread A và chạy lệnh removeAll. Lúc này sẽ xảy ra crash khi CPU quay lại thread B để chạy lệnh printmodel[0] vì mặc dù B đã check isEmpty là false, điều này không còn đúng tại thời điểm model[0] thực thi vì toàn bộ item đã bị xoá Race condition khi nhiều thread cùng làm việc với UnsafeDataSource Một trường hợp hay gặp gây ra bởi race condition là Fatal error Index out of range ở hàm cellForRowat indexPath khi Nguyên nhân là do trạng thái của UITableView không đồng nhất với model do hàm reloadData và cellForRow truy cập model ở trên main thread nhưng trong lúc đó model lại bị thay đổi ở một thread khác. Class và struct bạn tạo ra mặc định không an toàn để sử dụng đa luồng. Nếu biến và các thuộc tính của chúng có thể bị thay đổi bởi bất kì thread nào thì race condition chắc chắn sẽ xảy ra. Code chạy đúng 1000 lần không có nghĩa bạn sẽ an toàn ở lần thứ 1001. Value type trong swift không phải lúc nào cũng an toàn để sử dụng đa luồng Tổng kết Chúng ta đã cùng nhau hiểu rõ hơn về cách hoạt động của CPU, Core, cũng như cách chúng kết hợp với iOS để chạy code của ứng dụng. Ta cũng biết thêm về một vấn đề nổi cộm trong multithreading là race condition. Ở những bài tiếp theo, mình sẽ nói kĩ hơn về cách sử dụng các API đa luồng trong iOS như DispatchQueue, Operation, và NSLock. Trong quá trình đó, bạn cũng sẽ được giới thiệu về các vấn đề của chúng như deadlock và priority inversion. Hẹn gặp lại ở bài viết tới ; Trong quá trình sử dụng máy tính, nhiều người thường có thói quen lắp thêm một ổ cứng cho máy tính để giúp máy tính hoạt động tốt hơn, đáp ứng tối đa cho nhu cầu công việc. Thậm chí, có những máy tính còn cho phép các bạn gắn 2, 3 hoặc là 4 ổ cứng mới. Việc lắp ổ cứng không hề quá khó khăn. Nếu biết cách các bạn hoàn toàn có thể tự mình làm được mà không cần phải tốn nhiều chi phí nhờ đến các kỹ thuật viên IT chuyên nghiệp. Tuy nhiên, các bạn cần lưu ý là chỉ các máy tính để bàn mới có thể lắp thêm ổ cứng còn máy tính xách tay hay netbook thì diện tích và cấu tạo máy không có phép các bạn làm điều này. Sau đây chúng tôi sẽ hướng dẫn các bạn 10 bước lắp song song 2 ổ cứng SSD và HDD đơn giản và dễ hiểu nhất nhé! ========================= 1. Tại sao nên nâng cấp ổ cứng SSD cho laptop? 2. Có nên lắp song song 2 ổ cứng SSD và HDD không? 3. Lợi ích khi lắp 2 ổ cứng đồng thời 4. Hướng dẫn cách lắp song song 2 ổ cứng SSD và HDD cho PC 1. Tại sao nên nâng cấp ổ cứng SSD cho laptop? Ở thời điểm hiện tại ổ cứng HDD đã không còn phù hợp để sử dụng cho một số dòng máy tính nữa rồi, bởi tốc độ truy xuất data của ổ này khá chậm. Chính vì vậy ổ cứng SSD xuất hiện và là lựa chọn tốt nhất. SSD có khả năng lưu trữ được lượng data lớn, cùng tốc độ truy xuất dữ liệu nhanh và an toàn. Nhờ phần ổ cứng này mà người dùng dễ dàng thực hiện các thao tác một cách trơn tru hơn. Các bạn hoàn toàn có thể an tâm rằng trên thị trường hiện nay đối với hầu hết các dòng máy như Asus, Dell, Acer, Sony, HP, Macbook,… đều có thể nâng cấp ổ cứng từ HDD lên SSD. Nên nâng cấp ổ cứng SSD thay vì vẫn sử dụng HDD SSD được ứng dụng công nghệ hiện đại và mới nhất hiện nay, nên giá thành sẽ cao hơn so với HDD. Bù lại người dùng sẽ hoàn toàn yên tâm về chất lượng sản phẩm này mang lại. Tốc độ Với SSD bạn chỉ mất khoảng vài giây để khởi động máy tính hay các chương trình khác. Còn với HDD bạn sẽ phải chờ đến 1 phút thậm chí là nhiều hơn nữa. Hiệu suất Vì sở hữu công nghệ hiện đại nên dĩ nhiên SSD chạy ổn định và khả năng chống sốc cũng tốt hơn nhiều so với HDD. Tốc độ đọc/ ghi cũng sẽ nhanh hơn khi máy chạy trên ổ HDD. Độ bền Sở hữu cấu tạo vật lý cố định nên SSD có độ bền cao hơn HDD HDD phải hoạt động liên tục trục quay và đĩa từ. Hình thức Vì được áp dụng kỹ thuật hiện đại nên SSD sở hữu vẻ ngoài chỉn chu và bắt mắt hơn HDD. Tiếng ồn Nhờ cơ chế hoạt động tự động nên SSD hoạt động khá mượt. Còn HDD sử dụng trục quay nên sẽ gây ồn hơn. 2. Có nên lắp song song 2 ổ cứng SSD và HDD không? Trên các dòng laptop thế hệ mới hiện nay đều được tích hợp chipset Z77, H77 hoặc B75. Vì vậy người dùng có thể dễ dàng sử dụng cùng lúc 2 ổ cứng nếu thông qua công nghệ Intel Smart Response. Còn đối với các dòng máy tính cũ trường hợp bạn muốn sử dụng thêm ổ cứng thì cần phải có sự hỗ trợ của khe cắm mSATA. Cần xem xét nhiều yếu tố trước khi lắp song song ổ cứng SSD và HDD Khi bạn muốn lắp song song 2 ổ cứng, điều đầu tiên là phải tiến hành kiểm tra xem máy của mình có khe ổ cứng hay không? Đặc biệt ổ cứng dạng mSATA không được phổ biến trên thị trường Việt Nam, chủ yếu được bán ở nước ngoài nên khá khó tìm kèm theo đó là mức giá của chúng cũng tương đối cao. Vì vậy, nếu bạn muốn lắp song song 2 ổ cứng SSD và HDD hãy xem xét thật kỹ lưỡng rồi hãy đưa ra quyết định có nên lắp vào máy tính không nhé! 3. Lợi ích khi lắp 2 ổ cứng đồng thời Việc sử dụng đồng thời 2 ổ cứng bao giờ cũng đem lại hiệu quả tốt hơn một. Bởi khi sử dụng song song 2 ổ bạn sẽ có được lợi thế về tốc độ ngoài ra còn có lợi thế về không gian lưu trữ trong quá trình sử dụng, cụ thể như sau Khi sử dụng ổ cứng SSD sẽ giúp máy tính tăng tốc độ khởi động Windows cũng như gia tăng tốc độ truyền tải dữ liệu tốt hơn. Có thể nói, việc lắp đồng thời 2 ổ cứng SSD và HDD cho máy tính hay laptop có thể mang lại sự hài lòng rất lớn cho người dùng. Bởi lúc này máy sẽ đạt được tốc độ cũng như công suất tối đa, đồng thời giúp mở rộng không gian lưu trữ dữ liệu. Lắp cả 2 ổ cứng SSD và HDD mang lại nhiều lợi ích cho máy tính của bạn Việc lắp cùng lúc 2 ổ cứng còn giúp người dùng tận dụng được tính năng RAID. Đây được xem là giải pháp bảo vệ dữ liệu an toàn trên ổ cứng nếu chẳng may 1 ổ cứng bị hỏng trong quá trình sử dụng. Dù giá thành của SSD thường được bán ra khá cao, nhưng sản phẩm mang lại rất nhiều lợi ích. Ngược lại ổ đĩa HDD có giá bán ra mềm hơn cùng với dung lượng lớn có thể thích hợp cho việc lưu trữ dữ liệu nhưng tốc độ chạy không cao. Chính vì điều này mà khi 2 ổ này kết hợp và bù trừ khuyết điểm cho nhau thì mang lại lợi ích vô cùng lớn cho máy tính của bạn. 4. Hướng dẫn cách lắp song song 2 ổ cứng SSD và HDD cho PC Tắt máy, rút nguồn và tháo vỏ máy tính Bước đầu tiên để gắn thêm ổ cứng cho PC chính là phải tắt máy, rút nguồn và tháo vỏ máy tính ra. Trong bước này các bạn cần lưu ý, nếu môi trường xung quanh máy là môi trường dễ bị tĩnh điện thì trước khi tiến hành bước này các bạn cần mua một dây tiếp đất rồi quấn quanh cổ tay của bạn. Thậm chí, ngay cả môi trường xung quanh không có nhiều tĩnh điện thì các bạn cũng nên lưu ý khi chạm vào vỏ máy xong hãy để tay xuống đất trước khi các bạn tiếp xúc với các linh kiện bên trong máy. Chuẩn bị ổ cứng tương thích và lắp đặt Để lắp thêm ổ cứng cho PC thì các bạn cần phải chọn ổ cứng tương thích với dòng PC mà mình đang sử dụng. Khi đã chọn đúng loại ổ cứng cần thiết thì các bạn ấn nó vào một vị trí trống ở giá lắp bên trong máy tính. Giá lắp có dạng khay trượt nên việc lắp đặt cũng không quá khó khăn. Ví dụ, ổ cứng máy tính bạn đang sử dụng đã được lắp sẵn trong máy chiếm một vị trí thì trước khi lắp ổ cứng mới các bạn hãy quan sát cách mà ổ cứng cũ được lắp. Sau đó thì gắn ổ cứng mới tương tự như ổ cứng cũ. Xem thêm Cách giải quyết win 10 ngốn ram Cắm cáp SATA Bước tiếp theo trong số 10 cách cắm 2 ổ cứng trên 1 máy là cắm cáp ư. Để cắm cáp các bạn cần tìm cáp được đánh dấu SATA trên bo mạch chủ. Sau đó thì cắm cáp SATA ổ cứng mới ngay bên cạnh. Lưu ý rằng đầu cắm chỉ phù hợp với một đầu nối và nằm phía bên phải. >>Xem ngay máy tính bàn giá rẻ, cấu hình mạnh tại TPHCM! Gắn dây cáp điện vào ổ cứng Trong máy tính, bạn tìm một dây cáp điện SATA trong giống như cáp dữ liệu SATA nhưng lớn hơn và được dẫn từ nguồn của máy tính rồi gắn vào ổ cứng. Lắp ổ cứng và vặn vào đúng vị trí Hãy kiểm tra máy tính của mình, nếu như thấy hai ổ cứng được lắp cùng một vị trí trên giá lắp thì thỉnh thoảng các bạn nên dùng tua-vit nới lỏng các ốc vít của ổ cứng hiện tại. Như vậy sẽ giúp ổ cứng mới có thể trượt vào đúng vị trí, đồng thời việc lắp dây cáp cũng trở nên dễ dàng hơn. Tiếp đó hãy lắp lại vỏ máy tính như ban đầu và cắm nguồn điện rồi bật máy tính lên. Như vậy là máy tính của bạn đã hoạt động với chiếc ổ cứng mới rồi. Cài đặt cho máy tính Để ổ cứng có thể hoạt động được các bạn cần cài đặt máy tính một chút nhé! Đầu tiên, hãy click chuột vào nút Start để góc trái cuối màn hình và chọn Computer -> Manage. Sau khi cửa sổ menu Manage mở ra các bạn chọn Disk Management ở phía bên trái khung cửa sổ Computer Management. Lúc này bạn sẽ thấy trên màn hình xuất hiện cửa sổ Initialize Disk. tại màn hình này sẽ liệt kê các ổ đĩa mới cài đặt của bạn và yêu cầu bạn cho phép khởi tạo nó. Nghĩ là bạn phải thực hiện các thao tác cho phép Windows bắt đầu đưa thông tin vào đó. Trong trường hợp các bạn không có thay đổi bất kỳ cài đặt nào thì chỉ cần nhấn OK để hệ thống bắt đầu quá trình. Sau khi kết thúc, mặc dù ổ đĩa mới đã được ghi nhận nhưng chưa được phân vùng. Điều này đồng nghĩa với việc nếu muốn ổ đĩa sử dụng được thì cần phải thêm drive letter và chấp nhận lưu trữ các tập tin. Phân vùng cho ổ đĩa mới Bước tiếp theo trong cách lắp song song 2 ổ cứng SSD và HDD là tiến hành phân vùng cho ổ đĩa. Để phân vùng, các bạn quay lại cửa sổ Computer Management rồi click chuột phải vào ổ đĩa mới đã cài đặt nhưng chưa phân vùng. Sau đó chọn New Simple Volume từ trình đơn được bật lên. Khi thấy có cửa sổ New Simple Volume Wizard thì có nghĩa là ổ đĩa cứng mới mà bạn thêm vào đã được phân vùng. Chọn Next ở tất cả màn hình trong wizard Ổ đĩa của bạn sẽ được Windows chỉ định chữ và định dạng. Các bạn có thể thấy tại ổ đĩa mới vừa cài đặt đã có chữ cái và được xuất hiện trong trình Computer. Kiểm tra bằng cách nhấp chuột vào mục Start góc dưới bên trái màn hình và chọn Computer. Trên đây là hướng dẫn cách lắp thêm ổ cứng cho PC. Quá đơn giản phải không nào? Hy vọng với những thông tin chúng tôi gửi đến bạn sẽ giúp bạn có thể tự mình thêm mới và cài đặt được ổ cứng cho chiếc PC của mình. Xem thêm nội dung liên quan Trong một lần phỏng vấn mình có được hỏi về các khái niệm này, lúc đó do kiến thức mình hiểu có phần bị sai vì thế mình quyết định là tìm hiểu lại và viết lại một số vấn đề trong lập trình đa luồng và đa tiến trình trong Python1. Một số khái niệm cơ bảnTiến trình ProcessTiến trình đơn giản có thể hiểu là một chương trình đang được thực thi. Khi chương trình được đưa vào bộ nhớ nó thành tiến trình và được chia thành các 4 phần stack, heap,text,data. Các tiến trình chạy trong không gian riêng biệt lẫn nhauMỗi tiến trình trong hệ điều hành được biểu diễn bằng 1 cấu trúc dữ liệu gọi là PCB bao gồm tất cả các thông tin của tiến trìnhCác thông tin chứa trong PCBLuồng ThreadLuồng là một đơn vị thực thi trong một tiến trình. Một tiến trình có thể có một hay nhiều luồng. Các luồng không độc lập với nhau mà có thể chia sẻ phần tài nguyên và dữ liệu cho trong tiến trìnhĐồng bộ hóa SynchronizationVấn đề đồng bộ hóa được chia thành hai dạngĐồng bộ hóa tài nguyên Xác định việc truy cập vào tài nguyên dùng chung có an toàn bộ hóa hoạt động Đảm bảo việc thực thi các tác vụ chính xác khi phối hợp cùng nhau2. Lập trình đa luồng và đa tiến trình trong PythonPhân biệt đồng thời concurrency và song song parallelismLập trình đồng thời chỉ việc 2 hay nhiều tiến trình được xử lý xen kẽ thông qua cơ chế context switch trên 1 core CPULập trình song song tức là 2 hay nhiều tiến trình được xử lý song song với nhau trên nhiều core CPUIO và CPU boundCPU-bound chỉ việc chương trình sử dụng CPU phần lớn tính toán. Việc tăng tốc những chương trình dạng này tức là làm sao để có thể thực hiện nhiều phép tính toán hơn trong cùng 1 khoảng thời gianIO-bound chỉ việc thời gian thực hiện chương trình phần lớn là do thời gian đợi các tác vụ IO hoàn tất ví dụ đọc ghi từ ổ đĩa, bàn phím hay mạng. Khi đó CPU sẽ không được sử dụngCơ chế GIL trong PythonCơ chế GIL hay gọi là Global Intepreter Lock là một cơ chế trong python khóa toàn bộ trình thông dịch chỉ cho phép một luồng duy nhất được thực hiện. Do đó tại một thời điểm chỉ có một luồng được thực thi. Mỗi luồng muốn được thực thi thì GIL phải giải phóng luồng trước nên cơ chế này sẽ khiến các mô hình lập trình đa luồng không tăng hiệu suất mà có thể bị giảm hiệu Thử nghiệm đánh giá các mô hìnhChạy chương trình python dưới đây bao gồm 2 hàm là IO-bound và CPU-bound thực hiện tác vụ tương ứng với tên hàm1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import time, os from threading import Thread, current_thread from multiprocessing import Process, current_process COUNT = 200000000 SLEEP = 10 def io_boundsec pid = threadName = current_thread.name processName = current_process.name printf"{pid} * {processName} * {threadName} \ -> Start sleeping..." printf"{pid} * {processName} * {threadName} \ -> Finished sleeping..." def cpu_boundn pid = threadName = current_thread.name processName = current_process.name printf"{pid} * {processName} * {threadName} \ -> Start counting..." while n>0 n -= 1 printf"{pid} * {processName} * {threadName} \ -> Finished counting..." if __name__=="__main__" start = YOUR CODE SNIPPET HERE end = print'Time taken in seconds -', end - start Thử nghiệm mô hình với các tác vụ IO-boundGọi 2 lần hàm io_bound1 2 io_boundSLEEP io_boundSLEEP Chương trình sẽ có thời gian chạy hơn 20s với 20s là sleep thực hiện tuần tự. Kết quả như dưới đây1 2 3 4 5 18795 * MainProcess * MainThread -> Start sleeping... 18795 * MainProcess * MainThread -> Finished sleeping... 18795 * MainProcess * MainThread -> Start sleeping... 18795 * MainProcess * MainThread -> Finished sleeping... Time taken in seconds - Đa luồngỞ đây mình sử dụng 2 luồng để tăng tốc việc xử lý. 2 luồng đều hoàn thành công việc trong 10s đồng thời và việc này giảm 50% thời gian thực thi chương trình1 2 3 4 5 6 7 8 9 10 11 12 t1 = Threadtarget = io_bound, args =SLEEP, t2 = Threadtarget = io_bound, args =SLEEP, Kết quả1 2 3 4 5 19327 * MainProcess * Thread-1 -> Start sleeping... 19327 * MainProcess * Thread-2 -> Start sleeping... 19327 * MainProcess * Thread-2 -> Finished sleeping... 19327 * MainProcess * Thread-1 -> Finished sleeping... Time taken in seconds - Đa tiến trìnhTrong trường hợp này mình sẽ tạo ra 2 tiến trình thực hiện song song hàm io_bound trên và kết quả cũng tương tự phần đa luồng1 2 3 4 5 6 7 8 9 10 11 p1 = Processtarget = io_bound, args =SLEEP, p2 = Processtarget = io_bound, args =SLEEP, 1 2 3 4 5 19967 * Process-1 * MainThread -> Start sleeping... 19968 * Process-2 * MainThread -> Start sleeping... 19967 * Process-1 * MainThread -> Finished sleeping... 19968 * Process-2 * MainThread -> Finished sleeping... Time taken in seconds - Thử nghiệm mô hình với các tác vụ CPU-boundTương tự với phần trên mình gọi 2 lần hàm cpu_bound1 2 cpu_boundCOUNT cpu_boundCOUNT Kết quả của việc thực hiện tuần tự1 2 3 4 5 20153 * MainProcess * MainThread -> Start counting... 20153 * MainProcess * MainThread -> Finished counting... 20153 * MainProcess * MainThread -> Start counting... 20153 * MainProcess * MainThread -> Finished counting... Time taken in seconds - Đa luồngMình sẽ thử thực hiện chương trình trên với hai luồng để kiểm tra xem đối với các công việc cpu-bound thì liệu việc đa luồng trong Python có được cải thiện hay không1 2 3 4 5 6 7 8 9 10 11 t1 = Threadtarget = cpu_bound, args =COUNT, t2 = Threadtarget = cpu_bound, args =COUNT, Kết quả cho thấy đối với các tác vụ CPU-bound thì việc lập trình đa luồng không cải thiện được tốc độ. Giải thích ở đây là do cơ chế GIL được trình bày ở trên chỉ cho phép trong một thời điểm chỉ có một luồng được chạy. Ở đây sau khi luồng 1 chạy thì GIL mới được giải phóng và luồng 2 mới được phép 2 3 4 5 20338 * MainProcess * Thread-1 -> Start counting... 20338 * MainProcess * Thread-2 -> Start counting... 20338 * MainProcess * Thread-2 -> Finished counting... 20338 * MainProcess * Thread-1 -> Finished counting... Time taken in seconds - Đa tiến trìnhĐối với trường hợp đa tiến trình mình cũng sẽ thử nghiệm tương tự1 2 3 4 5 6 7 8 9 10 11 12 13 p1 = Processtarget = cpu_bound, args =COUNT, p2 = Processtarget = cpu_bound, args =COUNT, end = Ở đây kết quả đã được cải thiện đáng kể, tốc độ thực thi giảm gần 50%. Tiến trình chính chia thành 2 tiến trình con chạy song song trên các core CPU. Mỗi tiến trình có một luồng chính riêng là MainThread1 2 3 4 5 20556 * Process-1 * MainThread -> Start counting... 20557 * Process-2 * MainThread -> Start counting... 20557 * Process-2 * MainThread -> Finished counting... 20556 * Process-1 * MainThread -> Finished counting... Time taken in seconds - 4. Kết luậnTrong Python thì việc sử dụng lập trình đa tiến trình sẽ giúp cải thiện tốc độ của chương trình đối với cả CPU-bound và IO-bound tuy nhiên cũng cần phải chú ý vì đa tiến trình tức là các tiến trình riêng biệt sử dụng thêm tài nguyên ram và với lập trình đa luồng do cơ chế GIL thì các tác vụ CPU-bound sẽ không cải thiện được vấn đề gì vì thực chất chỉ có 1 luồng được phép chạy và việc sử dụng có khi còn giảm hiệu quả. Tuy nhiên cũng có thể sử dụng trong trường hợp IO-bound, ở đây có thể lấy ví dụ đa luồng trong việc crawl web. Khi gửi request đến một trang thì thời gian IO luôn chiếm phần lớn, khi đó CPU nhàn rỗi có thể cho luồng khác sử dụng vì lúc này luồng phía trước không còn GIL nữa, luồng mới sẽ được sử dụng. Thực chất đây là lập trình đồng thời concurrencyTham khảoDifference between multithreading and multiprocessing in Python Beginers guide to concurrency and parallellism in Python Cơ chế GIL trong Python Introduction to infamous Python GIL Multithreading in Python

chạy song song 2 cpu