探索Linux信號機制:有效管理進程間通信。我們把之前的信號1-31叫做標準信號,由于標準信號會丟失,所以標準信號也叫做不可靠信號,由于標準信號是用bit flag實現的,所以標準信號也叫做標記信號(flag signal)。實時信號與非實時信號:非實時信號一般指編號在 1 到 31 之間的信號,不支持排隊,處理時沒有嚴格的順序保證,且如果在處理某個信號時有相同類型的新信號到達,后者可能會被忽略或丟失,所以也被稱為不可靠信號。
static inline struct task_struct *__pick_next_task(struct rq *rq, struct task_struct *prev, struct rq_flags *rf){static __always_inline struct rq *context_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next, struct rq_flags *rf){static __always_inline struct rq *context_switch(struct rq *rq, struct task_struct *curr, struct task_struct *next, struct rq_flags *rf){
突破網絡性能極限:深入理解DPDK.這里給大家推薦零聲教育全網獨家的【DPDK網絡存儲虛擬化開發】課程體系,通過32個項目案例,2W+行手寫代碼,全面解析4個dpdk技術方向:1、DPDK網絡專欄。dpdk-tcp.dpdk-kni.dpdk- bpf源碼流程。dpdk-ddos熵計算源碼。(1)DPDK的虛擬交換機框架OvS.ovs-vswitchd與dpdk的關系。TRex與dpdk.對網絡原理、dpdk、高性能網絡開發的在職工程師;工作中從事dpdk/vpp/ovs等開發的工程師;DPDK開發工程師。
Linux低內存處理機制:解決內存不足問題的實例分析。其目的是將內存中的零散空閑頁面整理成連續的大塊空閑內存,以滿足一些對連續內存有要求的內存分配請求,例如分配大頁內存或者為某些特定的硬件設備分配連續的內存緩沖區。內存耗盡且無法滿足新的內存請求:當系統可用內存已經非常低,甚至連內核自身的關鍵內存操作都無法完成,同時又有新的進程請求內存或者當前運行的進程需要更多內存時,OOM - kill 機制就可能被觸發。
// 規則表入口的數量unsigned int size; // 新的規則表的總大小/* Hook entry points. */// 表所監聽HOOK 的規則入口, 是對于entries[ ]的偏移unsigned int hook_entry[NF_IP_NUMHOOKS];unsigned int underflow[NF_IP_NUMHOOKS]; // 規則表的最大下界 // 舊的計數器數目,即當前的舊entries 的數目unsigned int num_counters;struct ipt_counters *counters; // 舊的計數器struct ipt_entry entries[0]; // 規則表入口};
1.1CMake教程。包括(CMAKEPACKAGECONFIGHELPERS)#生成包含Exports配置文件的配置文件 }/mathfunctionsconfig.cmake "INSTALL_DESTINATION "lib/cmake/example" NO_SET_AND_CHECK_MACRO NO_CHECK_REQUIRED_COMPONENTS_MACRO ) # 生成配置文件的版本文件write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake" VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VER SION_MINOR}”
//buffer中空的長度 len = min(len, fifo->size - fifo->in + fifo->out); // 內存屏障:smp_mb(),smp_rmb(), smp_wmb()來保證對方觀察到的內存操作順序 smp_mb(); // 將數據追加到隊列尾部 l = min(len, fifo->size - (fifo->in &(fifo->size - 1))); memcpy(fifo->buffer + (fifo->in &(fifo->size - 1)), buffer, l); memcpy(fifo->buffer, buffer + l, len - l);kfifo->in % kfifo->size轉化為 kfifo->in &(kfifo->size – 1)
當CPU試圖從主存中加載/存儲數據的時候,CPU會首先從cache中查找對應地址的數據是否緩存在cache中,如果數據緩存在cache中,那么直接從cache中拿到數據并返回給CPU。在 L1 cache 后面連接 L2 cache,在 L2 cache 和主存之間連接 L3 cache。與 inclusive cache 對應的是 exclusive cache,這種 cache 保證某一地址的數據緩存只會存在于多級 cache 的其中一級,也就是說任意地址的數據不可能同時在 L1 和 L2 cache 中。
60個GitHub上c/c++學習項目推薦,拎幾個出來寫進簡歷(強烈推薦收藏!)難度:初級(這個初級難度的 Snake 項目適合已經熟悉 C++ 基本語法的初學者,他們可以通過這個項目來提升自己的編程實踐能力,將所學的知識運用到實際的游戲開發中,并且進一步理解程序的邏輯構建和簡單的交互設計。)項目鏈接:https://github.com/arduino/Arduino.項目鏈接:https://github.com/Kalutu/cpp-projects-for-everybody.
pthread_join等待線程結束:pthread_join函數用于等待一個指定的線程結束。pthread_exit顯式退出線程:pthread_exit函數用于當前運行的線程運行時退出,并且pthread_exit的參數作為返回值提供給pthread_join函數獲取。設置和獲取優先級通過 pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param) 和 pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param) 函數。
//是否在運行隊列上int on_rq;//優先級int prio;int static_prio;int normal_prio;unsigned int rt_priority;//調度器類const struct sched_class *sched_class;//調度實體struct sched_entity se;struct sched_rt_entity rt;struct sched_dl_entity dl;//調度策略unsigned int policy;//可以使用哪些CPUint nr_cpus_allowed;cpumask_t cpus_allowed;struct sched_info sched_info;struct thread_info { struct task_struct *task;
perf-top.root@ubuntu-test:~# perf stat -e raw_syscalls:sys_enter lsbin libexec off perf.data.old t1 t3 tutong.isobwtest minicom.log perf.data pktgen t1.c t3.c.利用 perf top 和 perf record 命令可以收集函數級別的性能數據,確定哪些函數是性能瓶頸所在。-g 選項是告訴perf record額外記錄函數的調用關系 -e cpu-clock 指perf record監控的指標為cpu周期 -p 指定需要record的進程pid.perf -i perf.data &>perf.unfold.
存儲 CPU 拓撲結構:通過store_cpu_topology函數,在每個 core 初始化的時候,將探測到的 CPU 拓撲結構信息填充到本 CPU 的cpu_topology變量中。更新系統全局視圖:將每個 CPU 核心的拓撲結構信息匯總,更新整個系統的 CPU 拓撲結構視圖。cpu_num=$(basename $cpu) core_id=$(cat $cpu/topology/core_id) package_id=$(cat $cpu/topology/package_id) echo "CPU $cpu_num - Core ID: $core_id, Package ID: $package_id"done.
⑵匯編語言中 mkdir 函數系統調用入參。使用 syscall 指令調用操作系統的函數時,不是像 call 指令那樣直接將被調函數的地址放到指令后,而是將相應函數的序號寫入 rax 寄存器,CPU 在執行 syscall 指令時通過讀取 rax 寄存器的值就能知道到底該調用操作系統中的哪個函數了。一般每個系統調用對應一個系統調用的封裝例程,函數庫再用這些封裝例程定義出給程序員調用的 API,這樣把系統調用終封裝成方便程序員使用的 C 庫函數。
另外,如果有一個 CPU 密集型進程和多個 I/O 密集型進程,可能會出現 CPU 密集型進程占用 CPU 時,所有 I/O 密集型進程在就緒隊列中等待,而當 CPU 密集型進程完成后又回到就緒隊列繼續分配到 CPU,導致 I/O 密集型進程長時間等待的情況。⑶優先級調度算法。當一個高優先級進程等待一個低優先級進程持有的資源時,低優先級進程將暫時獲得高優先級進程的優先級別,在釋放共享資源后,低優先級進程回到原來的優先級別。
深入理解Linux內核:進程調度機制原理。進程列表:按照默認排序(通常是CPU使用率或優先級)列出正在運行的進程及其相關信息,如PID、USER(執行進程的用戶)、PR(優先級)、NI(nice值,影響優先級)、VIRT(虛擬內存大小)、RES(常駐內存大小)、%CPU和%MEM(CPU和內存使用百分比)等。限期進程的優先級比實時進程要高,實時進程的優先級比普通進程要高下表就是描述了不同進程對應的優先級成員的變化:2.5進程調度的重要性。
如果新的內存空間申請成功,則會將ptr所指向的內存中的內容拷貝到新的內存空間中,ptr所指向的內存會被釋放,返回新的內存地址;同時,使用 free()釋放堆內存時,若要釋放的內存不在堆頂,則內核不會立即釋放內存,而是進行內存回收,標記這部分內存為空閑,也不會取消已經建立好的內存映射。用戶程序調用 malloc 函數從內存池申請內存時,如果內存池中有空閑的 chunk,則從空閑的 chunk 返回給用戶程序;
無論是傳統的IO拷貝方式還是引入了零拷貝,2次DMA Copy都是少不了的,因為兩次DMA都是依賴硬件完成的,下面從CPU拷貝次數,DMA拷貝次數,以及系統調用幾個方面總結上述io拷貝的差別:2.2零拷貝的實現方式。首先,數據從磁盤讀取到內核緩沖區,然后從內核緩沖區拷貝到用戶空間緩沖區,接著當要通過網絡發送時,又要從用戶空間緩沖區拷貝到內核的 socket 緩沖區,最后從內核 socket 緩沖區發送到網絡。
= NULL) {(gdb) p server.port$1 = 6379(gdb) p server.ipfd$2 = {0 <repeats 16 times>}(gdb) p server.ipfd_count $3 = 0.(gdb) info argseventLoop = 0x7ffff08350a0flags = 11(gdb)0x00007ffff71e2483 in epoll_wait () from /lib64/libc.so.6(gdb) display $ebx1: $ebx = 7988560(gdb) display /x $ebx2: /x $ebx = 0x79e550(gdb) display $eax3: $eax = -4(gdb) b mainBreakpoint 8 at 0x4201f0: file server.c, line 4003.
自動緩存文件數據:當文件通過內存映射被映射到內存空間后,操作系統會自動將文件數據緩存起來。# 打開文件并獲取文件大小fd = os.open("large_file.txt", os.O_RDWR)file_size = os.fstat(fd).st_size# 內存映射文件mmapped_file = mmap.mmap(fd, file_size, mmap.MAP_SHARED, mmap.PROT_READ | mmap.PROT_WRITE)# 像操作內存一樣操作文件內容mmapped_file[0:10] = b''''''''New Data''''''''mmapped_file.close()os.close(fd)