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不会

相关推荐
Albert Edison2 小时前
【ProtoBuf 语法详解】Any 类型
服务器·开发语言·c++·protobuf
-ONLY-¥2 小时前
LNMP架构部署实战全解析
linux
鬓戈2 小时前
SeaweedFS集群上文件遍历和删除
运维·python
百结2142 小时前
Nginx核心功能
运维·nginx
AMoon丶3 小时前
C++模版-函数模版,类模版基础
java·linux·c语言·开发语言·jvm·c++·算法
ryan007liu3 小时前
shell 批量执行locust 脚本压测
linux·服务器·压力测试
糟糕喔3 小时前
harbor私有仓库搭建
运维·docker·云原生·容器·kubernetes
KeepSeek3 小时前
大数据运维(1)
大数据·运维
AMoon丶4 小时前
Golang--多种数据结构详解
linux·c语言·开发语言·数据结构·c++·后端·golang