iOS ------ 多線程基礎

一,進程和線程

1,進程

定義:

  • 進程是指在系統中正在運行的一個應用程序
  • 每個進程之間是獨立的,每個進程均運行在其專有的且受保護的內存
  • 進程是系統進行資源分配和調度的一個獨立單位

補充:iOS系統是相對封閉的系統,App在各自的沙盒中運行,每個APP都只能讀取系統為該應用程序創建的文件夾AppData下的內容,不能隨意跨域自己的沙盒去訪問別的App沙盒中的內容。也就是說iOS是單線程的,一個App就是一個進程。

特點:

  • 獨立性:是系統獨立存在的實體,擁有自己獨立的資源,有自己私有的地址空間。在沒有經過進程本身的允許的情況下,一個用戶的進程不可以直接訪問其他進程的地址空間。
  • 動態性:程序是一個靜態的指令集合,而進程是一個正在系統中活動的指令集合,進程中加入了時間的概念。進程具有自己的生命周期和不同的狀態,這些都是程序不具備的
  • 并發性:多線程可以在單個處理器上并發執行,多個進程之間不會相互影響

2,線程

定義:

  • 線程是進程的基本執行單位,一個進程的所有任務都在線程中執行
  • 進程要想執行任務,至少要有一個線程
  • 程序啟動會默認開啟一條線程,這條線程被稱為主線程和UI線程

3,進程和線程的關系

  • 地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間。
  • 資源擁有:同一進程內的線程共享本進程的資源如內存,I/O,CPU等,但是進程之間的資源是獨立的。
  • 進程切換時,消耗的資源大,效率高。所以涉及到頻繁的切換時,使用線程要好于進程。同樣如果要求同時進行并且又要共享某些變量的并發操作,只能用線程不能用進程
  • 執行過程:每個獨立的進程有一個程序運行的入口、順序執行序列和程序入口。但是線程不能獨立執行,必須依存在應用程序中,由程序提供多個線程執行控制。
  • 線程是處理器調度的基本單位,但是進程不是

4,任務

  • 通俗的說任務就是一件事情或一段代碼,線程其實就是去執行這個時期

5,隊列

  • 隊列是先進先出的線性表。裝載線程任務的隊形結構。隊列只允許新數據在后端進行添加。
    在這里插入圖片描述

隊列的類型

  • 并發隊列:線程執行可以同時一起執行,不需要上一個執行完,才能執行下一個的
  • 串行隊列:線程執行只能依次逐一先后有序的執行,等待上一個執行完,再執行下一個
  • 主隊列:綁定主線程,所有任務都在主線程執行,有經過特殊處理的串行隊列
  • 全局隊列:系統提供的并發隊列

6,同步和異步

  • 同步sync:只能在當前線程按先后順序依次執行任務,不具備開啟新線程的能力
  • 異步async:在新的線程執行任務,具備開啟新線程的能力
    在這里插入圖片描述

二,多進程和多線程

  • 在早期單核CPU

如何理解多進程?在早期單核CPU時代,由于CPU執行代碼都是順序執行的,那么單核CPU如何執行多任務?
比如說一邊用瀏覽器上網,一邊聽音樂,一邊寫代碼

這里用到時間片輪換調度:簡單就是把一個處理器劃分為若干個段的時間片,每個進程會被操作系統分配一個時間片(即每次被CPU選中來執行當前進程所用的時間),每個時間片依次輪流地執行處理各個應用程序,時間一到,無論進程是否運行結束,操作系統就會強制將CPU這個資源轉到另一個進程去執行,由于每個時間片很短,對于每個程序,就好像為自己單獨服務,從而達到多個程序同時進行的效果。

如何理解多線程?
在一個程序中,以QQ聊天為例,當QQ這個進程被CPU分配時間處理時,這時我們需要處理聊天還是處理界面的刷新。如果處理了聊天,界面就不會刷新,看起來界面就卡死了。同樣上上面一樣,每次 CPU 執行100ms,其中30ms用于處理聊天,40ms用于處理傳文件,剩余的30ms用于處理界面刷新,這樣快速切換處理。就可以達到多線程的效果。

  • 在當前的多核CPU

多核CPU擁有多個物理核心,每個物理核心可以同時執行一個進程(線程)或多個進程(線程)。這意味著在多核CPU下,多個進程(線程)可以正真并行執行,每個線程在各自的核心上獨立運行。

在多核CPU的情況下,也可能會出現一個CPU核心處理多個進程(線程)的情況。

每個線程在自己的核心上獨立執行,互不干擾,可以充分利用CPU的并行處理能力。這種并行執行可以提高系統的響應性和吞吐量。

區別:
在多核CPU下,多線程的并發編程相對復雜,需要考慮線程間的同步、互斥和數據共享等問題。由于多個線程可以同時訪問和修改共享數據,可能會出現競態條件和數據不一致的問題,需要使用同步機制(如鎖、信號量等)來實現線程安全。
而在單核CPU下,由于只有一個線程在執行,不存在多個線程同時訪問共享數據的問題,因此并發編程的復雜性相對較低。

三,多線程的生命周期

在這里插入圖片描述

  • 新建:實例化線程對象
  • 就緒:向線程對象發送start消息,線程對象被加入可調度線程池等待CPU調度。
  • 運行:CPU負責調度可調度線程池中線程的執行,線程執行完成之前,狀態可能會在就緒和運行之間來回切換。就緒和執行之間的狀態變化由CPU負責。
  • 阻塞:當滿足某個預定條件時,可以使用休眠或鎖,阻塞線程執行,所謂阻塞狀態是正在運行的線程沒有運行結束,暫時讓出CPU,這時其他處于就緒狀態的線程就可以獲得CPU時間,進入運行狀態。
  • 死亡:正常死亡,線程執行完畢。非正常死亡,當滿足某個條件后,在線程內部終止執行/在主線程終止線程對象

線程池
線程池是一種“池化”的線程使用模式。線程的創建,銷毀,調度都有一定的開銷,通過預先創建一定數量的線程,讓這些線程處于就緒狀態來提高系統響應速度,在線程使用完成后歸還到線程池達到重復利用的目的,從而降低系統資源的消耗,提高響應速度,增加了線程的可管理性。

四,多線程的四種使用方法

在這里插入圖片描述

我們一般使用比較多的是 GCD,因為開發者只需要告訴 GCD 想要執行什么任務,不需要編寫任何線程管理代碼,但這也是 GCD 的不夠靈活的地方,我們無法監控線程的各個狀態,這也是很多大框架中使用 NSOperation 的原因,NSOperation 相比 GCD 更加靈活,開發者可以通過 KVO 監測 Operation 的狀態,自定義 NSOperation 等。

五,多線程的意義

  • 某個操作可能會陷入長時間等待,等待的線程會進入睡眠狀態,無法繼續執行。多線程執行可以有效利用等待時間進行線程切換。如等待網絡響應。
  • 某個操作可能會消耗大量的時間,如果只有一個線程,程序和用戶之間的交互會被中斷。多線程可以讓一個線程負責交互,另一個線程負責計算。
  • 多CPU或多核處理器,本身具備同時執行多個線程的能力,因此單線程程序無法全面發揮計算機的全部計算能力。
  • 多線程可以提高程序的效率。多線程同步完成多項任務,不是為了提高運行效率,而是為了提高資源使用效率來提高系統的效率。

多線程的不足:

  • 開啟線程需要占用一定的內存空間(默認情況下,每條線程占512kb);如果開啟大量的線程,會占用大量的內存空間,降低程序的性能。
  • 線程越多,CPU在調用線程上的開銷就越大(因為要在線程之間切換);
  • 多線程編程的程序設計會更加復雜(如線程間的通信、多線程的數據共享等)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12967.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL中的LAG函數與LEAD函數用法

LAG:函數用于獲取結果集中當前行之前的某一行的值 LAG (scalar_expression [,offset] [,default]) OVER ([partition_by_clause ] order_by_clause ) -----漢字解釋 LAG (字段 [,偏移量默認為1] [,如果沒有值時候默認值]) OVER ( [ partition_by 字段 ] order_by 字…

服務網格 SolarMesh v1.13 重磅發布

SolarMesh是行云創新推出的流量治理平臺,它基于Istio,為部署在K8s集群上的應用提供全面的流量治理能力。 在之前的版本中,SolarMesh提供的能力有:流量視圖,流量控制策略批量配置,API級別的流量數據采集和展…

【上海大學計算機組成原理實驗報告】五、機器語言程序實驗

一、實驗目的 理解計算機執行程序的實際過程。 學習編制機器語言簡單程序的方法。 二、實驗原理 根據實驗指導書的相關內容,指令的形式化表示是指采用一種規范化的符號系統,以更清晰、精確地描述和表示指令的邏輯功能和操作步驟。 匯編是一種編程語言…

MM模塊學習二 (供應商,物料后臺相關配置)

公司代碼配置 新建條目(只是建了一個名字出來,后面很多表都是沒有得) 接下來定義公司代碼: 公司代碼復制完成(后續修改交給財務顧問去做) 復制工廠: 復制工廠完成: 修改復制過去的工…

Linux服務器lvm磁盤管理fdisk和df磁盤大小不同修改

服務器端由于硬盤是通過VCenter原來100G磁盤復制的虛擬機,復制完成后,原來100G的磁盤通過選擇 磁盤重新復制出150G的磁盤,開機后發現還是原來的100G的磁盤,通過fdisk -l 查看有個sdb是150G, 但是已經劃轉的lvm盤只有100G, 通過df查看也是原來的100G: pvs查看pv里也是10…

用c++實現快速排序、最大子段和問題

6.2.2 快速排序 【問題】快速排序(quick sort)的分治策略如下(圖6-5)。 (1)劃分:(選定一個記錄作為軸值,以軸值為基準將整個序列劃分為兩個子序列,軸值的位置在劃分的過程中確定,并且左側子序列的所有記錄…

26 分鐘驚訝世界,GPT-4o 引領未來人機交互

前言 原文鏈接:OpenAI最新模型——GPT-4o,實時語音視頻交互,未來人機交互近在眼前 - Kaiho小站 北京時間 5 月 14 日凌晨,OpenAI 發布新一代模型——GPT-4o,僅在 ChatGPT 面世 17 個月后,OpenAI 再次通過…

qt的udp通訊

QString mylocalip; const QList interfaces QNetworkInterface::allInterfaces(); foreach(QNetworkInterface ip, interfaces) { if (ip.humanReadableName() QStringLiteral(“以太網”)) { //if (ip.type() QNetworkInterface::Ethernet) { const QList iplist ip.addr…

【EasyX】快速入門——靜態圖形篇

1.基本說明 EasyX 是針對 C 的圖形庫,可以幫助 C/C 初學者快速上手圖形和游戲編程。 比如,可以基于 EasyX 圖形庫很快的用幾何圖形畫一個房子,或者一輛移動的小車,可以編寫俄羅斯方塊、貪吃蛇、黑白棋等小游戲,可以練…

Go 注釋生成 api文檔

在 Go 語言中,通常會使用 godoc 工具來從注釋中生成 API 文檔。godoc 是 Go 官方提供的文檔生成工具,它可以解析 Go 源代碼中的注釋,并生成在線的、可交互的文檔。 為了使用 godoc 生成 API 文檔,你需要遵循一些特定的注釋格式。…

使用VMware或VirtualBox安裝eNSP Pro并使用CRT連接設備

文章目錄 使用Oracle Virtual Box安裝eNSP Pro創建虛擬機配置網卡配置帶外管理網絡 使用VMware Workstation安裝eNSP Pro轉換文件格式及虛擬磁盤模式配置網卡創建虛擬機配置使用CRT連接管理設備 前一段時間是開放了eNSP Pro的賬號權限,但是在寫博客時,權…

2024OD機試卷-字符串分割(二) (java\python\c++)

題目:字符串分割(二) 題目描述 給定一個非空字符串S,其被N個‘-’分隔成N+1的子串,給定正整數K,要求除第一個子串外,其余的子串每K個字符組成新的子串,并用‘-’分隔。 對于新組成的每一個子串,如果它含有的小寫字母比大寫字母多,則將這個子串的所有 大寫字母轉換為小…

27.哀家要長腦子了!

目錄 1.316. 去除重復字母 - 力扣(LeetCode) 2. 1209. 刪除字符串中的所有相鄰重復項 II - 力扣(LeetCode 哎喲 煩死了 剛剛不小心退出又沒保存 又要寫一遍 煩死了 最近刷題不得勁啊 感覺這腦子沒長一點 1.316. 去除重復字母 - 力扣&am…

(實測驗證)【移遠EC800M-CN 】GNSS功能打開和關閉關閉步驟驗證

引言 本文章使用自研“超小體積TTL轉4GGPS集成模塊”進行實測驗證; 一、打開GNSS功能 步驟一、通過 ATQGPSCFG 配置 GNSS 參數 (1)該命令用于查詢和配置 GNSS 不同的設置,包括 NMEA 語句輸出端口、NMEA 語句的輸出類型等。 1.1…

NSSCTF | [SWPUCTF 2021 新生賽]easyupload2.0

先傳一個普通的一句話木馬試一試 GIF89a <?php eval($_POST[shell]);?> 可以看到回顯&#xff0c;不允許上傳php文件。 使用Burpsuite抓包只修改ContentType后發現也不能繞過&#xff0c;說明服務器使用了黑名單后綴限制&#xff0c;那么我們可以使用其他的后綴代替ph…

RPA的實施過程通常包括哪些步驟?

RPA&#xff08;Robotic Process Automation&#xff09;的實施過程通常涉及一系列詳細的步驟&#xff0c;旨在確保自動化項目的成功部署和運行。以下是RPA實施過程的一般步驟&#xff1a; ### 1. 需求分析與目標設定 實施RPA的第一步是進行需求分析&#xff0c;明確企業希望通…

電路板維修【四】

【開關電源輸出電壓偏低不穩&#xff0c;用示波器立馬鎖定故障范圍】&#xff1a;https://www.bilibili.com/video/BV1pf421D73K?vd_source3cc3c07b09206097d0d8b0aefdf07958 可以用示波器查看MOS的輸出波形來查看其是否損壞&#xff1a; 電源芯片的供電電壓來回跳變&#xf…

嵌入式C語言與人工智能融合開發高級教程:實現手勢識別系統

目錄 文章主題環境準備人工智能與嵌入式系統基礎代碼示例&#xff1a;實現手勢識別系統應用場景&#xff1a;智能家居與穿戴設備問題解決方案與優化 1. 文章主題 文章主題 本教程將詳細介紹如何在STM32嵌入式系統中使用C語言實現手勢識別系統&#xff0c;特別是如何在資源受…

基于卷積神經網絡CNN,使用二維卷積Conv2D實現MNIST數字識別的四種方法

前言 系列專欄&#xff1a;機器學習&#xff1a;高級應用與實踐【項目實戰100】【2024】?? 在本專欄中不僅包含一些適合初學者的最新機器學習項目&#xff0c;每個項目都處理一組不同的問題&#xff0c;包括監督和無監督學習、分類、回歸和聚類&#xff0c;而且涉及創建深度學…

ROS 2邊學邊練(48)-- 將URDF與robot_state_publisher一起使用

前言 本篇將完成一個行走的機器人&#xff0c;并以tf2消息的方式實時發布機器人狀態&#xff0c;以便我們在Rviz中同步查看。 首先&#xff0c;我們創建描述機器人裝配的URDF模型。接下來&#xff0c;我們編寫一個節點&#xff0c;用于模擬運動并發布JointState和位姿變換。然后…