操作系统

  • 2.5w字 + 36 张图爆肝操作系统面试题,太牛逼了!

  • 32位系统和64位系统有什么区别?C++中32位和64位有什么区别?(同花顺提前批) 计算机基础----32位操作系统和64位操作系统的区别、C++那些细节–32位64位数据类型的区别
    1)支持的内存不同
    a、32位:最多支持4G的内存
    b、64位:支持4G 8G 16G 32G 64G 128G 256G内存,理论上可以无限支持,只要主板上有足够的内存条
    2)支持的处理器和软件不同
    a、32位:能完全支持64位的处理,支持基于32位的软件,不能运行64位的软件
    b、64位:支持基于64位的处理器,两种类型软件都支持
    3)C++数据类型大小不同
    a、32位:指针大小为4byte,可以表示2^32,string类型为28byte
    b、64位:指针大小为8byte,可以表示2^64,string类型为32byte,相差了一个指向字符串开头的指针

  • 虚拟内存 20 张图揭开「内存管理」的迷雾,瞬间豁然开朗
    1)虚拟内存的作用?
    a、虚拟内存:我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
    b、物理内存:实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
    c、机制和作用:操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,这样不同进程访问地址不会冲突。
    2)页表在哪里?
    页表实际上存储在 CPU 的内存管理单元 (MMU)
    3)如何判断逻辑地址是否已经映射在物理地址上?
    无缺页中断

  • 缺页中断何时发生? 详解缺页中断-----缺页中断处理(内核、用户)
    1)编码错误:当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程。
    2)缺页中断:当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断。
    3)内存调用:当使用malloc或mmap等希望访问物理空间的库函数或系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将产生缺页中断;若先进行读操作,将被映射给默认的零页,等再进行写操作时,仍会产生缺页中断,这次必须分配1物理页了,进入写时复制的流程。
    4)Fork函数:当使用fork等系统调用创建子进程时,子进程不论有无自己的vma,它的vma都有对于物理页的映射,但它们共同映射的这些物理页属性为只读,即linux并未给子进程真正分配物理页,当父子进程任何一方要写相应物理页时,导致缺页中断的写时复制。

  • 缺页中断处理流程? 缺页中断处理过程、操作系统—(35)缺页中断与缺页中断处理过程
    1)保存现场:首先硬件会陷入内核,在堆栈中保存程序计数器,将当前指令的信息保存在CPU特殊的寄存器
    2)查找虚拟页面:当操作系统发现是一个页面中断时,查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器
    3)查找空闲页框:操作系统查找一个空闲的页框(物理内存页面),如果没有则通过页面置换算法找到空闲页框,此时将页框置为忙状态,以防页框被其它进程抢占掉,如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上,此时会引起一个写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)
    4)复制磁盘内容:页框干净后,操作系统根据虚拟地址对应磁盘上的位置,将磁盘上的页面内容复制到空闲页框中,此时会引起一个读磁盘调用,发生上下文切换,当磁盘页面内容全部装入页框后,向操作系统发送一个中断。操作系统更新页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态
    5)恢复现场:恢复缺页中断发生前的状态,将程序指令器重新指向引起缺页中断的指令,调度引起页面中断的进程,操作系统返回汇编代码例程,汇编代码例程恢复现场,将之前保存在通用寄存器中的信息恢复。

  • 虚拟内存页面置换算法 【操作系统 - 5】虚拟内存页面置换算法
    1)先进先出页面置换算法(FIFO)
    a、定义:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
    b、实现:只需把页面按先后次序链接成一个队列,并设置一个替换指针,使它总是指向最老的页面。
    c、抖动现象(Belady):采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,缺页率反而提高的异常现象。该算法与进程实际运行的规律不相适应,
    d、原因:因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO算法并不能保证这些页面不被淘汰。
    2)最佳置换算法(Optimal)
    a、定义:其所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。
    b、缺点:目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。
    3)最近最久未使用置换算法(LRU)
    LRU置换算法是选择最近最久未使用的页面淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面淘汰。
    4)最少使用置换算法(LFU)
    在采用最少使用置换算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在之前时期使用最少的页面作为淘汰页。

  • 引起上下文切换的原因有哪些?寄存器、上下文、栈 基本功:线程上下文切换、线程切换是如何给 CPU 洗脑的?
    1)上下文切换类别
    a、进程切换,两个进程之间的切换
    b、线程切换,同一进程中的两个线程之间的切换
    c、模式切换,在给定线程中,用户模式和内核模式的切换
    d、地址空间切换,将虚拟内存切换到物理内存
    2)上下文切换原因
    a、时间片用完:当前执行任务(线程)的时间片用完之后,系统CPU正常调度下一个任务
    b、中断处理:其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。中断分为硬件中断和软件中断,软件中断包括因为IO阻塞、未抢到资源或者用户代码等原因,线程被挂起。
    c、用户态切换:对于一些操作系统,当进行用户态切换时也会进行一次上下文切换,虽然这不是必须的。
    d、多进程或多线程切换:多个任务抢占锁资源,在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换
    3)解决方法
    a、无锁并发编程:多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据
    b、CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
    c、使用最少线程或进程
    d、协程:单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

  • 进程切换与线程切换的区别?为什么虚拟地址切换很慢? 送命题:进程切换与线程切换的区别?
    1)进程切换和线程切换的区别
    进程切换与线程切换的一个最主要区别就在于进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
    2)为什么虚拟地址切换很慢?
    页表切换、页表查找慢、TLB失效
    现在我们已经知道了进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB,Translation Lookaside Buffer,我们不需要关心这个名字只需要知道TLB本质上就是一个cache,是用来加速页表查找的。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

  • 了解协程吗?协程上下文切换实现?每个连接分配一个协程,开销会不会很大?要是每个连接分配一个内核级线程,可不可以?内核级线程切换的开销? linux进程-线程-协程上下文环境的切换与实现、协程是什么?怎么来的?它有什么作用?、协程不过是用户态的线程,这句话对吗?、C语言实现协程(一)
    协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
    协程适合io密集型场景,处理完一个io立即切换,不用涉及用户态和内核态的切换,不适合计算密集型场景,一个协程处理过久导致其他协程等待过久。

  • 用户态和内核态的区别? 线程-用户态(也有叫协程的)和内核态的区别
    1)由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态和内核态
    2)用户态:只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取
    3)内核态:CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

  • 用户态和内核态怎么切换?陷入内核态的方式有哪些? 操作系统用户态和内核态之间的切换过程
    1)系统调用
    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。
    2)异常
    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常
    3)外设中断
    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,CPU会去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程发生了由用户态到内核态的切换。

  • 库函数和系统调用的区别? 库函数和系统调用的区别和联系

  • read() 和 fread()区别? read函数和fread函数的区别
    1)格式
    ssize_t read(int fd ,void *buf, size_t count);
    read用于从文件描述符对应的文件读取数据,调用成功返回读出的字节数;buf为读出数据的缓冲区,count为每次读取的字节数,出错返回-1,EOF返回0。
    size_t temp=fread(buf,10,1,p);
    每次读取10个字节到buf里边(10×1),如果读取的字节数少于10个返回0
    fread多一个读取记录数的参数,read用文件描述符,fread用文件指针
    2)区别
    效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。
    读取文件差别:fread功能更强大,可以的结构体的二进制文件。如果底层的操作,用到文件描述符,用read更好。

  • 用户态线程和内核态线程的区别? 用户态线程和内核态线程有什么区别?
    1)用户态线程
    a、定义:用户态线程也称作用户级线程(User Level Thread)。操作系统内核并不知道它的存在,它完全是在用户空间中创建。
    b、优点:
    ①、管理开销小:创建、销毁不需要系统调用。
    ②、切换成本低:用户空间程序可以自己维护,不需要走操作系统调度。
    c、缺点:
    ①、与内核协作成本高:比如这种线程完全是用户空间程序在管理,当它进行 I/O 的时候,无法利用到内核的优势,需要频繁进行用户态到内核态的切换。
    ②、线程间协作成本高:两个线程需要通信,通信需要 I/O,I/O 需要系统调用,因此用户态线程需要支付额外的系统调用成本。
    ③、无法利用多核优势:比如操作系统调度的仍然是这个线程所属的进程,所以无论每次一个进程有多少用户态的线程,都只能并发执行一个线程,因此一个进程的多个线程无法利用多核的优势。
    ④、系统无法对线程调度优化:当一个进程的一个用户态线程阻塞(Block)了,操作系统无法及时发现和处理阻塞问题,它不会更换执行其他线程,从而造成资源浪费。
    2)内核态线程
    内核态线程也称作内核级线程(Kernel Level Thread)。这种线程执行在内核态,可以通过系统调用创造一个内核级线程。
    b、优点:
    ①、可利用多核 CPU 优势:内核拥有较高权限,因此可以在多个 CPU 核心上执行内核线程。
    ②、系统级优化:内核中的线程操作 I/O 不需要进行系统调用;一个内核线程阻塞了,可以立即让另一个执行。
    c、缺点:
    ①、创建成本高:创建的时候需要系统调用,也就是切换到内核态。
    ②、扩展性差:由一个内核程序管理,不可能数量太多。
    ③、切换成本较高:切换的时候,也同样存在需要内核操作,需要切换内核态。

  • IO模型有哪几种? 同步、异步、阻塞、非阻塞IO总结(IO模型总结)、五种IO模型(详解+形象例子说明)
    1)同步IO:包括以下四种方式,第一步不同,第二步都阻塞在将数据从内核拷贝到用户缓冲区的IO操作上
    a、阻塞IO:当系统调用未准备好数据时挂起等待。
    b、非阻塞IO:通过忙轮询去检测系统调用是否有数据准备好,直到有数据准备好了再开始数据的复制。
    c、信号驱动IO:当数据准备好时,内核给进程发送一个信号,进程捕捉信号,调用信号处理函数获取。
    d、IO多路复用:阻塞监听一组文件描述符,返回准备好数据的文件描述符。
    2)异步IO:由用户进程告知内核启动一个操作,并且由内核去操作,操作完后给用户进程发一个通知,通知用户进程操作完了(包括数据从内核缓冲区拷贝到用户缓冲区的过程)

  • 中断响应的处理过程和机制? 中断及中断处理过程

  • 进程和线程的区别? 进程、线程和协程之间的区别和联系、PCB与进程分配资源
    1)根本区别
    a、进程:操作系统资源分配的基本单位
    b、线程:CPU处理器任务调度和执行的基本单位
    2)资源开销和内存分配
    a、进程:每个进程都有独立的代码、数据空间(程序上下文)和地址空间,程序之间的切换会有较大的开销
    b、线程:线程可以看做轻量级的进程,同一类线程共享代码、数据空间和地址空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
    3)影响关系
    a、进程:一个进程崩溃后,在保护模式下不会对其他进程产生影响
    b、线程:一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮
    4)通信机制
    a、进程:通信较复杂,进程之间的通信需要以通信的方式(IPC)进行
    b、线程:通信较方便,同一进程下的线程共享全局变量、静态变量等数据,不过需要处理同步和互斥
    5)执行过程
    a、进程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。
    b、线程:线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

  • 线程有什么数据是自己私有,哪些是共享的? OS / 线程哪些内容是私有的和共享的?
    1)线程私有
    a、栈(局部变量,函数的参数)。
    b、线程局部存储(Thread Local Storage,TLS),有限的容量。
    c、寄存器 (执行流的基本数据)。
    d、线程ID、信号屏蔽码、信号屏蔽码、错误返回码
    2)线程共享
    a、全局变量、函数里的静态变量。
    b、堆上的数据。
    c、程序代码,任何线程都有权利读取并执行任何代码。
    d、进程打开的文件描述符,A 线程打开的文件可以由 B 线程读写。

  • 进程有哪些状态?进程的几种状态
    1)运行态:该进程正在执行。
    2)就绪态:进程已经做好了准备,只要有机会就开始执行。
    3)阻塞态(等待态):进程在某些事情发生前不能执行,等待阻塞进程的事件完成。
    4)新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中
    5)退出态:操作系统从可执行进程组中释放出的进程,或由于自身或某种原因停止运行。

  • 哪些情况进程会由运行转为阻塞?
    1)进程缺少相应io资源,阻塞等待资源
    2)访问正在被其他进程访问的临界资源,等待解锁
    3)进程睡眠(sleep)

  • 进程调度算法有哪些? 操作系统中常用的进程调度算法
    1)先来先服务调度算法
    每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存
    2)短作业(进程)优先调度算法
    进程优先(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程
    3)时间片轮转法
    每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾
    4)多级反馈队列调度算法
    应设置多个就绪队列,并为各个队列赋予不同的优先级,该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,第i+1个队列的时间片要比第i个队列的时间片长一倍

  • 进程通信的方式有哪些?IPC 最快的方式是什么? linux基础——linux进程间通信(IPC)机制总结、进程间通信——共享内存(Shared Memory)
    1)匿名管道(PIPE)
    a、定义: 管道实际是用于进程间通信的一段共享内存,一个进程写入数据后,另一进程就可以读取出来
    b、特点:
    ①、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;
    ②、只能用于父子进程或者兄弟进程之间( 具有亲缘关系的进程), 比如fork或exec创建的新进程。
    在使用exec创建新进程时,需要将管道的文件描述符作为参数传递给exec创建的新进程。
    当父进程与使用fork创建的子进程直接通信时,发送数据的进程关闭读端,接受数据的进程关闭写端
    ③、管道对于管道两端的进程而言,就是一个文件,单独构成一种文件系统,并且只存在与内存中
    c、函数:
    创建匿名管道:int pipe(int file_descriptor[2]);
    2)命名管道(FIFO)
    a、定义:命名管道在系统中以文件形式存在,克服了管道的弊端,可以允许没有亲缘关系的进程间通信。
    b、函数:
    创建命名管道:int mkfifo(const char *filename,mode_t mode);
    3)信号 (signal)
    a、定义:信号机制是unix系统中最为古老的进程之间的通信机制,用于一个或几个进程之间传递异步信号。
    b、函数
    ①、截取系统信号:int ret = signal或sigation(SIGSTOP, sig_handle),前一个为信号,后一个为处理函数
    ②、向指定进程发起信号:kill(pid_t pid,int sig)、int raise(int sig)
    ③、指定时间后把SIGALARM发给当前进程:alarm(unsigned int seconds)
    4)消息队列(Message queues)
    a、定义:消息队列是内核地址空间中的内部链表,每个消息队列可以用 IPC标识符唯一地进行识别
    b、对比和优点:
    ①、消息队列克服了信号承载信息量少,管道只能承载无格式字符流
    ②、消息队列也可以独立于发送和接收进程而存在,消除了在同步命名管道的打开和关闭时可能产生的困难
    ③、命名管道中,发送数据用write,接收数据用read,消息队列中,发送数据用msgsnd,接收数据用msgrcv
    ④、发送消息还可以避免命名管道的同步和阻塞问题,不需要由进程自己来提供同步方法
    ⑤、接收程序可以通过消息类型有选择地接收数据,而不是像命名管道中那样,只能默认地接收
    c、函数
    ①、通过目录和ID获取指定IPC标识符:key_t ftok( const char * fname, int id );
    ②、创建和访问一个消息队列:msgget(key_t key,int msgflag);
    ③、把一条消息添加到消息队列中int msgsnd(int msgid,const void *msgptr,size_t msg_sz,int msgflg);
    ④、通过msqid对指定消息队列进行接收操作:msgrcv(int msgid, void *msgptr, size_t msg_sz, long int msgtype, int msgflg);
    5)信号量(Semaphore)
    a、定义:信号量是一种计数器,用于控制对多个进程共享的资源进行的访问。
    ①、创建一个新的信号量集合:int semget(key_t key, int num_sems, int sem_flags);
    ②、改变信号量的值:int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);
    6) 共享内存(Share Memory)
    a、定义:共享内存是在多个进程之间共享内存区域的一种进程间的通信方式
    b、优点:共享内存是 IPC最快捷的方式,因为共享内存方式的通信没有中间过程,多个进程间的共享内存是同一块的物理空间,仅仅映射到各进程的地址不同而已,因此不需要进行复制,可以直接使用此段空间。
    ①、创建一个新的共享内存段:int shmget(key_t key,size_t size,int shmflg);
    ②、将共享内存连接到进程的地址空间中:shmat(int shm_id,const void *shm_addr,int shmflg);
    ③、将共享内存从当前进程中分离:int shmdt(const void *shm_addr);
    7)内存映射(Memory Map)
    a、定义:内存映射文件,是由一个文件到一块内存的映射,只要有一个进程对这块映射文件的内存进行操作,其他进程也能够马上看到,共享内存是内存映射文件的一种特殊情况,内存映射一块内存,而非磁盘文件。
    b、优点:使用内存映射文件不仅可以实现多个进程间的通信,还可以用于处理大文件提高效率。普通的做法是将数据拷贝到缓冲区再拷贝到磁盘文件,一共四次拷贝,如果文件数据量很大,拷贝的开销是非常大的。
    c、函数
    将一个文件或者其它对象映射进内存:void mmap(voidstart,size_t length,int prot,int flags,int fd,off_t offset);
    8)套接字(Socket)
    a、定义:套接字机制不但可以单机的不同进程通信,而且使得跨网机器间进程可以通信
    b、函数
    int bind(int socket,const struct sockaddr *address,size_t address_len);
    int listen(int socket,int backlog);
    int accept(int socket,struct sockaddr *address,size_t *address_len);
    int connect(int socket,const struct sockaddr *addrsss,size_t address_len);

  • 信号的底层原理?软中断 操作系统中信号工作的底层原理分析
    软中断信号 (简称为信号) 是用来通知进程发生了异步事件,是在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。

  • 进程的同步与互斥方式?Linux下进程、线程同步几种方法
    1)信号量
    可以借助Linux的信号量的PV操作来实现对临界资源的互斥访问。
    2)文件锁
    linux下可以使用flock()函数对文件进行加锁解锁等操作
    3)无锁CAS访问
    CAS是一组原语指令,用来实现多进/线程下的变量同步。
    CAS原语有三个参数,内存地址,期望值,新值。如果内存地址的值==期望值,表示该值未修改,此时可以修改成新值。否则表示修改失败,返回false,由用户决定后续操作。
    4)校验方式(CRC32校验)
    可以用crc32校验的方式,把变量a的crc32值记录下来,存入另外的变量b。
    在写入变量a的时候,更新完变量a后,再计算出a的crc32值,更新变量b;
    在读取变量a的时候,把读出的值a的crc32值和另外的变量b进行比较,如果不相同,就说明变量a正在更新中,从而实现对该变量的无锁互斥访问。

  • 线程的同步与互斥方式?多线程的锁了解哪些?自旋锁和互斥锁的区别?使用场景? 多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)、在Linux中使用线程、自旋锁与互斥锁的区别
    1)互斥锁
    a、定义:互斥锁是一种简单的加锁的方法来控制对共享资源的访问,互斥锁只有两种状态,即上锁和解锁
    b、函数:
    初始化锁:pthread_mutex_init、销毁锁:pthread_mutex_destroy
    上锁:pthread_mutex_lock、解锁:pthread_mutex_unlock
    2)条件变量
    a、定义:条件变量用来自动阻塞一个线程,直到某特殊情况发生,通常条件变量和互斥锁同时使用,线程必须首先锁住互斥量,如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件
    b、函数:
    初始化条件变量:pthread_cond_init、销毁条件变量:pthread_cond_destroy
    阻塞等待:pthread_cond_wait、唤醒条件变量:pthread_cond_signal
    3)读写锁
    a、定义一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁
    b、状态:读写锁可以有3种状态:读模式下加锁状态、写模式加锁状态、不加锁状态
    c、规则:
    如果有其它线程读数据,则允许其它线程执行读操作,但不允许写操作;
    如果有其它线程写数据,则其它线程都不允许读、写操作。
    d、适用场景:读写锁适合于对数据结构的读次数比写次数多得多的情况。
    e、函数:
    初始化锁:pthread_rwlock_init、销毁锁:pthread_rwlock_destroy
    申请读锁:pthread_rwlock_rdlock、申请写锁:pthread_rwlock_wrlock、解锁:pthread_rwlock_unlock
    4)自旋锁
    a、定义:与互斥量功能一样,互斥量阻塞后休眠让出cpu,而自旋锁阻塞后不会让出cpu,会一直忙等待
    b、适用场景:内核使用的比较多,锁的持有时间比较短,或者说小于2次上下文切换的时间。
    c、函数:
    初始化锁:pthread_spin_init、销毁锁:pthread_spin_destroy
    上锁:pthread_spin_lock、解锁:pthread_spin_unlock
    5)信号量
    a、定义:信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。可根据信号量值判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。
    b、函数:
    初始化信号量:sem_init、销毁信号量:sem_destroy
    信号量P操作:sem_wait、信号量V操作:sem_post、获取信号量的值:sem_getvalue
    c、适用场景
    【信号量用于同步】:

    【信号量用于互斥】

    6)无锁CAS
    7)校验方式(CRC32校验)

  • 有了互斥量,为什么还需要条件变量? 有了互斥量,为什么还需要条件变量?

  • 多进程和多线程的区别?多进程和多线程相比有什么好处?多进程和多线程的区别是什么?多进程和多线程的优缺点分析

  • 设计题:生产者消费者问题 【操作系统】生产者消费者问题
    多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

  • 设计题:多线程循环有序打印ABC Linux系统编程:多线程交替打印ABC
    思路:设置三个条件变量和三把锁,用条件变量控制顺序交替打印,在主进程里唤醒c锁。

  • 线程安全的队列如何实现? 线程安全队列的实现 Linux version

  • 线程解锁和通知的先后顺序问题 条件变量用例–解锁与signal的顺序问题
    当采用实时调度策略时,signal/broadcast会唤醒高优先级的线程。如果多个线程具有相同的优先级,则先在条件变量上阻塞的线程会被唤醒。

  • 形成死锁的必要条件 死锁的四个必要条件和解决办法
    1)死锁概念
    a、概念: 多个并发进程或线程因争夺系统资源而产生相互等待的现象。
    b、原理: 当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
    c、本质原因:
    ①、系统资源有限。
    ②、进程推进顺序不合理。
    2)死锁产生的4个必要条件
    a、互斥: 某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。
    b、占有且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。
    c、不可抢占: 别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。
    d、循环等待: 存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。
    当以上四个条件均满足,必然会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。那么,解决死锁问题就是相当有必要的了。
    3)死锁预防
    由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证
    a、破坏“占有且等待”条件
    方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
    方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。
    b、破坏“不可抢占”条件
    当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请。这就意味着进程已占有的资源会被短暂地释放或者说是被抢占了。
    c、破坏“循环等待”条件
    可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源
    4)避免死锁
    银行家算法

  • 怎么阻止你的程序多开? 防止程序多开的原理介绍
    1)进程检查
    使用FindWindow API函数。
    通过查找窗口标题(或/和类名)来判断程序是否正在运行。如果找到了,表明程序正在运行,这时可退出程序,达到不重复运行的效果;反之表明程序是第一次运行。
    这种方法不适用于以下情况,程序的标题是动态变化的、系统中运行了相同标题(或/和类名)的程序
    2)互斥对象/信号量/事件
    通过互斥对象/信号量/事件(Mutex/Event/Semaphore )等线程同步对象来确定程序是否已经运行。最常用的函数如:CreateMutexA(注意:QQ堂、QQ游戏大厅就是采用这样方法来限制程序多开的)
    3)内存映射文件(File Mapping)
    通过把程序实例信息放到跨进程的内存映射文件中,也可以控制程序多开。
    4)DLL全局共享区
    DLL全局共享区在映射到各个进程的地址空间时仅被初始化一次,且是在第一次被windows加载时,所以利用该区数据就能对程序进行多开限制。
    5)全局Atom
    将某个特定字符串通过GlobalAddAtom加入全局原子表(Global Atom Table),程序运行时检查该串是否存在来限制程序多开。(该Atom不会自动释放,程序退出前必须调用GlobalDeleteAtom来释放Atom)

  • 进程调度和线程调度的区别 一篇文章彻底弄懂进程和线程调度

  • 进程虚拟地址空间内存分布 进程虚拟地址空间的分布详解

  • 段错误 段错误

  • CPU指令执行的过程 一条指令在cpu中的执行流程(理解CPU组成)

  • CPU高速缓存 CPU缓存

  • 多核CPU多线程时如果一个CPU有一个cache,怎么保证各个cache之间和主存之间的数据一致 多核cpu如何保证cache缓存数据的一致性

  • 调用函数的过程 浅析函数的调用过程

Linux

  • Linux面试题 Linux面试题(2020最新版)

  • Shell脚本 Linux中编写Shell脚本

  • Makefile

  • proc linux proc目录详解

  • Linux文件系统? linux下的文件系统

  • 硬链接和软链接的区别?软链接和硬链接到底有啥作用和区别
    1)软链接
    a、定义:软链接可以理解成快捷方式。它和windows下的快捷方式的作用是一样的。
    b、命令:ln -s 源文件 目标文件
    c、原理:软链接不使用节点作为文件指针,而是使用文件路径名作为指针,软链接有自己的inode,在磁盘上有空间存放路径名,所以删除链接文件对源文件无影响,但是删除源文件,链接文件就会找不到源文件 。
    2)硬链接
    a、定义:硬链接等于cp -p 加 同步更新。
    b、命令:ln 源文件 目标文件
    c、原理:硬链接不管有多少个,都指向的是同一个节点,和源文件完全相同,并不区分。只要结点的连接数不是 0,文件就一直存在,不管你删除的是源文件还是连接的文件,删除最后一个链接磁盘文件才消失。
    3)区别
    a、大小和创建时间
    软链接文件的大小和创建时间和源文件不同,硬链接文件和源文件的大小和创建时间一样
    b、删除操作
    删除源文件,软链接也用不了,但是硬链接还可以查看
    c、是否跨区和跨目录
    软链接可以跨文件系统 ,硬链接不可以;软链接可以对目录进行连接,硬链接则不行
    d、是否链接不存在的文件
    软链接可以对一个不存在的文件名进行连接,硬链接则不行
    4)硬链接关于为什么不能跨文件系统?
    首先,不同的文件系统的文件管理方式不同,甚至有些文件系统不是索引文件系统,并不一定两个文件系统的inode有相同的含义。再者,即使有相同inode含义,硬链接的几个文件,具有相同的inode号码。不同文件系统中,也可能有使用该inode号的文件,这将产生矛盾。

  • Linux文件描述符 每天进步一点点——Linux中的文件描述符与打开文件之间的关系

  • linux进程内存空间布局 Linux进程地址空间和进程的内存分布

  • Linux内核的内存分配机制?伙伴算法和Slab分配器

  • 伙伴算法 【Linux 内核】内存管理(二)伙伴算法

  • Slab分配器 linux 内核 内存管理 slub算法 (一) 原理(讲的最清楚的一篇)

  • Linux的malloc内存分配 Linux内存分配小结–malloc、brk、mmap

  • ptmalloc 内存池怎么可以保证不会产生碎片 一篇文章彻底讲懂malloc的实现(ptmalloc)、malloc底层原理剖析——ptmalloc内存池、STL中内存池的实现

  • linux查看系统资源和内存的命令有哪些? 【操作系统----Linux】Linux查看内存使用情况

  • Linux系统CPU过高原因?(虾皮提前批一面)CPU飙高原因及解决方案
    1)死循环、2)惊群效应、3)死锁、大量线程抢占资源、4)大量IO

  • Linux系统CPU过高怎么排查?(虾皮提前批一面)Linux 系统 CPU 占用率较高问题排查思路、linux下cpu过高问题排查

  • 负载是什么?负载和CPU什么关系?负载高怎么排查?(虾皮提前批一面)CPU load过高产生的原因及排查、Linux面试最高频的5个基本问题
    CPU使用率 = CPU时间片被程序使用的时间 / 总时间
    CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数
    简单理解,一个是CPU的实时使用情况,一个是CPU的当前以及未来一段时间的使用情况

  • 代码中遇到进程阻塞,进程僵死,内存泄漏等情况怎么排查 ?(考察coredump,虾皮提前批一面)Linux生成core文件和core文件路径设置、linux下core dump【总结】
    1)定义
    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”),也叫“内存快照”。除了内存信息之外,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息也会被保存。
    2)命令
    查看是否开启:ulimit -c
    临时开启:ulimit -c unlimited
    永久生效:修改/etc/security/limits.conf
    默认生成的core文件保存在可执行文件目录下,文件名为core
    core dump后,使用gdb 程序名 core文件名,调试core文件

  • GDB调试常用的命令有哪些? gdb基本使用方法及常用命令、 GDB调试指南(入门,看这篇够了)
    1)编译链接选项
    编译、链接成可执行文件,记得加入-g选项
    gcc -g gdbtest.c -o test
    2)启动gdb
    gdb+可执行文件名或直接gdb
    3)列出源码
    list、list 10(行数)、list test(函数名)
    4)运行程序
    run、run test(程序名)
    5)设置断点
    break 7(行数)、break test(函数名)
    6)单步执行
    不进入函数:next
    进入函数:step
    7)终止调试
    kill
    8)监视变量
    watch sum(变量名)变量名会随着单步执行一直显示
    9)打印变量
    print sum(变量名)
    10)修改变量值
    set variable=value
    11)执行shell命令
    shell 命令名
    12)查看命令
    a、info break查看断点信息
    b、info args查看当前方法的参数
    c、info stack查看调用堆栈
    d、info source查看当前源文件的信息
    e、info sources查看所有在程序中的源文件路径

  • linux命令du和df区别? Linux中 du (详解)、 df (详解)和 free(详解)以及它们的区别
    1)du :
    显示每个文件和目录的磁盘使用空间文件的大小
    du -h #以K M G为单位显示,提高可读性
    2)df
    显示磁盘分区上可以使用的磁盘空间
    3)free
    可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer

  • Linux怎么看端口号?Linux查看网络状态命令和网络状态详解 Linux查看服务端口号、Linux下netstat命令详解
    1)如何查看端口号?
    netstat - atulnp会显示所有端口和所有对应的程序
    -a :all,表示列出所有的连接,服务监听端口,Socket资料
    -t :tcp,列出tcp协议的服务
    -u :udp,列出udp协议的服务
    -n :port number, 用端口号来显示
    -l :listening,列出当前监听服务
    -o:显示与每个连接相关的所属进程 ID。
    -p :program,列出服务程序的PID
    2)如何查看某个端口被占用?
    netstat -ano | grep 8080

  • Linux如何查看文件权限?Linux 文件和文件夹权限操作

  • 常用的linux命令 Linux中top命令参数详解、【精】Linux磁盘I/O性能监控之iostat详解、readelf命令和ELF文件详解、linux中的ldd命令简介、Linux diff --比较两个文件并输出不同之处

  • Fork()问题总结 fork()函数详解、fork()函数的底层实现原理、fork之后,子进程从父进程那继承了什么
    1)Fork返回值
    a、在父进程中,fork返回新创建子进程的进程ID;
    b、在子进程中,fork返回0;
    c、如果出现错误,fork返回一个负值;
    2)写时拷贝
    一种可以推迟甚至免除拷贝数据的技术 使用写时拷贝,内核并不复制整个进程地址空间,而是让父子进程共享同一个拷贝。只有需要写入的时候,数据才会被复制,从而各个进程拥有各自的拷贝。
    3)Fork底层实现
    a、fork()通过系统调用clone()->do_fork->copy_process()实现
    b、分配新的内存块和内核数据结构给子进程
    c、将父进程部分数据结构内容拷贝至子进程
    d、子进程被存放在一个叫做任务队列的双向循环链表当中,链表当中的每一项都是类型为task_struct称为进程描述符的结构,也就是我们写过的进程PCB
    4)Fork为什么一次调用,返回两次
    由于在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
    5)Fork之后,子进程从父进程那继承了什么
    进程的资格、用户号、组号、环境(environment)、堆栈、内存、打开文件的描述符、执行时关闭(close-on-exec) 标志、信号(signal)控制设定、进程调度类别、进程组号、Session ID、当前工作目录、根目录

  • 怎么创建进程,怎么创建线程,除了fork()还有什么能达到类似的效果吗?vfork和clone Linux中fork,vfork和clone详解(区别与联系)、fork()、vfork()、clone()的区别

  • 什么是孤儿进程和僵尸进程? 孤儿进程与僵尸进程产生及其处理
    1)孤儿进程
    a、概念:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程
    b、原因:子进程死亡需要父进程来处理,那么意味着正常的进程应该是子进程先于父进程死亡。当父进程先于子进程死亡时,子进程死亡时没父进程处理,这个死亡的子进程就是孤儿进程。
    c、结果:结果孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程与僵尸进程不同的是,由于父进程已经死亡,系统会帮助父进程回收处理孤儿进程。所以孤儿进程实际上是不占用资源的,因为它终究是被系统回收了。不会像僵尸进程那样占用ID,损害运行系统。
    2)僵尸进程
    a、概念子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样的子进程就称为僵尸进程,僵尸进程实际上是一个已经死掉的进程。
    b、状态:已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。
    c、后果:这个僵尸进程需要它的父进程来为它收尸,如果他的父进程没有处理这个僵尸进程的措施,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸。系统资源是有限的,因此当僵尸进程达到一定数目时,系统因缺乏资源而导致奔溃。
    3)僵尸进程的处理方法
    a、杀死父进程
    ①、做法:比较暴力的做法是将其父进程杀死,那么它的子进程,即僵尸进程会变成孤儿进程,由系统来回收。
    ②、缺点:但是这种做法在大多数情况下都是不可取的,如父进程是一个服务器程序,如果为了回收其子进程的资源,而杀死服务器程序,那么将导致整个服务器崩溃,得不偿失。
    b、处理SIGCHLD信号
    ①、原因:wait函数是用来处理僵尸进程的,但是进程一旦调用了wait,就立即阻塞自己,直到有子进程结束。由wait自动分析是否当前进程的某个子进程已经退出。
    ②、做法:当子进程终止时,内核就会向它的父进程发送一个SIGCHLD信号,父进程可以选择忽略该信号,也可以提供一个接收到信号以后的处理函数。对于这种信号的系统默认动作是忽略它。我们不希望有过多的僵尸进程产生,所以当父进程接收到SIGCHLD信号后就应该调用 wait 或 waitpid 函数对子进程进行善后处理,释放子进程占用的资源。

  • 什么是守护进程? 守护进程的详细总结(包括实例解析)
    1)概念:
    守护进程(Daemon)是一种运行在后台的一种特殊的进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件 ,当控制终端被关闭的时候,相应的进程都会自动关闭。但是守护进程却能突破这种限制,它脱离于终端并且在后台运行。
    2)实现步骤
    a、创建子进程,父进程退出(使子进程成为孤儿进程)
    b、在子进程中创建新的会话(脱离控制终端)
    ①、操作:使用系统函数setsid()来创建一个新的会话,并且担任该会话组的组长。
    ②、原因:由于在调用了fork()函数的时候,子进程拷贝了父进程的会话期、进程组、控制终端等资源、虽然父进程退出了,但是会话期、进程组、控制终端等并没有改变,因此,需要用setsid()韩式来时该子进程完全独立出来,从而摆脱其他进程的控制
    c、改变当前目录为根目录
    ①、操作:使用chdir("/")命令设定当前目录
    ②、原因:fork()创建的子进程是继承了父进程的当前工作目录,由于在进程运行中,当前目录所在的文件系统是不能卸载的,这对以后使用会造成很多的麻烦
    d、重设文件权限掩码
    ①、操作:文件权限掩码是屏蔽掉文件权限中的对应位,使用umask(0)把文件的权限掩码设置成为0,即在此时有最大的权限,这样可以大大增强该守护进程的灵活性。
    ②、原因:由于使用fork()函数新创建的子进程继承了父进程的文件权限掩码,这就给该子进程使用文件带了很多的麻烦,比如父进程中的文件没有执行文件的权限,然而在子进程中希望执行相应的文件这个时候就会出问题。
    e、关闭文件描述符
    ①、操作:关闭打开的文件描述符close(i)
    ②、原因:用fork()函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些文件被打开的文件可能永远不会被守护进程读写,如果不进行关闭的话将会浪费系统的资源
    3)守护进程的终止
    上面建立了守护进程,当用户需要外部停止守护进程运行时,往往需要使用kill命令来停止该守护进程,所以守护进程中需要编码来实现kill发出的signal信号处理,达到进程的正常退出。实现该过程的函数是signal函数

  • 终端退出终端运行的进程会怎样?进程分离?(进程挂起,nohup命令)进程组和会话是什么? Linux终端关闭后台进程也结束原因分析和nohup的使用
    1)进程组和会话
    在Linux中,每个进程都属于一个进程组(group),进程组有一个组长;多个进程组构成一个会话,会话是由其中的进程建立的,该进程叫做会话的领导进程(session leader)。会话领导进程的PID成为识别会话的SID(session ID)。会话中的每个进程组称为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground job),而其他的进程组是后台工作(background job)。会话主要是针对一个终端建立,当我们打开多个终端窗口时,实际上就创建了多个终端会话。
    2)终端
    在UNIX系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。
    3)终端退出
    当打开终端的最初的进程(也就是SID进程)退出后,其子进程也会结束。
    4)进程分离
    nohup make &

  • pthread_detach() 、pthread_join(),如果不 join会有啥问题 linux中pthread_join()与pthread_detach()详解
    pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。

  • socket调用write返回值表示的意义?Read和Write深入理解linux下write()和read()函数

  • Read系统调用流程? Read 系统调用在用户空间中的处理过程

  • Linux有哪些信号? 【Linux】一篇文章彻底搞定信号!
    1)定义
    信号其实就是一个软件中断。
    2)种类
    a、SIGHUP:1号信号,Hangup detected on controlling terminal or death of controlling process(在控制终端上挂起信号,或让进程结束),ation:term
    b、SIGINT:2号信号,Interrupt from keyboard(键盘输入中断,ctrl + c ),action:term
    c、SIGQUIT:3号信号,Quit from keyboard(键盘输入退出,ctrl+ | ),action:core,产生core dump文件
    d、SIGABRT:6号信号,Abort signal from abort(3)(非正常终止,double free),action:core
    e、SIGKILL:9号信号,Kill signal(杀死进程信号),action:term,该信号不能被阻塞、忽略、自定义处理
    f、SIGSEGV:11号信号,Invalid memory reference(无效的内存引用,解引用空指针、内存越界访问),action:core
    g、SIGPIPE:13号信号,Broken pipe: write to pipe with no readers(管道中止: 写入无人读取的管道,会导致管道破裂),action:term
    h、SIGCHLD:17号信号,Child stopped or terminated(子进程发送给父进程的信号,但该信号为忽略处理的)
    i、SIGSTOP:19号信号,Stop process(停止进程),action:stop
    j、SIGTSTP:20号信号,Stop typed at terminal(终端上发出的停止信号,ctrl + z),action:stop

  • CAS是什么?会出现什么问题?(ABA问题) 利用CAS操作(Compare & Set)实现无锁队列

后端知识点链接(二):操作系统、Linux相关推荐

  1. linux系统怎么设置硬链接,二、Linux系统硬链接和软链接详细介绍与实践

    链接的概念 在linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link).在默认不带参数的情况下,执行ln命令创建的链接是硬链 ...

  2. [ Azure | Az-900 ] 基础知识点总结(二) - 核心组件服务

    本系列文章主要针对微软AZ-900所有知识点总结,助力通过考试,获得证书.本系列文章列表如下: [ Azure | Az-900 ] 基础知识点总结(一) - Cloud云概念 [ Azure | A ...

  3. 后端程序员必备的Linux基础知识 1

    本文同步更新在我的Github上:网页链接 我自己总结的Java学习的系统知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snai ...

  4. 后端程序员必备的Linux基础知识

    学习Linux之前,我们先来简单的认识一下操作系统. 一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么是操作系统: 操作系统(Operation System,简称OS)是管理计算 ...

  5. 后端程序员必备的 Linux 基础知识+常见命令(近万字总结)

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 今天这篇文章中简单介绍一下一个 Java 程序员必知的 Linux 的一些概念以及常见命令. 如果文章有任何需要 ...

  6. 计算机网络(二)Linux网络编程

    layout: post title: 计算机网络(二)Linux网络编程 description: 计算机网络(二)Linux网络编程 tag: 计算机网络 文章目录 资源共享 Linux高性能服务 ...

  7. 软件测试基础篇二之linux

    一.linux操作系统介绍 测试需要做的事: 部署测试环境 ---> linux常用命令 通过查看日志定位问题 操作数据库进行数据校验或者数据准备 --->数据库增删改查 监控服务器性能指 ...

  8. 后端程序员必备的 Linux 基础知识

    后端程序员必备的 Linux 基础知识 原文来自github stars>63k的项目JavaGuide,欢迎小伙伴去支持原作者 一 从认识操作系统开始 1.1 操作系统简介 1.2 操作系统简 ...

  9. 前端后端程序员必备的Linux基础知识

    一 从认识操作系统开始 1.1 操作系统简介 我通过以下四点介绍什么操作系统: 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石: 操作 ...

最新文章

  1. 【迈克尔・乔丹:人工智能,革命远未发生】
  2. 在NVIDIA Jetson Xavier NX上安装llvmlite报错:No such file or directory: ‘llvm-config‘: ‘llvm-config‘
  3. 【面试题41】和为s的两个数字VS和为s的连续整数序列
  4. 基于qt和mysql的地铁线路系统_[源码和文档分享]基于QT实现的可视化地铁换乘查询系统...
  5. linux共享库的运行方式,Linux下动态共享库加载及使用详解
  6. 三菱a系列motion软体_三菱M70A/64SM重要功能比较
  7. jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
  8. 分页查询抽象出的对象属性(笔记)
  9. 解决ubuntu18.04中python兼容以及pip兼容问题
  10. Hybrid A*论文解析(4)
  11. ajax中json响应
  12. Verilog作业(一)
  13. jsp 与html 如何结合使用方法,jsp中如何写javascript?
  14. 计算机组成原理(第3版)唐朔飞著 知识点总结 第五章输入输出系统
  15. 《自卑与超越》读书笔记优秀范文3200字
  16. VMware安装教程
  17. Mac Air 配置Android开发环境
  18. 职场中的你有危机感吗?在职提升来社科院与杜兰大学金融管理硕士项目
  19. 小技巧 - 如何在线下载 Google Play 里面的应用?
  20. 2018杭州云栖大会参会总结

热门文章

  1. 京东运营 不错的帖子
  2. 20220408-CH9121串口转以太网模块学习
  3. python发邮件图片太长显示不出来_小白入门,用python 发送定时邮件,将Dataframe转为邮件正文,链接显示为图片...
  4. java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
  5. CodeIgniter框架源码学习之安全类--Security.php
  6. 游戏人工智能——聚集与避障
  7. 周鸿祎杀出的一片红海:杀毒软件的死伤现场
  8. 微信支付-超详细java开发-小程序对接
  9. 【转】国家集训队论文分类
  10. 台式电脑开机显示蓝屏 检查计算机上的病毒,电脑出现蓝屏是怎么回事