The mind is not a vessel that needs filling , but wood that needs igniting !算法
程序计数器pcide
将pc置一个初值,而后取值执行,cpu就运转起来了函数
当遇到IO设备的时候,cpu得等待idea
当程序1执行到一个程序须要等着别的程序执行,那么就先切到别的程序执行操作系统
怎么切换,不就是pc的跳转,利用栈来作线程
当只有一个栈的时候问题就出现了,3d
Yield:其做用是当前线程“放弃”执行,让操做系统调度另外一线程继续执行blog
因此就出现了两个栈+两个用户TCB(线程控制块)进程
当前的再怎么切都是在用户切,根本进入不了内核ip
引入了内核栈的切换
在屏幕上交替的打出A和B
从用户代码开始:
fork是怎么工做的?
fork函数的特性?
fork调用的一个奇妙之处就是它仅仅被调用一次,却可以返回两次,它可能有三种不一样的返回值
在fork函数执行完毕后,若是建立新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新建立子进程的进程ID。咱们能够经过fork返回的值来判断当前进程是子进程仍是父进程。
INT就进入了内核
而后就是执行system_call , 接下来就是sys_fork
接着开始copy_process
而后就开始返回
如今是建立好了一个打印A的进程,如今须要返回建立一个打B的进程
和上面相似,只是对应的tss->eip不一样
而后父进程开始等待,也就是阻塞,而后调用schedule
总的来讲:就是有一个进程,产生出两个打印A和打印B的子进程,对应着打印A和打印B的函数,而后父进程阻塞调用schedule,schedule就开始选择其中的一个进程(根据选择算法),这里也就是打印A的进程,选择完了就切换过去,
也就是把当前cpu中的信息拍到当前父进程中,而后把A的PCB中的tss扣到cpu上
这就切换过去了,而cpu一直就是取指执行,此时eip=100,而eax=0,接下来程序中A就开始不断的执行
前面是进程A开始不断的打A了,而该怎么交替的打印A和B?
要想打印B,那么必须须要B这个进程执行,也就是得切换B进程对应的PCB,而切换的程序和上面的同样,schedule、switch_to,那么如今须要一个调用,也就是调用到schedule的入口,这个就是调度点,因为是交替打印A和B,那么这个调度点该放到什么位置合适呢?
须要中断,时钟中断
也就是对于A来讲,先执行一会,当前的counter=0就调用schedule,和上面同样,也是经过switch_to,把对应的数据进行交换,而后B执行
何为交替?仍是中断,由于时钟中断已经作好了,每过一段时间就要作一次时钟中断
这个时候A和B就交替的出现了