![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux操作系统
Linux操作系统原理学习
张孟浩_jay
分享Java后端、MySQL、数据结构、计算机基础、算法、并发编程技术!欢迎朋友们交流关注,共同进步!
展开
-
为什么进程切换比线程切换耗费资源?
每个进程都有对应的页表,进程切换的时候需要切换页表,为了加快虚拟地址的地址转换效率,所以引入了TLB来缓存对应的虚拟地址和物理地址的映射。切换页表这个操作本身是不太耗费时间的,切换之后,TLB就失效了,所以在进行地址转化的时候需要重新去查找页表,这就造成了程序运行的效率低下。同一个进程的线程之间是共用一个页表的,所以线程之间的切换是不需要切换页表的。...原创 2021-12-21 18:48:36 · 2239 阅读 · 0 评论 -
线程到底共享了进程的什么资源了?
本文观点来自于知乎一篇文章添加链接描述线程的原理就是一个函数栈的压入和弹出,用来不断的调用函数。独占资源1、函数栈每个线程都有对应的函数栈,栈帧里面包含了有局部变量、参数、返回的参数、返回的地址、寄存器信息等2、调度信息线程需要被操作系统调度3、程序计数器和寄存器的状态用来标志着当前执行代码的位置4、栈的指针用来表示当前的栈帧5、线程的运行状态共享资源1、代码段一个进程有着对应的代码段,线程之间的是共享的。2、数据区线程之间共享着函数之外的全局变量,这些变量存放在数据区3原创 2021-12-21 17:59:57 · 1608 阅读 · 0 评论 -
自旋还是挂起?
自旋会一直CAS来获取锁,不会释放CPU,而线程挂起会释放对应的CPU资源。1、如果是多核处理器,如果预计线程等待锁的时间很短,短到比线程两次上下文切换时间要少的情况下,使用自旋锁是划算的。2、如果是多核处理器,如果预计线程等待锁的时间较长,至少比两次线程上下文切换的时间要长,就讲线程挂起,到锁释放的时候再将线程唤醒。3、如果是单核处理器,一般建议不要使用自旋锁。因为,在同一时间只有一个线程是处在运行状态,那如果运行线程发现无法获取锁,只能等待解锁,但因为自身不挂起,所以那个获取到锁的线程没有办法进入原创 2021-10-24 21:34:13 · 265 阅读 · 1 评论 -
Linux中UDP接收流程详解
UDP是一个无连接的协议,在实现上比TCP简单的多。1、创建socket无论是TCP还是UDP,底层都是一个socket对应。socket中有着接收队列、等待队列、发送队列三个队列。接收队列:用来存放对应的数据等待队列:当线程调用recv_msg()的时候,如果接收队列为空,就阻塞,将其加入到等待队列中。如果接收队列不为空,就直接读取对应的数据发送队列:当线程调用send_msg()的时候,就将数据挂到发送队列中,对应的内核线程会将其写入网卡中2、接收数据当数据到达网卡后,会一层一层的调原创 2021-10-01 16:58:47 · 1686 阅读 · 2 评论 -
Linux中TCP流程详解
文章知识来源本文是对张彦飞(飞哥)的文章的总结,用于学习和技术交流。飞哥的github:开发内功修炼Github飞哥的知乎专栏:开发内功修炼知乎专栏服务端建立TCP是一个基于客户端-服务器的网络模型,首先要建立服务端。Linux中会首先建立一个socket对象,socket中主要是维护了两个链表:1、半连接队列服务器收到客户端第一次握手的信息的时候,内核会为其生成一个request_sock对象,用来记录对应的客户端握手信息,并将request_sock对象加入到半连接队列中。半连接队列原创 2021-10-01 00:09:39 · 1556 阅读 · 1 评论 -
Linux中进程通信
进程之间需要通信,主要有以下方式:1、信号量生产者-消费者模型就是通过信号量来通信,当一个进程需要其他进程完成操作后才能执行的时候,就自我阻塞,进入睡眠状态。当其他进程完成操作后,会像进程发送信号,进程会被唤醒,然后继续执行。2、管道匿名管道管道就是在内核中开辟的一块缓存,提供了两个文件描述符,一个用于写入,一个用于读取。然后将进程fork,子进程会复制对应的FD,然后将父进程的读端关闭,子进程的写段关闭,就可以进行通信了。命名管道命名管道引入了路径的概念来标识一个管道,就是给管道起了一个原创 2021-09-28 21:15:37 · 113 阅读 · 1 评论 -
Linux中进程管理
进程结构我们都知道 进程就是动态的程序。一个程序想要转化为进程运行,首先要经过编译、动态链接,形成一个ELT,二进制可执行文件。然后将ELT文件装配到内存中。下图是进程的所有信息,相关信息是存在内核空间中的,是由内核程序统一管理的。上图就是一个进程要在内核中保存以上的所有信息。一个进程对应一个task的结构,然后通过链表或者红黑树的形式来将所有的进程组合起来。操作系统内核就依靠链表或者红黑树来进行进程调度。上述的管理信息保存在内核空间中,用户空间中保存具体的栈、MMAP、代码等信息下图是用原创 2021-09-28 19:42:05 · 180 阅读 · 1 评论 -
Linux文件系统
Linux中文件管理原创 2021-09-27 22:35:14 · 368 阅读 · 1 评论 -
大端和小端
存储器的一个存储单元一般为1个字节。那么一个 4字节 的int变量,需要4个存储单元来存储,在存储单元中怎么存储呢?有两种存储方法,分为为大端和小端大端就是 低地址中存储高位小端就是 低地址中存储低位...原创 2021-09-24 20:42:15 · 68 阅读 · 1 评论