学习目标:
进程线程篇:
复习线程和进程的基本概念;
复习多线程与多进程的优缺点;
复习进程和线程的使用场景;
复习多进程和多线程之间同步(通信)的方法;
进程的空间模型,状态转换图,以及阻塞和就绪的时机;
父子进程间的关系以及区别。
C/C++篇:
什么是面向对象思想?什么是面向过程思想?
对象的三大特性,以及它们的概念。
多态如何实现?
const和static的区别?const char*p和char* const p的区别?
为什么会产生内存泄露?如何预防内存泄露?
网络编程篇:
TCP、UDP的区别?
TCP的三次对话,三/四次握手的实现过程?
TCP、UDP的优缺点?TCP UDP适用场景?
学习内容:
线程和进程的基本概念:
进程是并发执行的过程中分配和管理资源的基本单位,是一个动态的概念。它是计算机系统资源的基本单位。线程是一个执行单元,是一个进程内科调度实体(KSE),是比进程更小的独立运行的基本单元。线程通常被称为轻量级进程。
多线程与多进程的优缺点:
多线程的优点:
无需跨进程边界;
程序逻辑清晰和控制方式简单;
所有线程可以直接共享内存和变量;
线程方式消耗的总资源比进程方式好。
缺点:
每个线程与主程序共用地址空间,且受到2GB地址内存空间的大小限制;
线程之间的同步和加锁比较繁琐;
一个线程的崩溃可能会影响到整个程序的稳定性;
限制CPU的性能提高,不同的操作系统中线程的数量有限定;
线程能够提高的总资源有限,而且线程一多了之后,线程本身的调度也是一个麻烦事,需要消耗较多的CPU。
多进程优点:
进程间相互独立,不影响主程序的稳定性,子进程崩溃没关系;
通过增加CPU可以扩充性能;
可以尽量减少加锁/解锁的影响,极大提高性能。
子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
缺点:
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,不适合高并发的工作量,适合小数据量的传送,密集运算;
多进程调度开销比较大。
进程和线程的使用场景:
多线程应用场景:
线程间有数据共享,并且数据是需要修改的;
有优先级任务处理;
单任务并行计算,
人机交互的应用,键盘鼠标的输入立即响应。
多进程的使用场景:比如Chrome浏览器采用多进程的方式,可以避免因为一个网页的崩溃导致整个浏览器的崩溃。
总结:
频繁创建和销毁大优先用线程,大量计算的也优先使用线程,强相关用线程,弱相关用进程。
多进程和多线程之间同步(通信)的方法:
首先了解的进程间的通信方式主要有:管道,信号量,消息队列,信号,共享内存,套接字。
管道:一种半双工的通信方式,数据只能单向流动。
管道又分为:有名管道和无名管道。
有名管道:它不限制于父子进程间的通信,适用于不同的进程之间的通信。
无名管道:只能限制在父子进程间的通信,不适用不同进程间的通信。
信号量:是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也来访该资源。因此,主要作为进程间以及进程内不同线程之间的同步手段。
消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号:一种比较复杂的通信方式,用于通知接收某个事件已经发生。
共享内存:就是映射一段能被其他进程访问的内存,因为是进程创建的,所以可以多个进程访问。共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的,。往往与信号量配合使用,来实现进程间的同步和通信。
套接字:套接口也是一种进程间的通信机制,与其他通信机制不同的是,它可以用于不同进程之间的进程通信。
线程间通信:
互斥锁: 提供了以排他方式防止数据结构被并发修改的方法。
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保。护下进行的。条件变量始终与互斥锁一起使用。
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量。
进程的空间模型,状态转换图,以及阻塞和就绪的时机:
1.内核区:用户代码不可见区,存放页表。
2.用户区:
代码段:只可读,不可写,程序代码段。
数据区:保存全局变量,静态变量的区域。
堆区:动态内存,通过malloc,new申请的内存空间,由系统自己释放。
文件映射区:通过mmap系统调用,如动态库,共享内存等映射物理空间的内存区域。可以单独释放,不会产生内存碎片。
栈区:用户维护函数调用的上下问空间,一般默认大小为8M
状态转换图:
当执行态等待事件时会进入阻塞状态,当阻塞态事件发生时进入就绪态。
父进程、子进程的关系以及区别:
子进程时父进程的复制品,区别在于子进程有单独的ID,fork的返回值,
不可以继承父进程设置的锁。其他的信息全盘接收。
什么是面向对象思想?什么是面向过程思想?
面向对象:是一种以对象为中心的编程思维,它是通过剖析问题分解出对象的之间的挂不行,进行调节组合来解决问题。
面向过程:是一种以过程为中心的编程思维,它通过将问题进行拆分成为一个个详细的步骤,进而用函数实现每一个步骤的调用。
对象的三大特性,以及它们的概念:
封装,继承,多态。
封装:把客观事物抽象成类,并且把自己的属性和方法让可信的类或者对象进行操作,对不可性的隐藏。
继承:它可以使用现有的类的所以功能,并在无需要重新编写原来的类的情况下,对这些功能进行扩展。
多态:一种允许父对象设置成为和更多它的子对象相等的技术,
学习时间:
- 周一至周六晚上 10 点—晚上1点
- 周日上午 8 点-中午 12 点
学习产出:
- 面试笔记笔记 1 篇