进程 线程 纤程 中断 初解笔记

进程 线程 纤程 中断
进程和线程有什么区别?
    进程就是一个程序运行起来的状态,线程是一个进程中的不同的执行路径。
    专业:进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)
    纤程:用户态的线程,线程中的线程,切换和调度不需要经过OS
    优势:1:占有资源很少 OS : 线程1M  Fiber:4K 
                2:切换比较简单 
                3:启动很多个10W+

目前2020 3 22支持内置纤程的语言:Kotlin Scala Go Python(lib)... Java? (open jdk : loom)

Java中对于纤程的支持:没有内置,盼望内置
利用Quaser库(不成熟)

<xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>mashibing.com</groupId>
    <artifactId>HelloFiber</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/co.paralleluniverse/quasar-core -->
        <dependency>
            <groupId>co.paralleluniverse</groupId>
            <artifactId>quasar-core</artifactId>
            <version>0.8.0</version>
        </dependency>
    </dependencies>

</project>
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;

        }
    }
}


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;

        }
    }
}

作业:目前是10000个Fiber -> 1个JVM线程,想办法提高效率,10000Fiber -> 10份 -> 10Threads
纤程的应用场景
纤程 vs 线程池:很短的计算任务,不需要和内核打交道,并发量高!


JVM -> 站在OS老大的角度,就是个普通程序    
进程在Linux中也称task 是系统分配资源的的基本单位 
进程描述符 PCB(process control Block)
进程的创建和启动
系统函数 fork() exec()
从Afork()B   A是B的父进程

僵尸进程(defunct)
    父进程产生子进程,会维持子进程的PCB ,子进程退出,父进程释放,如果父进程未释放 则子进程成为一个僵尸进程,一般僵尸进程不影响性能,除非数据量过大(C语言)
孤儿进程
  子进程退出之前,父进程就以退出
  孤儿进程会成为init进程的孩子,由1号进程进行维护

进程调度
 dos 单任务(独占)到多任务(分时)
 原则:最大限度压榨CPU
多任务:
    非抢占式
    抢占式
linux 2.6采用CFS调度策略 完全公平算法 completely fair scheduler
(按优先级分配时间片的比例,记录每个进程的执行时间,如果每一个进程执行时间不到他应该分配比例,有限执行)

linux默认调度策略;
    实时:优先级分高低 FIFO(First In First Out) ,优先级一样RR(Round Robin)
    普通:CFS
                
                
中断  interrupt
    硬件跟操作系统内核打交道的一种机制
    软中断(80中断) ==  系统调用
    系统调用:int 0x80 或者 sysenter原语
    通过ax寄存器填入调用号
    参数通过bx cx dx si di传入内核
    返回值通过ax返回

java读网络 – jvm read() – c库read() - > 

内核空间 -> system_call() (系统调用处理程序)

-> sys_read()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进程上下文是指在一个进程执行期间,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容的总和。它包括用户级上下文和系统级上下文。用户级上下文包括用户的程序块、数据块、运行时的堆和用户栈等组成的用户空间信息。而系统级上下文包括进程标识信息、进程现场信息、进程控制信息(包含进程表、页表、打开文件表等)和系统内核栈等组成的内核空间信息。 线程上下文与进程上下文类似,但是线程之间共享同一进程的地址空间,所以在切换线程上下文时,不需要切换地址空间,只需要切换线程的寄存器状态即可。一次线程上下文切换发生在一个进程内的不同线程之间。 中断上下文是发生在CPU响应硬件中断时,保存当前正在执行的上下文,然后切换到中断处理程序的上下文。中断上下文保存了中断前的进程上下文信息,以及中断处理程序执行所需要的寄存器和堆栈等。 中断上下文的切换是由硬件自动完成的,它会保存当前正在执行的进程线程的上下文,切换到中断服务程序的上下文,等中断处理完成后再切换回原来的上下文。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Linux:上下文,进程上下文和中断上下文概念,上下文切换](https://blog.csdn.net/W546556/article/details/126300300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [系统调用,上下文切换(cpu上下文,进程上下文,线程上下文,中断上下文,进程切换,线程切换)](https://blog.csdn.net/aa541850383/article/details/125363264)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值