ღゝ◡╹)ノ❤️

集中一点,登峰造极!

  menu
137 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

操作系统

java里面的线程和操作系统的线程

  • 直接映射,一对一的方式
  • 操作系统的线程状态:
    初始状态:仅在语言层面创建了该线程对象,还未与操作系统关联
    可运行状态:指线程已经被创建,可以由CPU调度执行。
    阻塞状态:调用了阻塞API,如BIO读写文件,这是线程实际不会用到CPU,会导致线程上下文件切换。
    终止状态:表示线程已经执行完毕,生命周期已经结束。
  • java的六种状态:
    NEW:线程刚被创建,但是还没调用start方法。
    RUNNABLE:调用start方法之后,java层面的RANNABLE状态涵盖了操作系统层面的可运行状态,运行状态,阻塞状态。
    BLOCKEDWAITINGTIMED_WAITING:是java方面的阻塞状态。
    TERMINATED:线程结束的状态。

java层面调用sleep(long n)、waite(long n)等带时间的等待方法会RUNNABLE --> TIMED_WAITING

调用sleep、waite、join会从RUNNABLE --> WAITING

image.png

image.png

进程和线程?

进程:是一个动态概念,竞争计算机系统资源的基本单位。

线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。

区别

  • 地址空间:线程共享本地进程地址空间,而进程之间是独立的空间
  • 资源:线程共享本地进程的资源如:内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
  • 健壮性:多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
  • 切换时:进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
  • 通信:线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量,进程之间通信则比较复杂。

键盘敲击之后发生了什么?

键盘敲击之后,键盘控制器根据敲击的键生成扫描码,写入寄存器。同时通过中断控制器向CPU发出中断请求。CPU接到中断请求后即停止正在执行的程序,保存现场,转入键盘中断服务程序。中断服务程序从寄存器中读出键盘扫描码转换成Ascii码与扫描码一起存入键盘缓冲区。

用户态切换到内核态主要的3种方式?

  • 系统调用
    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
  • 异常当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
  • 外围设备的中断
    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

Netty VS java多路复用

  • java多路复用开发工作量大,bug多
  • 需要自己构建协议
  • 解决TCP传输问题,如粘包,半包
  • epoll bug 空轮询导致CPU100%
  • 对API进行增强,使之易调用。ByteBuf =》ByteBuffer

select,poll,epoll

select

image.png

image.png

select,poll,epoll都是IO多路复用机制的实现,即可以监视多个描述符,一旦某个文件描述符就绪(读或写就绪),能够通知程序进行相应读写操作。

  1. select和poll的动作基本一致,只是poll采用链表来进行文件描述符的存储,而select采用fd标注位来存放,所以select会受到最大连接数的限制,而poll不会。
  2. select、poll、epoll虽然都会返回就绪的文件描述符数量。但是select和poll并不会明确指出是哪些文件描述符就绪,而epoll会。造成的区别就是,系统调用返回后,调用select和poll的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll则直接处理即可。
  3. select、poll都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而epoll创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap()文件映射内存加速与内核空间的消息传递:即epoll使用mmap减少复制开销。
  4. select、poll采用轮询的方式来检查文件描述符是否处于就绪态,而epoll采用回调机制。造成的结果就是,随着fd的增加,select和poll的效率会线性降低,而epoll不会受到太大影响,除非活跃的socket很多。
  5. epoll的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符

虽然epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。

水平触发和边缘触发

image.png

进程调度算法

  • 先来先服务
  • 相应比优先
  • 时间片轮询
  • 最短作业优先
  • 多级反馈队列

操作系统读写磁盘,影响磁盘读写时间的因素有哪些?

  • 寻道时间
  • 旋转延迟
  • 传输时间

进程通信的方式

  • 管道
  • 信号
  • 报文
  • 套接字

PCB包括什么?

  • 程序id
  • 特征信息
  • 进程状态
  • 优先级
  • 通信信息
  • 现场保护区
  • 资源需求,分配控制信息
  • 进程实体信息

线程切换需要保存哪些上下文?

  • 线程id
  • 线程状态
  • 堆栈
  • 寄存器状态

什么是协程?

协程,英文Coroutines,是一种比线程更加轻量级的存在。 正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

Linux 用户态切换到内核态的 3 种方式

  • 系统调用

这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如 fork() 实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如 Linux 的 int 80h 中断。

  • 中断

当外围设备完成用户请求的操作后,会向 CPU 发出相应的中断信号,这时 CPU 会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

  • 异常

当 CPU 在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。


标题:操作系统
作者:哇哇哇哇
地址:https://wuxiangshi.vip/articles/2022/04/04/1649083156031.html