目录
IO部分:
1.标准IO: 概念、特点、函数(fopen/freopen、fclose、fgetc/fputc、fgets/fputs、fread/fwrite、rewind/fseek/ftell)
练习:cat、wc -l、head、计算时间、cp
2.文件IO:概念、特点、函数(open、close、read、write、lseek)
练习:cp
3.文件属性获取:stat
4.目录操作: opendir、closedir、readdir、chdir
进程部分:
1.进程基础: 进程和程序的区别、特点、三个段、分类、状态、函数(fork、wait/waitpid、exit/_exit、getpid/getppid、exec函数组)、守护进程(特点、步骤)
练习: 父子进程实现cp
2.线程基础:和进程的区别、函数(pthread_create、pthread_join/pthread_detach、pthread_exit)、同步(信号量、函数sem_init/sem_wait/sem_post)、互斥(互斥锁、函数pthread_mutex_init/pthread_mutex_lock/pthread_mutex_unlock/phtread_mutex_destroy)、条件变量(和互斥锁搭配实现同步、函数pthread_cond_init/pthread_cond_wait/pthread_cond_signal/pthread_cond_destroy)
3.进程间通信:
无名管道:特点、pipe、步骤
有名管道:特点、mkfifo、步骤
信号:特点(异步)、信号处理方式、函数
共享内存:特点、步骤、函数
信号灯集:特点、步骤、函数
消息队列:特点、步骤、函数
面试题
- 标准IO和文件IO的区别是什么?
- 什么是库,静态库和动态库的区别?
- 什么是孤儿进程?什么是僵尸进程?
- 什么是守护进程?创建步骤?
- 进程和线程的区别?
- 线程的同步和互斥,怎么实现?什么是异步?什么是阻塞? 什么是非阻塞?
- 进程间通讯方式有哪些,分别描述一下?效率最高是哪种?
- 无名管道和有名管道的区别?
1.标准IO和文件IO的区别是什么?
标准IO | 文件IO |
|
|
2. 什么是库,静态库和动态库的区别?
- 库:把一些常用的函数的目标文件打包在一起,提供相应的函数接口,便于程序员使用。本质上来说库是一种可执行代码的二进制形式文件。
- 区别:
静态库:编译阶段,体积大,移植性好,升级麻烦,以.a结尾。
动态库: 运行阶段加载代码,体积小,移植性差,升级简单,以.so结尾。
3. 什么是孤儿进程?什么是僵尸进程?
若父进程先结束,子进程成为孤儿进程,被init进程收养,子进程变成后台进程。
若子进程先结束,父进程如果没有及时回收资源,子进程变成僵尸进程(要避免僵尸进程产生)
4.什么是守护进程?创建步骤?
- 守护进程?
守护进程是后台进程;
生命周期比较长,从系统启动时开启,系统关闭时结束;
它是脱离控制终端且周期执行的进程。
- 步骤
1) 创建子进程,父进程退出,让子进程变成孤儿进程,成为后台进程: fork()
2) 在子进程中创建新会话:setsid()
3) 改变进程运行路径为根目录: chdir("/")
4) 重设文件权限掩码: umask(0)
5) 关闭文件描述符:close(
5.进程和线程的区别?
相同点 :都为操作系统提供了并发执行能力
不同点:
调度和资源:线程是系统调度的最小单位; 进程是资源分配的最小单位
地址空间方面:同一个进程创建的多个线程共享该进程的资源;进程的地址空间相互独立
通信方面:线程通信相对简单,只需要通过全局变量可以实现,但是需要考虑临界资源访问的问题;进程通信比较复杂,需要借助进程间的通信机制(借助3g-4g内核空间)
安全性方面:线程安全性差一些,当进程结束时会导致所有线程退出;进程相对安全
6.线程的同步和互斥,怎么实现?什么是异步?什么是阻塞? 什么是非阻塞?
- 什么是同步?什么是互斥?
同步: 指的是多个任务(线程)按照约定的顺序相互配合完成一件事情
互斥:多个线程在访问临界资源时,同一时间只能一个线程访问
- 同步用什么实现? 接口哪些以及什么功能?
信号量:
sem_init: 信号量初始化
sem_wait: 申请资源,P操作, 如果没有资源可以用, 阻塞,-1
sem_post: 释放资源,V操作, 非阻塞 +1
- 互斥用什么实现? 接口哪些以及什么功能?
互斥锁:pthread_mutex_init 初始化
pthread_mutex_lock 上锁
pthread_mutex_unlock 解锁
pthread_mutex_destroy 销毁
- 什么是阻塞和非阻塞?
阻塞(blocking)、非阻塞(non-blocking):可以简单理解为需要做一件事能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了,在等待的过程中可以做其它事情。否则就可以理解为非阻塞。
7.进程间通讯方式有哪些,分别描述一下?效率最高是哪种?
无名管道
- 只能用于具有亲缘关系的进程之间的通信
- 半双工的通信模式,具有固定的读端fd[0]和写端fd[1]。
- 管道可以看成是一种特殊的文件,对于它的读写可以使用文件IO如read、write函数。
- 管道是基于文件描述符的通信方式。当一个管道建立时,它会创建两个文件描述符 fd[0]和fd[1]。其中fd[0]固定用于读管道,而fd[1]固定用于写管道。
有名管道
- 有名管道可以使互不相关的两个进程互相通信。
- 有名管道可以通过路径名来指出,并且在文件系统中可见,但内容存放在内存中。但是读写数据不会存在文件中,而是在管道中。
- 进程通过文件IO来操作有名管道。
- 有名管道遵循先进先出规则
- 不支持如lseek() 操作
信号
1.信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式
2.信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。
3.如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。
共享内存
1.共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。
2.为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程
将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。
3.由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等
信号灯集
信号灯(semaphore),也叫信号量,信号灯集是一个信号灯的集合。它是不同进程间或一个给定进程内部不同线程间同步的机制;
而Posix信号灯指的是单个计数信号灯:无名信号灯、有名信号灯。(咱们学的是无名信号灯)
System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。
通过信号灯集实现共享内存的同步操作
消息队列
消息队列是IPC对象(活动在内核级别的一种进程间通信的工具)的一种
一个消息队列由一个标识符 (即队列ID)来标识
消息队列就是一个消息的列表。用户可以在消息队列中添加消息、读取消息等
消息队列可以按照类型(自己设一个值作为类型)来发送/接收消息
效率最高的为共享内存
8.无名管道和有名管道的区别?
无名管道 | 有名管道 | |
使用场景 | 具有亲缘关系的进程间 | 不相干的进程可以通信 |
特点 | 半双工通信方式 固定的读端fd[0]和写端fd[1] 可以看作一种特殊的文件,通过文件IO进行操作 | 在文件系统中会存在管道文件,数据存放在内核空间 通过文件IO进程操作 不支持定位操作,遵循队列原则先进先出 |
函数 | pipe() 直接read/write | mkfifo() 先打开open,然后read/write |
读写特性 | 当管道中无数据读阻塞 当管道中写满数据时写阻塞 关闭读端往管道中写会导致管道破裂 | 以只读方式打开打开阻塞,直到另一个进程把写打开 以只写方式打开打开阻塞,直到另一个进程把读打开 可读可写的方式打开,如果没数据读阻塞 |