【专栏必读】王道考研408操作系统+Linux系统编程万字笔记、题目题型总结、注意事项、目录导航和思维导图
其他科目導航
-
【專欄必讀】王道考研408計算機組成原理萬字筆記(從學生角度輔助大家理解):各章節導航及思維導圖
-
【專欄必讀】王道考研408數據結構萬字筆記(有了它不需要你再做筆記了):各章節內容概述導航和思維導圖
-
【專欄必讀】王道考研408計算機網絡+網絡編程萬字筆記、題目題型總結、注意事項、目錄導航和思維導圖
-
C++學習
-
【免費分享】軟件工程核心知識點
-
【免費分享】數據庫系統概論(王珊 第五版)知識點
視頻介紹
408(計組+操作系統+數據結構+計網)王道計算機考研專欄萬字筆記-祝您考研上岸
首先感謝王道大大(手動比心),很用心在做了,筆記會按照如下方式、特點記錄,大家可以看看,介紹在后面
- (王道408考研操作系統)第二章進程管理-第一節3:進程控制(配合Linux講解)
- (王道408考研操作系統)第二章進程管理-第二節3:調度算法詳解2(RR、HPF和MFQ)
文章目錄
- 一:必讀
- 二:關于本專欄及學習建議
- 三:408所需C語言基礎
- (1)C語言基礎知識點
- (2)C語言重點、難點、考點整理
- 四:文章目錄導航
- 第一章:計算機系統概述、
- 第一節:操作系統的基本概念
- 第二節:操作系統的發展歷程
- 第三節: 操作系統運行環境
- 第四節:操作系統結構
- 第五、六節:操作系統引導和虛擬機
- 第二章:進程管理
- 第一節:進程與線程
- 第二節:進程調度、分類及其調度算法等
- 第三節:進程同步和互斥、信號量及經典進程同步問題等
- 第四節:死鎖和避免死鎖等
- 第三章:內存管理
- 第一節:內存基本知識、分配管理方式等
- 第二節:虛擬內存、請求分頁及頁面置換算法等
- 第四章:文件管理
- 第一節:文件基本概念、目錄、物理結構、邏輯結構、共享和安全等
- 第二節:磁盤結構、磁盤調度算法等
- 第五章:輸入/輸出(I/O)管理
- 五:《Linux系統編程》附加專欄說明
- (1)第一部分:博客文章導航
- (2)第二部分:涉及的系統調用命令總結
- A:進程部分
- B:基礎IO部分
- C:進程間通信部分
- D:進程信號部分
- E:多線程部分
- (3)第三部分:重要代碼
一:必讀
①:《計算機科學專業基礎綜合》(代碼408) 想必每位計算機考研人都有所了解,雖然可能所考院校是自命題,但總會涉及408中的一種或多種。408會涉及如下4門課,它們各有特點
- 《計算機組成原理》(占30%):涉及硬件等底層知識、部分知識晦澀難懂
- 《操作系統》(占23.3%):計算機中的“哲學”,內容特別抽象,感覺“學了等于沒學”
- 《數據結構》(占30%):最重要的一門課,邏輯性強,較為抽象,常和算法有關
- 《計算機網絡》(占16.7%):關聯知識較多(例如通信),所以知識點“又臭又長”
所以408難度確實不小,在180分鐘內做完一套試卷猶如進行了一場戰斗。而且最為關鍵的是考計算機一定會考數學,數學的復習幾乎會占據你考研復習時間的一半(甚至更多),因為“得數學者得天下”
②:對于408的復習,市面上的授課機構主要是王道和天勤,它們兩家真的都非常非常好,我都細心看過
- 王道:知識點涵蓋全面、講解仔細
- 天勤:講解角度獨特,動畫制作精美,關鍵問題容易理解
而王道也把人家的課程全部上傳至了B站,所以專欄筆記主體會基于王道進行,所以這里真的特別特別感謝王道
- 《王道-計算機組成原理》
- 《王道-操作系統》
- 《王道-數據結構》
- 《王道-計算機網絡》
③:只有考研人才能懂考研人,所以我深知復習408的痛苦。面對海量的知識點你會感覺力不從心,尤其在前期,總是學了這一章忘了上一章,而且很多時候不同科目的知識經常攪到一起。因此,我花費了很長時間寫了這些專欄筆記以幫助大家考研復習,有以下特點
-
專欄筆記會按照視頻課和課本的邏輯進行記錄,會把老師課上所講內容和課本進行結合,同時輔助一些自己在工作、學習中的想法
-
說個實話,視頻課中的內容是有點“亂”的,因為老師在講課時是需要按照他的思路來進行的,所以我的目的就是要讓其系統性(也即你會知道每一節究竟在干什么),便于同學查閱;同時有些知識點晦澀難懂,我會加入自己的理解便于大家學習
-
所有筆記純手打(課本+老師說的話+自己的理解),并不是視頻課截圖(當然有些圖片肯定還是會采用截圖)
-
所有筆記會嚴格控制格式(主要就是公式和配色),力爭做到清晰、簡潔、整齊
-
部分科目會配有題型講解,大家可以在我主頁處找到,這一部分還在更新
④:專欄會一直更新,主要是糾錯和補充知識點
⑤:希望大家能夠意識到學習這四門課并不是簡簡單單為了考研,只要你真心想要走計算機這條道路,它就是你的基本功
- 就拿離你們最近的校招來說,其實70%的內容都是這些
⑥:“道阻且長、行則將至”,大家加油吧!
二:關于本專欄及學習建議
-
王道操作系統思維導圖鏈接:sxky
-
標題是按照視頻課走的,可能有些部分存在差異,因為部分視頻課內容太少,不值得單獨做一篇文章
-
所用教材為 《2023年操作系統考研復習指導》
-
筆記主要以王道視頻為主,少量會補充 《操作系統精髓與設計原理(第八版)》 中的內容。建議大家有時間可以讀一讀,十分經典
-
筆記是學好的必要條件,但不是充分條件
-
記筆記的目的不是單純的為了“記”,是為了以后復習時不需要太大的時間成本
-
學習一門課就像開發一個程序一樣,先搭框架,后解決細節問題。前期需要迅速建立一門學科的整體框架與邏輯,不會的可以直接跳,學完之后需要反復梳理
三:408所需C語言基礎
(1)C語言基礎知識點
第一章:C語言快速入門及注意事項
第二章:字符串函數和內存函數
第三章:函數與遞歸
第四章:數組入門
第五章:操作符
第六章:指針入門
第七章:結構體相關
第八章:簡單調試
第九章:指針進階
第十章:分支與循環
(2)C語言重點、難點、考點整理
第一章:數據類型、常量和變量
第二章:C語言文件
第三章:C語言內存管理
第四章:C語言指針
第五章:C語言預處理
第六章:C語言中的重要符號
第七章:關鍵字精講
四:文章目錄導航
第一章:計算機系統概述、
第一節:操作系統的基本概念
(王道408考研操作系統)第一章計算機系統概述-第一節1、2:操作系統概念、概念和特征
第二節:操作系統的發展歷程
(王道408考研操作系統)第一章計算機系統概述-第二節:操作系統的發展歷程
第三節: 操作系統運行環境
(王道408考研操作系統)第一章計算機系統概述-第三節1:操作系統的運行機制與體系結構
(王道408考研操作系統)第一章計算機系統概述-第三節2:中斷和異常
(王道408考研操作系統)第一章計算機系統概述-第三節3:系統調用
第四節:操作系統結構
(王道408考研操作系統)第一章計算機系統概述-第四節:操作系統體系結構
第五、六節:操作系統引導和虛擬機
(王道408考研操作系統)第一章計算機系統概述-第五節:操作系統引導
第二章:進程管理
第一節:進程與線程
((王道408考研操作系統)第二章進程管理-第一節1:進程的概念、組成和特征
(王道408考研操作系統)第二章進程管理-第一節2:進程狀態與轉換
(王道408考研操作系統)第二章進程管理-第一節3:進程控制(配合Linux講解)
(王道408考研操作系統)第二章進程管理-第一節4:進程通信(配合Linux)
(王道408考研操作系統)第二章進程管理-第一節5:線程的概念
(王道408考研操作系統)第二章進程管理-第一節6、7:線程的實現方式、多線程模型、線程的狀態與轉換、線程的組織與控制
第二節:進程調度、分類及其調度算法等
(王道408考研操作系統)第二章進程管理-第二節1:調度的基本概念和層次
(王道408考研操作系統)第二章進程管理-第二節2、3:進程調度的時機、切換與過程、方式、調度器和閑逛進程
(王道408考研操作系統)第二章進程管理-第二節4:調度算法評價指標
(王道408考研操作系統)第二章進程管理-第二節5:調度算法詳解1(FCFS、SJF和HRRN)
(王道408考研操作系統)第二章進程管理-第二節6、7:調度算法詳解2(RR、HPF和MFQ)
第三節:進程同步和互斥、信號量及經典進程同步問題等
(王道408考研操作系統)第二章進程管理-第三節1:進程同步與互斥的基本概念
(王道408考研操作系統)第二章進程管理-第三節2:實現進程互斥的軟件方法
(王道408考研操作系統)第二章進程管理-第三節3:實現進程互斥的硬件方法
(王道408考研操作系統)第二章進程管理-第三節4:信號量機制(整型、記錄型信號量和P、V操作)
(王道408考研操作系統)第二章進程管理-第三節5:用信號量實現進程互斥、同步和前驅關系
(王道408考研操作系統)第二章進程管理-第三節6:經典同步問題之生產者與消費者問題
(王道408考研操作系統)第二章進程管理-第三節7:經典同步問題之多生產者與多消費者問題
(王道408考研操作系統)第二章進程管理-第三節8:經典同步問題之吸煙者問題
(王道408考研操作系統)第二章進程管理-第三節9:經典同步問題之讀者寫者問題
(王道408考研操作系統)第二章進程管理-第三節10:經典同步問題之哲學家進餐問題
(王道408考研操作系統)第二章進程管理-第三節11:管程(Monitor)及條件變量
第四節:死鎖和避免死鎖等
(王道408考研操作系統)第二章進程管理-第四節1:死鎖相關概念
(王道408考研操作系統)第二章進程管理-第四節2:死鎖處理策略之預防死鎖
(王道408考研操作系統)第二章進程管理-第四節2:死鎖處理策略之避免死鎖(銀行家算法)
(王道408考研操作系統)第二章進程管理-第四節3:死鎖處理策略之檢測和解除
第三章:內存管理
第一節:內存基本知識、分配管理方式等
(王道408考研操作系統)第三章內存管理-第一節1:內存基礎知識、程序編譯運行原理
(王道408考研操作系統)第三章內存管理-第一節2:內存管理的基本概念
(王道408考研操作系統)第三章內存管理-第一節3:覆蓋與交換
(王道408考研操作系統)第三章內存管理-第一節4:連續分配管理方式(單一連續、固定分區和動態分區分配)
(王道408考研操作系統)第三章內存管理-第一節5:動態分區分配算法(首次適應、和鄰近適應)
(王道408考研操作系統)第三章內存管理-第一節6-1:非連續分配管理方式之基本分頁存儲管理
(王道408考研操作系統)第三章內存管理-第一節6-2:非連續分配管理方式之基本分頁存儲管理之基本地址變換機構
(王道408考研操作系統)第三章內存管理-第一節6-3:非連續分配管理方式之基本分頁存儲管理之具有快表的地址變換機構
(王道408考研操作系統)第三章內存管理-第一節6-4:非連續分配管理方式之基本分頁存儲管理之兩級頁表
(王道408考研操作系統)第三章內存管理-第一節7:非連續分配管理方式之基本分段管理方式
(王道408考研操作系統)第三章內存管理-第一節8:非連續分配管理方式之段頁式管理方式
第二節:虛擬內存、請求分頁及頁面置換算法等
(王道408考研操作系統)第三章內存管理-第二節1:虛擬內存管理基本概念
(王道408考研操作系統)第三章內存管理-第二節2:請求分頁管理方式
(王道408考研操作系統)第三章內存管理-第二節3:頁面置換算法1
(王道408考研操作系統)第三章內存管理-第二節3:頁面置換算法2
(王道408考研操作系統)第三章內存管理-第二節4:頁面分配策略
第四章:文件管理
第一節:文件基本概念、目錄、物理結構、邏輯結構、共享和安全等
(王道408考研操作系統)第四章文件管理-第一節1:文件管理初識
(王道408考研操作系統)第四章文件管理-第一節2:文件的邏輯結構
(王道408考研操作系統)第四章文件管理-第一節3:文件目錄
(王道408考研操作系統)第四章文件管理-第一節4:文件物理結構(文件分配方式)
(王道408考研操作系統)第四章文件管理-第一節5:文件存儲空間管理
(王道408考研操作系統)第四章文件管理-第一節6:文件基本操作
(王道408考研操作系統)第四章文件管理-第一節7:文件共享
(王道408考研操作系統)第四章文件管理-第一節8:文件保護
(王道408考研操作系統)第四章文件管理-第一節9:文件系統的層次結構
第二節:磁盤結構、磁盤調度算法等
(王道408考研操作系統)第四章文件管理-第二節1:磁盤的結構
(王道408考研操作系統)第四章文件管理-第二節2:磁盤調度算法
(王道408考研操作系統)第四章文件管理-第二節3:減少延遲時間的方法
(王道408考研操作系統)第四章文件管理-第二節4:磁盤的管理
第五章:輸入/輸出(I/O)管理
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節1:I/O設備的概念和分類
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節2:I/O控制器
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節3:I/O控制方式
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節4:I/O軟件層次結構
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節5:假脫機(SPOOLing)技術
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節6:設備的分配和回收
(王道408考研操作系統)第五章輸入/輸出(I/O)管理-第一節7:緩沖區管理
五:《Linux系統編程》附加專欄說明
用“哲學”來比喻操作系統我覺得再合適不過了。操作系統就是這樣,你感覺你懂了其實你沒有懂,你沒有懂但是你又明白一點。所以想要落實唯一的一個方法就是實踐、實踐、實踐。我們所學的操作系統并沒有針對某個特定的操作系統,這里我選擇的是Linux進行演示,因為它真的很直觀
- 所選用Linux系統為Centos 8.0
- Linux中的常用命令可以查看這篇專欄《Linux命令行大全》
(1)第一部分:博客文章導航
Linux系統編程1:Linux中使用率最高的一些命令
Linux系統編程2:詳解Linux中的權限問題
Linux系統編程3:基礎篇之詳解Linux軟件包管理器yum
Linux系統編程4:入門篇之最強編輯器vim的使用攻略
Linux系統編程5:Linux系統編程5:入門篇之在Linux下觀察C/C++程序編譯過程 && gcc/g++使用詳解
Linux系統編程7:入門篇之Linux項目自動化構建工具-Make/Makefile的超強使用指南
Linux系統編程9:進程入門之操作系統為什么這么重要以及它是如何實現管理的
Linux系統編程10:進程入門之系統編程中最重要的概念之進程&&進程的相關操作&&使用fork創建進程
Linux系統編程11:進程入門之詳細闡述進程的一些狀態&&區分僵尸狀態和孤兒狀態&&動圖演示
Linux系統編程12:進程入門之進程的優先級及PR和NI&&如何修改進程優先級
Linux系統編程13:進程入門之Linux中的環境變量的概念及其相關命令(export;env等)&&main函數的參數
Linux系統編程14:進程入門之Linux進程中非常重要的概念之進程地址空間-原來我們看到的地址全部是虛擬的
Linux系統編程15:進程控制之如何創建進程和寫時拷貝技術
Linux系統編程16:進程控制之進程終止以及終止進程的三種情況
Linux系統編程17:進程控制之進程等待&&為什么進程需要被等待&wait方法和waitpid方法&&阻塞和非阻塞等待
Linux系統編程18:超詳解進程程序替換&exec函數的一些用法
Linux系統編程19:基礎IO之了解Linux中的標準輸入和輸出以及相關的系統調用接口(如write,read等)
Linux系統編程20:基礎IO之從內核代碼深刻理解Linux是如何管理文件及文件描述符的本質是什么
Linux系統編程21:基礎IO之全緩沖和行緩沖的區別及深刻理解緩沖區及其作用
Linux系統編程22:基礎IO之掌握重定向的本質和使用dup2完成重定向
Linux系統編程23:基礎IO之了解硬盤物理和邏輯結構及明白inode的本質和掌握軟硬鏈接及其區別
Linux系統編程24:基礎IO之在Linux下深刻理解C語言中的動靜態庫以及頭文件和庫的關系
Linux系統編程25:基礎IO之親自實現一個動靜態庫
Linux系統編程26:進程間通信之進程間通信的基本概念
Linux系統編程27:進程間通信之管道的基本概念和匿名管道與命名管道及管道特性
Linux系統編程28:進程間通信之共享內存和相關通信接口(ftok,shmget,shmctl,shmat,shmdt)
Linux系統編程29:進程信號之什么是信號及signal函數
Linux系統編程30:進程信號之產生信號的四種方式(Core Dump,kill,raise)
Linux系統編程31:進程信號之什么是信號的阻塞及相關術語(遞達,未決,pending位圖,handler位圖)
Linux系統編程32:進程信號之詳解信號集操作函數(sigset_t ,sigpending,sigprocmask)
Linux系統編程33:進程信號之詳解信號的捕捉過程,用戶態和內核態及其切換,sigaction和signal
Linux系統編程34:進程信號之可重入函數,volatile關鍵字的作用和SIGHLD
Linux系統編程35:多線程之如何理解Linux中的線程以及輕量級進程LWP
Linux系統編程36:多線程之線程控制之pthread線程庫(線程創建,終止,等待和分離)
Linux系統編程37:多線程之什么是臨界區和臨界資源以及如何使用mutex互斥鎖
Linux系統編程38:多線程之什么是線程同步以及條件變量函數
Linux系統編程39:多線程之基于阻塞隊列生產者與消費者模型
Linux系統編程40:多線程之基于環形隊列的生產者與消費者模型
Linux系統編程41:多線程之線程池的概念及實現
(2)第二部分:涉及的系統調用命令總結
A:進程部分
B:基礎IO部分
C:進程間通信部分
D:進程信號部分
E:多線程部分
(3)第三部分:重要代碼
1:理解fork的作用
#include <stdio.h> #include <unistd.h>int main() {prinf("還沒有執行fork函數的本進程為:%d\n",getpid());pid_t=fork();//其返回值是pid類型的sleep(1);if(ret>0)//父進程返回的是子進程ID{while(1){printf("----------------------------------------------------------------\n");printf("我是父進程,我的id是:%d,我的孩子id是%d\n",getpid(),ret);sleep(1);}}else if(ret==0)//子進程fork返回值是0{while(1){printf("我是子進程,我的id是%d,我的父親id是%d\n",getpid(),getppid());sleep(1);}}elseprintf("進程創建失敗\n");sleep(1);return 0; }2:理解僵尸狀態
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() {// printf("還沒執行fork函數時的本進程為:%d\n",getpid());pid_t ret=fork();//其返回值類型是pid_t型的sleep(1);if(ret>0)//父進程返回的是子進程ID{while(1){printf("----------------------------------------------------\n");printf("父進程一直在運行\n");sleep(1);}}else if(ret==0)//子進程fork返回是0{int count=0;while(count<=10){printf("子進程已經運行了%d秒\n",count+=1);sleep(1);}exit(0);//讓子進程運行10s}elseprintf("進程創建失敗\n");sleep(1);return 0; }3:理解進程等待及waitpid第二個參數
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() {pid_t ret=fork();//其返回值類型是pid_t型的sleep(1);if(ret>0)//父進程返回的是子進程ID{printf("父進程正在等待子進程死亡\n");int st=0;pid_t rec=waitpid(ret,&st,0);//阻塞if(rec==ret)//如果返回值是子進程id,等待成功{printf("等待成功\n");if(WIFEXITED(st))//如果為真,正常退出{printf("正常退出且退出碼為%d\n",WEXITSTATUS(st));}else{printf("異常退出,信號值為%d\n",st&0x7f);}}else{printf("等待失敗\n");exit(0);}}else if(ret==0)//子進程fork返回是0{int count=1;while(count<=10){printf("子進程[%d]已經運行了%d秒\n",getpid(),count);count++;sleep(1);}exit(3);}elseprintf("進程創建失敗\n");sleep(1);return 0; }4:理解進程程序替換
//myprocess.c #include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() {int count=0;while(count<5){printf("Hello World\n");sleep(1);count++;}printf("%s\n",getenv("myenv"));return 0; }//test.c #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() {char* env[]={"myenv=you_can_see_this_env",NULL};printf("替換函數前\n");execle("./myprocess.exe","myprocess.exe",NULL,env);printf("替換函數后\n");}5:理解文件描述符
#include <fcntl.h> #include <unistd.h> #include <stdio.h>int main() {int fd1=open("log1.txt",O_WRONLY);//打開錯誤int fd2=open("log2.txt",O_WRONLY|O_CREAT);//打開成功int fd3=open("log3.txt",O_WRONLY|O_CREAT);//打開成功int fd4=open("log4.txt",O_WRONLY|O_CREAT);//打開成功int fd5=open("log5.txt",O_WRONLY);//打開錯誤printf("%d\n",fd1);printf("%d\n",fd2);printf("%d\n",fd3);printf("%d\n",fd4);printf("%d\n",fd5); }6:理解匿名管道
#include <fcntl.h> #include <unistd.h> #include <stdio.h> #include <string.h>int main() {int pipefd[2]={0};pipe(pipefd);pid_t id=fork();if(id==0)//child{close(pipefd[0]);const char* msg="This is the data that the child process wrote";while(1){write(pipefd[1],msg,strlen(msg));sleep(1);} }else//father{close(pipefd[1]);char buffer[64];while(1){ssize_t ret=read(pipefd[0],buffer,sizeof(buffer)-1);if(ret>0)//判斷是否讀到{buffer[ret]='\0';//加上結束標志,便于輸出printf("The father process got the information:%s\n",buffer);}}}return 0; }7:理解命名管道
server.c
client.c
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int main() {int fd=open("fifo",O_WRONLY);//直接打開管道文件if(fd>=0){ char buffer[64];//從鍵盤讀入數據到這個緩沖區while(1){ printf("客戶端-請輸入消息:");ssize_t ret=read(0,buffer,sizeof(buffer)-1);//從鍵盤讀入數據if(ret>0){ buffer[ret]='\0';write(fd,buffer,ret);//讀入ret個數據就向管道中寫入ret個數據}}} }8:理解共享內存
server.c
client.c
#include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <unistd.h> #include <sys/shm.h>#define PATHNAME "tmp" #define PROJ_ID 88 #define SIZE 4096int main() {key_t k=ftok(PATHNAME,PROJ_ID);printf("key值:%#X\n",k);int shmid=shmget(k,SIZE,0);//服務端已經申請了,寫成0直接獲取if(shmid<0){perror("creat failed");return 1;}char* shmaddr=shmat(shmid,NULL,0);//掛接,注意強轉int i=0;while(i<26){shmaddr[i]=97+i;每隔5s依次輸入a,b,c...........................i++;sleep(5);}shmdt(shmaddr);//脫離return 0; }9:理解signal函數
#include <stdio.h> #include <unistd.h> #include <signal.h>void handler(int sig) {printf("catch a sin : %d\n",sig);}int main() {signal(2,handler);//一旦捕捉到2號信號,將會執行handler函數內的操作while(1){printf("I Am runnng now...\n");sleep(1);}return 0;}10:理解信號集操作函數
#include <stdio.h> #include <unistd.h> #include <signal.h>void handler(int sig) {printf("獲得信號:%d\n",sig);}void print_pending(sigset_t* pending) {int i=1;for(i=1;i<=31;i++){if(sigismember(pending,i)){printf("1");//只要i信號存在,就打印1}else {printf("0");//不存在這個信號就打印0}}printf("\n"); }int main() {signal(2,handler);//捕捉sigset_t pending;//定義信號集變量sigset_t block,oblock;//定義阻塞信號集變量sigemptyset(&block);sigemptyset(&oblock);//初始化阻塞信號集sigaddset(&block,2);//將2號信號添加的信號集sigprocmask(SIG_SETMASK,&block,&oblock);//設置屏蔽關鍵字int cout=0; while(1){sigemptyset(&pending);//初始化信號集sigpending(&pending);//讀取未決信號集,傳入pendingprint_pending(&pending);//定義一個函數,打印未決信號集sleep(1);cout++;if(cout==10)//10s后解除阻塞{printf("解除阻塞\n");sigprocmask(SIG_SETMASK,&oblock,NULL);}} }11:理解線程的創建,等待等
#include <stdio.h> #include <unistd.h> #include <pthread.h>void* new_thread(void* arg) {while(1){printf("我是新線程,我的線程id是%p\n",pthread_self());sleep(5);int a=1/0; //浮點異常} }int main() {pthread_t tid;//線程的IDpthread_create(&tid,NULL,new_thread,(void*)"我是新線程");while(1){ printf("-----------------------------------------------------------\n");printf("我是主線程,我的線程id是:%p,新線程的id是%p\n",pthread_self(),tid);void* ret;//獲取退出碼pthread_join(tid,&ret);printf("主線程阻塞等待新線程,退出碼碼為%d\n",(int)ret);break;}}12:理解互斥鎖
#include <stdio.h> #include <unistd.h> #include <pthread.h>int tickets=1000;pthread_mutex_t lock;//申請一把鎖void scarmble_tickets(void* arg) {long int ID=(long int)arg;//線程IDwhile(1)//多個線程循環搶票{pthread_mutex_lock(&lock);//那個線程先到,誰就先鎖定資源if(tickets>0){usleep(1000);printf("線程%ld號搶到了一張票,現在還有%d張票\n",ID,tickets);tickets--;pthread_mutex_unlock(&lock);//搶到票就解放資源}else {pthread_mutex_unlock(&lock);//如果沒有搶到也要釋放資源,否則線程直接退出,其他線程無法加鎖break;}}}int main() {int i=0;pthread_t tid[4];//4個線程IDpthread_mutex_init(&lock,NULL);//初始化鎖for(i=0;i<4;i++){pthread_create(tid+1,NULL,scarmble_tickets,(void*)i);//創建4個線程}for(i=0;i<4;i++){pthread_join(tid+1,NULL);//線程等待}pthread_mutex_destroy(&lock);//銷毀鎖資源return 0; }13:理解條件變量
#include <stdio.h> #include <unistd.h> #include <pthread.h> #include <stdlib.h>pthread_mutex_t lock;//鎖 pthread_cond_t cond;//條件void* thread_a(void* arg)//其他線程被喚醒 {const char* name=(char*)arg;//線程名字while(1){pthread_cond_wait(&cond,&lock);//一直在等待條件成熟printf("%s被喚醒了\n=================================================\n",name);}}void* thread_1(void* arg)//讓線程1喚醒其他線程 {const char* name=(char*)arg;while(1){sleep(rand()%5+1);//隨機1-5秒喚醒pthread_cond_signal(&cond);printf("%s現在正在發送信號\n",name);}}int main() {pthread_mutex_init(&lock,NULL);//初始化鎖pthread_cond_init(&cond,NULL);//初始化條件pthread_t t1,t2,t3,t4,t5;//創建兩個線程pthread_create(&t1,NULL,thread_1,(void*)"線程1"); pthread_create(&t2,NULL,thread_a,(void*)"線程2"); pthread_create(&t3,NULL,thread_a,(void*)"線程3"); pthread_create(&t4,NULL,thread_a,(void*)"線程4"); pthread_create(&t5,NULL,thread_a,(void*)"線程5"); pthread_join(t1,NULL);pthread_join(t2,NULL);pthread_join(t3,NULL);pthread_join(t4,NULL);pthread_join(t5,NULL);pthread_mutex_destroy(&lock);pthread_cond_destroy(&cond);//銷毀條件}總結
以上是生活随笔為你收集整理的【专栏必读】王道考研408操作系统+Linux系统编程万字笔记、题目题型总结、注意事项、目录导航和思维导图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信公众号开发 重要 access_to
- 下一篇: Linux系统的远程登录