随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

内核态和用户态

  用户态模式下只能执行部分指令,不能访问硬件资源

 

进程和线程:  进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位

协程:一种用户态的轻量级线程,其调度完全由用户程序控制。有独立的栈,但和其他协程共享堆内存。

    协程之间切换开销很小,无需内核态的上下文切换,适合高并发

 

软链接 与 硬链接:

  硬链接 保存了一个指针,指向对应文件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

posted on   towboat  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示