进程和线程
CPU并不知道线程和进程之类的概念
CPU只知道两件事:
1、 从内存中取出指令;
2、 执行指令,然后再从内存中取出下一条指令
寄存器
CPU从哪里取出指令呢?答案是寄存器,可以把寄存器简单地理解为内存,不过存取速度比内存更快。寄存器中存放的是CPU将要执行的下一条指令的地址。寄存器中的地址默认是自动加1,遇到if和else时,这种顺序执行就被打破了。CPU在执行这类指令时会根据计算结果来动态改变PC寄存器中的值,这样CPU就可以正确地跳转到需要执行的指令了。
函数
指令形成的过程:程序代码源文件à编译器编译à可执行文件à磁盘à内存àCPU指令。函数被编译成功之后才会形成CPU执行指令,只需要找到函数被编译后形成的第一条指令,指令就可以按顺序执行下去。第一条指令就是函数的入口,也就是我们程序源代码中常用的main()函数
进程
如果想让CPU执行某个函数,那么只需要把函数对应的第一条机器执行装入PC寄存器就可以了,这样即使没有操作系统也可以让CPU执行程序。但是过程非常复杂:
1、 需要在内存中找到一块大小合适的区域装入程序
2、 需要找到函数入口,设置好寄存器让CPU开始执行程序
机器指令需要加载到内存中执行,因此需要记录下内存的起始地址和长度;同时要找到函数的入口地址并写道PC寄存器中。需要一个结构体类型的数据结构来记录这些信息。该结构体记录的是程序在被加载到内存中的运行状态,叫做进程
线程
所谓进程,无非就是内存中的一段区域,这段区域中保存了CPU执行机器指令以及函数运行时的堆栈信息,要想让进程运行,就把main函数的第一条机器指令地址写入PC寄存器,这样进程就运行起来了。进程的缺点在于只有一个入口函数,也就是main函数,因此进程中的机器指令只能被一个CPU执行。但是既然我们可以把main函数的第一条指令吸入PC寄存器,那么其他函数和main函数本质上来说也没有什么区别。可以把PC寄存器执行main函数,也可以把PC寄存器指向任何一个函数。当把PC寄存器指向非main函数时,线程就诞生了。这样一个进程内可以有多个入口函数,也就是说属于同一个进程中的机器指令可以被多个CPU同时执行。