深入理解操作系統的管程,進程,線程(二)

1.進程間的通信(inter-process communicationIPC

有三點需要注意:

一:一個作業通常被分爲若干個能併發執行的進程

二:這些進程以各自獨立的速度向前推進,但是他們能保持通信,以便協調一致的(同步)完成任務。

三:進程的通信就是進程間互相傳遞數據。

 

 

進程之間的通信分2種。

(1)低級通信。控制信息的傳遞,一般只傳遞一個或者幾個字節的信息,以達到控制進程執行速度的作用。

(2)高級通信。大批量數據傳遞,不是爲了控制進程的執行速度,而是爲了交換信息。高級通信分三大類。

一:管道通信:能夠連接一個讀進程和一個寫進程,並允許他們以producer-consumer方式進行通信的一個共享文件。


例題1:用C語言編寫一個程序,建立一個pipe,同時父進程生成一個子進程,子進程向pipe中寫一個字符串,父進程從pipe中讀取該字符串。

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int x,fd[2];
char buf[30],s[30];
pipe(fd);
x=fork();
if(x==0)
{
sprintf(buf,"this is a example.\n");
write(fd[1],buf,30);
exit(0);
}
else
{
wait(0);
read(fd[0],s,30);
printf("%s",s);
}
}
例二:



lockf:用於鎖定文件的某些或整個文件
頭文件:#include<unistd.h>
參數定義:int lockf(files,function,size)
function :1鎖定 0解鎖
size:0,表示從文件的當前位置到文件尾

頭文件解釋:

#include <sys/types.h>基本系統數據類型,是Unix/Linux系統的基本系統數據類型的頭文件,含有size_t,time_t,pid_t等類型。linux編程中經常用到的頭文件

The <sys/wait.h> header shall define the following symbolic constants for use withwaitpid():

#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
void main()
{
int i,r,p1,p2,fd[2];
char buf[50],s[50];
pipe(fd);
p1=fork();
if(p1==0)
{
lockf(fd[1],1,0);
sprintf(buf,"child process1 is sending\n");
printf("child process1\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
p2=fork();
if(p2==0)
{
lockf(fd[1],1,0);
sprintf(buf,"child process2 is sending\n");
printf("chilid process2\n");
write(fd[1],buf,50);
sleep(5);
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);//等待其中一個進程
if((r=read(fd[0],s,50))==-1) printf("cant read pipe\n");
else printf("%s",s);
wait(0);
if((r=read(fd[0],s,50))==-1) printf("cant read pipe\n");
else printf("%s",s);
}
}
}


二:消息傳遞系統:

         

三:共享存儲系統


2、線程

線程是進程的一個實體,是被系統獨立調度的基本單位。
一:一個進程可以建立多個線程,這些線程共享進程擁有的全部資源
二:多個線程之間併發執行,切換時快速簡便。
線程的特性:動態性,併發性,(運行)獨立性,異步性


線程分爲2種,一種是內核級線程(kernel-level thread),另外一種是用戶級線程(user-level thread)
一:內核級線程,由內核的內部需求進行創建和撤消,用來執行一個指定的函數。此時,線程切換由內核完成。
當一個線程發起系統調用而堵塞時,不會影響其他線程的運行,但是會帶來更大的系統開銷。


二:用戶級線程,指不需要內核支持而在用戶程序運行的線程,其不依賴於系統核心,
應用線程利用線程庫提供創建,同步,調度,管理線程的函數來控制用戶線程。由於用戶線程不需要
內核的管理,因此能快速的創建和管理。缺點是如果一個線程在發起系統調用堵塞,那麼整個進程都在
等待。


發佈了35 篇原創文章 · 獲贊 42 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章