1.进程和线程
进程是资源分配的最小单位,线程是CPU调度的最小单位。进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。线程共享进程的堆存储,每个线程又有自己的栈存储。
进程间通信:管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket
线程间通信的方式 :临界区、互斥量(互斥)、信号量(同步)、事件
1)进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
2)进程有独立的系统资源,而同一进程内的线程共享进程的大部分系统资
3)一个进程崩溃,不会对其他进程产生影响;而一个线程崩溃,会让其他线程也死掉。
4)进程在创建、切换和销毁时开销比较大,而线程比较小
5)进程间通信比较复杂,而同一进程的线程由于共享代码段和数据段,所以通信比较容易。
2.Linux虚拟地址空间
所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,等到运行到对应的程序时,才会通过缺页异常,来拷贝数据。
请求分页系统、请求分段系统和请求段页式系统。
扩大地址空间、内存保护、公平分配、利用碎片。
建立额外数据结构、增加指令执行时间(虚到实转换)、页面换出。
3.操作系统的内存结构
BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
数据段:存放程序中已初始化的全局变量的一块内存区域。
代码段:存放程序执行代码的一块内存区域。
栈区(高):由编译器自动释放,存放函数的参数值、局部变量等。
堆区(低):用于动态分配内存,位于BSS和栈中间的地址区域
4.操作系统缺页中断
malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。
1、保护CPU现场 2、分析中断原因 3、转入缺页中断处理程序进行处理 4、恢复CPU现场,继续执行
5.请你回答一下fork和vfork的区别
1. fork( )的子进程拷贝父进程的数据段和代码段;vfork( )的子进程与父进程共享数据段
2. fork( )的父子进程的执行次序不确定;vfork( )保证子进程先运行,在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行。
3. 当需要改变共享数据段中变量的值,则拷贝父进程。
6.并发和并行
并发(concurrency):指宏观上看起来两个程序在同时运行,比如说在单核cpu上的多任务。
并行(parallelism):指严格物理意义上的同时运行,比如多核cpu,两个程序分别运行在两个核上,两者之间互不影响,单个周期内每个程序都运行了自己的指令,也就是运行了两条指令。
7. Linux常见命令
修改Linux最大文件句柄数: ulimit -n 2048, 将最大句柄数修改为 2048个
对所有进程都有效的方法,修改Linux系统参数 vi /etc/security/limits.conf
show global variables like 'port';查看端口号 ,mysql的默认端口是3306
8.请问单核机器上写多线程程序,是否需要考虑加锁
需要线程锁。因为线程锁通常用来实现线程的同步和通信。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。不使用线程锁的前提下,可能会导致共享数据修改引起冲突。
9. 请问线程需要保存哪些上下文
线程在切换的过程中需要保存当前线程Id、线程状态、堆栈、寄存器状态等信息。其中寄存器主要包括SP PC EAX等寄存器,其主要功能如下:
SP:堆栈指针,指向当前栈的栈顶地址
PC:程序计数器,存储下一条将要执行的指令
EAX:累加寄存器,用于加法乘法的缺省寄存器
10. 请你说一说线程间的同步方式,最好说出具体的系统调用
sem_wait(sem_t *sem):以原子操作的方式将信号量减1,如果信号量值为0,则sem_wait将被阻塞,直到这个信号量具有非0值。
sem_post(sem_t *sem):以原子操作将信号量值+1。当信号量大于0时,其他正在调用sem_wait等待信号量的线程将被唤醒。
pthread_mutex_init:初始化互斥锁
pthread_mutex_destroy:销毁互斥锁
pthread_mutex_lock:以原子操作的方式给一个互斥锁加锁,如果目标互斥锁已经被上锁,将阻塞
pthread_mutex_unlock:以一个原子操作的方式给一个互斥锁解锁。
pthread_cond_init:初始化条件变量
pthread_cond_destroy:销毁条件变量
pthread_cond_signal:唤醒一个等待目标条件变量的线程
pthread_cond_wait:等待目标条件变量。需要一个加锁的互斥锁确保操作的原子性
11.请你说一说OS缺页置换算法
先进先出(FIFO)算法:置换最先调入内存的页面,即置换在内存中驻留时间最久的页面。
最不经常访问淘汰(LFU)算法:每个数据块一个引用计数,所有数据块按照引用计数排序。
最近最少使用(LRU)算法: 置换最近一段时间以来最长时间未访问过的页面。程序局部性原理。
12. 死锁发生的条件以及如何解决死锁
死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象
互斥条件、请求和保持条件、不可剥夺条件、环路等待条件
资源一次性分配、可剥夺资源、资源有序分配法
互斥锁、读写锁、自旋锁、RCU
13. 操作系统中的结构体对齐,字节对齐
1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的
2)性能原因:而对齐的内存访问仅需要一次访问。
可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变对齐系数
14. 进程间的状态转换
15. static 和 virtual
16. 大端和小端
大端是指低字节存储在高地址;小端存储是指低字节存储在低地址。我们可以根据联合体来判断该系统是大端还是小端。因为联合体变量总是从低地址存储。
17.线程模型
fork&join模型:该模型包含递归思想和回溯思想,递归用来拆分任务,回溯用合并结果。
生产者消费者模型 :其核心是使用一个缓存来保存任务。