创建子进程 fork() 子进程pid为0,子进程先执行,父进程再执行,返回两次,fork后,子进程会赋值父进程的task_struct结构,并为子进程的对栈分配物理页。理论上来说,子进程应该完整地复制父进程的堆,栈以及数据空间,但是2者共享正文段。
多线程:线程是可执行代码的可分派单元。
线程安全:概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。主要考虑线程间的共享变量,全局变量、静态变量。
可重入:可重入一定是线程安全的
1、不在函数内部使用静态或全局数据
2、不返回静态或全局数据,所有数据都由函数的调用者提供。
3、使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
4、不调用不可重入函数。
IPC****进程间通信
管道:具有亲缘关系之间的进程间的通信,有固定的读端和写端 pipe 速度慢,容量有限,只有父子进程能通讯
FIFO****命名管道:FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。任何进程间都能通讯,但速度慢
信号量:计数器,信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。需要与共享内存联系起来。不能传递复杂消息,只能用来同步
消息队列:可以实现消息的随机查询。容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
共享内存(最快):能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
缓存的运行过程 如何保证cache一致性
缓存只是内存中少部分数据的复制品,所以CPU到缓存中寻找数据时,也会出现找不到的情况(因为这些数据没有从内存复制到缓存中去),这时CPU还是会到内存中去找数据,这样系统的速率就慢下来了,不过CPU会把这些数据复制到缓存中去,以便下一次不要再到内存中去取。
缓存映射:直接映射缓存,组相连缓存,全相连缓存
cache****一致性:用于保证多个CPU cache之间缓存共享数据的一致。MESI协议为了保证多个CPU cache中共享数据的一致性,定义了cache line的四种状态,而CPU对cache的4种操作可能会产生不一致状态,因此cache控制器监听到本地操作和远程操作的时候,需要对地址一致的cache line状态做出一定的修改,从而保证数据在多个cache之间流转的一致性。
cache的4种状态:
modify:表示当前CPU中拥有最新数据,虽然主存中的数据和当前CPU中的数据不一致,但是以当前CPU中的数据为准
exclusive:表示当前CPU独占数据(其他CPU没有数据),并且和主存的数据一致
shared:表示当前CPU和其他CPU共享数据,且数据在多个CPU 之间一致、多个CPU之间的数据和主存一致
invalid:表示当前CPU中是脏数据,不可用,其他CPU可能有数据、也可能没有数据
引起数据状态转化的操作:
去本地cache的数据,将数据写到本地cache,读取主存中的数据,将数据写到主存中
怎么等一个线程做完
join()方法
解释下线程和协程区别,协程库中yield干嘛用的
Python中的yield吗?
用于让当前进程释放其占用的CPU资源,以便让其他进程有机会执行
怎么创建新进程,内核做了啥?这个回答了下fork, vfork等,然后具体do_fork过程,copy on write等
求一些数的全排列
SQL语句(包含count,group by)
selelct x.sno,x.score,y.score from studtent x,sc y where xxx and xxx
GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等。
select sno,avg(score) from sc group by sno having avg(score)>60
select sc.sno,sname,count(cno),sum(score) from student join sc on student.sno=sc.sno group by sc.sno,sname
select count(tname) from teacher where tname like “无%”
select sno,sname from student where sno not in(select sno from SC where cno in(select cno from coursewhere tno in(select tno from teacherwhere tname=\'悟空\')))
order by asc(升序) desc(降序)
MySQL中事务隔离级别
事务的基本要求ACID
原子性(要么做,要么不做)、一致性、隔离性(同一时间只允许一个事务请求同一数据,不同事务之间没干扰),持久性
事务的并发问题:
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据