百戰c++(os1)

Linux中的鎖

互斥鎖:mutex,用于保證在任何時刻,都只能有一個線程訪問該對象。當獲取鎖操作失敗時,線程會進入睡眠,等待鎖釋放時被喚醒

讀寫鎖:rwlock,分為讀鎖和寫鎖。處于讀操作時,可以允許多個線程同時獲得讀操作。但是同一時刻只能有一個線程可以獲得寫鎖。其它獲取寫鎖失敗的線程都會進入睡眠狀態,直到寫鎖釋放時被喚醒。 注意:寫鎖會阻塞其它讀寫鎖。當有一個線程獲得寫鎖在寫時,讀鎖也不能被其它線程獲取;寫者優先于讀者(一旦有寫者,則后續讀者必須等待,喚醒時優先考慮寫者)。適用于讀取數據的頻率遠遠大于寫數據的頻率的場合。

自旋鎖:spinlock,在任何時刻同樣只能有一個線程訪問對象。但是當獲取鎖操作失敗時,不會進入睡眠,而是會在原地自旋。,調用者就一直循環在那里看是否該自旋鎖的保持者已經釋放了鎖。直到鎖被釋放。這樣節省了線程從睡眠狀態到被喚醒期間的消耗,在加鎖時間短暫的環境下會極大的提高效率。但如果加鎖時間過長,則會非常浪費CPU資源。

說說進程與線程的區別?具體描述下。如何選擇進程與線程

程序段、數據段、PCB三部分構成進程實體

進程就緒狀態 已經分配好除CPU以外的所有資源。

PCB中包含處理機狀態,進程調度信息,進程控制信息,進程標識符。

因此可實現間斷性運行,作為獨立運行基本單位的標志,提供進程管理所需的信息,提供進程調度所需要的信息,實現與其他進程同步與通信。

1.因為進程擁有獨立的堆棧空間和數據段,所以每當啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,系統開銷比較大,而線程不一樣,線程擁有獨立的棧空間,但是共享數據段,它們彼此之間使用相同的地址空間,共享大部分數據,切換速度也比進程快,效率高,但是正由于進程之間獨立的特點,使得進程安全性比較高,也因為進程有獨立的地址空間,一個進程崩潰后,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。一個線程死掉就等于整個進程死掉。

2.體現在通信機制上面,正因為進程之間互不干擾,相互獨立,進程的通信機制相對很復雜,譬如管道,信號,消息隊列,共享內存,套接字等通信機制,而線程由于共享數據段所以通信機制很方便。。

3.屬于同一個進程的所有線程共享該進程的資源,包括文件描述符。而不同過的進程相互獨立。

4.線程必定也只能屬于一個進程,而進程可以擁有多個線程而且至少擁有一個線程;

5.進程是資源分配的最小單位,線程是CPU調度的最小單位;進程是系統進行資源分配和調度的一個獨立單位

進程與線程的選擇取決以下幾點

1、需要頻繁創建銷毀的優先使用線程;因為對進程來說創建和銷毀一個進程代價是很大的。

2、線程的切換速度快,所以在需要大量計算,切換頻繁時用線程,還有耗時的操作使用線程可提高應用程序的響應

3、因為對CPU系統的效率使用上線程更占優,所以可能要發展到多機分布的用進程,多核分布用線程;

4、并行操作時使用線程,如C/S架構的服務器端并發線程響應用戶的請求;

5、需要更穩定安全時,適合選擇進程;需要速度時,選擇線程更好。

狀態切換?

請你說一說Linux虛擬地址空間

為了防止不同進程同一時刻在物理內存中運行而對物理內存的爭奪和踐踏,采用了虛擬內存。

虛擬內存技術使得不同進程在運行過程中,它所看到的是自己獨自占有了當前系統的4G內存。所有進程共享同一物理內存,每個進程只把自己目前需要的虛擬內存空間映射并存儲到物理內存上。 事實上,在每個進程創建加載時,內核只是為進程“創建”了虛擬內存的布局,具體就是初始化進程控制表中內存相關的鏈表,實際上并不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射),等到運行到對應的程序時,才會通過缺頁異常,來拷貝數據。還有進程運行過程中,要動態分配內存,比如malloc時,也只是分配了虛擬內存,即為這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。

請求分頁系統、請求分段系統和請求段頁式系統都是針對虛擬內存的,通過請求實現內存與外存的信息置換。

虛擬內存的好處:

1.擴大地址空間;

2.內存保護:每個進程運行在各自的虛擬內存地址空間,互相不能干擾對方。虛存還對特定的內存地址提供寫保護,可以防止代碼或數據被惡意篡改。

3.公平內存分配。采用了虛存之后,每個進程都相當于有同樣大小的虛存空間。

4.當進程通信時,可采用虛存共享的方式實現。

5.當不同的進程使用同樣的代碼時,比如庫文件中的代碼,物理內存中可以只存儲一份這樣的代碼,不同的進程只需要把自己的虛擬內存映射過去就可以了,節省內存

6.虛擬內存很適合在多道程序設計系統中使用,許多程序的片段同時保存在內存中。當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用。在內存中可以保留多個進程,系統并發度提高

7.在程序需要分配連續的內存空間的時候,只需要在虛擬內存空間分配連續空間,而不需要實際物理內存的連續空間,可以利用碎片

虛擬內存的代價:

1.虛存的管理需要建立很多數據結構,這些數據結構要占用額外的內存

2.虛擬地址到物理地址的轉換,增加了指令的執行時間。

3.頁面的換入換出需要磁盤I/O,這是很耗時的

4.如果一頁中只有一部分數據,會浪費內存。

1 頁是信息的物理單位,分頁是為了實現離散分配方式,以消減內存的外零頭,提高內存的利用率。分頁僅僅是由于系統管理的需要而不是用戶的需要

?? 段是信息的邏輯單位,分段的目的是為了能更好地滿足用戶的需要

2 頁的大小固定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,段的長度卻不固定,決定于用戶所編寫的程序

3 分頁的作業地址空間是一維的,即單一的線性地址空間。 分段的作業地址空間是二維的 在標識一個地址時,即需給出段名,又需給出段內地址

請你說一說線程間的同步方式,最好說出具體的系統調用

信號量

信號量是一種特殊的變量,可用于線程同步。它只取自然數值,并且只支持兩種操作:

P(SV):如果信號量SV大于0,將它減一;如果SV值為0,則掛起該線程。

V(SV):如果有其他進程因為等待SV而掛起,則喚醒,然后將SV+1;否則直接將SV+1

其系統調用為:

sem_waitsem_t *sem):以原子操作的方式將信號量減1,如果信號量值為0,則sem_wait將被阻塞,直到這個信號量具有非0值。

sem_postsem_t *sem):以原子操作將信號量值+1。當信號量大于0時,其他正在調用sem_wait等待信號量的線程將被喚醒。

互斥量

互斥量又稱互斥鎖,主要用于線程互斥,不能保證按序訪問,可以和條件鎖一起實現同步。當進入臨界區?? ???時,需要獲得互斥鎖并且加鎖;當離開臨界區時,需要對互斥鎖解鎖,以喚醒其他等待該互斥鎖的線程。其主要的系統調用如下:

pthread_mutex_init:初始化互斥鎖

pthread_mutex_destroy:銷毀互斥鎖

pthread_mutex_lock:以原子操作的方式給一個互斥鎖加鎖,如果目標互斥鎖已經被上鎖,pthread_mutex_lock調用將阻塞,直到該互斥鎖的占有者將其解鎖。

pthread_mutex_unlock:以一個原子操作的方式給一個互斥鎖解鎖。

條件變量

條件變量,又稱條件鎖,用于在線程之間同步共享數據的值。條件變量提供一種線程間通信機制:當某個共享數據達到某個值時,喚醒等待這個共享數據的一個/多個線程。即,當某個共享變量等于某個值時,調用?signal/broadcast。此時操作共享變量時需要加鎖。其主要的系統調用如下:

pthread_cond_init:初始化條件變量

pthread_cond_destroy:銷毀條件變量

pthread_cond_signal:喚醒一個等待目標條件變量的線程。哪個線程被喚醒取決于調度策略和優先級。

pthread_cond_wait:等待目標條件變量。需要一個加鎖的互斥鎖確保操作的原子性。該函數中在進入wait狀態前首先進行解鎖,然后接收到信號后會再加鎖,保證該線程對共享資源正確訪問。

請你說一說Linux虛擬地址空間

為了防止不同進程同一時刻在物理內存中運行而對物理內存的爭奪和踐踏,采用了虛擬內存。

虛擬內存技術使得不同進程在運行過程中,它所看到的是自己獨自占有了當前系統的4G內存。所有進程共享同一物理內存,每個進程只把自己目前需要的虛擬內存空間映射并存儲到物理內存上。 事實上,在每個進程創建加載時,內核只是為進程“創建”了虛擬內存的布局,具體就是初始化進程控制表中內存相關的鏈表,實際上并不立即就把虛擬內存對應位置的程序數據和代碼(比如.text .data段)拷貝到物理內存中,只是建立好虛擬內存和磁盤文件之間的映射就好(叫做存儲器映射),等到運行到對應的程序時,才會通過缺頁異常,來拷貝數據。還有進程運行過程中,要動態分配內存,比如malloc時,也只是分配了虛擬內存,即為這塊虛擬內存對應的頁表項做相應設置,當進程真正訪問到此數據時,才引發缺頁異常。

請求分頁系統、請求分段系統和請求段頁式系統都是針對虛擬內存的,通過請求實現內存與外存的信息置換。

虛擬內存的好處:

1.擴大地址空間;

2.內存保護:每個進程運行在各自的虛擬內存地址空間,互相不能干擾對方。虛存還對特定的內存地址提供寫保護,可以防止代碼或數據被惡意篡改。

3.公平內存分配。采用了虛存之后,每個進程都相當于有同樣大小的虛存空間。

4.當進程通信時,可采用虛存共享的方式實現。

5.當不同的進程使用同樣的代碼時,比如庫文件中的代碼,物理內存中可以只存儲一份這樣的代碼,不同的進程只需要把自己的虛擬內存映射過去就可以了,節省內存

6.虛擬內存很適合在多道程序設計系統中使用,許多程序的片段同時保存在內存中。當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用。在內存中可以保留多個進程,系統并發度提高

7.在程序需要分配連續的內存空間的時候,只需要在虛擬內存空間分配連續空間,而不需要實際物理內存的連續空間,可以利用碎片

虛擬內存的代價:

1.虛存的管理需要建立很多數據結構,這些數據結構要占用額外的內存

2.虛擬地址到物理地址的轉換,增加了指令的執行時間。

3.頁面的換入換出需要磁盤I/O,這是很耗時的

4.如果一頁中只有一部分數據,會浪費內存。

1 頁是信息的物理單位,分頁是為了實現離散分配方式,以消減內存的外零頭,提高內存的利用率。分頁僅僅是由于系統管理的需要而不是用戶的需要

?? 段是信息的邏輯單位,分段的目的是為了能更好地滿足用戶的需要

2 頁的大小固定,由系統把邏輯地址劃分為頁號和頁內地址兩部分,段的長度卻不固定,決定于用戶所編寫的程序

3 分頁的作業地址空間是一維的,即單一的線性地址空間。 分段的作業地址空間是二維的 在標識一個地址時,即需給出段名,又需給出段內地址

請你說一說線程間的同步方式,最好說出具體的系統調用

信號量

信號量是一種特殊的變量,可用于線程同步。它只取自然數值,并且只支持兩種操作:

P(SV):如果信號量SV大于0,將它減一;如果SV值為0,則掛起該線程。

V(SV):如果有其他進程因為等待SV而掛起,則喚醒,然后將SV+1;否則直接將SV+1

其系統調用為:

sem_waitsem_t *sem):以原子操作的方式將信號量減1,如果信號量值為0,則sem_wait將被阻塞,直到這個信號量具有非0值。

sem_postsem_t *sem):以原子操作將信號量值+1。當信號量大于0時,其他正在調用sem_wait等待信號量的線程將被喚醒。

互斥量

互斥量又稱互斥鎖,主要用于線程互斥,不能保證按序訪問,可以和條件鎖一起實現同步。當進入臨界區?? ???時,需要獲得互斥鎖并且加鎖;當離開臨界區時,需要對互斥鎖解鎖,以喚醒其他等待該互斥鎖的線程。其主要的系統調用如下:

pthread_mutex_init:初始化互斥鎖

pthread_mutex_destroy:銷毀互斥鎖

pthread_mutex_lock:以原子操作的方式給一個互斥鎖加鎖,如果目標互斥鎖已經被上鎖,pthread_mutex_lock調用將阻塞,直到該互斥鎖的占有者將其解鎖。

pthread_mutex_unlock:以一個原子操作的方式給一個互斥鎖解鎖。

條件變量

條件變量,又稱條件鎖,用于在線程之間同步共享數據的值。條件變量提供一種線程間通信機制:當某個共享數據達到某個值時,喚醒等待這個共享數據的一個/多個線程。即,當某個共享變量等于某個值時,調用?signal/broadcast。此時操作共享變量時需要加鎖。其主要的系統調用如下:

pthread_cond_init:初始化條件變量

pthread_cond_destroy:銷毀條件變量

pthread_cond_signal:喚醒一個等待目標條件變量的線程。哪個線程被喚醒取決于調度策略和優先級。

pthread_cond_wait:等待目標條件變量。需要一個加鎖的互斥鎖確保操作的原子性。該函數中在進入wait狀態前首先進行解鎖,然后接收到信號后會再加鎖,保證該線程對共享資源正確訪問。

操作系統中的缺頁中斷

malloc()mmap()等內存分配函數,在分配時只是建立了進程虛擬地址空間,并沒有分配虛擬內存對應的物理內存。當進程訪問這些沒有建立映射關系的虛擬內存時,處理器自動觸發一個缺頁異常。

缺頁中斷:在請求分頁系統中,可以通過查詢頁表中的狀態位來確定所要訪問的頁面是否存在于內存中。每當所要訪問的頁面不在內存是,會產生一次缺頁中斷,此時操作系統會根據頁表中的外存地址在外存中找到所缺的一頁,將其調入內存。

缺頁本身是一種中斷,與一般的中斷一樣,需要經過4個處理步驟:

1、保護CPU現場

2、分析中斷原因

3、轉入缺頁中斷處理程序進行處理

4、恢復CPU現場,繼續執行

但是缺頁中斷是由于所要訪問的頁面不存在于內存時,由硬件所產生的一種特殊的中斷,因此,與一般的中斷存在區別:

1、在指令執行期間產生和處理缺頁中斷信號

2、一條指令在執行期間,可能產生多次缺頁中斷

3、缺頁中斷返回是,執行產生中斷的一條指令,而一般的中斷返回是,執行下一條指令。

Vfork和fork clone的區別

1.? fork? ():子進程拷貝父進程的數據段,代碼段

??? vfork? ):子進程與父進程共享數據段

2.? fork ()父子進程的執行次序不確定

??? vfork 保證子進程先運行,在調用exec exit 之前與父進程數據是共享的,在它調用exec

???? exit 之后父進程才可能被調度運行。

3.? vfork ()保證子進程先運行,在她調用exec exit 之后父進程才可能被調度運行。如果在

?? 調用這兩個函數之前子進程依賴于父進程的進一步動作,則會導致死鎖。

fork()函數用于從已存在的進程中創建一個新的進?程,新的進程稱為子進程,而原進程稱為父進程,fork?()的返回值有兩個,子進程返回0,父進程返回子進程的進程號,進程號都是非零的正整數,所以父進程返回的值一定大于零。

Linuxfork()使用寫時拷貝(copy-on-write)頁實現。寫時拷貝是一種可以推遲甚至免除拷貝數據的技術。內核此時并不復制整個地址空間,而是讓父進程和子進程共享一個拷貝。只有在需要寫入的時候,數據才會復制,從而使各個進程擁有各自的拷貝。也就是說,資源的復制只有在需要寫入的時候才進行,在此之前,只是以只讀方式共享。這種技術使地址空間的頁的拷貝被推遲到實際發生寫入的時候。

?

守護進程

守護進程是運行在后臺的一種特殊進程, 不受終端控制,Linux系統的大多數服務器就是通過守護進程實現的。一個守護進程的父進程是init進程。
?

1)創建子進程,父進程退出

2)在子進程中創建新會話

3)改變當前目錄為根目

4)重設文件權限掩碼

5) 關閉文件描述符

說說IO阻塞與非阻塞是什么?各自有啥好處?知道多路復用嗎?了解過 select 嗎?說說他與 epoll 的區別。

進線程間通信方式

管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。

它可以看成是一種特殊的文件,對于它的讀寫也可以使用普通的read、write等函數。但是它不是普通的文件,并不屬于其他任何文件系統,并且只存在于內存中。

互斥:當一方進程正在讀寫的時候,其他進程必須等待。同步:當寫入一定數量的數據時,便去睡眠等待,直到讀進程取走數據。當讀一個空管道時,也應睡眠等待,直到寫進程寫了之后才能讀。確認對方是存在的才能進行通信。

命名管道 (FIFO) : 有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。FIFO有路徑名與之相關聯,它以一種特殊設備文件形式存在于文件系統中。

信號量:信號量用于實現進程間的互斥與同步,也可以用在線程上,主要有posix信號量和System V信號量,posix信號量一般用在線程上,System V信號量一般用在進程上,posix信號量的函數一般都在下劃線。

消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。(優先級,大小)

1)消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。

2)消息隊列獨立于發送與接收進程。進程終止時,消息隊列及其內容并不會被刪除。

3)消息隊列可以實現消息的隨機查詢,消息不一定要以先進先出的次序讀取,也可以按消息的類型讀取。

共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

信號 ( sinal ) : 信號是一種比較復雜的通信方式,用于通知接收進程某個事件已經發生,kill -l可列出所有可用信號。信號是UNIX和Linux系統響應某些條件而產生的一個事件,接收到該信號的進程會相應地采取一些行動。通常信號是由一個錯誤產生的。但它們還可以作為進程間通信或修改行為的一種方式,明確地由一個進程發送給另一個進程。一個信號的產生叫生成,接收到一個信號叫捕獲。還有更健壯的sigaction

?

套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用于不同機器間的進程通信。

線程間通信的方式:

臨界區:通過多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問;

互斥量Synchronized/Lock:采用互斥對象機制,只有擁有互斥對象的線程才有訪問公共資源的權限。因為互斥對象只有一個,所以可以保證公共資源不會被多個線程同時訪問

信號量Semphare:為控制具有有限數量的用戶資源而設計的,它允許多個線程在同一時刻去訪問同一個資源,但一般需要限制同一時刻訪問此資源的最大線程數目。

事件(信號),Wait/Notify:通過通知操作的方式來保持多線程同步,還可以方便的實現多線程優先級的比較操作

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

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

相關文章

Linux實驗三:Shell編程

文章目錄一、實驗目的二、實驗要求三、實驗內容1、通配符的使用2、重定向3、管道4、shell變量5、建立下面的腳本,運行并分析輸出結果,并給出代碼注釋。6、編寫腳本一、實驗目的 1.為文件擴展名使用通配符 2.標準輸入、標準輸出和標準錯誤的重定向 3.使…

a href=#與 a href=javascript:void(0) 的區別

a href"#"> 點擊鏈接后&#xff0c;頁面會向上滾到頁首&#xff0c;# 默認錨點為 #TOP<a href"javascript:void(0)" onClick"window.open()"> 點擊鏈接后&#xff0c;頁面不動&#xff0c;只打開鏈接<a href"#" οnclick&…

Linux實驗四:編譯和調試工具的使用

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容四、實驗操作1、用gcc編譯程序&#xff0c;寫出編譯過程&#xff0c;并給出運行結果。2、調試程序&#xff0c;要求用gdb進行調試并給出修改方案。3、make的使用一、實驗目的&#xff1a; 1、練習并掌握Linux提供的v…

Linux實驗五:Linux環境下的C語言編程

文章目錄一、實驗目的&#xff1a;二、實驗要求三、實驗內容1、編寫一段C語言程序使其完成&#xff1a;父進程創建兩個子進程&#xff0c;每個進程都在屏幕上顯示自己的進程ID號。2、上機調試下面的程序&#xff0c;觀察運行結果&#xff0c;分析原因。3、利用兩個管道進行雙向…

百戰c++(4)

1.求下面函數的返回值&#xff08;微軟&#xff09; int func(x) { int countx 0; while(x) { countx ; x x&(x-1); } return countx; } 假定x 9999。 答案&#xff1a;8 思路&#xff1a;將x轉化為2進制&#xff0c;看含有的1的個數。 2. 什么是“引用”&…

ndarray對象的建立

文章目錄ndarray&#xff08;別名array&#xff09;常用屬性創建NumPy數組使用array()函數使用zeros()函數使用ones()函數使用empty()函數使用arange()函數注意ndarray&#xff08;別名array&#xff09; 常用屬性 import numpy as np # Numpy工具包data np.arange(12).res…

百戰c++(5)

11. 已知strcpy的函數原型&#xff1a;char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串&#xff0c;strSrc 是源字符串。不調用C/C 的字符串庫函數&#xff0c;請編寫函數 strcpy。 答案&#xff1a; char *strcpy(char *strDest, const char *strS…

Numpy數組的廣播機制

文章目錄前言數組廣播廣播機制的使用條件前言 Numpy數組不需要循環遍歷&#xff0c;即可對每個元素執行批量的算術運算操作&#xff08;矢量化運算&#xff09;。當兩個數組大小&#xff08;Numpy.shape&#xff09;不同時&#xff0c;進行算術運算會出現廣播機制。 數組廣播…

百戰c++(6)

26. 描述內存分配方式以及它們的區別? 1&#xff09; 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好&#xff0c;這塊內存在程序的整個運行期間都存在。例如全局變量&#xff0c;static 變量。 2&#xff09; 在棧上創建。在執行函數時&#xff0c;函數內局部變量的…

Spring3.1.0+Quartz1.8.6整合實現計劃任務

1.首先要加入任務計劃的相關的jar包&#xff0c;這里除了需要加Spring3.1.0的jar&#xff0c;還需要加quartz-all-1.8.6.jarslf4j-api-1.5.8.jar slf4j-log4j12.jar這三個包&#xff0c;如果你是SSH整合的項目&#xff0c;里面有下面的兩個包了&#xff0c;就可以不加&#xff…

百戰c++(7)

40. 鏈表題&#xff1a;一個鏈表的結點結構 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知鏈表的頭結點head,寫一個函數把這個鏈表逆序 ( Intel) Node * ReverseList(Node *head) //鏈表逆序 { if ( head NULL || head->next NU…

數組的轉置和軸對稱

文章目錄T屬性transpose()方法swapaxes()方法T屬性 import numpy as np # Numpy工具包data np.arange(12).reshape(3, 4) # 創建一個3行4列的數組 print(data)# 數組的轉置和軸對稱 data1 data.T print(data1)print(data) [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] print(dat…

百戰c++(8)

43. 寫一個在一個字符串(n)中尋找一個子串(m)第一個位置的函數。 KMP算法效率最好&#xff0c;時間復雜度是&#xff2f;(nm)。 44. 多重繼承的內存分配問題&#xff1a; 比如有class A : public class B, public class C {} 那么A的內存結構大致是怎么樣的&#xff1f; 這…

管道實現父子進程的信息傳遞(一)【fork函數、pipe函數、write/read操作、wait函數】

文章目錄題目描述代碼實現關于pipe函數關于讀寫操作關于讀寫端口關于wait函數功能&#xff1a;注意&#xff1a;關于fork函數題目描述 編寫一個程序&#xff0c;利用管道實現父子進程的通信&#xff0c;父進程向子進程發送信息&#xff0c;由子進程輸出顯示。 代碼實現 #inclu…

基礎的shell編程問題(一)

文章目錄題目一題目描述代碼實現關于$#的有關內容實測本程序的作用題目二題目描述代碼實現注釋關于argc、argv關于read函數關于文件描述符關于write函數本程序的作用題目三題目描述代碼實現實測關于grep命令關于read命令題目四題目描述代碼實現關于test命令實測題目一 題目描述…

百戰c++(9)

12 . 下面的代碼輸出是什么&#xff0c;為什么&#xff1f; void foo(void) { unsigned int a 6; int b -20; (ab > 6) puts("> 6") : puts("< 6"); } 這個問題測試你是否懂得C語言中的整數自動轉換原則&#xff0c;我發現有些開發者懂得…

基礎的shell編程問題(二)

文章目錄題目一題目描述代碼實現結果驗證關于本題題目二題目描述代碼實現結果測試題目三題目描述代碼實現及結果測試題目四題目描述代碼實現及結果測試題目五題目描述代碼實現及結果測試題目一 題目描述 輸入的命令行參數必須是hello&#xff0c;才會正確顯示&#xff1b;否則…

百戰c++(10)

1.多態類中的虛函數表是Compile-Time&#xff0c;還是Run-Time時建立的? 2.將一個 1M -10M 的文件&#xff0c;逆序存儲到另一個文件&#xff0c;就是前一個文件的最后一個 字符存到新文件的第一個字符&#xff0c;以此類推。 3.main主函數執行完畢后&#xff0c;是否可能會…

Numpy實現酒鬼漫步問題【以及randint()、where()、cumsum()、argmax()的用法詳解】

文章目錄題目描述代碼實現關于本題涉及到的幾個函數randint()where()cumsum()題目拓展題目描述代碼實現題目拓展題目描述代碼實現argmax()題目描述 從前有一個酒鬼&#xff0c;喝醉了行走在一條直線上&#xff0c;每走一步方向是不確定的&#xff08;向前或者向后&#xff09;…

百戰c++(11)

31.找錯 Void test1() { char string[10]; char* str1"0123456789"; strcpy(string, str1); } Void test2() { char string[10], str1[10]; for(I0; I<10;I) { str1[i] a; } strcpy(string, str1); } Void test3(char* str1) { char string[10]; if(st…