Linux总结

1. linux操作系统的大致总体架构

Linux 从上到下分为应用层、C 库、系统调用、内核、硬件 五层。应用程序运行在用户态,通过系统调用进入内核,内核负责进程管理、内存管理、文件系统、设备驱动、网络协议栈

2. 虚拟地址空间

它是操作系统给进程画的大饼,让程序以为占据了整个内存。通过页表实现虚拟地址到物理地址转换。其中,从在物理地址中存储位置可能是不连续的,但从虚拟地址看就是连续的;提高安全性,当想修改常量时看页表权限就可以直接拒绝该操作;减轻内存压力,可以只加载部分代码和数据到内存,当发生缺页中断后在向内存中添加。

当虚拟内存使用量大于物理内存时,操作系统会使用 Swap 交换分区 ,将物理内存中最近最少使用的页面换出到硬盘。

3. 软链接和硬链接

软链接:相当于创建了一个快捷方式,它里面存了一个"路径字符串"。

硬链接:在linux中,文件名不是文件本身,inode才是。硬链接就是给inode在起一个名字,它可以节省空间,同一个文件,不需要多备份,多个名字,共享一份数据;防止误删。但是它不能链接目录,以免出现目录循环。

4. 缓冲区

缓冲区是为了提高计算机运行效率,因为内存的访问速度比硬件要快很多。

'\n':换行,正常刷新(如果是行刷新内容才会内核,全缓冲只会换行)

endl:换行,强制刷新(不管是哪种刷新方式,内容都会到内核)

5. 符号表

符号表用于记录函数名、变量名,它们在内存/文件中的地址。在编译时遇到了一个函数,会在符号表里记录该函数未定义,

链接时,去找该函数地址并填进去(该过程叫符号解析/符号冲定位)。

运行时,加载动态库时,也要查符号表,把函数地址存进去。

6. 写时拷贝

在fork之后,父进程和子进程会共享大部分内存空间(像内存空间、文件描述符、环境变量等),这样做是为了减少内存占用和拷贝的开销。当任意一方进程修改数据时,才会新开辟空间用于存储当前进程所修改之后的数据。

7. 僵尸进程/线程

父进程没有回收子进程。僵尸进程会占少量内核资源(进程表项),如果堆积太多会造成无法创建进程,它没有执行体。它发生在子进程退出之后到父进程获取到退出信息之前,再次期间它无法被kill杀掉(kill是向运行中的进程发送信号,它没有可执行体)。当子进程退出会发送SIGCHLD信号,父进程注册该信号的处理函数。

pthread_jion等待线程并回收它,防止出现僵尸线程,实现线程的重要手段,只能阻塞式等待。

8. 进程/线程是什么,有什么用,线程有什么好处

进程:当一个程序被加载到内存,并分配了PCB(进程控制块,用于标识该进程)那么就变为了进程,它是操作系统中资源分配基本单位。独立资源

线程:进程内部的小执行流,共享大部分资源(每个线程都有自己独立的栈,id等)。在linux中没有线程这一概念,是用轻量级进程代替的。是操作系统中调度基本单位。可以实现程序干多件事,且切换快,开销小(虚拟地址空间,页表,CPU缓存都不用换)。

9. 多进程/多线程

多进程:各自独立,安全(一个崩了,不影响其他的),但是创建/切换/销毁慢,数据不共享,要通信必须用IPC。多用于稳定、隔离要求高的场景。

多线程:共享大部分资源,创建/切换/销毁快,但是不安全(一个崩了,整个进程就崩了),需要加锁。多用于高并发、高性能的场景。

10. 信号量/条件变量

条件变量:解决线程之间的协作(如必须生产完在消费),要配合锁来使用。核心是 "等待 / 唤醒特定条件满足的线程"。

信号量:解决有限数量资源的访问,它自身就有计数器,核心是计数。

11. 线程安全

多线程操作共享资源时,无论线程的执行顺序、调度方式如何,程序都能始终输出正确的结果,且不会出现数据错乱、崩溃、死锁等问题。

12. 死锁

两个或多个进程 / 线程在并发执行时,因互相持有对方所需资源、又都不释放自身资源,导致彼此无限等待、无法推进的僵局。

产生死锁的四个必要条件:

  1. 互斥条件:资源同一时间只能被一个线程持有
  2. 请求并保持:线程持有部分资源,又申请新资源,且等待的时候不释放已占资源
  3. 不可剥夺:已分配的资源只能让持有者释放,不能被强行剥夺
  4. 循环等待:线程间形成资源等待闭环(如p1等p2,p2等p1)

想解决死锁一般是破坏循环等待,给所有资源 / 锁分配全局序号,强制按固定顺序申请。

其他

页表是页和页框的映射关系表

IO是对外设就行输入和输出

重定向改变程序默认输入/输出的文件

exit在程序结束时会将用户缓冲区的内容刷新到内核中,而_exit不会

相关推荐
tg_xianheyun21 小时前
CDN节点分布如何影响网页加载速度和用户体验
服务器·cdn加速·全球访问优化
lsh曙光21 小时前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫21 小时前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝21 小时前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR12345678821 小时前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8351 天前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_1 天前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁1 天前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
龙仔7251 天前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪1 天前
嵌入式Linux----网络通信
linux·运维·服务器