进程与线程概念剖析

线程

1:执行流

  多道程序设计:是一种让处理器在多个任务间来回切换执行的方法,这样给了用户一种所有任务并行执行的错觉,这称为“伪并行”。任务轮转工作是由任务调度器来执行的。

  任务调度器是os的一个模块,它根据一套算法来决定从线程表中调度线程的顺序和时间。

什么是线程?

  线程是一套机制,此机制可以为一般的代码块创造它所依赖的上下文环境(自己的栈,一套自己的寄存器映像和内存资源)。从而让代码块具有独立性,因此在原理上线程能使一段函数成为调用单元(或称为执行流),使函数能够被调度器认可,从而能够被专门调度到处理器上执行。这样,函数就可以被加入到线程表中作为调度器的调度单元,从而有机会单独获得处理器资源。也就是说,处理器不是把线程中调用的函数和其他指令混在一起执行的,或者说不是在执行整个进程时顺便执行了该函数,而是单独,专门执行了此函数。

  任何代码块(就是函数),只要给它加上上下文环境,就具备独立性,可以成为执行流,单独被调度器调度。

  简单的来说,线程就是一段具有独立性的代码块,可以被单独调度上处理器执行。这样的代码块称为执行流。

使用线程的目的?

  使用线程的目的主要是让程序中的多个函数以并行的方式执行(单核就是伪并行),从而为程序提速。当然线程它没有自己独立的地址空间,必须依赖于进程的资源,所以使用线程的目的也可以说是为了进程提速。

  为进程提速的原理有2个,一是让自己的进程拥有多个执行流,在任务调度器的线程表中多拥有几个调度单元,增加自己进程中指令被调度上cpu执行的可能性,相当于去抢其他进程的执行时间。

  二是防止因为一些局部原因而阻塞了整个进程。

2:进程

  进程就可以看作是线程加资源。因为进程如果不显示的创建线程,就是单线程进程,它里面也至少有一个执行流。资源呢就是进程有自己独立的页表,线程没有。

3:进程,线程的状态

  状态是用来描述执行流的,是用来描述线程的。调度器的调度单位是执行流,状态可以理解为调度器调度的依据。一些线程因为等待外界条件而无法继续执行,调度器就把它换下去,这称为阻塞态。把外界条件成立,随时可以被调度器调度上处理器执行的线程状态称为就绪态,把已经被调度器调度,正在处理器上运行的线程状态称为就绪态。进程同理,因为进程可以看作线程加资源,状态是用来描述进程中有关动作的执行流部分,不包括静态的资源部分。

PCB(进程控制块)

  可以看成进程的身份证,是os用来管理进程用的。os为每一个进程都提一个pcb,用来记录与进程相关的信息,比如进程状态,进程ID(PID),优先级等。os把所有PCB放到一个表格中来维护,就是进程表,通过这个表。调度器就可以来选择在处理器上运行的进程了。

  PCB一般都很大,以页(4kb)为单位,我的玩具os比较简单,PCB只占一页。

  PCB格式:PCB格式不固定,取决于OS的复杂程度,一些基本的内容有:寄存器映像(用了保存进程被调度下处理器的时候的状态的,下次被调度的时候用来恢复现场),栈(进程所使用的0特权级别下的内核栈),栈指针(记录0级栈栈顶的位置),进程id(pid),进程状态,优先级,时间片,页表,打开的文件描述符,父进程。

4:实现线程的两种方式-内核或用户线程

  主要是看线程机制在哪里实行的,就是看线程表在哪里,由用户代码,还是内核代码来调用线程上cpu。在0特权级代码实现的就是内核级线程,在3特权级用户级代码实现的就是用户线程。

在用户空间实现线程

  优势:

  • 1:可移植性强。在不支持线程的os上也可以用。

  • 2:灵活性强。可以自己改变线程调度算法,给某些线程加权调度。

  • 3:将线程的寄存器映像装载到CPU时,可以在用户空间完成,不用陷入内核态,免去了进入内核时的入栈和出栈操作。

  缺点:

  • 1:进程可能因为某个线程的阻塞而全体阻塞,让整个进程被挂起,即整个进程的全部线程都无法执行。
  • 2:整个进程占据处理器的时间片有限。

5:在内核空间实现线程

优势:

  • 1:可以让进程多占处理器资源,本线程的多个线程出现在任务调度器的线程表中,增加被调用的时间期望
  • 2:单一线程阻塞不会让全体线程被阻塞。

缺点:

  • 1:用户进程需要系统调用陷入内核,增加了一些现场保护的栈操作。

6:上下文保护

  分为两部分:1保存任务进入中断前的全部寄存器,目的是能够让任务恢复到中断前。

  2 保存esi,edi,ebx,ebp这4个寄存器,让任务执行在任务切换发生时剩下未执行的内核代码。保证顺利走到退出中断的出口,利用第一部分保护的寄存器环境彻底恢复任务。

7:cpu寄存器

x86寄存器(32位)分类:

8个通用寄存器:EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP

1个标志寄存器:EFLAGS(第9位IF位,sti指令开中断,置1,cli关中断,置0)

6个段寄存器:CS、DS、ES、FS、GS、SS

5个控制寄存器:CR0(第31位pg位)、CR1、CR2、CR3(页表寄存器)、CR4

8个调试寄存器:DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7

4个系统地址寄存器:GDTR、IDTR、LDTR、TR

其他寄存器:EIP、TSC等。

posted @ 2021-03-15 15:47  江安躺平侠  阅读(107)  评论(0)    收藏  举报