今天看unix网络编程的时候,看到调用send函数,把数据放入缓冲区,然后加上ip层包头,然后放入链路层输入队列,链路层进程从输入队列取出,然后发送。
一下子就蒙住了,以前对操作系统内核没想到去怎么形容,比如我用户进程里调用阻塞时send方法,有数据后才会返回。以为自己对这句话理解了。
现在想想不知其所以然也。以下是自己查了一些资料,加上一些猜测的操作系统内核的进程方面的架构。
没有操作系统前,人们也可以利用cpu来做事情。操作系统就是一个系统,这个系统包含一些进程,线程,对cpu封装,我们写的所有应用程序都是在操作系统之上进行的。
也就是操作系统内核进程有好多个,是主动对象。
这样的话,用户进程调用send,内部调用系统调用,假设这个系统调用把一个请求放到一个消息队列中,有一个进程一直在监控这个消息队列,有数据了就读出来去处理。
用户进程调用send后,就把本进程挂起;然后通过某种通信方式,让内核进程执行,这里是内核进程从内核缓冲区中取出数据,然后wakeup用户进程。
所以网络编程中所谓的send和recv都是从内核缓冲中读写的,内核的网络模块不管你用户进程是否有在recv,只要网络对端有数据来,都会接收到缓冲区。如果用户进程send,则内核进程a就把数据放入缓冲区,然后让用户进程返回。内核进程b从缓冲区中发送。
百度 内核进程 用户进程
init进程
http://blogimg.chinaunix.net/blog/upfile2/080802120641.pdf
网卡驱动程序:
提供发送数据接口。
有数据的时候,网卡产生一个中断,然后由中断处理程序接收数据到缓冲。
http://hi.baidu.com/shuaihujun/blog/item/61ce883c49737b06baa167a4.html
综上,内核里的主动对象是通过进程;而驱动程序的主动对象时通过硬件中断。
在操作系统之下开发应用程序,好像很少会考虑怎么去实现主动对象,进程是怎么实现的,像网卡接收数据,可以通过中断,硬件本身也是主动对象。
脑子乱了。
linux内核和驱动,啥时候研究下就好了。minux是linux的前驱,更简单。