OS - 一文带你快速精通程序、进程、线程、纤程

2021-02-05  本文已影响0人  zzj0990

以下本文都是在OS角度说的。

面试高频:进程和线程有什么区别?

JAVA中对纤程的支持:目前没内置,期望内置

利用Quaser库(不成熟)
<dependencies>

<dependency>
<groupId>co.paralleluniverse</groupId>
<artifactId>quasar-core</artifactId>
<version>0.8.0</version>
</dependency>
</dependencies>

// 线程版本:
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.strands.SuspendableRunnable;
public class HelloFiber {
    public static void main(String[] args) throws  Exception {
        long start = System.currentTimeMillis();
        Runnable r = new Runnable() {
            @Override
            public void run() {
                calc();
            }
        };
        int size = 10000;
        Thread[] threads = new Thread[size];
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(r);
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].start();
        }
        for (int i = 0; i < threads.length; i++) {
            threads[i].join();
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
    static void calc() {
        int result = 0;
        for (int m = 0; m < 10000; m++) {
            for (int i = 0; i < 200; i++) result += i;
        }
    }
}
// 大概耗时7s
// 纤程版本
import co.paralleluniverse.fibers.Fiber;
import co.paralleluniverse.fibers.SuspendExecution;
import co.paralleluniverse.strands.SuspendableRunnable;
public class HelloFiber2 {
    public static void main(String[] args) throws  Exception {
        long start = System.currentTimeMillis();
        int size = 10000;
        Fiber<Void>[] fibers = new Fiber[size];
        for (int i = 0; i < fibers.length; i++) {
            fibers[i] = new Fiber<Void>(new SuspendableRunnable() {
                public void run() throws SuspendExecution, InterruptedException {
                    calc();
                }
            });
        }
        for (int i = 0; i < fibers.length; i++) {
            fibers[i].start();
        }
        for (int i = 0; i < fibers.length; i++) {
            fibers[i].join();
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
    }
    static void calc() {
        int result = 0;
        for (int m = 0; m < 10000; m++) {
            for (int i = 0; i < 200; i++) result += i;
        }
    }
}
// 大概耗时3秒,纤程之间的切换很轻盈,是在用户态内部进行的,不需要os参与

大家可以尝试:目前是10000个Fiber -> 1个JVM线程,想办法提高效率,10000Fiber -> 10份 -> 10Threads

纤程的使用的场景

纤程 vs 线程池:很短的计算任务,不需要和内核打交道,并发量高!

进程创建和启动

fork and exec.png
linux是c语言写的,它对外提供一些类库和接口,比如fork(),创建进程调用系统的函数fork() 产生一个子进程,其实内部还是clone方式产生的,即从父进程克隆出一个

僵尸进程 & 孤儿进程

进程调度(了解)

Linux 2.6采用CFS调度策略:Completely Fair Scheduler
按优先级分配时间片的比例,记录每个进程的执行时间,,如果有一个进程执行时间不到他应该分配的比例,优先执行。
默认调度策略:
实时优先级分高低 : FIFO (First In First Out),
优先级一样 : RR(Round Robin)
普通: CFS

————————————————————
坐标帝都,白天上班族,晚上是知识的分享者
如果读完觉得有收获的话,欢迎点赞加关注

上一篇下一篇

猜你喜欢

热点阅读