一个操作系统的实现:第八章——进程间通信

声明:随着学习的深入,本人发现后面的章节越来越不好进行总结,感觉想把全部内容总结好就要直接“抄书”了。本人只是想把书中的一些重点、或者查阅点记录下来,方便后面学习的查阅,所以后面的总结会越来越不尽人意,望谅解。

 

C语言语法:

#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。

##被称为连接符(concatenator),用来将两个Token连接为一个Token,##符是把传递过来的参数当成字符串进行替代。

例如: 

#define PRINT( n ) printf( "token" #n " = %d", token##n ) 
则PRINT(mine );
在编译时会被编译成

printf( "token" "mine" " = %d", tokenmine );

__FILE__、__BASE_FILE__和__LINE__这三个宏,它们的意义如下 :
__FILE__将被展开成当前输入的文件。
__BASE_FILE__可被认为是传递给编译器的那个文件名。比如你在m.c中包含了n.h,而n.h中的某一个assert函数失败了,则__FILE__为n.h,__BASE_FILE__为m.c。
__LINE__将被展开成当前的行号。

__asm__是GCC 关键字asm 的宏定义:
#define __asm__    asm
__asm__或asm 用来声明一个内联汇编表达式,所以任何一个内联汇编表达式都是以它开头的,是必不可少的。

__volatile__是GCC 关键字volatile 的宏定义
#define __volatile__   volatile
__volatile__或volatile 是可选的。如果用了它,则是向GCC 声明不允许对该内联汇编优化,否则当 使用了优化选项(-O)进行编译时,GCC 将会根据自己的判断决定是否将这个内联汇编表达式中的指令优化掉。

 

微内核与宏内核:
让内核只负责它必须负责的工作,比如进程调度。这种将内核工作简单化的思想,便是微内核的基本思想。而所有工作通过系统调用扔给内核态的做法,被称为宏内核。
在基于宏内核的操作系统中,完成具体任务时,用户进程通过系统调用让内核来做事,直来直去,我们之前已经很熟悉了。在基于微内核的操作系统中,这个过程稍微复杂一些。在完成具体任务时,内核的角色很像是个中介。

IPC:
IPC是Inter-Process Communication的缩写,直译为进程间通信,说白了就是进程间发消息。有的消息机制是很像收发邮件的,这种叫做异步IPC,意思是说,发信者发完就去干别的了,收信者也一样,看看信箱里没信,也不坐在旁边傻等。而有另一种消息机制正好相反,被称为同步IPC,它不像邮寄,倒像接力赛,发送者一直等到接收者收到消息才肯放手,接收者也一样,接不到就一直等着,不干别的。

同步IPC有若干的好处,比如:
操作系统不需要另外维护缓冲区来存放正在传递的消息;
操作系统不需要保留一份消息副本;
操作系统不需要维护接收队列(发送队列还是需要的);
发送者和接收者都可在任何时刻清晰且容易地知道消息是否送达;
从实现系统调用的角度来看,同步IPC更加合理——当使用系统调用时,我们的确需要等待内核返回结果之后再继续。

 Linux的系统调用如下:

Minix的系统调用如下:


 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页