内存、典型锁、相对地址、内存覆盖、守护进程、孤儿进程、僵尸进程、局部性原理
内存与其作用:
内存是用于存放数据的硬件,程序执行前需要 先放到内存 才可以被CPU处理
典型的几种锁:
读写锁:
🔴 多个读者可以同时进行读
🔴 写者必须互斥(只允许一个写者写,也不能读者、写者同时进行)
🔴 写者优先于读者(一旦有写者,后续读者必须等待,唤醒时优先考虑写者)
自旋锁(spin):
进程、线程无法取得锁,不会立即放弃CPU时间片,一直循环尝试获取锁,直到获取为止,如果别的线程长期占有锁,自选则是在浪费CPU做无用功,自旋锁一般应用于加锁时间很短的场景。
互斥锁(mutex):
一次只能有一个线程拥有互斥锁,其他线程等待。
抢锁失败放弃CPU进入睡眠,等待锁的状态改变,操作系统负责线程调度,(锁要交给操作系统管理),互斥锁在加锁操作涉及上下文切换,加锁时间大概 100ns
互斥锁一般先自旋一段时间,自旋超过阈值投入睡眠,因此并发运算种使用互斥锁(每次占用锁时间很短)效果不亚于使用自旋锁。
条件变量(cond):
互斥锁缺点只有:锁定和非锁定,而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,常与互斥锁一同使用。
条件不满足时,线程往往解开相应的互斥锁并阻塞线程然后等待条件变化,一旦其他线程改变了条件变量,将通知相应的条件变量唤醒一个或多个被此条件变量阻塞的线程。
互斥锁是线程间的互斥的机制,条件变量则是同步机制。
逻辑地址(相对地址)与物理地址(绝对地址):
编译时仅需要确定变量x存放的相对地址是100(进程在内存中起始地址而言的地址)。CPU找到x在内存中实际存放的地址,只需要进程的 起始地址 + 100。
内存覆盖:
🔴 程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成为一个固定区和若干个覆盖区。
🔴 活跃的部分放在固定区,其余部分按照调用关系分段,将那些即将要访问的段放入覆盖区,其他段放在外存中
🔴 在需要调用前,系统将其调入覆盖区,替换覆盖区中原有的段。
覆盖技术的特点:
打破了必须将一个进程的全部信息装入内存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。
终端退出后终端运行的进程:
终端在退出时会发送SIGHUP给对应的bash进程
bash进程收到信号后首先将其发送给session下面的进程
如果程序没有对SIGHUP信号特殊处理,进程会随着终端关闭而关闭
守护进程:在后台运行,独立于控制终端,周期性的执行某种任务,Linux大多数服务器就是守护进程,例如web服务器的http
创建守护进程:
🔴 程序后台运行,调用 fork()产生一个子进程,父进程退出。
🔴 调用 setsid(),创建一个新对话(控制终端、登录会话和进程组通常从父进程继承),调用 setsid()使此进程成为一个会话组长,与原先一系列(终端、会话、进程组)脱离。
🔴 禁止进程重新打开终端。此进程已经成为一个无终端的会话组长,但可以重新申请打开一个终端,再一次fork()创建新子进程,使调用fork()的进程退出。
🔴 关闭不再需要的文件描述符,子进程从父进程继承打开的文件描述符,不关闭会浪费资源,首先获取最高文件描述符值,然后循环关闭 0 到最高值的文件描述符
🔴 将当前目录改为根目录
🔴 子进程从父进程继承的文件创建屏蔽字可能会拒绝某些许可权,使用umask(0)将屏蔽字清零。
🔴 处理SIGHLD信号。对于服务器进程,请求到来时往往生成子进程处理请求,如果子进程等待父进程捕获,子进程将成为僵尸进程,将SIGHLD信号设置为SIG_IGN,不会产生僵尸进程。
孤儿进程:
父进程退出,它的(一或多)子进程还在运行,变为孤儿进程。孤儿进程将被init进程(进程号为1)收养,init对其完成状态收集工作。
僵尸进程:为了维护子进程的信息(进程ID、进程终止状态、CPU时间)
子进程退出,父进程还没退出,子进程必须等到父进程捕获到了子进程的退出状态才算真正结束,否则此时的子进程变为僵尸进程。
局部性原理:分为时间局部性和空间局部性。
🔴 时间局部性:如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
🔴 空间局部性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。(因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)