![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Linux历程
文章平均质量分 87
合抱之木,生于毫末;九层之台,起于垒土。
抱猫人
这个作者很懒,什么都没留下…
展开
-
UNIX环境编程-文件纪要
例如,当程序文件的所有者是超级用户时,设置文件的该权限位后,当程序文件被一个进程执行时,该进程具有超级用户的权限。有一个值为O_SYNC的文件状态(可以跳过缓存,一般数据库程序就会用到),使得每次write文件时,都需要等待数据实际写到磁盘上才返回(未设置该状态的情况下write采用的是延时写策略)。当文件设置的偏移量超过文件的大小,并写入一些数据后,就会造成文件空洞(文件空洞要结合文件在磁盘上存放在不连续的块中来理解)。表示获取或设置文件状态(文件表项中的文件状态标志,包括只读、只写、读写、异步等等)。原创 2024-01-12 09:34:53 · 879 阅读 · 2 评论 -
UNIX环境编程-进程纪要
伪终端,指的是对一个应用程序而言,它看上去像一个终端,但事实上它并不是一个真正的终端。IO复用配合非阻塞IO可以在一定程度上提升效率,但是会大大增加编码的难度(需要充分考虑接受数据时缓冲区的问题),使用IO复用配合多线程更好(视情况而定)。信号排队:在信号屏蔽期间,如果信号多次被递送到进程,则对于不支持排队的信号来说,只会对信号处理一次;并且在函数返回时恢复之前的信号屏蔽字(mask临时设置信号屏蔽字)。由于第3步和第4步不是原子的,则有可能在3、4步之间发生信号的丢失,第4步将永久等待下去。原创 2024-01-12 09:34:29 · 963 阅读 · 0 评论 -
UNIX网络编程-纪要
stdio库带有缓冲区,例如,文件有数据可读时(select准备就绪),使用stdio读取数据,文件中有2条数据,2条数据都已经读到了stdio的缓冲区,但是使用时只用到了第一条数据,用完之后继续使用select去等待数据可读,这时select不会管缓冲区中是不是还有数据,而是继续去等待数据可读(因为之前数据都读出来了放在缓冲区了,这里可能会一直阻塞)。),客户端使用ipv4数据报(因为是双协议栈主机,所以主机也有ipv4地址),服务端会将数据报中的ipv4地址映射为ipv6地址(下图虚线)。原创 2024-01-12 09:33:46 · 903 阅读 · 0 评论 -
linux内核之进程管理
进程管理进程理解进程(最小分配资源的单位)理解线程(最小执行资源的单位)进程描述符及结构进程描述符的存放进程的状态进程上下文进程家族树进程的创建线程在linux中的实现内核线程进程的退出进程的调度多任务调度策略进程优先级时间时间片Linux调度算法CFS(完全公平调度)实时调度策略抢占和上下文切换进程理解进程(最小分配资源的单位)进程就是处于执行期的程序(目标码存放在某种介质上)。但进程并不仅仅局限于一段可执行程序代码,通常还包含其他资源,像打开的文件、挂起的信号、内核内部数据、处理器的状态等、一个或原创 2023-03-28 15:47:41 · 392 阅读 · 0 评论 -
linux内核之时钟管理
但是高节拍率也意味着系统的负担增重,因为处理器必须花更多的时间来处理时钟中断处理程序,这样会引起处理器处理其他工作的时间更少,频繁打乱处理器高速缓存以及增加耗电等问题。系统定时器是一种可编程硬件芯片,它能以固定的频率产生中断(即定时器中断),它所对应的中断处理程序(时钟中断)负责更新系统时间,以及负责执行需要周期性运行的任务。相对于事件驱动而言,内核中有大量的函数都是基于时间事件驱动的,例如周期性执行的函数,或者延时执行的函数。(3)统计系统资源消耗统计值(进程消耗的系统时间和用户时间)原创 2023-03-28 15:48:51 · 410 阅读 · 0 评论 -
linux内核之中断
中断中断异常中断处理程序上半部和下半部重入和中断处理程序中断上下文中断处理机制的实现中断控制下半部和推后执行工作不同的下半部方法中断任何操作系统内核的核心任务,都包含了对连接到计算机上的硬件设备进行有效管理,如硬盘、鼠标、键盘等。而想管理这设备,首先要能和它们互相通信才行。众所周知,处理器的速度跟外围硬件设备的速度往往不是一个数量级的,因此如果让处理器在发出一个请求后,专门等待响应,显然是不合理的。为了协同和这些外围设备的工作而又不降低机器的整体性能,使用了中断机制:让硬件在需要的时候再向内核发送信号。原创 2023-03-28 15:46:42 · 758 阅读 · 0 评论 -
linux内核之内核同步
当处理多处理器之间或硬件设备之间的同步问题时,有时需要在程序中以指定的顺序发出读内存和写内存的指令(指令的指令要按照特定的顺序)。但是为了提高效率,编译器或处理器可能会对程序指令重新排序(例如,处理器在执行指令期间,会在取指令和分派时,把表面上看上去无关的指令按照自认为最好的方式排序)。在读取数据前后,序列值都会被读取,如果读取的序列值相同,则说明读操作过程中没有新的数据写入。如果在中断处理程序中使用了自旋锁,那么,在其他地方获取锁之前(例如,可以被中断的进程上下文中),需要先禁止本地中断。原创 2023-03-23 17:44:54 · 342 阅读 · 0 评论 -
linux内核之基础
算法内容:设置多个就绪队列,优先级从高到低,时间片从小到大;新进程进入队列时,先在第一级队列,按FCFS分时间片,按照分配的时间片,若进程没有执行完,则将剩余任务移到二级、三级队列;算法内容:按照进程达到就绪队列的顺序,轮流分配一个时间片去执行,时间用完就剥夺执行权。算法内容:结合FCFS和SJF,综合考虑等待时间和服务时间计算响应比,高的优先调度。- 公平、响应快,适用于分时系统,进程在一定时间内都能得到响应。- 长作业等待时间越久,响应比越高,越容易获得执行权。算法内容:优先级高的作业/进程优先进程。原创 2023-03-23 17:38:56 · 291 阅读 · 0 评论 -
linux内核之系统调用
API定义了一组应用程序使用的编程接口,它们的实现可以使用一个或多个系统调用,甚至是完全不使用任何系统调用也没有问题。用户空间的程序无法直接执行内核代码,所以应用程序应该以某种方式通知内核,告诉内核自己需要执行一个系统调用,希望内核切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用了。通过这样一个独一无二的号,进程在执行系统调用时就无须提及系统调用的名称。从纯技术的角度看,POSIX是由IEEE组成的一套标准,其目标是提供一套大体上基于Unix的可移植操作系统标准。两者就是密不可分,互相使用。原创 2023-03-23 17:37:47 · 158 阅读 · 0 评论 -
linux内核之内存管理
虽然处理器的最小可寻址单位是字,但是内存管理单元(MMU,将虚拟地址转为物理地址的硬件)通常以页为单位进行处理(一般为32位系统为4k,64位系统为8k,如果页为4k,物理内存为1G,则物理内存会被划分为1G/4k=262144个页,这些页信息通过page结构体全部保存在内存中)。按照如上直接映射的方式,会发现内核只能访问1G的内存,但我们的物理内存实际上会达到8G、16G,甚至更高,所以必须要有一种灵活的方式来让内核访问到全部的物理内存,因此linux高端内存十分必要。这也是用户空间分配方式。原创 2023-03-23 17:30:16 · 411 阅读 · 0 评论 -
linux内核之虚拟文件系统
所以在VFS和内核的其他部分来看,所有文件系统都是相同的(比如说,它们都支持文件和目录的概念,都有打开、读取、关闭的操作)。理解:VFS采用的是面向对象的思想,实际文件系统的类型可能不同,但是都需要实现VFS提供的回调的接口来满足VFS需要实现的目的。文件的相关信息,例如访问权限、大小、创建时间等,被称为文件的元数据,被存储在单独的数据结构中,该结构被称为索引节点(inode)。在Unix中,目录也属于普通文件,它列出了包含在其中的所有文件,可以对目录执行和文件相同的操作。原创 2023-03-22 11:20:00 · 376 阅读 · 0 评论 -
linux内核之块IO层
使用缓冲区头作为IO操作单元有两个弊端:缓冲区头是一个很大且不受控制的结构体(上面的是已经缩减过的),而且缓冲区头对数据的操作既不方便也不清晰,对内核来说,它更倾向操作页面(内存章节中讲到分配内存时按页分配),页面比缓冲区大,效率更高,同时更为简单;块是文件系统最小逻辑可寻址单元(物理磁盘的最小单位是扇区,但是内核执行的所有磁盘操作都是基于块来进行的),对于块单位的要求是:数倍于扇区,2的整数倍,并且要小于页面大小,所以通常块的大小为512、2k、4k。该调度程序就是最轻量级的调度,只提供指向合并的功能。原创 2023-03-22 11:21:21 · 303 阅读 · 0 评论 -
linux内核之进程地址空间
这里的每个内存区域指的的单个进程中不同的内存区域,例如,代码区、全局变量区等,具体见上面的地址空间。内存寻址缓冲器,TLB作为一个将虚拟地址映射到物理地址的硬件缓存,当请求访问一个虚拟地址时,处理器将首先检查TLB中是否缓存了该虚拟地址到物理地址的映射,如果在缓存直接命中,物理地址立即返回,否则,就需要再通过页表搜索需要的物理地址。在多数体系结构中,搜索页表的工作是由硬件完成的,虽然通常操作中,很多使用页表的工作都可以通过硬件来执行,但是只有在内核正确设置页表的前提下,硬件才能方便地操作它们。原创 2023-03-22 11:16:10 · 328 阅读 · 0 评论 -
页高速缓存
在页高速缓存中的页可能包含了多个不连续的物理磁盘块,也正是由于页面中映射的磁盘块不一定连续,所以在页面高速缓存中检查特定数据是否已经被缓存颇为困难,因为不能用设备名称和块号来做页高速缓存中的索引。当我们发起一个对操作时(例如,进程调用read),它首先会检查需要的数据是否在页缓存中,如果在,则放弃访问磁盘,直接从内存中读取。(3)回写,linux采用的策略,程序执行写操作直接写到缓存中,后端存储不会立刻更新,而是将缓存页更新为脏页,并将其加入到脏页链表中,然后由一个进程周期性的将脏页写回磁盘。原创 2023-03-22 11:14:21 · 306 阅读 · 0 评论 -
GDB程序调试
GDB(GNU Debugger)是GCC的调试工具。其功能强大,现描述如下:启动程序,可以按照你的自定义的要求随心所欲的运行程序。可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)当程序被停住时,可以检查此时你的程序中所发生的事。动态的改变你程序的执行环境。一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。原创 2023-03-22 11:11:41 · 611 阅读 · 0 评论 -
网络编程示例程序
由于客户端不需要固定的端口号,因此不必调用bind(),客户端的端口号由内核自动分配。注意,客户端不是不允许调用bind(),只是没有必要调用bind()固定一个端口号,服务器也不是必须调用bind(),但如果服务器不调用bind(),内核会自动给服务器分配监听端口,每次启动服务器时端口号都不一样,客户端要连接服务器就会遇到麻烦。原创 2023-03-22 11:10:08 · 157 阅读 · 0 评论 -
Linux系统编程
任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)。(1)调用进程不能是进程组组长(否则创建会话函数会出错),该进程变成新会话首进程(session header),并且该进程成为一个新进程组的组长进程(组长进程不能成为新会话首进程,新会话首进程必定会成为组长进程)。原创 2023-03-22 11:09:15 · 90 阅读 · 0 评论 -
linux网络编程
而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉了,如果因为网络故障丢失了数据包或者丢失了对方发回的ACK段,经过等待超时后TCP协议自动将发送缓冲区中的数据包重发。因此一般使用下面这行代码循环读数据。原创 2023-03-22 11:06:45 · 770 阅读 · 0 评论 -
linux基础知识
对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH段 —> 环境变量LD_LIBRARY_PATH —> /etc/ld.so.cache文件列表 —> /lib/, /usr/lib目录找到库文件后将其载入内存。(2)定时任务的环境变量是单独配置,如果你的可执行程序依赖环境变量(例如环境变量设置了动态库路径)或者是你的脚本依赖环境配置,此时需要在定时任务前单独配置下,一般加在任务脚本中;0代表标准输入,1代表标准输出,2标准错误,都是文件描述符;原创 2023-03-22 11:07:55 · 127 阅读 · 0 评论 -
字符串匹配处理
sed是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。原创 2023-03-22 11:07:05 · 1480 阅读 · 0 评论 -
linux内存分配器
内存分配器开源社区现有内存分配器(Memory Allocator)的种类:第一个被广泛使用的通用动态内存分配器,dlmallocglibc内置内存分配器的原型,ptmallocFreeBSD & Firefox使用的分配器,jemallocGoogle贡献的分配器,tcmallocSolaris所用的分配器…glibc内存分配ptmallocptmalloc的前身是dlmalloc,在dlmalloc的基础上,它支持了多线程内存分配。在dlmalloc中,所有线程都公用同一原创 2021-07-12 08:37:44 · 1816 阅读 · 0 评论 -
Linux下动态链接库版本管理及查找加载方式
linux下动态库链接版本管理转载 2023-02-28 17:22:43 · 1244 阅读 · 0 评论 -
linux内核之内存寻址
内存地址理解内存地址1.内存地址的分类逻辑地址线性地址(虚拟地址)物理地址2.三种内存地址之间的转换内存控制单元(MMU)通过一种称为分段单元的硬件电路将一个逻辑地址转换为线性地址;紧接着通过第二个分页单元把线性地址转换为物理地址。硬件分段Intel微处理器以两种不同的地址模式运行,分别是实模式和保护模式,实模式一般是为了兼容早期的模型,现在我们从保护模式来看硬件中的分段问题。1.一个逻辑地址由两部分组成段标识符段标识符又称段选择符,是一个16位的字段,如下图:段内原创 2022-03-17 11:00:21 · 1586 阅读 · 1 评论 -
Linux运维工具
linux运维Linux系统运维工具sar(System Activity Reporter)sar参数sar例子CPU资源监控inode、文件和其他内核监控内存和交换空间监控内存分页监控I/O和传送速率监控进程队列长度和平均负载状态监控系统交换活动信息监控设备使用情况瓶颈问题iostat(I/O statistics,输入输出统计)iostat命令iostat例子显示所有信息显示磁盘详细信息iostat数据来源iostat的缺陷vmstatvmstat参数vmstat使用显示所有信息pidstatpids原创 2021-12-17 17:07:05 · 600 阅读 · 0 评论 -
Linux Socket发送/接受类函数
write函数和read函数writev函数和readv函数send函数和recv函数sendto函数和recvfrom函数sendmsg函数和recvmsg函数原创 2021-10-26 17:28:03 · 1040 阅读 · 0 评论 -
linux线程同步
互斥锁/** 互斥锁有四种属性:* PTHREAD_MUTEX_TIMED_NP,缺省值,普通锁;* PTHREAD_MUTEX_RECURSIVE_NP,可重入锁,允许同一个线程对同一个锁获取多次,并通过多次unlock解锁,可递归;* PTHREAD_MUTEX_ERRORCHECK_NP,如果同一个线程请求同一个锁多次,会返回EDEADLK,可规避死锁;* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,在多核情况下,首先自旋获取锁,若超过了自旋次数的最大值则会阻塞挂起;*/原创 2021-10-25 16:19:55 · 60 阅读 · 0 评论 -
linux/macos获取路由信息
netlink什么是netlink?netlink是linux提供的用于内核和用户进程之间的通信方式。虽然Netlink主要用于用户空间和内核空间的通信,但是也能用于用户空间的两个进程通信。一般来说,用户进程和内核空间通信的方式有三种:/proc、ioctl、netlink;前两种是单向的,netlink可以实现双工通信。每个netlink协议,通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空原创 2021-10-20 16:32:58 · 1113 阅读 · 0 评论 -
VMWare三种网络配置
1.bridged(桥接模式)在这种模式下,使用VMnet0虚拟交换机,虚拟操作系统就像是局域网中的一台独立的主机,与宿主计算机一样,它可以访问网内任何一台机器。在桥接模式下,可以手工配置它的TCP/IP配置信息(IP、子网掩码等,而且还要和宿主机器处于同一网段),以实现通过局域网的网关或路由器访问互联网;还可以将IP地址和DNS设置成“自动获取”。使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。理原创 2021-09-02 10:15:55 · 1167 阅读 · 0 评论 -
理解WebSocket
1原创 2021-08-24 20:29:09 · 2099 阅读 · 2 评论