操作系统原理、实现与实践|第四章 线程切换和调度 学习笔记

线程与进程的基本概念

1.线程与进程的使用目的,在于是否要使用不同的进程资源。若是并发的执行序列,并使用共同的地址空间等进程资源,那么则考虑使用线程。

2.HTTPS是一种安全的HTTP通道,通常向一些网站传送用户名和密码等重要信息,故HTTPS使用的是进程。(因为如果使用的是线程,那么一个线程的代码可以访问同一个线程下的其它线程的任意内存位置)。

用户级线程的切换和创建

1.线程概念:在一个地址空间下启动并交替执行多个程序,交替执行的多个线程可以由操作系统管理,也可以由用户自己管理。用户自己管理的是用户级线程,操作系统管理的是内核级线程。

注意:线程虽然使用相同的地址空间,但是不同的线程使用的线程TCB(TCB为线程控制块)不同,并且每个线程使用不同的栈(保证栈的函数调用和返回时不会因为其它的函数,例如不是Yield函数却进行了线程跳转,跳转到其它线程当中)。

用户级线程的切换

        1.用户级线程的切换就是在切换的位置上调用Yield()函数

        2.Yield()函数:通过Yield函数实现线程的切换。

                step1:找到下一个进程的TCB,根据当前线程的TCB找到下一个线程的TCB完成用户栈的切换。

                step2:切换到新栈以后用Yield函数的“}”将PC指针切换到下一个线程要执行的指令处。

                补充:还需要在此过程中保存和恢复一些执行现场。(相关寄存器的值)

下面是Yield函数的部分代码

Yield(){
    next=FindNext();           //找到下一个线程的TCB
    push %eax                  //保留执行现场
    push %ebx                  
    ......
    mov %esp,TCB[current].esp   //将当前的esp赋值给当前TCB的值
    mov TCB[next].esp,%esp      //将next的esp赋值给当前的esp(这时就完成了用户栈的切换)
    .....
                                //注意这里已经完成了用户栈的切换此时使用的是二号线程的栈
    push %ebx                   //经过一系列的操作之后ebx存CS的值
    push %eax                   //eax存EIP的值
}                            //函数返回,弹出CS与EIP的值完成切换

  拓展:x86调用框架

        (又叫做栈帧),是指称一个函数被调用时位于内存中的一块区域。

    函数的特点:  

  • 函数拥有明显的生存周期界限。在被调用进入执行第一条函数体指令时开始存在, 在返回调用者时消亡。
  • 函数可以输入参数以改变具体行为, 而具体参数值在运行时确定。
  • 函数可以被多次调用, 比如以循环或递归方式。

          

        传参:通过相关寄存器将参数传入函数中,如寄存器用完就通过压栈的方式将参数压入栈中。参数一般在ebp的上方。从右向左依次放入参数。

        前序:将原来的ebp压栈,并将esp的值赋值给ebp。保存前一个参数调用的基址。

        局部变量:局部变量在ebp的下方

用户级线程的创建 

       x86架构下的栈,是由高地址向低地址生长。

void thread_create(void *func,void *arg1){
    long *stac
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值