Linux 线程实现模型

by admin on 2018年10月26日

作者:凯鲁嘎吉 – 博客园
http://www.cnblogs.com/kailugaji/

 

相同、实验目的

1、Linux 线程的调度实现可生出星星点点种植模型,

1. 依矩阵按模最酷特色值,判断解方程组的Jacobi迭代法所得迭代序列的敛散性。

   
 一栽是一点一滴由进程负责,进程内启动一个线程调度器,由进程内的线程调度器完成调度。

2. 会在Jacobi迭代法所得迭代序列收敛时,用修改后底Gauss-Seidel迭代法。

        缺点是:(1)各个线程自己加主动释放cpu的流水线

3. 会逐次超松驰迭代法。

                     
 (2)进程或过不去,达不至几近线程时为过程多头并进的效应。因为当一个线程调用了阻塞性的系调用,则会招致整个过程挂住,因为经过内之线程调度器得无顶运行会,所以,根本没法调度外线程进行运转。

亚、实验原理

     另外一栽是出于基础完成调度。

图片 1

  缺点是:(1)内核完成调度,内核负担非常。

老三、实验程序

 

图片 2

2、Linux 的线程实现,历史及面世了Linux Thread 和 现代版的NPTL。Linux
Thread虽然也能兑现多线程的效益,但是局限比较多,而NPTL则进一步切合Posix
标准,在一个过程内开行多单线程时性更好。极端气象下,一个经过内得以启动10万独线程,而动传统的Linux
Thread则盖启动几千单线程。从Linux 2.6初始,以及glibc
新本子中都是默认开启NPTL。

季、实验内容

 

之所以地方前亚栽方法求解4元线性方程组的即似解,所选方程组尽可能可以为此强艺术求得收敛解。

3、NPTL=native posix thread library

横流:要注意看清迭代法收敛性,方法之一即是故程序要矩阵的按模最充分特征值。

 

 

4、NPTL的线程实现模型如下:

五、解答(按如下顺序提交电子版)

图片 3

1.(程序)

 

(1)Jacobi迭代法源程序:

5、java
的多线程实现,是由JVM实现的,内核并无体贴,而是由JVM完成差不多线程调度,JVM内部维护一个程序运行指令的个数计数器,从而知道线程的运作时刻,当上自然指令条数后,则强行剥夺线程运行,以便调度外线程运行,java线程的预级也10只,默认为5,
可以指定1~10.

function x=jacobi(a,b,x0,n,tol,m)
x=zeros(n,1);
for k=0:m
    for i=1:n
        s=0;
        for j=1:n
            if j~=i
                s=s+a(i,j)*x0(j,1);
            end
        end
        x(i,1)=(b(i,1)-s)/a(i,i);
        if norm(x-x0,inf)<tol
            break;
        end
        x0(i,1)=x(i,1);
    end
end

基本原理是:基于优先级的岁月片轮转调度。

(2)Gauss-Seidel迭代法源程序:

 

function x=gauss_seidel(a,b,x0,n,tol,m)
x=zeros(n,1);
for k=0:m
    for i=1:n
        s=0;s2=0;
        for j=1:i-1
            s2=s2+a(i,j)*x(j,1);
        end
        for j=i+1:n
                s=s+a(i,j)*x0(j,1);
        end
        x(i,1)=(b(i,1)-s-s2)/a(i,i);
        if norm(x-x0,inf)<tol
            break;
        end
        x0(i,1)=x(i,1);
    end
end

6、python的多线程实现,待到。

2.(运算结果)

 

(1)求解线性方程组

图片 4

>> a=[8 -3 2;4 11 -1;6 3 12];b=[20 33 36]';x0=[0 0 0]';
>> x=jacobi(a,b,x0,3,1e-6,50)

x =

    3.0000
    2.0000
    1.0000

(2)Gauss-Seidel迭代法

>>  a=[8 -3 2;4 11 -1;6 3 12];b=[20 33 36]';x0=[0 0 0]';
>> x=gauss_seidel(a,b,x0,3,1e-6,50)

x =

    3.0000
    2.0000
    1.0000

3.(拓展(方法改进、体会等))

逐次超松驰迭代法源程序:

function x=SOR(a,b,x0,n,w,tol,m)
x=zeros(n,1);
for k=0:m
    for i=1:n
        s=0;s2=0;
        for j=1:i-1
            s2=s2+a(i,j)*x(j,1);
        end
        for j=i+1:n
                s=s+a(i,j)*x0(j,1);
        end
        x(i,1)=(1-w)*x0(i,1)+w*(b(i,1)-s-s2)/a(i,i);
        if norm(x-x0,inf)<tol
            break;
        end
        x0(i,1)=x(i,1);
    end
end

运算结果:

>>  a=[-4 1 1 1;1 -4 1 1;1 1 -4 1;1 1 1 -4];b=[1 1 1 1]';x0=[0 0 0 0]';
>> x=SOR(a,b,x0,4,1,1e-6,20)

x =

   -1.0000
   -1.0000
   -1.0000
   -1.0000

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图