一、要完成程序执行这个功能的硬件实体是CPU。
1. cpu是执行指令的单元:指令执行需要操作数和跳转地址。而不同的操作数和跳转地址组合成一块memory,这些不同的memory(称作栈)就可以产生多变的系统执行流程和结果。cpu通过栈指针寄存器sp(R13)可以执行不同的memory的位置,进而构成了不同的软件执行流程,即:线程(thread)。Linux内核为了简化实现,将共享资源的进程作为线程。Linux内核中进程间的切换(不同的执行流程),就是通过内核栈的改变来实现的。具体是通过switch_to()函数实现。
2. cpu可以接收中断:有些执行流程的切换是有cpu自动完成的,比如中断、异常,这些都是系统为了满足外部事件,以及完全性、容错性的需求。系统可以通过这些中断对外部事件进行管理。由于不同的cpu中断处理存在差异,折旧需要软件上抽象出中断管理的接口。
3. 程序切换:由于外部事件需要对执行流程进行转换,另外不同的应用执行流程之间也需要切换,这就要在Linux内核的逻辑层抽象出调度器这一逻辑功能。调度器复制在不同线程之间选择合适的线程来让cpu执行(即:切换到相应的执行流程中),来完成对应的任务,具体的切换执行在Linux内核中是有switch_to()函数实现的。
4. 进程:应用层需要Linux内核能够执行应用程序,而在应用程序中不仅仅包含指令执行流程还包含程序操作的资源,比如打开的文件,地址空间中的内容以及对文件的映射等。这些就需要Linux内核将它们作为一个整体进行抽象,就形成了进程的概念,这在Linux内核中就是虚拟子系统层中的task。同样,在应用接口层也需要相应的接口对task进行操作,比如创建、设置不同的执行指令等等。
5. 同步:大型任务需要分多个线程或者进程来完成,这样可以降低系统复杂度,这就提出了多个线程或者进程之间沟通并同步的需求,这部分就是bridge层的功能。
阅读(581) | 评论(0) | 转发(0) |