进程、线程、协程粗解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013139008/article/details/80039178
协程(Coroutine):拥有独立的堆栈,和其他协程共享全局变量及其他大部分东西
多个协程执行起来类似同步的多线程,但是该多个协程属于一个线程

进程:资源分配的基本单位。
线程:程序执行的基本单位。

进程的三态模型:运行、就绪、阻塞
线程的状态也可以用这三态来描述,毕竟进程里真正执行程序的是线程。

1.线程的调度策略:
1)先到先服务:一旦占用cpu则一直运行,直到有更高优先级任务到达或自己放弃。优先级1-99
2)时间片轮转:当任务的时间片用完,系统将重新分配时间片,并置于就绪队列尾。优先级1-99

3)普通任务调度:线程的优先级都是0

注:线程的调度策略和优先级都是线程的属性,可以通过一些函数进行设置和获得线程属性的值。
pthread_attr_t attr; 
struct sched_param param; 
pthread_attr_init(&attr); 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
param.sched_priority = 10; 
pthread_attr_setschedparam(&attr,param); 
pthread_create(xxx , &attr , xxx , xxx); 
pthread_attr_destroy(&attr);
2.Lua中协程的状态
1)suspend running dead
2)状态的转换通过函数的调用完成:

     coroutine.creat方法只要建立了一个协程 ,那么这个协程的状态默认就是suspend。使用coroutine.resume方法启动后,会变成running状态;遇到coroutine.yield时将状态设为suspend;如果遇到return(协程代码调用结束),那么将协程的状态改为dead。

注:Lua中coroutine.resume方法的返回,如果是因为遇到了coroutine.yield返回的,返回值是调用状态
(true/false)+coroutine.yield方法的参数。之后如果再次调用coroutine.resume函数,则该函数的参数
是coroutine.yield函数的参数。通过这个方式进行协程内外代码的参数的传递。

3.线程和协程比较
如果是单进程里的多线程,系统中多个线程是同时存在的,多个线程按照某种调度策略占用CPU。为了实现多个线程合作完成工作,需要使用信号量锁机制等。线程的调度以及锁机制的使用(例如获得锁时需要使自己线程进入阻塞状态,此时线程切换)影响程序的性能。

一个线程里可以创建多个协程,每个协程内有自己的堆栈,相当于对线程的资源进行了进一步的划分。单线程中的多个线程共享该线程里的全局变量,由于程序什么时候执行哪个协程在编码的时候是程序员自己能够确定的,所以全局变量的使用不需要加锁操作。由于只有一个线程的存在,所以没有线程调度增加CPU的开销。

4.Lua协程使用简单例子
co1 = coroutine.create(
    function(i)
            print("co1 num = ", num)
                num = num + 1
            for i = 1, 2 do
                    print("co1 ", i)
                        coroutine.yield()
                end
    end               
)

co2 = coroutine.create(
    function(i)
            print("co2 num = ", num)
                num = num + 1
            for i = 1, 2 do
                    print("co2 ", i)
                        coroutine.yield()
                end
        end
)

num = 8
coroutine.resume(co1)
coroutine.resume(co2)
print("num = ", num)
print(coroutine.status(co1))
print(coroutine.status(co2))
coroutine.resume(co1)
coroutine.resume(co2)
print(coroutine.status(co1))
print(coroutine.status(co2))
coroutine.resume(co1)
coroutine.resume(co2)
print(coroutine.status(co1))
print(coroutine.status(co2))

执行结果:

co1 num =       8
co1     1
co2 num =       9
co2     1
num =   10
suspended
suspended
co1     2
co2     2
suspended
suspended
dead
dead

猜你喜欢

转载自blog.csdn.net/u013139008/article/details/80039178