进程是既切换指令,同时也切换映射表(进程访问地址从映射表中获得),映射表对应的是内存,内存是程序执行所需的资源,需要用到的资源都存放在内存中
进程=资源(映射表)+指令执行序列
如 mov 100 ,在每个进程中都可以写,但是每个进程对应有自己的映射表,映射到物理内存中就不一样了,从而实现地址分离
线程是只切换指令,不切换映射表,将资源和指令执行分开,只是切换了PC指针和部分寄存器,映射表没有切换
所以说,线程既保留了并发的优点,又避免了进程切换的代价
多个指令序列同时出发(creat函数),交替执行,用户级线程,要想交替执行,是主动调用函数,调用函数时,就是从一个函数切换到另一个函数(用yield函数切出去,交替执行)
用yield完成切换
TCB和栈相互配合,栈中的底端地址放在esp中,完成栈的切换。
切换的时候只要切换栈就可以,PC指针已经被压入栈中,执行yield时,会自动弹栈。
两个线程:有两个TCB(thread control block),两个栈,切换的PC在栈中
一个栈,一个TCB与栈关联,栈里放着返回的地址
ThreadCreat 核心:做出上面这三样东西,栈,TCB,TCB和栈关联
void ThreadCreat (A)
{
TCB *tcb=malloc(); //申请一段内存作为tcb
*stack=malloc(); //申请一段内存作为栈
*stack=A; //在栈里填上程序的初始地址
tcb.esp=stack; //栈和tcb关联
}
yield:用户级线程,完全是用户栈,没有进入到内核
核心级线程(schedule):TCB在内核中,内核级线程并发性好一些