1. 程式人生 > 其它 >11-程序-執行緒相關概念

11-程序-執行緒相關概念

程序概念

Process: 執行中的程式的一個副本,是被載入記憶體的一個指令集合,是資源分配的單位   程序ID(Process ID,PID)號碼被用來標記各個程序   UID、GID、和SELinux語境決定對檔案系統的存取和訪問許可權   通常從執行程序的使用者來繼承     存在生命週期 程序建立:   init:第一個程序,從 CentOS7 以後為systemd   程序:都由其父程序建立,fork(),父子關係,CoW:Copy On Write ,資料發生變化時建立子程序

程序

程序是一個具有一定獨立功能的程式在一個數據集上的一次動態執行的過程,是作業系統進行資源分配和排程的一個獨立單位,是應用程式執行的載體。程序是一種抽象的概念,從來沒有統一的標準定義。 程序的組成程序一般由程式、資料集合和程序控制塊三部分組成。 程式用於描述程序要完成的功能,是控制程序執行的指令集; 資料集合是程式在執行時所需要的資料和工作區; 程式控制塊(Program Control Block,簡稱PCB),包含程序的描述資訊和控制資訊,是程序存在的唯一標誌。 程序具有的特徵: 動態性:程序是程式的一次執行過程,是臨時的,有生命期的,是動態產生,動態消亡的; 併發性:任何程序都可以同其他程序一起併發執行; 獨立性:程序是系統進行資源分配和排程的一個獨立單位; 結構性:程序由程式、資料和程序控制塊三部分組成。

執行緒

在早期的作業系統中並沒有執行緒的概念,程序是能擁有資源和獨立執行的最小單位,也是程式執行的最小單位。任務排程採用的是時間片輪轉的搶佔式排程方式,而程序是任務排程的最小單位,每個程序有各自獨立的一塊記憶體,使得各個程序之間記憶體地址相互隔離。後來,隨著計算機的發展,對CPU的要求越來越高,程序之間的切換開銷較大,已經無法滿足越來越複雜的程式的要求了。於是就發明了執行緒。執行緒是程式執行中一個單一的順序控制流程,是程式執行流的最小單元,是處理器排程和分派的基本單位。一個程序可以有一個或多個執行緒,各個執行緒之間共享程式的記憶體空間(也就是所在程序的記憶體空間)。一個標準的執行緒由執行緒ID、當前指令指標(PC)、暫存器和堆疊組成。而程序由記憶體空間(程式碼、資料、程序空間、開啟的檔案)和一個或多個執行緒組成。

程序和執行緒的區別

程序是作業系統分配資源的最小單位 執行緒是程式執行的CPU排程的最小單位 一個程序由一個或多個執行緒組成,執行緒是一個程序中程式碼的不同執行路線; 程序之間相互獨立,但同一程序下的各個執行緒之間共享程式的記憶體空間(包括程式碼段、資料集、堆等)及一些程序級的資源(如開啟檔案和訊號),某程序內的執行緒在其它程序不可見; 排程和切換:執行緒上下文切換比程序上下文切換要快得多 mysql 單程序多執行緒,加鎖解決資源爭用

Redis server v=5.0.7  早期版本單執行緒 

檢視是執行緒否為多執行緒

root@ubuntu2004:~# ps -ef|grep redis
redis       
3769 1 0 00:19 ? 00:00:03 /usr/bin/redis-server 127.0.0.1:6379 top -Hp 3769

  -H  顯示執行緒資訊  -p 指定pid

Threads:   4 total,   0 running,   4 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.5 id,  0.2 wa,  0.0 hi,  0.2 si,  0.0 st
MiB Mem :   3901.0 total,   3020.9 free,    299.8 used,    580.3 buff/cache
MiB Swap:   3907.0 total,   3907.0 free,      0.0 used.   3362.8 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                                                  
   3769 redis     20   0   50188   4796   3488 S   0.0   0.1   0:02.92 redis-server                                                                                                                             
   3770 redis     20   0   50188   4796   3488 S   0.0   0.1   0:00.00 redis-server                                                                                                                             
   3771 redis     20   0   50188   4796   3488 S   0.0   0.1   0:00.00 redis-server                                                                                                                             
   3772 redis     20   0   50188   4796   3488 S   0.0   0.1   0:00.00 redis-server

 

[root@centos7 ~]# grep -i th /proc/484/status
Threads: 1

[root@centos7 ~]# pstree -p
systemd(1)─┬─
           ├─fdfs_storaged(930)─┬─{fdfs_storaged}(1340)    #帶{}的執行緒 ,公司員工,至少一個
           │                    ├─{fdfs_storaged}(1341)
           │                    ├─{fdfs_storaged}(1342)
           │                    ├─{fdfs_storaged}(1343)
           │                    ├─{fdfs_storaged}(1344)
           │                    ├─{fdfs_storaged}(1345)
           │                    ├─{fdfs_storaged}(1346)
           │                    └─{fdfs_storaged}(1347)
           ├─fdfs_trackerd(944)─┬─{fdfs_trackerd}(964)
           │                    ├─{fdfs_trackerd}(965)
           │                    ├─{fdfs_trackerd}(966)
           │                    ├─{fdfs_trackerd}(967)
           │                    ├─{fdfs_trackerd}(968)
           │                    └─{fdfs_trackerd}(969)
           ├─nginx(945)─┬─nginx(947)
           │            └─nginx(948)
           ├─sshd(914)───sshd(1421)─┬─bash(1423)  #程序和子程序
           │                        └─bash(1471)───pstree(1488)

        ├─redis-server(3769)─┬─{redis-server}(3770)
                         ├─{redis-server}(3771)
                        └─{redis-server}(3772)

           ├─systemd-journal(484)

root@ubuntu2004:/proc/3769# grep -i Threads /proc/3769/status  
Threads: 4  #redis 自己一個加剩餘三個執行緒

 

找到資源佔用高的程序的所在的磁碟檔案,可以刪掉臨時解決,再分析系統為什麼被黑掉

如果對檔案設定 i 屬性,那麼不允許對檔案進行刪除、改名,也不能新增和修改資料;防止 病毒

root@ubuntu2004:/proc/3769# ll exe 
lrwxrwxrwx 1 redis redis 0 Apr 19 00:20 exe -> /usr/bin/redis-check-rdb*
chattr -i /usr/bin/redis-check-rdb
rm  -f /usr/bin/redis-check-rdb
chattr -i /usr/bin/redis-check-rdb

併發  基於時間片10ms 處理,人感覺不到

並行 基於cpu核數同時處理