内核态和用户态
用户态模式下只能执行部分指令,不能访问硬件资源
进程和线程: 进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
协程:一种用户态的轻量级线程,其调度完全由用户程序控制。有独立的栈,但和其他协程共享堆内存。
协程之间切换开销很小,无需内核态的上下文切换,适合高并发
软链接 与 硬链接:
硬链接 保存了一个指针,指向对应文件inode
软链接创建新的文件,保存对应文件的路径
为什么进程崩溃不会对其他进程产生很大影响?进程有独立的内存空间,崩溃后会被OS回收
有了进程,为什么还设计个线程?
1.线程适合并发运行 2. 同一个进程里的线程共享内存资源
进程切换比较线程切换,多了内存映射表,文件描述符,全局变量等的开销
线程切换的详细过程:
1. 上下文保存 2.调度器选择下一个线程,加载上下文 3.切换线程
进程上下文:寄存器,程序计数器,堆栈指针;
一般存储在进程的pcb中
进程通信的方法:
管道,注意管道都是存在内核缓冲区,不在文件系统
消息队列(内核中的一个链表),
共享内存:两片虚拟内存映射到同一片物理地址(需要同步机制
socket
说几个同步机制,保证线程安全 :互斥锁,,自旋锁,
条件变量(condition): 一种等待/通知机制,与互斥锁一起用
信号量: 一个计数器
讲讲乐观锁:对于共享资源不加锁,而是判断是否版本匹配,匹配就更新,否则等待一会,直到拿到锁;(cas操作
死锁:
产生条件:互斥,持有与等待,不可剥夺,循环等待
解决:
方案一:超时释放(破坏不可剥夺条件)
synchronized直接PASS,这玩意请求不到就阻塞。因此我们需要的是可以手动释放锁的LOCK进行释放锁。可以直接使用tryLock中的超时时限用来释放锁。
方案二: 按计划好的顺序获取锁(破坏环路等待条件)
内存碎片:
1. 内部碎片: 分配给进程但没有使用的内存(分页)
2.外部碎片:没有分给进程但无法使用的内存,原因是空闲的内存不连续,无法分配(分段)
页表:
存储在内存中,每个进程有独立的页表
分页机制下,虚拟地址包括页号,偏移量
⚠️CPU中的页表基地址寄存器,指向当前运行进程的页表
现代操作系统对内存采用段页管理,虚拟地址包括段号,页号,偏移量
多级页表减少内存占用的主要原因在于:
只有在实际需要时才分配页表,不需要时页表项为空,而不是为整个虚拟地址空间预留页表项
网络io
异步io
多路复用io比较阻塞io,一个线程处理多个io操作,更好的并发性能,更少的开销
ls -l drwxr--r--
三个部分 当前用户,群组,其他用户
chmod 777 a
r=4, w=2 , x=1
7=4+2+1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!