小结小结

1.管道为什么是半双工<单工是只能向一个方向发送消息,比如广播。半双工可以在不同时刻进行两个方向的信息流动(网络中单工半双工占有一个信道),全双工则是两者在任意时刻均可进行信息的交流(网络中占有两个信道)。在父进程中创建了管道,然后将其读端关闭,子进程中将其写端关闭,两者进行通信>

2.原子锁,互斥锁(总线加锁),读写锁? <忙等待,阻塞。忙等待的锁在所加锁的代码较短然后不用对整个系统进行设置及恢复的操作,一直使得CPU处于运转之中>

3.quickSort的优化,插入排序嵌套,递归变成循环,对轴的选择。

4.共享内存的实现原理,内存地址映射到一块相同的物理内存。

5.写时拷贝<父进程通过fork产生了子进程,子进程继承了父进程中的资源,包括打开的文件,锁,并且和父进程共用代码段,数据段,堆栈段,这些都是通过复制父进程的地址映射表项实现的,并且将其权限设置为只读模式,所以两者能共用相同的物理内存。当其中有某一个进程要进行写操作的时候,就会触发缺页异常,操作系统为其申请新页面,由于OS将内存划分为页单位,每页的大小一定,所以父子进程之间对于读写的地址的偏移是一样的,进而开始进行写操作>

6.进程和线程的区别<1.线程是调度和分派的基本单元,线程是能独立运行的基本单位。2.拥有资源,进程是资源分派的基本单元,线程可以共享进程的资源。3.线程支持多处理机系统,如果是多线程的话可以分派到不同的cpu上,但是单进程只能绑定到单核上。4.进程之间的独立性大于线程之间的独立性,每个进程拥有一个独立的地址空间和其它资源,而线程是共享进程内部的资源的。一个线程的堆栈也可以被其它线程读写。5.线程的并发性。6.系统开销,线程进程创建销毁的开销进程线程切换的效率大小不同,进程的效率是线程的5倍之多>
线程的开创重要的原因之一就是其并发性好

多进程和多线程的区别:
<
1.线程共享进程的数据,所以线程之间的通信十分的方便,但是线程之间共享导致竞态资源,所以需要同步
2.fork创建子进程相对于线程的创建的消耗较大,进程之间的切换消耗大于线程之间的切换
3.多线程之间由于共享数据,其独立性差,而进程是拥有独立的地址空间,独立的资源,所以在资源管理上有很大优势
>

内核线程和用户线程的区别<操作系统是否能感知到线程的存在>
1.内核线程
    <1>接受操作系统的调度
    <2>切换需要占用较多的系统资源,需要用户态内核态的切换
    <3>在用户线程中一个线程的阻塞会引起整个进程的阻塞,而内核线程中一个线程的阻塞不会引起其它线程的阻塞
     <4>内核线程与用户线程存在一对一,一对多,多对多的关系
线程和进程的关系:
     在fork之初,先通过共享指针的方式共享了父进程的所有资源,然后再在copy_process中进行标志的判断,看是否需要深层次的拷贝,如果深拷贝那么就是独立的进程,否则通过设置为只读模式来实现写时拷贝技术。

7.数据库索引和Linux文件索引为什么使用B+树。<1.B+树是排序树,可以很容易定位到要搜索的内容 2.B+树利用了叶子结点的内存,避免了B树的空间浪费 3.B+树相对于其它树而言,树的深度小,要找到一个索引,需要从磁盘中调入树的深度次文件,虽然在内存中要进行多次的比较,但是相对于磁盘调度更有效率>

8.智能指针,交叉引用
     weak_ptr和shared_ptr共同使用来处理多线程引用过程中造成的线程安全问题
     weak_ptr弱引用,不能决定对象的释放,只能探测对象是否存活,如果活着就将指针转化成shared_ptr并返回给用户

9.进程间的通信,线程间的通信。使用全局变量的多线程对该变量的保护<1.使用voilatet来保证编译器不进行优化,从内存中得到最新的值。2.进行加锁操作保证其的互斥性>

10.AVL树和红黑树的比较。AVL树的插入删除,红黑树的插入删除

你可能感兴趣的:(Linux编程)