主頁 >  其他 > [Linux從無到有] 行程

[Linux從無到有] 行程

2021-12-19 09:15:25 其他

文章目錄

  • 1. 行程
    • 1.2 PCB
      • 1.2.1背景關系資料
      • 1.2.2 記憶體指標
      • 1.2.3狀態
      • pid和ppid與fork(創建行程)與識別符號
      • 1.2.4優先級
      • 1.2.6 程式計數器

1. 行程

大家應該對任務管理并不陌生吧,有時候app卡死了我們就需要手動去吧這個app殺死,但仔細看會發現他上面寫的是行程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Bi2Qrsij-1639743084209)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211204155353580.png)]

簡單來說,一般點開app就是把軟體的代碼和資料加載到記憶體中,這樣算是一個行程了,但是其實內部還進行了更多的操作,他還會為這個代碼創建一個PCB(sask_struct)



1.2 PCB

什么是PCB?

行程控制塊,用來描述行程屬性的集合

為什么需要PCB?

一般情況下行程是不止一個的,所以CPU需要對行程管理,切上述說過一個概念管理者與于被管理者,而CPU就是管理者,行程就是背管理者,一般管理者是不直接管理被管理者,一般通過資料管理的

PCB中包含的資訊(部分)

  1. 背景關系資料
  2. 記憶體指標
  3. 狀態
  4. 優先級
  5. 識別符號
  6. 程式計數器
  7. IO狀態
  8. 記賬資訊



1.2.1背景關系資料

CPU一直奉行一個概念:公平至上,效率為優,就是CPU不會偏心他每一個行程都會雨露均沾,所以這里就有一個概念叫做時間片

時間片:

微觀是就是分配給每個行程在CPU上的運行時間

當一個行程的時間片到了,或者來了一個優先級更高的行程,那么CPU就要把他剝離下來,而剝離下來的時候會將CPU暫存器中的資訊(運行資訊),程式計數器(pc指標,存的是下個代碼的地址),程式狀態,保存至PCB中,整個就是背景關系資料的簡單概念

并發

老話說眼見為實,耳聽為虛,其實作在我告訴你,眼見也不一定為實,我們平時在電腦上打開多個app,在上述操作中可以理解CPU是同時在運行多個行程,這就是眼睛欺騙了你,他只讓你看到了他的表面,底層其實是cpu在瘋狂的切換(每個行程都有對應的時間片),讓你覺得其實CPU在執行多個行程

并行

本質就是有錢,一臺機子倆CPU,那么CPU就可以在同一時間運行倆個行程,只要錢夠多,同時跑百八十個行程都沒事

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WuzUnMLu-1639743084211)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212165632154.png)]

途中可以清晰的看出在一段時間內并發與并行的運行原理,且他們剝離后會放到運行佇列中等待

并發:一段時間內運行多個行程

并行:同一時間可以運行多個行程(取決于cpu個數)


運行佇列等待:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-PGNZyNEY-1639743084211)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211217200025216.png)]



1.2.2 記憶體指標


1.2.3狀態

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1O6iyDRU-1639743084212)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211205163054711.png)]

上面的是宏觀的行程狀態圖,且每個作業系統可能對應的狀態有所不同,我們講的linux下的狀態

  1. R 運行狀態
  2. S 睡眠狀態
  3. D 深度睡眠(磁盤休眠)
  4. T 停止狀態
  5. Z 僵尸狀態
  6. X 死亡狀態

R狀態

R既然是運行狀態,那么他是CPU在運行的嗎?

當然不是,上面說過,每個行程都有一個時間片,運行完就剝離下來,還需要運行就放到運行佇列中,那么其實在運行佇列中的行程也是R狀態


D狀態 VS S狀態

S和D都是睡眠狀態

S,D都意味著行程在等待事件完成,但是S是可以被中斷喚醒了(外部給一個指令),D是只能等著行程自動醒來

不知道你有沒有遇到過這樣的場景就是你想關機卻卡死了,其實就是有行程在深度睡眠(D),阻止你關機,現在是不是多年的謎團就解破了,D狀態一般是行程在進行重要的操作,如往磁盤中塞資料……


T狀態

該狀態可以理解為在除錯,啟動除錯不就停在了短點出嗎,他也是類似,行程直接停止,需要發送SIGSTOP才可以繼續,這就和我們按下n,s(Linux中gdb下一步與進入函式指令)他就又開始跑,


Z狀態

父行程還在,可是子行程突然啥原因退出了,那么這個時候子行程就是僵尸狀態,但他是僵尸狀態的時候他會把自己行程的基本資訊放入他的PCB中

為啥叫僵尸狀態呢?

當一個行程意外退出的時候是不會馬上被釋放的,就和背景關系資料類似,我創建行程本質是想干什么,當然是完成任務了,如果他突然掛了,那么我需要知道他是否完成了任務,如果沒有完成我需要派新行程再去執行,所以僵尸狀態本質:就是行程退出時候的行程狀態

不處理僵尸狀態會怎么樣?

C和C++你動態開辟出來的資料不釋放會怎么樣?記憶體泄漏咯,那么Z狀態也一樣,Linux是由C語言撰寫(其實作業系統基本都是由C撰寫的),那么上述說過一個行程是由代碼資料,還有對應PBC結構體,這個PCB很大很大…………


X狀態

該狀態一般你在任務串列是看不到的,因為一閃而過,直接被作業系統回收,


拓展介紹一個行程(孤兒行程):

人如其名,就是當子行程還在運行的時候,這時候我父行程突然也應為某種原因線子行程退出,這就是孤兒行程的概念?


你說過子行程的資料是父行程回收的那現在怎么?

那么你想一想現在誰可以幫助子行程不變僵尸呢?當然是作業系統,沒錯當一個行程變成孤兒行程的時候,他們會去認作業系統做父親(作業系統本質也是一個行程(1號行程))
在這里插入圖片描述


如果我看這個行程不爽老是優先占用CPU資源那么什么辦法呢?

  • kill + pid

那么現在有個問題就是僵尸行程可以被殺死嗎?

現在已經是邏輯題了,你說你向他心臟開了一槍后且確認已經死了,臨走的時候又補了幾槍算是在殺了次嗎?他又不是死侍(漫威超級英雄),你那只能算鞭尸

除了僵尸且D狀態也是不可以被殺死的,你關機都可以給阻攔住讓你死機,你覺得一條指令可以殺死他們不要開玩笑了好嗎


如何查看呢?

  1. 需要一條指令: ps axj |grep [行程]
  2. top
  3. ps l

建議使用第一個,因為第一個搭配grep直接篩選出你想要看的行程

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nS2ApRbl-1639743084212)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211209171833537.png)]

那么怎么樣才會看到這些狀態呢?


R狀態:

當你載用ps指令的時候怒有沒有發現其實ps他的狀態就是R

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-RHHoHSa2-1639743084213)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212171559745.png)]

本質我們輸入這個指令也創建了一個行程


t狀態

當我按下回車得的時候,那么查看行程狀態的時候,main.g這個行程的就變成了t

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ulc001fA-1639743084214)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212171335935.png)]


Z狀態:

代碼:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-r7MFglLv-1639743084214)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212164212018.png)]

行程的狀態:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OcYtrprt-1639743084215)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211212163747563.png)]


S狀態

這反而是最好看到的,只需要在代碼中加一個sleep函式,或者不加行程都處于S狀態(因為本質上這個行程又大一那一下在運行,大部分時間都是在睡眠所以)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-69Hu3708-1639743084215)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213144904833.png)]


孤兒行程
在這里插入圖片描述

當被1號行程領養后,你不發ctrl+C終止行程,你可以理解為翅膀硬了,普通的招對他沒用了,這個時候需要用kill 指令進行殺除



pid和ppid與fork(創建行程)與識別符號

在上面你看到右pid與ppid,這倆個是什么東西呢?

在現實生活中,你是如何被人標識的呢?

名字,外號???

這只是一部分,那么當要過年買車票回家時候你你不會和售票員說我叫xxx,給我張票我要回家,這個除非你是總統一般情況售票員小姐姐會認為你🧠有點毛病,你當然是遞上你的生份證,因為上面的生份證號就代表了你,你的一切資訊都可以通過他得知,而不是xxx的名字


那么pid就是你的生份證號,也就是當前行程的生份證號(識別符號)

ppid為則為你的父行程的生份證號(多出的p理解為parent)


且你看到我運行的時候為啥開if 與else同時運行,這就要歸功于fork()

linux中的分叉函式(其實就是創建子行程函式)

  • 創建成功后,子行程回傳0,父行程回傳子行程的 pid,如果失敗回傳 -1(回傳型別是pid_t 其實就是 unsigend long long的typedef)
  • 創建出來的子行程的資料與代碼與父行程一致(子行程創建的時和父行程共同指向一份代碼,但是資料是各自私有一份的 )
  • 且在運行父子行程的時候誰優先取決于作業系統

圖解forke創建后,行程運行狀態:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zb3tKJBB-1639743084216)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213150420299.png)]


為啥需要回傳子行程的pid給父行程?

你想當子行程退出后他的資源由誰回收呢?那你想你在學習里面犯事了那是誰給你擦屁股的,當然是你老爹啊,那么道理都一樣當子行程退出后當然是由他的夫行程取釋放嘍


這個時候可能有人會問,那么父行程由誰釋放?

快動用你的小腦袋瓜子想想,你父親是那里來的,不要和我說你父親是孫悟空,或者耶穌,當然是你爺爺奶奶生下來的呀,那么‘’爺爺‘’ 行程是啥呢?

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-nx12r4FJ-1639743084216)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213155338547.png)]
bash其實就是命令列解釋器


現在介紹完linux中的狀態后我們來對應一下開始的行程狀態圖:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-9Gs4lAeo-1639743084217)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211213154100906.png)]



1.2.4優先級

在醫院繳費的時候是否留心看到過一個一張紙條,上面寫著 “軍人依法優先”,雖然我沒有現實中去醫院沒有碰到過兵哥哥,那為啥要優先,本質就是他啥都優先,抗洪救災,保家衛國……,且繳費的視窗太少了,本質就是僧多粥少

而在計算機中也是如此,一般情況下,計算機中只搭載了一顆CPU,那么行程那么多,不也是一個僧多粥少的局面嗎


優先級 vs 權限

你覺得他們的一樣嗎?

其實是不一樣的,優先級是優先獲得資源,說白了,不管怎么樣最終你都會獲得資源(好像看過一部電影還是電視,男主獨苗叛逆,家里有錢,他爸不給他錢,最終他老爹死了,因為是獨苗所以他還是獲得了遺產),權限是有沒有資格獲得,如上面的故事,我是你家的庸人,老板死了他為啥不把錢給我,本質就是我沒有這個權限


如何修改優先級

在Linux中優先級由PRI 與 NI 值控制,PRI為初始值而NI是可以影響他的優先級

NI的范圍[-20,19],越小優先級就越高,優先獲得資源

如圖所示

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-CmChVcrK-1639743084217)(/Users/wuxiaobo/Library/Application Support/typora-user-images/image-20211208154820706.png)]

需要用到的指令是top->r-> 輸入pid與nice值,且每次修改都是在PRI的初始值上修改入上圖所示(80)

為什么要限制NI的范圍

上述說過一個概念就是,OS的調度器的第一原則就是“公平之上,效率擇優”,如果你將一個行程的優先級設為-10000000……那么這時候CPU大部分時間都在運行這個行程,那么就導致其他行程調度不到,導致饑餓問題,就如古代一些皇帝一樣,自己胡吃海喝,底下民不聊生,這難道不出問題?



1.2.6 程式計數器

這個在上述提到過,學名是PC,不是電腦端的意思,他的作用指向程式下一條需要執行的代碼存到暫存器中,這個程序就叫做取指令,并且在如何時刻,PC指標都指向主存的某潭訓器指令,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/385592.html

標籤:其他

上一篇:【LFS7.7】一步步教你從 〇 開始擼個 Linux 系統 | 文末送書

下一篇:CSP-J 2021解題報告

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more