1.文件IO与标准IO的区别?
>文件IO不带缓冲区,标准IO带缓冲区。
>文件IO函数是由操作系统提供的,与操作系统绑定,无法在其他操作系统执行。标准IO函数则可以在任何操作系统上执行。
>文件IO操作文件的入口是文件描述符,标准IO操作文件的入口文件流。
2.IO中特殊的流指针有哪些?
>stdin 标准输入流指针:获取终端文件的输入,scanf的封装了一个stdin的流指针。
>stdout 标准输出流指针:输出信息到终端文件上,printf封装了一个stdout的流指针。
>stderr 标准错误输出流指针:输出错误信息到终端文件上。
3.缓冲区分类、操作对象、刷新方式
>缓冲区分为全缓冲,行缓冲,无缓冲
>全缓冲是针对文件的,范围大小是[0,4095]字节,行缓冲是针对终端文件的stdin和stdout,大小是[0,1023]k,无缓冲针对的是stderr,大小0k。
>刷新方式:①缓冲区满:通过填满缓冲区,使缓冲区自动刷新。
②fflush()函数:通过fflush强制刷新缓冲区。
③return返回:通过return返回来结束函数,强制刷新缓冲区。
④exit():通过exit退出函数,强制刷新缓冲区。
⑤flcose():通过关闭流指针,强制刷新缓冲区。
⑥\n:通过在输出函数后面加\n来进行强制缓冲
4.文件描述符的总量,取值范围
>总量1024,范围是[0,1023]
5.特殊的文件描述符
>特殊的文件描述符是0、1、2
>0代表stdin、1代表stdout、2代表stderr
6.将fopen的打开方式,分别用flags的组合表示,例如:"W":O_WRONLY|O_CREAT|O_TRUNC
> r:O_RDONLY
> w:O_WRONLY | O_CREAT | O_TRUNC
> a:O_WRONLY | O_CREAT | O_APPEND
> r+:O_RDW1
> w+:O_RDWR | O_CREAT | O_TRUNC
> a+:O_RDWR | O_CREAT | O_APPEND
注意:flags组合之间需要用 | 按位或来进行链接。
7.进程和程序的区别?
程序从外部存储到内存执行是进程
8.进程的调度机制
时间片轮询
9.进程的五态图
创建态,就绪态,执行态,阻塞态,结束态
10.进程的内存管理与分布
> 将内存分为用户空间0-3g,内核空间3-4g,用户空间是进程间相互独立的,内核空间用户无法之间访问。
> 用户空间分为栈区、堆区、静态存储区(.bass .data .rodata .text)
> 栈区自动申请,自动释放
> 堆区手动申请,手动释放
> 静态存储区有很多数据段,.bass是存放未初始化的全局变量,静态变量。 .data段存储的是初始化的全局变量,静态变量。.rodata存储的是常量。.text存储的是二进制代码
11.编号特殊的进程
> 0 idle进程 引导程序,创建1和2进程
> 1 init进程 初始化内核各个模块,收养孤儿进程
> 2 kthread进程 用于进程间调度的
12.进程与进程之间的关系,父子进程之间的关系
> 进程与进程之间虚拟内存一样,物理内存不一样
> 父进程的文件描述符会复制一份给子进程。
13.exit _exit的区别
exit会刷新缓冲区,_exit不会刷新缓冲区
14.回收僵尸进程的方式
> 退出父进程,子进程的资源将由内核回收
> wait函数和waitpid函数,但是用阻塞方式进行时,进程无法做自己的事情
> 用信号的方式回收僵尸进程,子进程退出后,通知父进程收尸。
15.孤儿进程,僵尸进程,守护进程的创建
> 孤儿进程是父进程退出后子进程不退出,此时子进程会被1号进程收养,从而导致子进程变成孤儿进程。
> 僵尸进程是子进程退出后父进程没有回收子进程的资源,此时子进程就会变成僵尸进程。
> 守护进程:
创建一个孤儿进程:将所有工作运行在子进程中,从形式上脱离终端,退出父进程。
创建一个新的会话:使子进程完全独立出来,不再依赖于父进程的会话。setsid函数
修改运行目录为不可卸载的文件系统,chdir函数
重设文件权限掩码umask,将umask(0)
关闭从父进程继承过来的所有文件描述符,包括0,1,2,close()函数
16.线程与进程的区别
> 进程是资源分配的最小单位,线程是任务执行的最小单位
> 进程与进程的用户空间相互独立,内核空间是所有进程共享
> 线程与线程共享其附属进程的所有资源,线程运行在进程空间内。
> 创建多线程的效率比创建多进程高
> 多进程的资源量比多线程高
> 多进程稳定性比多线程高
17.线程同步互斥机制有哪些?原理分别是什么?
> 互斥锁:对于要访问临界资源的线程,在访问之前,都先申请互斥锁,
如果申请上锁成功,则进入临界区,执行临界区代码,直到退出临界区,解开互斥锁
如果申请上锁失败,则说明互斥锁被别的线程占用,当前线程进入休眠,等待互斥锁解开
互斥锁不能控制线程进入临界区的顺序,但是能够保证一个时刻只有一个线程进入临界区。
> 条件变量
将不访问共享资源的线程直接休眠,并设置一个唤醒条件,该唤醒条件称之为条件变量
如果该线程需要访问共享资源,则通过其他线程唤醒
> 信号量
1)当对个任务要访问共享资源的时候,在进入临界区之前先做申请信号量的操作。
当信号量中的值大于0,则申请信号量成功,线程进入临界区。
当信号量中的值等于0,则申请信号量失败,线程进入休眠阻塞阶段,直到信号量的值大于0,解除阻塞。
2)信号量允许多个线程同时进入临界区,主要看信号量的初始值为多少,例如:初始值为2,则允许两个线程同时进入临界区。依次类推。
3)互斥锁又称之为二值信号量,即信号量的初始值为1,。同时只允许一个线程进入临界区。
4)pv操作:是实现线程,进程同步互斥的机制。
p操作:申请信号量的值,-1操作
v操作:释放信号量的值,+1操作
18.同步与互斥的区别?
互斥:值某个资源同时只允许一个访问者对其进程访问,具有唯一性,互斥机制无法限制访问者的访问顺序,即访问是无需的。例如互斥锁
同步:在互斥的基础上,通过其他机制可以实现访问者的有序执行。例如条件变量
19.进程间通信机制有哪些?原理是什么?
> 无名管道
> 有名管道
> 信号
> 消息队列
> 共享内存
将同一物理地址通过内核内存中的共享内存,分别映射到不同的进程中。每个进程只需要操作自己用户空间中的虚拟地址就是实现对共享内存进行操作。
> 信号灯集
20.无名管道的特点?为什么只能用于亲缘关系的进程通信
无名管道在文件系统中不可见,所以两个无关的进程,无法拿到同一根管道的读写端。
子进程会继承父进程的文件描述符表,所以在父进程中创建一根管道拿到读写端后,调用fork函数,创建出来的子进程也会有该管道的读写端。
21. 管道特性
22. 进程对信号的处理方式。
23. 特殊的信号,17号信号必须记
24. 用信号的方式回收僵尸进程,要求写出捕获函数,以及信号处理函数。
25. 最高效的进程间通信方式
26. 进程间的同步互斥机制有哪些? 信号灯集,互斥锁,信号量,条件变量