Linux复习(第二节课)__2018.07.24
用户态:执行用户代码的时候处于用户态
内核态:执行内核代码的时候处于内核态
系统调用就是执行系统的代码,处于内核态。
0x80号中断(系统调用),产生中断,内核处理中断。
用户访问不了内核的代码,它只是告诉内核自己要干什么,由内核完成具体操作。
《Linux内核设计与实现》第五章。
系统调用处于系统和硬件之间。
系统调用的开销是很大的。尽量减少系统调用的次数。
int main(int argc,char *argv[],char *env[]);//参数个数 参数内容 环境变量
无名管道 只能在父子进程间通信 半双工 写入管道的数据都在内存中
有名管道 可以在任意两个进程间通信 (为了解决无名管道的缺陷)
管道是一个流式的数据,一段写一段读。
系统调用:signal、kill的功能。
signal() 改变信号的相应方式
kill() 发送信号
实现:在pcb中定义一个长整形的数据,收到哪一个信心就把哪一位置为1,默认为0
fork()复制的时候,先为子进程申请一个pid,然后把pcb复制一份,将pcb的中的进程号改为子进程的pid,然后是进程实体的复制(写时拷贝)。
僵死进程:子进程先于父进程结束,父进程没有调用wait获取子进程的退出码,子进程就变成僵死进程。
父进程调用wait,Linux中让它忽略掉SIGCHLD信号,可以达到处理僵死进程的目的。
虚拟内存,不是真实的物理内存,只是磁盘上划分的一段空间(Linux上的swap分区)当作内存来用,物理内存不足时可以把一些物理页框换出去,放在交换分区。
意义:可以使系统运行比当前物理内存还大的应用程序。
申请1.9G的内存。
关闭系统的交换分区:#swapoff -a
fork底层的实现都是调用do_fork()
先为进程获取一个pid,再调用复制进程实体 的函数。
对传进来的标志位,进行检查,看有没有冲突。
系统会先缓存好多pcb的镜像,用的时候,直接拿出来就行了。
PCB:task_struct
tsk:pcb的指针。
你这样讲,主干思路就不清晰了。
初始化结构体。
在内核中打开了一个文件。
内核中的数据结构。
pcb里面是一大堆的指针。
将页设为只读,当要对该页进行写操作时,就会产生异常。
PGD:全局页目录。
mmstruct:内存描述符。
内核栈(thread_info):4K或8K
用了父进程的内核栈信息初始化了子进程的栈信息,所以子进程是接着父进程执行的位置继续执行,fork返回的值是0(eax),
PCB=》进程实体=》父进程的内核栈初始化子进程的内核栈
子进程的返回值是0;主干流程理清楚。
把fork和系统调用的切换过程整理一下,主干思路理清楚。