linux_進程和線程

1,進程(交互,管理,守護)
(1,資源管理的最小單位
(2,執行模式:用戶模式,內核模式
(3,幾種狀態:運行,停止,等待,殭屍,等
(4,進程調度命令:ps(ps -alx, ps -ef, ps -eLf), nice, kill, top


2,進程機制:使用fork創建,進程控制塊(PCB),拷貝了父進程的整個地址空間,實則“寫操作是拷貝(子進程需要改變內存數據時才拷貝父進程)”

 

3,exec函數族:偷樑換柱,在進程中啓動另一個程序執行的方法

 


4,進程退出:_exit(參數)系統調用,不會清理緩存, exit(參數)庫調用,會清理緩存
pid_t wait(int *status)
pid_t waitpid(pid_t pid, int *status, int option)
wait函數用於父進程等待子進程消亡


5,守護進程編寫:
(1,創建子進程,父進程退出
(2,在子進程創建新會話       setsid()
(3,改變當前目錄爲根目錄   chdir("/")
(4,重設文件權限掩碼           umask(0)
(5,關閉文件描述符               close();
(6,守護進程完成的操作


6,線程:輕量級的進程,用task_struct來描述,每個線程會有一個task_struct來管理

進程創建:int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);
進程退出:void pthread_exit(void *rval_ptr);
(父)進程等待(子):int pthread_join(pthread_t thread, void **rval_ptr);

 

 

(父)進程取消(子):int pthread_cancel(pthread_t tid);

 

父子線程資源分離,用於多線程:pthread_detach()


7,線程間的同步和互斥

同步:按照一定順序相互配合完成一件事
信號量:代表某一資源,其值表示資源數量。p(申請資源)v(釋放資源)

信號量初始化              :int sem_init(sem_t *sem, int pshared, unsigned int value);
信號量申請資源(p):int sem_wait(sem_t *sem);//p
信號量釋放資源(v):int sem_post(sem_t *sem);//v


互斥鎖:保證資源的完整性,(信號量也可以實現)
鎖初始化:int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
上鎖        :int pthread_mutex_lock(pthread_mutex_t *mutex);
解鎖        :int pthread_mutex_unlock(pthread_mutex_t *mutex);


8,進程間通信:
傳統:無名管道,有名管道,信號
system V IPC:共享內存,消息隊列,信號燈
BSD:套接字

9,無名管道:半雙工,具有親緣間通信。基於文件描述符,f[0]:讀管道,f[1]:寫管道。
關於管道破裂和阻塞總結如下:
(1,管道兩端都打開:滿寫阻塞,空讀阻塞
(2,某一段關閉:    無讀寫滿破裂,無寫讀完返回0

10,fifo:可用於不互相關進程,先進先出,不支持lseek(),通過文件讀寫,前提打開(創建)管道。
創建管道文件:int mkfifo(const char *filename, mode_t mode)//mode權限


11,信號:用於內核和用戶通信,處理方式:忽略,捕捉,執行
定義方式:void (*signal(int signum, void(*handler)(int)))(int)

12,共享內存:最高效進程間的通信方式。通過ipcs查看狀態,ipcrm 刪除ipc對象,否則會一直保留在系統
步驟:(獲得key-ftok())創建(打開)內存->映射->...->取消映射->刪除共享內存
創建:int shmget(key_t key, int size, int shmflg);
映射:void *shmat(int shmid, const void *shmaddr, int shmflg);
撤銷:int shmdt(const void *shmaddr);
刪除:int shmctl(int shmid, int cmd, struct shmid_ds *buf);




13,消息隊列:多個fifo的集合。獲得key->創建隊列->寫->讀->控制(刪除)。
創建:int msgget(key_t key, int flag)
寫  :int msgsnd(int msqid, const void *msgp, size_t size, int flag)
讀  :int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int flag)
控制:int msgctl(int msgqid, int cmd, struct msqid_ds *buf)




14,信號燈(信號量):不同進程間同步的機制。posix是單個計數信號燈
創建:int semget(key_t key, int nsems, int semflg)
pv:   int semop(int semid, struct sembuf *opsptr, size_t nops)
設置:int semctl(int semid, int semnum, int cmd ...)


一般使用:
1,共享內存+信號燈,高效但是複雜

 

2,消息隊列 ,簡單

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章