1 文件描述符:在linux系统中,每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。文件描述符的优点:兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。文件描述符的缺点:不能移植到UNIX以外的系统上去,也不直观。
文件指针:C语言中使用的是文件指针而不是文件描述符做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引。
函数库调用
|
系统调用
|
在所有的ANSI C编译器版本中,C库函数是相同的 | 各个操作系统的系统调用是不同的 |
它调用函数库中的一段程序(或函数) | 它调用系统内核的服务 |
与用户程序相联系 | 是操作系统的一个入口点 |
在用户地址空间执行 | 在内核地址空间执行 |
它的运行时间属于“用户时间” | 它的运行时间属于“系统”时间 |
属于过程调用,调用开销较小 | 需要在用户空间和内核上下文环境间切换,开销较大 |
在C函数库libc中有大约300个函数 | 在UNIX中大约有90个系统调用 |
典型的C函数库调用:system fprintf malloc | 典型的系统调用:chdir fork write brk; |
区别:(1)地址空间:进程有自己独立的地址空间;线程共享进程的地址空间;
(2)资源:进程是资源分配和拥有的独立单位,同一个进程内的线程共享进程的资源;
(3)线程是处理器调度的基本单元,进程不是;
.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈);
(4)在并发的开销方面,线程比进程开销小,这样提高了资源的吞吐量;
4LINUX中的文件类型
d 目录文件
l 符号链接(指向另一个文件,类似于瘟下的快捷方式)
s 套接字文件
b 块设备文件
c 字符设备文件
p 命名管道文件(FIFO文件)
普通文件(文本文件和二进制文件):
5 虚拟地址:指的是由程序产生的由段选择符和段内偏移地址两个部分组成的地址。
逻辑地址:指由程序产生的与段相关的偏移地址部分。
线性地址:指的是虚拟地址到物理地址变换之间的中间层,是处理器可寻指的内存空间(称为线性地址空间)中的地址。程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换产生物理地址。若是没有采用分页机制,那么线性地址就是物理地址。
物理地址:指的是现在CPU外部地址总线上的寻址物理内存的地址信号;
Memory Mangement Unit负责从虚拟地址到物理地址的转化。逻辑地址是段标识+段内偏移量的形式,MMU通过查询段表,可以把逻辑地址转化为线性地址。
cpu开启了分页功能,MMU还需要查询页表来将线性地址转化为物理地址:逻辑地址 ----(段表)---> 线性地址 — (页表)—> 物理地址
1)前者属于低级IO,后者是高级IO。
2)前者返回一个文件描述符(用户程序区的),后者返回一个文件指针。
3)前者无缓冲,后者有缓冲。
4)前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
5)后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
9 linux多线程同步的方式:线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。
临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
条件变量:利用共享的全局变量提供的一种机制,条件变量上的基本操作触发条件,等待条件,挂起线程知道其他线程触发条件;
10 linux进程间同步的方式:
原子操作:该操作绝不会在执行完毕前被任何其他任务或事件打断,原子操作需要硬件的支持,因此是架构相关的,它们都使用汇编语言实现。
信号量:信号量在创建时需要设置一个初始值,表示同时可以有几个任务可以访问该信号量保护的共享资源,初始值为1就变成互斥锁(Mutex)。
自旋锁:自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。
如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断)(因为无法中断已睡眠的进程),就必须使用自旋锁。
linux内核同步方法:原子操作、自旋锁、读-写自旋锁、信号量、读-写信号量、完成变量、BKL、禁止抢占(preemp_disable()、preemp_enable())