摘要:
一个进程中可以包含多个线程。线程中包含了表示进程执行环境必须的信息,其中包括进程中标识线程的线程ID、一组寄存器值、栈、调度 优先级和策略、信号屏蔽字、errno变量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。 需要注意的是,进程ID是全局唯一的,但是线程ID只有在它所属的进程环境中有效。 通过调用函数pthread_create来创建线程(更多内容:man 3 pthread_create):1 #include <pthread.h>2 3 int pthread_create(pthread_t 阅读全文
摘要:
vfork用于创建一个新进程,而该进程的目的就是exec一个新程序。vfork和fork均创建一个子进程,但是vfork并不将父进程的地址空间完全复制到子进程中,因为子进程会调用exec(或exit),于是也就不会访问改地址空间。在子进程调用exec或exit之前,它继续在父进程的空间中运行。 vfork和fork之间的另一个区别:vfork保证子进程先运行。在子进程调用exec或exit之后,父进程才可能被调度运行。 1 #include <stdlib.h> 2 #include <unistd.h> 3 #include <sys/types.h> 4 阅读全文
摘要:
信号驱动式I/O是指进程预先告知内核,使得当某个描述字上发生某事时,内核使用信号通知相关进程。图1概括展示信号驱动式I/O模型。图1 信号驱动式I/O模型 针对一个进程建立一个相关进程的处理函数,需要通过signal()函数来建立。 基本信号:(linux 控制台中输入:man 7 signal) SIGINT(值为2,默认动作:terminal):Interrupt from keyboard。 SIGTERM(值为15,默认动作:terminal):Termination signal SIGCHILD(值为20,17,28,默认动作:ignore):child stoppe... 阅读全文
摘要:
pthead_cond_t 的使用源代码1: 1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 pthread_cond_t qready = PTHREAD_COND_INITIALIZER; 7 pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; 8 int constant = 0; 9 10 void *prints(void *arg)11 {12 pth 阅读全文
摘要:
View Code 1 /** 2 * 大根堆。从STL中获得。 3 */ 4 5 #include <iostream> 6 #include <ctime> 7 #include <cmath> 8 #include <cstdlib> 9 10 using namespace std; 11 12 void _push_heap(int *start, int holeIndex, int topIndex, int value) 13 { 14 int parent = (holeIndex - 1) / 2; 15 while (hol 阅读全文
摘要:
<效率> 条款16:谨记80 – 20 法则 80 – 20 法则说:一个程序80 % 的资源用於20 % 的代码身上。 语句的执行次数和函数调用次数可以间接协助你了解你无法直接量测的软件行为。如果你无法直接量测动态内存的使用,那么知道内存分配函数和释放函数被调用的频率,至少也可以给你带来一部分的联想。 条款17:考虑使用lazy evaluation(缓式评估) 一旦你采用lazy evaluation,就是以某种方式撰写你的classes,使它们延缓运算,直到那些运算结果刻不容缓地被迫切需要为止。 在const memberr functions内修改data members的 阅读全文
摘要:
<异常> 条款9:利用destructors避免泄露资源 在函数中,可以将资源封装在局部对象中,通常便可以在exceptions出现时避免泄露资源。是因为局部对象总是会在函数结束时被析构,不论函数如何结束,但唯一例外的就是调用longjmp而结束。 条款10:在constructors内阻止资源泄露(resource leak) C++只会析构已构造完成的对象。对象只有在其constructor执行完毕才算是完全构造妥当。 面对尚未完全构造好的对象,为什么C++拒绝调用其析构函数?是因为若析构函数被调用于一个尚未完全的构造好的对象身上,那么这个析构函数如何知道构造函数现在构造了那些 阅读全文
摘要:
<基础议题> pointer和reference在继承机制下存在两种型别:静态型别是指其声明时的型别;动态型别是指它们实际所指的对象来决定。 条款1:仔细区分pointer和references 没有null references,一个reference必须总是代表某个对象。 使用reference之前不需测试其有效性。若使用pointer,通常就是测试它是否为null。 pointers和references的差异:pointers可以被重新赋值,指向另一个对象;reference却总是指向(代表)它最初获得的那个对象,即使被重新赋值改变的也是原对象的值。 operator[]返 阅读全文
摘要:
对每个TCP连接,TCP管理4个不同的定时器:重传定时器使用与当希望收到另一端的确认。如果当定时器溢出时还没有收到确认,TCP连接将重传该数据;坚持定时器是窗口大小信息保持不断流动,即使另一端关闭了其接收窗口;保活定时器可检测一个空闲连接的另一端何时崩溃或重启;2 MSL定时器测量一个连接处于TIME_WAIT状态的时间。 TCP的超时与重传 TCP超时与重传中对重要的部分就是对一个给定连接的往返时间(RTT)的测量,通过RTT的变化来改变其超时时间。 拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,希望降低分组进入网络的传输速率,于是可以调用慢启动来做到这一... 阅读全文
摘要:
TCP的交互数据流 服务器端回显客户端输入的字符过程如图1所示,在回显过程中产生4个报文段:来自客户的交互按键;来自服务器的按键确认;来自服务器的按键回显;来自客户的按键回显确认。图1 一种可能的处理远程交互按键回显的方法 时延确认:通常TCP在接收到数据时并不立即发送ACK;相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送(有时称这种现象为数据捎带ACK)。绝大多数采用的时延是200 ms。 Nagle算法:该算法要求一个TCP连接上最多只能有一个未被确认的未完成的小分组,在该分组的确认到达之前不能发送其他的小分组。相反,TCP收集这些少量数据的分组,并在确认到来时以一个... 阅读全文