
操作系统
操作系统原理介绍
张孟浩_jay
分享Java后端、MySQL、数据结构、计算机基础、算法、并发编程技术!欢迎朋友们交流关注,共同进步!
展开
-
线程切换详解
线程切换的流程:1、保存CPU上下文,也就是各类寄存器的信息2、触发软中断,从用户态转化到内核态,恢复内核栈的寄存器信息,内核栈会执行对应的线程切换函数,从就绪线程中选出一个线程来执行,并恢复线程对应的CPU上下文。这里面存在了2次的CPU上下文切换3、对应的线程开始执行这里面有两个比较耗时间的点:CPU的上下文切换、 进程的调度选择!...原创 2021-12-21 22:43:53 · 5410 阅读 · 1 评论 -
为什么进程切换比线程切换耗费资源?
每个进程都有对应的页表,进程切换的时候需要切换页表,为了加快虚拟地址的地址转换效率,所以引入了TLB来缓存对应的虚拟地址和物理地址的映射。切换页表这个操作本身是不太耗费时间的,切换之后,TLB就失效了,所以在进行地址转化的时候需要重新去查找页表,这就造成了程序运行的效率低下。同一个进程的线程之间是共用一个页表的,所以线程之间的切换是不需要切换页表的。...原创 2021-12-21 18:48:36 · 2363 阅读 · 0 评论 -
自旋还是挂起?
自旋会一直CAS来获取锁,不会释放CPU,而线程挂起会释放对应的CPU资源。1、如果是多核处理器,如果预计线程等待锁的时间很短,短到比线程两次上下文切换时间要少的情况下,使用自旋锁是划算的。2、如果是多核处理器,如果预计线程等待锁的时间较长,至少比两次线程上下文切换的时间要长,就讲线程挂起,到锁释放的时候再将线程唤醒。3、如果是单核处理器,一般建议不要使用自旋锁。因为,在同一时间只有一个线程是处在运行状态,那如果运行线程发现无法获取锁,只能等待解锁,但因为自身不挂起,所以那个获取到锁的线程没有办法进入原创 2021-10-24 21:34:13 · 347 阅读 · 1 评论 -
硬中断和软中断
中断简介中断是指计算机系统内部或者外部出现了情况,然后向CPU发送指令,CPU会放弃当前程序的执行,转而执行中断对应的程序的过程。中断的重要性当鼠标移动、网卡收到数据等情况下 都需要中断CPU,来调用对应的中断程序,达成之间的通信。硬中断硬中断指的是由硬件向CPU发送的电信号,比如网卡、鼠标、键盘、硬盘等硬件。硬件初始化的时候会像系统注册对应的中断程序,系统会维护一个中断程序表。当数据到达、或者出现异常的时候,会像CPU发送电信号,电信号中携带着信息,CPU会解析然后调用对应的中断程序。软中断原创 2021-09-30 11:41:43 · 1604 阅读 · 1 评论 -
Linux中内存管理详解
逻辑地址和地址映射如果用户进程直接操作物理地址会有以下的坏处:1、 用户进程可以直接操作内核对应的内存,破坏内核运行。2、 用户进程也会破坏其他进程的运行CPU中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。不同进程的逻辑地址可以一样,但是其映射的物理地址是不一样的。逻辑地址 分为 内核空间 和 用户空间。内核空间原创 2021-09-25 20:54:15 · 13974 阅读 · 8 评论 -
epoll之水平触发和边缘触发
epoll中有两种触发模式,分别为1、水平触发水平触发为Level Triggered,简称LT。水平触发关心的是缓冲区的状态,当缓冲区可读的时候,就会发出通知,也就是当缓冲区中只要有数据就会发出通知。2、边缘触发边缘触发为Edge Triggered,简称ET。边缘触发关心的是缓冲区状态的变化,当缓冲区状态发生变化的时候才会发出通知,比如缓冲区中来了新的数据。从上述表述可能不太看得出他们之间的区别,我们设想这样一个场景,当一次read()读取没有读取完缓冲区中的数据时,LT和ET的区别:1原创 2021-09-09 21:18:13 · 8594 阅读 · 3 评论 -
死锁详解和解决办法
死锁概念死锁是指两个以上线程因争夺资源而发生互相等待的现象!没有外力调解的话,就造成线程一直互相等待,无法执行的情况!死锁发生的必要条件死锁发生会同时出现以下的四个必要条件。1、互斥一个资源同时只能被一个线程使用2、请求并保持线程在请求资源阻塞的时候,并不会释放其已经拥有的资源。3、不可剥夺对于线程已经获得的资源,只能线程自己释放,其他线程无法强制剥夺。4、循环等待两个或者两个以上线程出现等待资源出现循环依赖。死锁的解决方法死锁共有三种解决方式:1、预防死锁预防死锁的解决方法就原创 2021-09-07 15:04:59 · 18495 阅读 · 1 评论 -
Linux中IO过程详解
IO就是input和output,对应着输入和输出。输入就是将对应的数据从IO设备中读取到内存中。输出就是将对应的数据从内存中输出到IO设备中。本文就说一下其IO对应的流程。InputInput就是将数据从IO设备中读取到内存中。线程调用read()方法,read()方法底层会调用操作系统的读取方法。步骤如下:1、操作系统首先会将数据从IO设备缓冲区拷贝到操作系统中的内核空间中2、操作系统将数据从操作系统中的内核空间拷贝到用户空间中。3、然后线程可以操作用户空间中的数据执行相应的代码。Out原创 2021-09-05 20:09:26 · 909 阅读 · 1 评论 -
Linux中网络IO模型详解
网络IO简介服务器大部分都是运行在Linux下的,Linux中的IO模型跟我们服务器中的网络IO息息相关。网络IO的read分为两步:1、等待其他网络将数据发送到当前系统的内核空间中2、将数据从内核空间复制到用户空间中网络IO模型Linux中IO模型分为以下四种:1、Blocking IO2、...原创 2021-09-03 19:34:39 · 787 阅读 · 1 评论 -
操作系统中的IO控制方式详解
IO简介IO就是Input和Output的简称,也就是输入输出。主要包括磁盘IO、网络IO、键盘输入,显示器输出、USB等操作。输入是从IO设备输入到内存中,输出是从内存中输出到IO设备中。IO控制器CPU不会直接控制IO设备,而是通过IO控制器间接的控制IO设备。因为市面上有各种各样的IO设备,操作方式都不太一样,CPU无法直接控制IO设备。所以引入了IO控制器,也叫做设备控制器来间接控制IO设备。IO控制器作为CPU和IO设备的中介,通过地址总线、控制总线与CPU相连。有以下作用:1、数据缓原创 2021-09-02 21:05:49 · 16234 阅读 · 2 评论 -
用户态与内核态之间切换详解
用户态切换到内核态CPU中有一个标志字段,标志着线程的运行状态。用户态和内核态对应着不同的值,用户态为3,内核态为0.每个线程都对应着一个用户栈和内核栈,分别用来执行用户方法和内核方法。用户方法就是普通的操作。内核方法就是访问磁盘、内存分配、网卡、声卡等敏感操作。当用户尝试调用内核方法的时候,就会发生用户态切换到内核态的转变。切换流程:1、每个线程都对应这一个TCB,TCB中有一个TSS字段,存储着线程对应的内核栈的地址,也就是内核栈的栈顶指针。2、因为从用户态切换到内核态时,需要将用户态.原创 2021-08-29 19:11:36 · 22301 阅读 · 4 评论 -
线程TCB详解
TCB简介操作系统中一个线程对应着一个TCB(Thread Control Block),叫做线程控制模块,控制着线程的运行和调度。TCB组成1、threadID:线程的唯一标识。2、status:线程的运行状态3、register:线程关于CPU中寄存器的情况4、PC程序计数器:线程执行的下一条指令的地址5、优先级:线程在操作系统调度的时候的优先级6、线程的专属存储区:线程单独的存储区域7、方法栈:线程执行的方法栈,用来保存线程当前执行的方法的信息...原创 2021-08-29 15:31:55 · 10073 阅读 · 1 评论 -
进程和线程
进程进程是操作系统分配资源的最小单位。线程线程是操作系统cpu调度的最小单位。进程和线程的关系进程是由多个线程组成的。当一个进程被创建的时候,会为进程分配内存资源,然后立刻创建一个线程来执行程序,这个线程就叫做主线程。每个进程都有一个主线程,主线程对应着执行进程主程序,通过主线程在执行主程序的时候可以创建其他子线程。多个线程之间共享线程的公共资源。...原创 2021-08-29 14:55:45 · 159 阅读 · 1 评论