1.简述一下系统调用和库函数的区别(举例说明)
系统调用:open, close, read, write…
系统调用是操作系统相关的,因此一般不具有跨操作系统的可移植性。
系统调用通常用于底层文件访问。
系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换,开销较大。
库函数:fopen, fclose, fread, fwrite…
库函数是系统无关的,因此可移植性好。
库函数调用通常用于应用程序中对一般文件的访问。
库函数调用是基于C库,属于过程调用,对文件操作都使用了缓冲区,开销小。
2.写出open系统中打开的标志(至少5种)
O_RDONLY 以只读方式打开文件
O_WRONLY 以只读方式打开文件
O_RDWR 以读写方式打开文件
O_CREAT 打开的文件不存在则创建该文件
O_APPEND 写入的文件以附加的方式加入到文件后面
O_TRUNC 若文件存在并且以可写的方式打开时, 令文件长度清为0
3.VFS的涵义
虚拟文件系统(Virtual File System)
Linux 内核中的一个软件层,用于给用户空间的程序提供文件系统接口。
提供了内核中的一个抽象功能,允许不同的文件系统共存。
系统中所有的文件系统不但依赖 VFS 共存,而且也依靠 VFS 协同工作。
4.Linux系统种主要有几种文件类型(至少5种)
- 常规文件 d 目录文件 b 块设备文件 c 字符设备文件 l 符号链接文件 p 管道文件 s 套接字文件
5.软连接文件的特点是什么(符号链接)
软连接称为符号链接
软链接类似于Windows的快捷方式
软链接可以跨文件系统
软链接可以对一个不存在的文件名进行链接
软链接可以对目录进行链接
6.硬链接文件的特点是什么
硬链接以文件副本的形式存在
硬链接不可以跨文件系统,只有在同一个文件系统中才能创建
硬链接必须要有源文件
硬链接不允许给目录创建硬链接
删除其中一个硬链接文件并不影响其他有相同 inode 号的文件
7.什么是进程,进程资源有哪两部分组成
进程是计算机中程序的一次数据集合运算的活动,是系统进行调度和分配的基本单元,是操作系统的基础 。
进程资源由内核空间进程资源(PCB控制块)和 用户空间进程资源
8.Linux进程结构有哪些
代码区:加载的是可执行文件的代码段,其加载到内存中的位置由加载器完成。
全局初始化数据区/静态数据区(Data Segment):加载的是可执行文件的数据段,位置可位于代码段后也可以分开。生命周期:整个程序执行过程。存储的数据:已初始化全局数据,已初始化静态数据
未初始化数据区(BSS):加载的是可在执行文件的BSS段,位置可以分开亦可以紧靠数据段。生命周期:整个程序运行过程,存储的数据:未初始化全局数据,初始化全局数据。
栈区:由编译器自动分配释放,存放函数的参数值、返回值、局部变量等。生命周期:申请到释放该段空间。
堆区:用于动态内存分配。一般由程序员分配和释放,否则程序结束后OS回收。
9.简述进程和程序的区别
动态和静态的区别:进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念,而程序是一组有序的指令集和,是一种静态的概念
生命周期的区别:进程是程序的一次执行过程,他是动态创建和消亡的,程序是一组代码的集合,他是永久存在的
组成的区别:进程由程序,数据和PCB三部分组成,程序是一组有序的集合指令
进程是竞争计算机资源的基本单位,程序不是。
进程和程序不是一一对应的:多个进程可执行同一程序; 一个进程可以执行一个或几个程序
10.fork返回值的含义
=0 子进程
>0 父进程 子进程的进程ID
=-1 创建失败,出现错误
11.在进程中return和exit的区别
return
语言级别的,它表示调用堆栈的返回;
return是返回函数值并退出函数,通常0为正常退出,非0为异常退出 。
在主函数main中,return会结束当前进程 。如果不是在main函数中,那就是退回上一层调用 。
exit
系统调用级别的,它表示退出应用程序,也就是一个进程的结束,它将删除进程使用的内存空间。
对于单独的进程,exit的返回值是返回给操作系统的。
如果是多进程,则是返回给父进程的。这个返回值标识了应用程序的一些运行信息。通常情况:exit(0)表示程序正常退出, exit(1)和exit(-1)表示程序异常退出,exit(2)表示系统找不到指定的文件。
12.什么是孤儿进程,谁负责回收孤儿进程
父进程消失,子进程仍然存在,那么这个子进程就是孤儿进程。
孤儿进程被 init 进程回收。
13.什么是僵尸进程,这么消灭僵尸进程
子进程比父进程先结束,而父进程又没有释放子进程占用的资源,此时子进程将成为僵尸进程
1.父进程发出wait()/waitpid()系统调用终止进程
2.父进程不终止进程,kill掉这个父进程,僵尸进程就会成为孤儿进程,由init进程领养这个进程然后杀死这个僵尸进程。
14.fork和vfork的区别
fork和vfork都可以用来创建子进程
fork子进程拷贝父进程的数据段、代码;vfork 子进程与父进程共享数据段
fork创建的子进程和父进程的运行的先后顺序是没有保证的;vfork保证子进程先运行,只有子进程通过exec或者exit退出后,父进程才能运行
15.父进程调用wait可能出现的3种情况
当子进程都在执行时,wait会使父进程进入阻塞状态
当恰好有子进程结束时,wait会回收子进程资源并且获得子进程结束状态
当无子进程时wait会立刻返回-1 并且显示报错信息
16.Linux下进程状态有几种
运行态 Running(TASK_RUNING–0) 进程正在或准备运行。进程被标示为运行态,可能会被放到可运行进程队列中。可以认为进程处于随时可以 运行的(准备)就绪状态。
可唤醒阻塞态 Interruptible(TASK_INTERRRUPTIBLE–1) 进程处于等待队列中,待资源有效时被激活,也可由其他进程通过发送信号或者由定时器中 断唤醒后进入就绪队列。
不可唤醒阻塞态 Uninterruptible(TASK_UNINTERRUPTIBLE–2) 进程处于等待队列中,待资源有效时被激活,不可由其它信号或定时器中断唤醒。
僵死状态 Zombie (TASK_ZOMBLE–4) 进程已经结束运行且释放大部分资源,但尚未释放进程控制块。
停滞状态 Stopped (TASK_STOPPED–8) 进程停止运行,通常是由进程接收到一个信号所致。当某个进程处于调试状态时也可能被暂停运行。
17.Linux中常见的进程调度策略有几种
SCHED_FIFO:不同的进程根据静态优先级进行排队,然后在同一优先级的队列中,谁先准备好运行就先调度谁,并且正在运行的进程不会被终止直到 以下情况发生:1.被有更高优先级的进程所强占CPU;2.自己因为资源请求而阻塞;3.自己主动放弃CPU(调用sched_yield);
SCHED_RR:它给每个进程分配一个时间片,时间片到了,正在执行的进程就放弃执行。
(SCHED_FIFO和SCHED_RR是实时进程调度策略,只针对优先级相同并且都是就绪状态的的进程.)
SCHED_OTHER是普通进程,常规分时调度策略。
18.进程间通信的目的有哪些
数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几兆字节之间。
共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
资源共享:多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有异常,并能够及时知道它的状态改变。
19.简述进程对可靠信号和不可靠信号的处理过程
如果进程在屏蔽某个信号的时间内,其他进程多次向其发送同一个信号,
不可靠信号只有一次未决记录,当进程解除屏蔽后,该信号只会被捕捉一次;
可靠信号操作系统会记录所有的发送,当进程解除屏蔽后,操作系统会捕捉对等次数。
20.简单介绍信号的定义及其分类
信号是一种进程间异步的通信机制,在实现上是一种软中断。
可靠信号和不可靠信号
确定信号和随机信号;
连续信号和离散信号;
周期信号和非周期信号;
能量信号与功率信号;
因果信号与反因果信号;
实信号与复信号;
21.列举常见的进程间的通信方式,并简单描述(至少4种)
管道包括三种:普通管道,流管道,命名管道
信号量:是一个计数器,可以用来控制多个进程对共享资源的访问
消息队列:是由消息的链表,存放在内核中并由消息队列标识符标识
信号:是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
共享内存:是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问
套接字:是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信
22.解释匿名管道和有名管道的区别
有名管道通过mkfifo进行创建,匿名管道通过pipe进行创建
有名管道其是基于磁盘上的标记文件来进行操作的,其需要进行open函数获得文件描述符。
匿名管道是创建于内核空间的
有名管道不只局限于具有血缘关系的进程间通信,只要任意两个进程可以读取到同一个有名管道文件描述符都可以进行通信,而匿名管道只能在具有血缘关系的进程间通信
23.简答介绍匿名管道及其特点
匿名管道是半双工的,只有一个写端和一个读端
匿名管道不是普通的文件,不是在磁盘上,而是在内存中的,所以它的生命周期随进程的结束而结束
匿名管道是基于字节流来通信的
其本身有同步互斥的效果
匿名管道只能使用于有血缘关系的进程之间的通信
39.简单介绍信号是什么?
信号是异步的
信号是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动
信号是因为某些错误条件而产生的,比如内存段冲突、浮点处理器错误或者非法指令等
信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断
24.简述安装信号signal和sigaction的不同
signal() 安装的信号不能向信号处理函数传递信息
sigaction() 可设置进程的信号掩码,返回设置之前的sigaction结构
安装的信号可以向信号处理函数传递信息
25.简述linux中信号的处理方式
信号忽略 忽略此信号,大多数信号都可以采用这种方式进行处理,除了9( SIGKILL )和19(SIGSTOP )信号。
信号捕捉 进程要通知内核在某种信号产生时,需要调用一个用户函数,在用户函数中,用户可以自己定义信号处理的方式,在Linux下我们不能捕捉SIGKILL信号和SIGSTOP信号
执行默认动作 一般情况下是终止该进程
26.简述产生信号的方式
按键产生 软件条件产生 硬件异常产生 系统调用
27.简述信号的生命周期
信号诞生 触发信号的事件发生(如检测到硬件异常、定时器超时以及调用信号发送函数kill()或sigqueue()等)。
信号在进程中注册 内核更新目标进程的数据结构,将信号加入进程的未决信号集,并将信号所携信息保存到某个sigqueue结构中
对实时信号,不管其是否已在进程中注册,都被再次注册
对非实时信号,若该信号已在进程中注册,则将其丢弃
信号在进程中注销 进程从核心空间返回用户空间时都检测是否有信号等待处理
若存在等待处理且未被阻塞的未决信号,则将其在未决信号链中占有的结构卸掉 (对实时进程只删除sigqueue结构)
信号处理函数执行完毕
执行相应信号处理函数或改变目标进程的执行状态
28.简述什么是线程以及特点
线程是在一个程序内部可以被操作系统调度并发运行的任务
1线程有自己的运行线索,可完成特定任务。
2线程自己基本上不拥有系统资源,只拥有少量在运行中必不可少的资源(如程序计数器、一组寄存器、栈、线程信号掩码、局部线程变量和线程私有数据)。
3与同属一个进程的其他线程共享进程所拥有的全部资源(同一地址空间、通用的信号处理机制、数据与I/O)。
4可通过相互之间协同来完成进程所要完成的任务。
29.在线程中pthread_cancel()和exit的区别和联系 (取消函数和退出函数)
Pthread_exit()是结束本线程
Pthread_cancel()是结束其他线程
30.简述互斥锁与读写锁的区别与联系
互斥锁特点 一次只能一个线程拥有互斥锁,其他线程只有等待
读写锁特点 多个读线程可以同时进行读
写线程必须互斥(只允许一个写线程写,也不能读线程写线程同时进行)
31.条件变量中pthread_cond_wait实现步骤 (加锁,解锁…)
nlock mutex
sleep & wait for cond
cond ok & return
lock mutex
32.进程和线程的定义
线程是在一个程序内部可以被操作系统调度并发运行的任务
进程进程是计算机中程序的一次数据集合运算的活动,是系统进行调度和分配的基本单元,是操作系统结构的基础
33.进程和线程的关系与区别
线程是操作系统能够运算调度的最小单位,进程是运行中的程序,线程是进程内部的一个执行序列,进程是资源分配的基本单元,而线程是执行的基本单元
进程切换代价大,线程切换代价小
进程拥有资源多,线程拥有的资源少
多个线程共享进程的资源
34.TCP与UDP的区别
TCP需要连接,UDP是无连接的,发送数据之前不需要建立连接
TCP要求的系统资源较多,UDP较少
TCP提供可靠的服务,无差错,不丢失,不重复,且按序到达;
UDP尽最大努力交付,即不保证可靠交付
35.TCP三次握手的过程
第一次握手:建立连接时,客户端发送syn包到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号
第二次握手:服务器收到syn包,必须确认客户的SYN,同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK,此包发送完毕,客户端和服务器进入ESTABLISHE状态,完成三次握手
36.简述OSI的7层模型
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层