Skip to content

Commit

Permalink
修改
Browse files Browse the repository at this point in the history
  • Loading branch information
arkingc committed Jun 21, 2018
1 parent 758abc5 commit 3907c61
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 22 deletions.
11 changes: 6 additions & 5 deletions interview/C++.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,12 @@
* 2)内存管理有几种方式?(new、delete、malloc、free、allocators)
* 3)new和malloc的区别?(函数,运算符、类型安全、计算空间、步骤)
* 4)malloc的实现?
* 5)delete(步骤、delete与析构、可以delete空指针、可以delete动态const对象)
* 6)为什么要内存对齐?(性能原因、平台原因)
* 7)[struct内存对齐方式?](https://github.com/arkingc/llc/blob/master/cpp/alignment/struct.cpp#L1)
* 8)什么是内存泄露?如何检测与避免?(Mtrace,[valgrind](https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/)
* 9)智能指针相关
* 5)调用malloc函数之后,OS会马上分配内存空间吗?(不会,只会返回一个虚拟地址,待用户要使用内存时,OS会发出一个缺页中断,此时,内存管理模块才会为程序分配真正内存)
* 6)delete(步骤、delete与析构、可以delete空指针、可以delete动态const对象)
* 7)为什么要内存对齐?(性能原因、平台原因)
* 8)[struct内存对齐方式?](https://github.com/arkingc/llc/blob/master/cpp/alignment/struct.cpp#L1)
* 9)什么是内存泄露?如何检测与避免?(Mtrace,[valgrind](https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/)
* 10)智能指针相关
* 种类、区别、原理、能否管理动态数组
* shared_ptr(使用、计数的变化,get()函数要注意什么)
* unique_ptr(如何转移控制权)
Expand Down
8 changes: 6 additions & 2 deletions interview/temp/IO.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
## 2.如何理解阻塞非阻塞与同步异步的区别

* 同步和异步关注的是消息通讯机制
* 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)是的状态
- 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果
- 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用
* 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态
- 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回
- 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程

[参考](https://www.zhihu.com/question/19732473)
[怎样理解阻塞非阻塞与同步异步的区别?](https://www.zhihu.com/question/19732473)
2 changes: 1 addition & 1 deletion interview/temp/进程线程.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
* **vfork()函数**
- vfork()系统调用在Linux中也是用clone()实现的,其中clone()的参数flags指定为SIGCHLD信号和CLONE_VM和CLONE_VFORK标志,clone()的参数child_stack等于父进程当前的栈指针
- 创建的子进程运行在父进程的地址空间上,子进程对虚拟地址空间数据的修改对父进程都可见,这与fork完全不同,fork是独立地址空间,而vfork是共享父进程空间,为了防止父进程重写子进程需要的数据,父进程被阻塞,直到子进程执行exec()或exit()。vfork是一个过时的应用,vfork最初是因为fork没有实现COW机制,而很多情况下fork之后会紧接着exec,而exec的执行相当于之前fork复制的空间全部变成了无用功,所以设计了vfork。现在fork使用了COW机制,唯一的代价仅仅是复制父进程页表的代价,所以vfork不应该出现在新的代码之中([vfork](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#22-vfork)
- Linux内核使用`task_struct`描述进程,每个Linux线程都有唯一隶属于自己的`task_struct`结构,所以在内核中,它看起来就像一个普通进程(只是和其它一些进程共享某些资源,如地址空间)。vfork创建的子进程作为父进程的一个单独的线程在它的地址空间运行。
- Linux内核使用进程描述符`task_struct`记录进程信息,每个Linux线程都有唯一隶属于自己的`task_struct`结构,所以在内核中,它看起来就像一个普通进程(只是和其它一些进程共享某些资源,如地址空间)。vfork创建的子进程作为父进程的一个单独的线程在它的地址空间运行。
* **clone()函数**可以有选择性地继承父进程的资源,如果选择共享父进程空间,那么创建的是一个线程,也可以选择不与父进程共享同一空间
- `fn`:由新进程执行的函数
- `arg`:指向传递给fn()函数的数据
Expand Down
12 changes: 5 additions & 7 deletions interview/操作系统.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,11 @@
+ 2)Linux有哪几种设备?(字符设备与块设备,[mknod系统调用](https://blog.csdn.net/lqp276/article/details/53502992)用来创建设备文件)
+ 3)[如何唯一标识一个设备?](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#13%E8%AE%BE%E5%A4%87%E7%89%B9%E6%AE%8A%E6%96%87%E4%BB%B6)(主设备号和次设备号)
- **4.I/O**
+ 1)[5种I/O模型对比](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#%E5%85%AB%E9%AB%98%E7%BA%A7io)
+ 2)[5种I/O模型详解](http://www.jianshu.com/p/486b0965c296)
+ 3)[聊聊同步、异步、阻塞与非阻塞](http://www.jianshu.com/p/aed6067eeac)
+ 4)[如何理解阻塞非阻塞与同步异步的区别?](temp/IO.md#2如何理解阻塞非阻塞与同步异步的区别)
+ 5)[select poll epoll](https://segmentfault.com/a/1190000003063859)的区别,底层实现原理,应用场景?
+ 6)文件读写使用的系统调用
+ 7)[文件内存映射mmap](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#6%E5%AD%98%E5%82%A8%E6%98%A0%E5%B0%84io)
+ 1)5种I/O模型([总览](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#%E5%85%AB%E9%AB%98%E7%BA%A7io)
+ 2)[如何理解阻塞非阻塞与同步异步的区别?](temp/IO.md#2如何理解阻塞非阻塞与同步异步的区别)
+ 3)文件读写使用的系统调用:[open](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#21-%E6%89%93%E5%BC%80%E6%96%87%E4%BB%B6)[close](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#23-%E5%85%B3%E9%97%AD%E6%96%87%E4%BB%B6)[lseek](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#24-%E5%AE%9A%E4%BD%8D%E8%AF%BB%E5%86%99%E4%BD%8D%E7%BD%AE)[read](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#25-%E6%96%87%E4%BB%B6%E8%AF%BB)[write](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#26-%E6%96%87%E4%BB%B6%E5%86%99)
+ 4)[sync、fsync、fdatasync?](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#5%E6%95%B0%E6%8D%AE%E5%90%8C%E6%AD%A5)
+ 5)[文件内存映射mmap](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#6%E5%AD%98%E5%82%A8%E6%98%A0%E5%B0%84io)(如何使用mmap为文件添加数据?)
- **5.内存管理**
+ 1)[Linux内存模型](https://www.ibm.com/developerworks/cn/linux/l-memmod/)(内核)
+ 2)[内核内存分配vmalloc与kmalloc](temp/内存管理.md#1内核内存分配)
Expand Down
9 changes: 4 additions & 5 deletions interview/网络.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,9 @@
* **二.Linux**
* 1)[TCP通信的各个系统调用](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#%E4%BA%8C%E5%9F%BA%E6%9C%ACtcp%E5%A5%97%E6%8E%A5%E5%AD%97%E7%BC%96%E7%A8%8B)
- 连接建立:[socket](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#1socket%E5%87%BD%E6%95%B0)、[connect](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#2connect%E5%87%BD%E6%95%B0)、[bind](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#3bind%E5%87%BD%E6%95%B0)、[listen](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#4listen%E5%87%BD%E6%95%B0)、[accept](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#5accept%E5%87%BD%E6%95%B0)、[read](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#25-%E6%96%87%E4%BB%B6%E8%AF%BB)、[write](https://github.com/arkingc/note/blob/master/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/UNIX%E7%8E%AF%E5%A2%83%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B.md#26-%E6%96%87%E4%BB%B6%E5%86%99)([发送缓冲区](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#2%E7%BC%93%E5%86%B2%E5%8C%BA))
- 连接关闭:[close](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#6close%E5%87%BD%E6%95%B0)、shutdown(close与shutdown的区别?)
- 连接关闭:[close](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#6close%E5%87%BD%E6%95%B0)[shutdown](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#7shutdown%E5%87%BD%E6%95%B0)(close与shutdown的区别?)
* 2)[UDP通信的各个系统调用](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#%E4%B8%89%E5%9F%BA%E6%9C%ACudp%E5%A5%97%E6%8E%A5%E5%AD%97%E7%BC%96%E7%A8%8B)
- socket、[connect](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#1recvfrom%E4%B8%8Esendto%E5%87%BD%E6%95%B0)、bind、[sendto](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#1recvfrom%E4%B8%8Esendto%E5%87%BD%E6%95%B0)[发送缓冲区](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#1%E7%BC%93%E5%86%B2%E5%8C%BA))、[recvfrom](https://github.com/arkingc/note/blob/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/UNIX%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%8D%B71.md#1recvfrom%E4%B8%8Esendto%E5%87%BD%E6%95%B0)、close
* 3)close是一次就能直接关闭的吗,半关闭状态是怎么产生的?
* 4)FIN报文段除了在调用close时会发送,在进程终止(包括主动与被动)时也会发送
* 5)[Linux高性能服务器编程——进程池和线程池](http://blog.csdn.net/walkerkalr/article/details/37729323)
* 6)[使用同步IO模型实现的Reactor模式的工作流程](temp/1使用同步io模型实现的reactor模式的工作流程)
* 3)[select poll epoll](https://segmentfault.com/a/1190000003063859)的区别,底层实现原理,应用场景?
* 4)[Linux高性能服务器编程——进程池和线程池](http://blog.csdn.net/walkerkalr/article/details/37729323)
* 5)[使用同步IO模型实现的Reactor模式的工作流程](temp/1使用同步io模型实现的reactor模式的工作流程)
Binary file added pic/apue-fileio-14.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 4 additions & 2 deletions 操作系统/UNIX环境高级编程.md
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,8 @@ fcntl可以改变已经打开文件的属性

## 3.进程间文件共享

<div align="center"> <img src="../pic/apue-fileio-14.png"/> </div>

UNIX系统支持在不同进程间共享打开文件。内核使用3种数据结构描述打开文件。它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响

* 内核为每个进程分配一个**进程表项**(所有进程表项构成进程表),进程表中都有一个打开的文件描述符表。每个文件描述符占用一项,其内容为:
Expand Down Expand Up @@ -841,7 +843,7 @@ Single UNIX Specification为处理临时文件定义了另外两个函数:`mkd

* **同步I/O**:I/O操作过程中会导致请求进程阻塞,直到I/O操作完成
- **1)阻塞式I/O**:进程会在整个调用开始到结束一直阻塞
- **2)非阻塞式I/O**:非阻塞指I/O操作不导致进程睡眠。如果描述符未就绪,返回一个错误,因为需要轮询直到I/O操作成功,因此会耗费大量CPU
- **2)非阻塞式I/O**:非阻塞指I/O操作不导致进程睡眠。如果描述符未就绪,返回一个错误,因为需要轮询直到描述符就绪,因此会耗费大量CPU
- **3)I/O复用**:I/O复用的优势在于可以等待多个描述符就绪
- **4)信号驱动I/O**:内核在描述符就绪时发送`SIGIO`信号进行通知。优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行
* **异步I/O**:不导致请求进程阻塞
Expand Down Expand Up @@ -1180,7 +1182,7 @@ AIO控制块列表描述了一系列I/O请求,可以由该函数提交
- `SIGSEGV`:通常用于指示进程试图访问对它不可用的存储区。如果映射存储区被`mmap`指定成了只读的,则进程试图写这个映射存储区时,也产生此信号
- `SIGBUS`:如果映射区的某个部分在访问时不存在,则产生`SIGBUS`信号
> 如:用文件长度映射了一个文件,但在引用该映射区之前,另一个进程已将该文件截断,此时如果进程视图访问被截断部分对应的映射区,则接收到`SIGBUS`信号
> 如:用文件长度映射了一个文件,但在引用该映射区之前,另一个进程已将该文件截断,此时如果进程试图访问被截断部分对应的映射区,则接收到`SIGBUS`信号
**子进程能够通过`fork`继承存储映射区(因为子进程复制了父进程地址空间,而存储映射区是该地址空间的组成部分)。但是一旦子进程调用了`exec`,则新程序不再拥有存储映射区了**
Expand Down

0 comments on commit 3907c61

Please sign in to comment.