Linux系统编程总结(持续更新)

1.冯诺依曼体系结构是什么?分为哪几部分?

是现代计算机的硬件体系结构,分为存储器,运算器,控制器,输入设备,输出设备

2.操作系统是什么?如何管理?系统调用接口是什么?库函数和系统调用接口什么关系?

是一个搞管理的软件,管理计算机的软硬件设备,先描述再组织,操作系统向用户提供的访问内核的接口,库函数封装了系统调用接口

3.进程是什么?pcb有哪些描述信息?

进程是运行中的程序,进程就是pcb,是操作系统对运行中程序的动态描述,通过这些描述实现运行调度管理
是资源分配的基本单位(与线程的区分)
pcb有上下文数据,程序计数器,标识符,内存指针等

4 进程状态(Linux)有哪些?作用?特殊进程(孤儿进程,僵尸进程)?

一般进程状态有运行,就绪,阻塞
Linux有运行(R) ,可中断休眠(S),不可中断休眠(D),停止(T),僵死(Z)
能够让操作系统知道,一个程序什么状态该干什么事
僵尸进程:子进程先于父进程退出,父进程没有关注获取子进程退出返回值.因此子进程资源无法释放,成为僵尸,危害:资源泄露,避免:进程等待
孤儿进程:父进程先于子进程退出,子进程成为孤儿进程,特性:父进程运行正在后台,为1号进程

5环境变量?作用?

shell中特殊变量,可以传递给子进程的变量
可以向子进程传递参数
命令:env,set,echo(查看)export(设置)unset(解除)

6 程序地址空间是什么?为什么需要?分为哪几种内存管理?缺页中断是什么?内存置换算法?

操作系统为进程通过mm_struct结构体描述的一个虚拟的地址空间
实现离散式存储,提高内存利用率,通过页表进行地址映射访问,可以提高内存的访问控制
分为三种,分段式内存管理(优点:对地址管理比较好),分页式内存管理(内存利用率高,以及访问控制),段页式内存管理(结合前两种)
缺页中断就是,当内存不够时,会将不常用的数据交换到交换分区,则页表项为缺页中断,如果访问该数据时,发现数据不在内存空间中,就会缺页中断,从交换分区交换回来
LRU:一种内存置换算法,最久未使用

7 进程创建是什么?如何创建?写时拷贝技术?

在内核中创建一个pcb
fork:创建pcb,复制父进程大部分信息,性质:父进程子进程代码共享,数据独有,返回值:父进程fork()之后返回值为子进程的pid号,而子进程fork()之后的返回值为0
vfork:创建pcb,与父进程共用一个虚拟地址空间,父进程会阻塞直到子进程exit退出或者程序替换(因为fork现在有了写时拷贝技术,所以vfork用的很少)
写时拷贝技术:一开始创建子进程的时候,父子进程指向各自的虚拟地址映射到同一块物理内存,当子进程物理内存数据要改变时,则重新分配一块物理内存给子进程

8 进程终止有哪几种方式?

main中调用return 会刷新缓冲区
库函数exit() 会刷新缓冲区
系统调用接口_exit() 不会刷新缓冲器

9 进程等待是什么?为什么需要进程等待?如何等待?

等待子进程退出
因为需要获取子进程退出信息,释放子进程资源,避免发生僵尸进程
wait waitpid

10 程序替换是什么?为什么需要程序替换?如何替换?

程序替换就是重新加载新的程序到内存中,更改页表信息,使其映射到新的程序上,这时候pcb调度的就是这个新程序
让子进程可以处理新的任务
exec函数簇:execl,execlp,execle…

11 文件描述符是什么?重定向?文件流指针和文件描述符的关系?

系统调用IO接口的操作句柄,是一个非负整数,在内核中是一个文件描述信息数组的下标,通过下表可以找到文件描述信息,进而实现文件操作
重定向:通过改变文件描述符对应的文件描述信息,实现改变数据的流向 实现:dup2
文件流指针是一个结构体,是库函数IO的操作句柄,而库函数最终要调用系统调用接口,需要使用文件描述符,实际上文件流指针结构体就有一个成员变量是文件描述符

12 文件管理系统是什么?由什么组成?

文件管理系统是ext2文件系统,由超级块,inode bitmap,数据块bitmap,inode表,数据块组成

13 软链接和硬链接文件的区别?

共同点:都是针对一个文件而创建,用于通过链接文件访问源文件
不同点:硬链接是创建一个相同的inode节点,和源文件没有什么不同,只是目录项不同,链接数加1,软链接:一个独立的新文件,保存了源文件路径,源文件删除,软链接文件就找不到了,但是软链接文件可以跨分区,可以对目录创建

14 动态库静态库如何打包?如何使用?

将源码文件编译汇编成为各自的机器指令文件:gcc -fPIC -c *.c -o *.o
将各个机器指令文件以及库文件打包到一起生成库文件

动态库:gcc --shared .o -o lib.so
静态库:ar -cr lib*.a *.o *.o

生成可执行程序时连接使用:1.使用gcc -l选项2.将库文件放入指定目录 /lib64 3.设置环境变量LIBRARY_PATH=$ LIBRARY_PATH:./libpath 4.使用gcc链接选项gcc main.c -o main -L./libpath -l*
运行可执行程序时链接使用(仅限动态库):1.将库文件放入指定目录 /lib64 2.设置环境变量LIBRARY_PATH=$ LIBRARY_PATH:./libpath

15 进程间通信是什么?为什么需要进程间通信?

操作系统为进程提供的通信方式
因为进程间需要信息交互,进程具有独立性,进程访问的都是自己的虚拟地址空间,无法直接进行地址访问实现通信

16 管道是什么?分类?特性?

管道的本质就是内核中的一块缓冲区(占用内核中的一块内存),多个进程通过访问同一个缓冲区实现通信
分为匿名管道,命名管道

匿名管道(pipe):只用于具有亲属关系的进程通信,比如子进程复制父进程获取管道操作句柄
命名管道(mkfifo):在文件系统中创建一个管道文件作为内核中缓冲区的标识符,因此任意进程都可以打开同一个管道文件,访问到同一个缓冲区实现通信

特性:半双工通信,生命周期随进程,提供字节流服务(先进先出,有序,传输灵活,基于连接,所有读端关闭,写会触发异常,所有写端关闭,读会返回0),自带同步(没有数据读会阻塞,数据满了写会阻塞)与互斥

17 共享内存是什么?代码操作?命令操作?特性?注意事项?

本质就是一块物理内存空间,多个进程将同一块物理内存映射到自己的虚拟地址空间进行访问实现通信
创建共享内存:shmget 映射共享内存:shmat 具体操作 解除映射关系:shmdt 删除共享内存:shmctl
查看共享内存:ipcs -m 删除共享内存:ipcrm -m shmid
特性:生命周期随内核,最快的进程通信方式
注意:需要注意安全,加锁保护

18 消息队列是什么?特性?

本质内核的一个优先级队列
生命周期随内核,自带同步互斥

19 信号量是什么?

本质是内核中的一个计数器,主要通过计数器对资源进行计数,实现进程的同步互斥

20 信号是什么?信号的种类

信号是一个软件中断,通知进程发生了某个事件,打断进程当前操作,去处理这个事件
62种,分为可靠信号(34-64),非可靠信号(1-31)

21 信号的产生?

硬件:ctrl+c/ctrl+z
软件:kill/abort(给自己发送SIGABRT信号-通常用于异常通知)/raise/alarm(定时器 设定秒钟之后给进程自己发送SIGALRM信号)

22 信号在进程中注册是什么?如何实现?

在进程pcb中做标记,告诉进程给你发送了某个信号
pcb有个pending位图,以及sigqueue链表
可靠信号:修改位图,并且添加sigqueue节点,来一次添加一个
非可靠信号:修改位图,并且添加sigqueue节点,但是若信号已经注册,则什么也不做

23 信号在进程中注销是什么?如何实现?

消除pcb中信号存在的痕迹,避免信号重复处理
可靠信号:删除sigqueue节点,当没有相同节点时,重置位图
非可靠信号:删除sigqueue节点,直接重置位图

24 信号的处理是什么?处理方式有哪些?

调用信号的处理回调函数去处理事件
默认处理方式
忽略处理方式
自定义处理方式

25 信号的阻塞是什么?如何实现?特例?

进程收到了一个信号,但是暂时不处理这个信号,知道信号被解决阻塞
pcb中有block阻塞位图,在这个位图中被标记的信号表示要被阻塞
SIGSTOP/SIGKILL 这两个信号无法被阻塞,无法被忽略,无法被自定义的

26 函数的可重入与不可重入是什么?判断基准是什么?

函数重入:在多个执行流,同时进入同一个函数
函数可重入:函数重入不会造成二义性
函数不可重入:函数重入会造成二义性
判断基准:对于全局变量,函数是否做了原子操作

27 volatile的作用

防止编译器过度优化,每次访问都需要从内存中获取变量数据

28 信号应用有哪些?

SIGPIPE:当所有读端关闭,进行写操作就会触发异常
SIGCHID:当子进程先于父进程退出,会向父进程发送SIGCHID信号

29 线程是什么?进程和线程的区别?

线程是进程的一条执行流,Linux中pcb实现了执行流,线程就是轻量级进程,Linux下的线程就是一个pcb
进程就是分配资源的基本单位
线程是cpu调度的基本单位

30 线程间的独有与共享?

独有:标识符,栈,信号屏蔽字,寄存器,errno
共享:虚拟地址空间(数据段,代码段),文件描述符表,信号处理方式,工作路径

31.线程同步与互斥有哪些方式

临界区:适合一个进程内的多线程访问公共区域或代码段时使用
互斥量:适合不同进程内多线程访问公共区域或代码段时使用
事件:通过线程间触发事件实现同步互斥
信号量:与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据

31 多进程,多线程的区别?

共同点:多执行流并发或并行,提高程序处理效率
多线程:创建销毁成本更低,在同一进程里,调度成本更低,线程间通信灵活
多进程:健壮性,一个进程出问题,其他进程不会出现问题

32 线程控制流程?

线程创建(pthread_create)->线程终止(pthread_exit/pthread_cancel)->线程等待(pthread_join)->线程分离(pthread_detach自动退出,不需等待获取资源)

33 线程安全是什么?

描述线程间对临界资源访问操作的安全问题

34 死锁是什么?产生的条件?如何预防?如何避免?

多个线程对锁资源进行争抢获取,推进顺序不当导致程序流程阻塞,无法继续
互斥条件,不可剥夺条件,请求与保持条件,环路等待条件
预防出现四个必要条件
银行家算法

35 生产者消费者模型优点?

解耦合,支持忙闲不均,支持并发

36线程池优点?

避免频繁进行大量的线程创建与销毁带来的世间成本
避免了同一时间创建大量线程导致资源耗尽的风险

猜你喜欢

转载自blog.csdn.net/Hedenghui777/article/details/114623304