LOADING

加载过慢请开启缓存,浏览器默认开启

interview - linux

2023/3/23 interview linux

linux 读写文件的过程

清楚一点,linux的进程里维护了一张当前已经打开的文件描述符表

而系统维护了另外两张表:

1.打开文件表

2.inode表

类型 过程
读文件 1.进程调用库函数向内核发起读文件请求
2.内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项
3.调用该函数的可用系统调用函数read()
4.read()函数通过文件表项链接到目录项模块,根据传入的文件路径,在目录项模块中检索,找到该文件的inode
5.在inode中,根据文件内容偏移量计算出要读取的页
6.通过inode找到文件对应的address_space
7.在address_space中访问该文件的页缓存树,查找对应的页缓存节点,若页缓存命中,那么直接返回文件内容,若丢失,那么就是缺页一场,创建一个页缓存页,然后通过inode找到对应的磁盘地址,读入内存
写文件 前5步和读一致
如果页缓存命中,直接把文件内容修改更新在页缓存的页中。写文件就结束了。这时候文件修改位于页缓存,并没有写回到磁盘文件中去;
如果页缓存缺失,那么产生一个页缺失异常,创建一个页缓存页,同时通过inode找到文件该页的磁盘地址,读取相应的页填充该缓存页。此时缓存页命中,进行第6步。
一个页缓存中的页如果被修改,那么会被标记成脏页。脏页需要写回到磁盘中的文件块。有两种方式可以把脏页写回磁盘:1)手动调用sync()或者fsync()系统调用把脏页写回
(2)pdflush进程会定时把脏页写回到磁盘
同时注意,脏页不能被置换出内存,如果脏页正在被写回,那么会被设置写回标记,这时候该页就被上锁,其他写请求被阻塞直到锁释放。

kill 9 和kill 15的区别

kill -9会强制终止进程,无论进程是否愿意终止,它会立即杀死进程并释放资源。这是一种非常强硬的方法,可能会导致进程无法正常清理和关闭。因此,使用kill -9命令应该是最后的手段。

kill -15会向进程发送一个终止信号(SIGTERM),通知进程要求它自行关闭。这个信号会给进程一个机会来完成清理工作和资源释放等工作。如果进程不响应,可以再使用kill -9强制终止。使用kill -15可以更加温和地关闭进程,允许进程进行清理和关闭。

僵尸进程,孤儿进程以及其解决方式

类型 特点 解决方式
僵尸进程 是指一个进程使用fork函数创建子进程,如果子进程退出,而父进程并没有调用wait()或者waitpid()系统调用取得子进程的终止状态,那么子进程的进程描述符仍然保存在系统中,占用系统资源 1.在fork子进程之后我们都要及时使用wait系统调用。2.使用kill命令
孤儿进程 是指一个父进程退出后,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程 init进程会定期处理

区别:孤儿进程是父进程已退出,子进程未退出;而僵尸进程是父进程未退出,子进程已退出。

sync和fsync

类型 特点
sync 将文件系统缓存中的所有数据写入磁盘,包括文件数据和元数据,但并不会强制磁盘进行写入操作。这意味着,一些磁盘可能只是将数据缓存到了它们的缓冲区中,并没有真正写入磁盘。因此,使用sync命令不能完全保证数据的持久化。
fsync 命令将文件系统缓存中指定文件的数据写入磁盘,并强制磁盘进行写入操作。这样,fsync可以保证写入的数据已经被持久化,并可以在系统发生故障时恢复。但是,由于fsync需要等待数据写入磁盘,因此它的执行速度比sync慢。

sync适用于在执行重要操作之前,刷新文件系统缓存;而fsync适用于在写入文件后,保证文件已经被持久化。fsync可以提供更高的数据可靠性,但是需要付出更高的性能代价。

文件IO

1.打开文件 fopen

2.fread/fwrite用于二进制读写

3.fscanf/fprintf 用于文本数据的读写

4.fseek用于移动文件指针的位置

linux进程调度

Linux内核使用的进程调度算法是基于时间片轮转的多级反馈队列调度算法。

在这种算法中,所有可运行的进程被分成多个优先级队列,每个队列具有不同的时间片大小,高优先级队列的时间片更短,低优先级队列的时间片更长。当一个进程运行完它的时间片后,它被放回到它所在的队列的末尾,如果该队列有更高优先级的进程,则该进程会被挂起,而更高优先级的进程会被调度运行。

当一个进程在队列中等待了一段时间后,它的优先级会下降,这样它就有更长的时间片来运行,而且也能避免出现饥饿现象。Linux内核的进程调度器也会使用一些其他的策略,例如进程优先级、CPU利用率等,来决定进程的调度顺序。

需要注意的是,Linux内核的进程调度器是可配置的,可以使用不同的调度算法来适应不同的场景和需求。

linux零拷贝

零拷贝的原理

一般来说,传统的数据传输方式需要经过多次数据拷贝:应用程序将数据写入到应用程序内部的缓冲区中,然后通过操作系统内核将数据拷贝到操作系统内核缓冲区中,最后通过网络设备将数据拷贝到网络设备的缓冲区中。这种方式虽然简单易懂,但是会造成数据的多次拷贝,消耗大量的CPU和内存资源,导致系统性能下降。

零拷贝技术的实现方式是通过操作系统提供的文件映射机制,将磁盘文件直接映射到应用程序的内存空间中,避免了将数据从磁盘文件复制到内存中的过程。在网络传输过程中,应用程序可以将数据直接从内存中发送到网络设备的缓冲区中,而不需要将数据从内存中复制到操作系统内核缓冲区中,避免了一次额外的数据拷贝。

另外,零拷贝技术还可以通过在网络接口卡上实现TCP/IP协议栈,避免将数据从网络接口卡缓冲区复制到内核缓冲区的过程,从而减少了数据拷贝的次数。

总之,零拷贝技术的原理就是通过减少数据在内存中的拷贝次数,来提高数据传输的效率和性能。