教材第三四章讀書筆記
教材第三四章讀書筆記
by 20201321 周慧琳
學習目標
-
第三章:Unix/Linux進程管理
第三章的主要涉及Unix/Linux中的進程管理,多任務處理原則,進程概念,解釋了Unix/Linux中各進程的來源,包括初始進程、INIT進程、守護進程、登錄進程、登錄進程以及可供用戶執行命令的sh進程。對進程的執行模式進行了講解,描述了用于進程管理的Linux/Unix系統調用,闡明了父進程與子進程的關系,解釋了I/O重定向和管道的原則和方法。
第三章還有需要完成的實踐任務,如系統調用命令:fork、wait、exec、exit的掌握,通過exec更改進程執行映像等。
-
第四章:并發編程
第四章論述了并發編程,介紹了并行計算的概念,比較了并行算法和順序算法,解釋了線程的原理及其相對于進程的優勢。解釋了死鎖問題,討論了信號量。需要實踐的項目是實現用戶級線程,可通過該項目實現線程同步的線程連接、互斥量和信號量。
知識圖譜的歸納
對于第三、四章繁瑣的知識點,利用xmind工具制作了一個知識圖譜來強化知識理解

學習收獲和心得
第三四章主要在討論進程和線程,在學習過程中也出現了許多難以理解的詞匯,需要積累下來明白各個概念的共性與區別。
執行映像:包含執行代碼、數據和堆棧的存儲區
任務和進程可以互換使用
進程:進程是對映像的執行
系統資源包括:內存空間、I/O設備、CPU時間
PROC結構體:用來表示進程的數據結構

MT:多任務處理系統的簡稱
進程同步:一個操作系統包含許多并發進程,這些進程可以彼此交互。進程同步是指控制和協調進程交互以確保其正確執行所需的各項規則和機制。
進程終止:第2章已經提到,進程死亡(終止)有正常終止,異常終止兩種形式
管道:用于進程交換數據的單向進程間通信通道
pid:標識一個進程的進程ID編號
priority:進程調度優先級
以下是我重點學習的內容:
- fork()創建子進程
- 一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。
子進程是父進程的副本,它將獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味著父子進程間不共享這些存儲空間。
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[]){
pid_t pid=fork();
if ( pid < 0 ) {
fprintf(stderr,"錯誤!");
} else if( pid == 0 ) {
printf("子進程空間");
exit(0);
} else {
printf("父進程空間,子進程pid為%d",pid);
}
// 可以使用wait或waitpid函數等待子進程的結束并獲取結束狀態
exit(0);
}
- 認識環境變量
環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數,如:臨時文件夾位置和系統文件夾位置等。
環境變量是在操作系統中一個具有特定名字的對象,它包含了一個或者多個應用程序所將使用到的信息。例如Windows和DOS操作系統中的path環境變量,當要求系統運行一個程序而沒有告訴它程序所在的完整路徑時,系統除了在當前目錄下面尋找此程序外,還應到path中指定的路徑去找。用戶通過設置環境變量,來更好的運行進程。
Linux的環境變量和Windows的還是有一些區別。需要再花時間熟悉下。

可以通過以上方法來查看本機的具體環境變量設置
pthread_cancel()不能殺死線程
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <pthread.h>
5 #include <string.h>
6
7 void *func(void *arg){
8 while(1);
9 return NULL;
10 }
11 int main(){
12 printf("main:pid=%d,tid=%lu\n",getpid(),pthread_self());
13
14 pthread_t tid;
15 int ret = pthread_create(&tid,NULL,func,NULL);
16 if(ret != 0){
17 fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
18 return 1;
19 }
20
21 ret = pthread_cancel(tid);
22 if(ret != 0){
23 fprintf(stderr,"pthread_cancel error:%s\n",strerror(ret));
24 return 2;
25 }
26
27 pthread_exit((void*)0);
28
29 return 0;
30 }

原因:
使用pthread_cancel()終止線程,需要線程中存在取消點。
大致是需要線程中有陷入內核的操作,才會存在取消點
如果想要用pthread_cancel()終止一個沒有陷入內核操作的線程,就需要手動添加取消點
在while循環中加入,pthread_testcancel()即可用pthread_cancel()殺死該線程
7 void *func(void *arg){
8 while(1) pthread_testcancel();
9 return NULL;
10 }

posted on 2022-09-11 15:43 20201321周慧琳 閱讀(32) 評論(0) 收藏 舉報
浙公網安備 33010602011771號