程序员需要了解的计算机底层知识之进程、线程、纤程、中断

程序员需要了解的计算机底层知识之进程、线程、纤程、中断

面试高频:进程和线程有什么区别?
答案:普通:进程是程序运行起来的状态,线程是一个程序的执行路径。 专业:进行是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是独立的内存空间,线程调度执行(线程是共享进程的内存空间,没有自己独立的内存空间)

纤程:用户态的线程,线程中的线程,切换和调度不需要经过OS
优势:1:占有资源很少 OS : 线程1M Fiber:4K 2:切换比较简单 3:启动很多个10W+
目前2020 3 22支持内置纤程的语言:Kotlin Scala Go Python(lib)... Java? (open jdk : loom)

Java中对于纤程的支持:没有内置,盼望内置

可利用利用Quaser库(不成熟)实现纤程

纤程的应用场景

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

僵尸进程和孤儿进程

一个子进程在父进程还没有调用wait()方法或者waitpid()方法的情况下退出,这个子进程就是僵尸进程;
一个父进程退出,它的一个或多个子进程还在运行,子进程将成为孤儿进程,孤儿进程将被init进程所收养;
僵尸进程将会导致资源浪费,而孤儿进程则不会。

进程调度

Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler)
按优先级分配时间片的比例,记录每个进程的执行时间,如果有一个进程执行时间不到他应该分配的比例,优先执行

默认调度策略:
实时 (急诊): 优先级分高低 - FIFO (First In First Out),优先级一样 - RR(Round Robin 轮询)
普通: CFS

中断

硬件跟操作系统内核打交道的一种机制
软中断(80中断) == 系统调用
系统调用:int 0x80 或者 sysenter原语
通过ax寄存器填入调用号
参数通过bx cx dx si di传入内核
返回值通过ax返回

java读网络 – jvm read() – c库read() - >
内核空间 -> system_call() (系统调用处理程序)
-> sys_read()

从汇编角度理解软中断

搭建汇编环境

yum install nasm

;hello.asm
;write(int fd, const void *buffer, size_t nbytes)
;fd 文件描述符 file descriptor - linux下一切皆文件
​
section data
    msg db "Hello", 0xA
    len equ $ - msg
​
section .text
global _start
_start:
​
    mov edx, len
    mov ecx, msg
    mov ebx, 1 ;文件描述符1 std_out
    mov eax, 4 ;write函数系统调用号 4
    int 0x80
​
    mov ebx, 0
    mov eax, 1 ;exit函数系统调用号
    int 0x80

编译:nasm -f elf hello.asm -o hello.o
链接:ld -m elf_i386 -o hello hello.o
一个程序的执行过程,要么处于用户态,要么处于内核态

你可能感兴趣的:(程序员需要了解的计算机底层知识之进程、线程、纤程、中断)